Removing old grid code (bug 113082). r=timeless, evaughan, sr=shaver.

This commit is contained in:
bryner%netscape.com 2001-12-02 00:10:21 +00:00
Родитель 04cd364aae
Коммит f52b7ad1f1
18 изменённых файлов: 2 добавлений и 3146 удалений

Просмотреть файл

@ -1470,8 +1470,6 @@ nsBoxFrameInner::GetDebugPref(nsIPresContext* aPresContext)
}
}
#include "nsIMonument.h"
NS_IMETHODIMP
nsBoxFrame::Paint(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,

Просмотреть файл

@ -1,218 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// Eric Vaughan
// Netscape Communications
//
// See documentation in associated header file
//
#include "nsGridLayout.h"
#include "nsTempleLayout.h"
#include "nsIBox.h"
#include "nsIScrollableFrame.h"
nsresult
NS_NewGridLayout( nsIPresShell* aPresShell, nsCOMPtr<nsIBoxLayout>& aNewLayout)
{
aNewLayout = new nsGridLayout(aPresShell);
return NS_OK;
}
nsGridLayout::nsGridLayout(nsIPresShell* aPresShell):nsStackLayout()
{
}
/**
* Get the monuments in the other temple at the give monument index
*/
NS_IMETHODIMP
nsGridLayout::GetOtherMonumentsAt(nsIBox* aBox, PRInt32 aIndexOfObelisk, nsBoxSizeList** aList, nsMonumentLayout* aRequestor)
{
nsTempleLayout* temple = nsnull;
nsIBox* templeBox = nsnull;
GetOtherTemple(aBox, &temple, &templeBox, aRequestor);
if (temple)
{
nsresult rv = temple->GetMonumentsAt(templeBox, aIndexOfObelisk, aList);
NS_RELEASE(temple);
return rv;
}
else
*aList = nsnull;
return NS_OK;
}
/**
* a Grid always has 2 temples. This is called by one temple to get the other
*/
NS_IMETHODIMP
nsGridLayout::GetOtherTemple(nsIBox* aBox, nsTempleLayout** aTemple, nsIBox** aTempleBox, nsMonumentLayout* aRequestor)
{
// this is really easy. We know the index of the temple who requested
// so find our other temple who doesn't have that index.
nsIBox* child = nsnull;
aBox->GetChildBox(&child);
while(child)
{
nsIBox* oldBox = child;
nsresult rv = NS_OK;
nsCOMPtr<nsIScrollableFrame> scrollFrame = do_QueryInterface(child, &rv);
if (scrollFrame) {
nsIFrame* scrolledFrame = nsnull;
scrollFrame->GetScrolledFrame(nsnull, scrolledFrame);
NS_ASSERTION(scrolledFrame,"Error no scroll frame!!");
nsCOMPtr<nsIBox> b = do_QueryInterface(scrolledFrame);
child = b;
}
nsCOMPtr<nsIBoxLayout> layout;
child->GetLayoutManager(getter_AddRefs(layout));
// must find a temple that is not our requestor and is a monument.
if (layout != aRequestor) {
nsCOMPtr<nsIMonument> monument( do_QueryInterface(layout) );
if (monument)
{
nsTempleLayout* temple = nsnull;
monument->CastToTemple(&temple);
if (temple) {
// yes its a temple.
*aTemple = temple;
*aTempleBox = child;
NS_ADDREF(temple);
return NS_OK;
}
}
}
if (scrollFrame) {
child = oldBox;
}
child->GetNextBox(&child);
}
*aTemple = nsnull;
return NS_OK;
}
NS_IMETHODIMP
nsGridLayout::CastToTemple(nsTempleLayout** aTemple)
{
*aTemple = nsnull;
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsGridLayout::CastToObelisk(nsObeliskLayout** aObelisk)
{
*aObelisk = nsnull;
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsGridLayout::CastToGrid(nsGridLayout** aGrid)
{
*aGrid = this;
return NS_OK;
}
NS_IMETHODIMP
nsGridLayout::GetParentMonument(nsIBox* aBox, nsCOMPtr<nsIBox>& aParentBox, nsIMonument** aParentMonument)
{
NS_ERROR("Should not be called");
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsGridLayout::GetOtherMonuments(nsIBox* aBox, nsBoxSizeList** aList)
{
NS_ERROR("Should not be called");
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsGridLayout::GetMonumentsAt(nsIBox* aBox, PRInt32 aMonumentIndex, nsBoxSizeList** aList)
{
NS_ERROR("Should not be called");
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsGridLayout::BuildBoxSizeList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSize*& aFirst, nsBoxSize*& aLast, PRBool aIsHorizontal)
{
NS_ERROR("Should not be called");
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsGridLayout::GetMonumentList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList** aList)
{
NS_ERROR("Should not be called");
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsGridLayout::EnscriptionChanged(nsBoxLayoutState& aState, PRInt32 aIndex)
{
NS_ERROR("Should Never be Called!");
return NS_OK;
}
NS_IMETHODIMP
nsGridLayout::DesecrateMonuments(nsIBox* aBox, nsBoxLayoutState& aState)
{
return NS_OK;
}
NS_IMPL_ADDREF_INHERITED(nsGridLayout, nsStackLayout);
NS_IMPL_RELEASE_INHERITED(nsGridLayout, nsStackLayout);
NS_INTERFACE_MAP_BEGIN(nsGridLayout)
NS_INTERFACE_MAP_ENTRY(nsIMonument)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIMonument)
NS_INTERFACE_MAP_END_INHERITING(nsStackLayout)

Просмотреть файл

@ -1,85 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/**
Author:
Eric D Vaughan
**/
#ifndef nsGridLayout_h___
#define nsGridLayout_h___
#include "nsStackLayout.h"
#include "nsIMonument.h"
#include "nsCOMPtr.h"
#include "nsIBox.h"
class nsTempleLayout;
class nsMonumentLayout;
class nsBoxSizeList;
class nsGridLayout : public nsStackLayout,
public nsIMonument
{
public:
friend nsresult NS_NewGridLayout(nsIPresShell* aPresShell, nsCOMPtr<nsIBoxLayout>& aNewLayout);
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD CastToTemple(nsTempleLayout** aTemple);
NS_IMETHOD CastToObelisk(nsObeliskLayout** aObelisk);
NS_IMETHOD CastToGrid(nsGridLayout** aGrid);
NS_IMETHOD GetOtherMonuments(nsIBox* aBox, nsBoxSizeList** aList);
NS_IMETHOD GetOtherMonumentsAt(nsIBox* aBox, PRInt32 aIndexOfObelisk, nsBoxSizeList** aList, nsMonumentLayout* aRequestor = nsnull);
NS_IMETHOD GetOtherTemple(nsIBox* aBox, nsTempleLayout** aTemple, nsIBox** aTempleBox, nsMonumentLayout* aRequestor = nsnull);
NS_IMETHOD GetMonumentsAt(nsIBox* aBox, PRInt32 aMonumentIndex, nsBoxSizeList** aList);
NS_IMETHOD BuildBoxSizeList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSize*& aFirst, nsBoxSize*& aLast, PRBool aIsHorizontal);
NS_IMETHOD GetParentMonument(nsIBox* aBox, nsCOMPtr<nsIBox>& aParentBox, nsIMonument** aParentMonument);
NS_IMETHOD GetMonumentList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList** aList);
NS_IMETHOD EnscriptionChanged(nsBoxLayoutState& aState, PRInt32 aIndex);
NS_IMETHOD DesecrateMonuments(nsIBox* aBox, nsBoxLayoutState& aState);
protected:
nsGridLayout(nsIPresShell* aShell);
}; // class nsGridLayout
#endif

Просмотреть файл

@ -1,117 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsIMonument_h___
#define nsIMonument_h___
#include "nsISupports.h"
#include "nsIFrame.h"
#include "nsIBox.h"
class nsIBox;
class nsBoxLayoutState;
class nsTempleLayout;
class nsGridLayout;
class nsObeliskLayout;
class nsMonumentLayout;
class nsBoxLayoutState;
class nsIPresShell;
class nsBoxSize;
class nsBoxSizeList;
class nsBoxSizeListener
{
public:
virtual void WillBeDestroyed(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList& aList)=0;
virtual void Desecrated(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList& aList)=0;
};
class nsBoxSizeList
{
public:
virtual ~nsBoxSizeList() {}
virtual nsBoxSize GetBoxSize(nsBoxLayoutState& aState, PRBool aIsHorizontal)=0;
virtual nsBoxSizeList* GetFirst()=0;
virtual nsBoxSizeList* GetLast()=0;
virtual nsBoxSizeList* GetNext()=0;
virtual nsBoxSizeList* GetParent()=0;
virtual nsBoxSizeList* GetAt(PRInt32 aIndex)=0;
virtual nsBoxSizeList* Get(nsIBox* aBox)=0;
virtual void SetParent(nsBoxSizeList* aParent)=0;
virtual void SetNext(nsBoxLayoutState& aState, nsBoxSizeList* aNext)=0;
virtual void Append(nsBoxLayoutState& aState, nsBoxSizeList* aChild)=0;
virtual void Clear(nsBoxLayoutState& aState)=0;
virtual PRInt32 GetCount()=0;
virtual void Desecrate(nsBoxLayoutState& aState)=0;
virtual void MarkDirty(nsBoxLayoutState& aState)=0;
virtual void AddRef()=0;
virtual void Release(nsBoxLayoutState& aState)=0;
virtual void Destroy(nsBoxLayoutState& aState)=0;
virtual PRBool IsSet()=0;
virtual nsIBox* GetBox()=0;
virtual PRInt32 GetRefCount()=0;
virtual PRBool SetListener(nsIBox* aBox, nsBoxSizeListener& aListener)=0;
virtual void RemoveListener()=0;
virtual void SetAdjacent(nsBoxLayoutState& aState, nsBoxSizeList* aList)=0;
virtual nsBoxSizeList* GetAdjacent()=0;
};
// {AF0C1603-06C3-11d4-BA07-001083023C1E}
#define NS_IMONUMENT_IID { 0xaf0c1603, 0x6c3, 0x11d4, { 0xba, 0x7, 0x0, 0x10, 0x83, 0x2, 0x3c, 0x1e } };
class nsIMonument : public nsISupports {
public:
static const nsIID& GetIID() { static nsIID iid = NS_IMONUMENT_IID; return iid; }
NS_IMETHOD CastToTemple(nsTempleLayout** aTemple)=0;
NS_IMETHOD CastToObelisk(nsObeliskLayout** aObelisk)=0;
NS_IMETHOD CastToGrid(nsGridLayout** aGrid)=0;
NS_IMETHOD GetOtherMonuments(nsIBox* aBox, nsBoxSizeList** aList)=0;
NS_IMETHOD GetOtherMonumentsAt(nsIBox* aBox, PRInt32 aIndexOfObelisk, nsBoxSizeList** aList, nsMonumentLayout* aRequestor = nsnull)=0;
NS_IMETHOD GetOtherTemple(nsIBox* aBox, nsTempleLayout** aTemple, nsIBox** aTempleBox, nsMonumentLayout* aRequestor = nsnull)=0;
NS_IMETHOD GetMonumentsAt(nsIBox* aBox, PRInt32 aMonumentIndex, nsBoxSizeList** aList)=0;
NS_IMETHOD BuildBoxSizeList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSize*& aFirst, nsBoxSize*& aLast, PRBool aIsHorizontal)=0;
NS_IMETHOD GetParentMonument(nsIBox* aBox, nsCOMPtr<nsIBox>& aParentBox, nsIMonument** aParentMonument)=0;
NS_IMETHOD GetMonumentList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList** aList)=0;
NS_IMETHOD EnscriptionChanged(nsBoxLayoutState& aState, PRInt32 aIndex)=0;
NS_IMETHOD DesecrateMonuments(nsIBox* aBox, nsBoxLayoutState& aState)=0;
};
#endif

Просмотреть файл

@ -1,745 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// Eric Vaughan
// Netscape Communications
//
// See documentation in associated header file
//
#include "nsMonumentLayout.h"
#include "nsBoxLayoutState.h"
#include "nsIBox.h"
#include "nsIScrollableFrame.h"
#include "nsBox.h"
// ----- Monument Iterator -----
nsLayoutIterator::nsLayoutIterator(nsIBox* aBox):mBox(nsnull),mStartBox(aBox),mParentCount(0)
{
}
void
nsLayoutIterator::Reset()
{
mBox = nsnull;
}
PRBool
nsLayoutIterator::GetNextLayout(nsIBoxLayout** aLayout, PRBool aSearchChildren)
{
if (mBox == nsnull) {
mBox = mStartBox;
} else {
if (aSearchChildren) {
mParents[mParentCount++] = mBox;
NS_ASSERTION(mParentCount < PARENT_STACK_SIZE, "Stack overflow!!");
mBox->GetChildBox(&mBox);
} else {
mBox->GetNextBox(&mBox);
}
}
return DigDeep(aLayout, aSearchChildren);
}
PRBool
nsLayoutIterator::DigDeep(nsIBoxLayout** aLayout, PRBool aSearchChildren)
{
// if our box is null. See if we have any parents on the stack
// if so pop them off and continue.
if (!mBox) {
if (mParentCount > 0) {
mBox = mParents[--mParentCount];
mBox->GetNextBox(&mBox);
return DigDeep(aLayout, aSearchChildren);
}
*aLayout = nsnull;
return PR_FALSE;
}
// if its a scrollframe. Then continue down into the scrolled frame
nsresult rv = NS_OK;
nsCOMPtr<nsIScrollableFrame> scrollFrame = do_QueryInterface(mBox, &rv);
if (scrollFrame) {
nsIFrame* scrolledFrame = nsnull;
scrollFrame->GetScrolledFrame(nsnull, scrolledFrame);
NS_ASSERTION(scrolledFrame,"Error no scroll frame!!");
mParents[mParentCount++] = mBox;
NS_ASSERTION(mParentCount < PARENT_STACK_SIZE, "Stack overflow!!");
nsCOMPtr<nsIBox> b = do_QueryInterface(scrolledFrame);
mBox = b;
}
// get the layout manager
nsCOMPtr<nsIBoxLayout> layout;
mBox->GetLayoutManager(getter_AddRefs(layout));
// if we are supposed to search our children. And the layout manager
// was null. Then dig into the children.
if (aSearchChildren && !layout)
{
mParents[mParentCount++] = mBox;
NS_ASSERTION(mParentCount < PARENT_STACK_SIZE, "Stack overflow!!");
mBox->GetChildBox(&mBox);
return DigDeep(aLayout, aSearchChildren);
}
*aLayout = layout;
NS_IF_ADDREF(*aLayout);
if (layout)
return PR_TRUE;
else
return PR_FALSE;
}
// ---- Monument Iterator -----
nsMonumentIterator::nsMonumentIterator(nsIBox* aBox):nsLayoutIterator(aBox)
{
}
PRBool
nsMonumentIterator::GetNextMonument(nsIMonument** aMonument, PRBool aSearchChildren)
{
nsCOMPtr<nsIBoxLayout> layout;
while(GetNextLayout(getter_AddRefs(layout), aSearchChildren)) {
if (layout)
{
nsresult rv = NS_OK;
nsCOMPtr<nsIMonument> monument = do_QueryInterface(layout, &rv);
*aMonument = monument;
if (monument) {
NS_IF_ADDREF(*aMonument);
return PR_TRUE;
}
}
}
return PR_FALSE;
}
PRBool
nsMonumentIterator::GetNextObelisk(nsObeliskLayout** aObelisk, PRBool aSearchChildren)
{
nsCOMPtr<nsIMonument> monument;
PRBool searchChildren = aSearchChildren;
while(GetNextMonument(getter_AddRefs(monument), searchChildren)) {
searchChildren = aSearchChildren;
if (monument)
{
*aObelisk = nsnull;
monument->CastToObelisk(aObelisk);
if (*aObelisk) {
return PR_TRUE;
}
// ok we found another grid. Don't enter it.
nsGridLayout* grid = nsnull;
monument->CastToGrid(&grid);
if (grid) {
searchChildren = PR_FALSE;
}
}
}
*aObelisk = nsnull;
return PR_FALSE;
}
//static long _nodes = 0;
//static long _lists = 0;
//------ nsInfoListNodeImpl ----
nsBoxSizeListNodeImpl::~nsBoxSizeListNodeImpl()
{
MOZ_COUNT_DTOR(nsBoxSizeListNodeImpl);
//_nodes--;
//printf("Nodes %d\n",_nodes);
}
void
nsBoxSizeListNodeImpl::Release(nsBoxLayoutState& aState)
{
Destroy(aState);
}
void
nsBoxSizeListNodeImpl::Destroy(nsBoxLayoutState& aState)
{
delete this;
}
void
nsBoxSizeListNodeImpl::Desecrate(nsBoxLayoutState& aState)
{
if (mParent)
mParent->Desecrate(aState);
}
void
nsBoxSizeListNodeImpl::MarkDirty(nsBoxLayoutState& aState)
{
if (mBox)
mBox->MarkDirty(aState);
}
void nsBoxSizeListNodeImpl::SetNext(nsBoxLayoutState& aState, nsBoxSizeList* aNext)
{
mNext = aNext;
}
void nsBoxSizeListNodeImpl::SetAdjacent(nsBoxLayoutState& aState, nsBoxSizeList* aNext)
{
mAdjacent = aNext;
}
void
nsBoxSizeListNodeImpl::Append(nsBoxLayoutState& aState, nsBoxSizeList* aChild)
{
NS_ERROR("Attept at append to a leaf");
}
nsBoxSizeListNodeImpl::nsBoxSizeListNodeImpl(nsIBox* aBox):mNext(nsnull),
mParent(nsnull),
mAdjacent(nsnull),
mBox(aBox),
mRefCount(0),
mIsSet(PR_FALSE)
{
MOZ_COUNT_CTOR(nsBoxSizeListNodeImpl);
// _nodes++;
// printf("Created. Nodes %d\n",_nodes);
}
nsBoxSizeList*
nsBoxSizeListNodeImpl::GetAt(PRInt32 aIndex)
{
nsBoxSizeList* node = this;
PRInt32 count = 0;
while(node)
{
if (count == aIndex)
return node;
node = node->GetAdjacent();
count++;
}
return nsnull;
}
nsBoxSizeList*
nsBoxSizeListNodeImpl::Get(nsIBox* aBox)
{
nsBoxSizeList* node = this;
while(node)
{
if (node->GetBox() == aBox)
return node;
node = node->GetNext();
}
return nsnull;
}
//------ nsInfoListImpl2 ----
nsBoxSizeListImpl::nsBoxSizeListImpl(nsIBox* aBox):nsBoxSizeListNodeImpl(aBox),
mFirst(nsnull),
mLast(nsnull),
mCount(0),
mListener(nsnull),
mListenerBox(nsnull)
{
MOZ_COUNT_CTOR(nsBoxSizeListImpl);
// _lists++;
// printf("Lists %d\n",_lists);
}
nsBoxSizeListImpl::~nsBoxSizeListImpl()
{
MOZ_COUNT_DTOR(nsBoxSizeListImpl);
// _lists--;
// printf("Lists %d\n",_lists);
}
/* Ownership model nsMonumentLayout
nsTempleLayout owns
mMonuments (nsBoxSizeListImpl)
nsBoxSizeListImpl owns
mAdjacent (nsBoxSizeListImpl)
mFirst (nsBoxSizeList) Now mFirst is a list of
nsBoxSizeListImpl or nsBoxSizeListNodeImpl.
It only owns nsBoxSizeNodeImpl not the
nsBoxSizeListImpl.
*/
void
nsBoxSizeListImpl::Destroy(nsBoxLayoutState& aState)
{
// notify the listener that we are going away
if (mListener) {
mListener->WillBeDestroyed(mListenerBox, aState, *this);
}
// tell each of our children to release. If you ask
// a node to release it will delete itself. If you
// ask a list to release it will do nothing because
// Lists are not owned by other lists they are owned
// by Temples.
nsBoxSizeList* list = mFirst;
while(list)
{
nsBoxSizeList* toRelease = list;
list = list->GetNext();
toRelease->Release(aState);
}
// now tell each or our adacent children to be destroyed.
if (mAdjacent)
mAdjacent->Destroy(aState);
delete this;
}
void
nsBoxSizeListImpl::Release(nsBoxLayoutState& aState)
{
// do nothing. We can only be destroyed by our owner
// by calling Destroy.
mParent = nsnull;
}
void
nsBoxSizeListImpl::Clear(nsBoxLayoutState& aState)
{
nsBoxSizeList* list = mFirst;
while(list)
{
nsBoxSizeList* toRelease = list;
list = list->GetNext();
toRelease->Release(aState);
}
mFirst = nsnull;
mLast = nsnull;
}
void
nsBoxSizeListImpl::Append(nsBoxLayoutState& aState, nsBoxSizeList* aChild)
{
if (!mFirst)
mFirst = aChild;
else
mLast->SetNext(aState, aChild);
mLast = aChild;
mLast->SetNext(aState, nsnull);
aChild->SetParent(this);
}
void
nsBoxSizeListImpl::Desecrate(nsBoxLayoutState& aState)
{
if (mIsSet) {
mIsSet = PR_FALSE;
if (mListener)
mListener->Desecrated(mListenerBox, aState, *this);
nsBoxSizeListNodeImpl::Desecrate(aState);
}
}
void
nsBoxSizeListImpl::MarkDirty(nsBoxLayoutState& aState)
{
nsBoxSizeList* child = mFirst;
while(child)
{
child->MarkDirty(aState);
child = child->GetNext();
}
nsBoxSizeListNodeImpl::MarkDirty(aState);
}
PRBool
nsBoxSizeListImpl::SetListener(nsIBox* aBox, nsBoxSizeListener& aListener)
{
if (mListener)
return PR_FALSE;
mListener = &aListener;
mListenerBox = aBox;
return PR_TRUE;
}
void
nsBoxSizeListImpl::RemoveListener()
{
mListener = nsnull;
mListenerBox = nsnull;
}
nsBoxSize
nsBoxSizeListImpl::GetBoxSize(nsBoxLayoutState& aState, PRBool aIsHorizontal)
{
if (!mIsSet) {
mIsSet = PR_TRUE;
mBoxSize.Clear();
nsBoxSizeList* node = mFirst;
while(node) {
nsBoxSize size = node->GetBoxSize(aState, aIsHorizontal);
if (size.pref > mBoxSize.pref)
mBoxSize.pref = size.pref;
if (size.min > mBoxSize.min)
mBoxSize.min = size.min;
if (mBoxSize.max != NS_INTRINSICSIZE)
if (size.max == NS_INTRINSICSIZE)
mBoxSize.max = size.max;
else
mBoxSize.max += size.max;
mBoxSize.flex = size.flex;
mBoxSize.ascent = size.ascent;
node = node->GetNext();
}
}
return mBoxSize;
}
nsBoxSize
nsBoxSizeListNodeImpl::GetBoxSize(nsBoxLayoutState& aState, PRBool aIsHorizontal)
{
nsBoxSize size;
nsSize pref(0,0);
nsSize min(0,0);
nsSize max(NS_INTRINSICSIZE,NS_INTRINSICSIZE);
nscoord ascent = 0;
nscoord flex = 0;
if (!mBox)
return size;
mBox->GetPrefSize(aState, pref);
mBox->GetMinSize(aState, min);
mBox->GetMaxSize(aState, max);
mBox->GetAscent(aState, ascent);
mBox->GetFlex(aState, flex);
nsBox::AddMargin(mBox, pref);
size.Add(min, pref, max, ascent, flex, !aIsHorizontal);
return size;
}
// ------ nsMonumentLayout ------
nsMonumentLayout::nsMonumentLayout(nsIPresShell* aPresShell):nsSprocketLayout()
{
}
NS_IMETHODIMP
nsMonumentLayout::CastToTemple(nsTempleLayout** aTemple)
{
*aTemple = nsnull;
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsMonumentLayout::CastToObelisk(nsObeliskLayout** aObelisk)
{
*aObelisk = nsnull;
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsMonumentLayout::CastToGrid(nsGridLayout** aGrid)
{
*aGrid = nsnull;
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsMonumentLayout::GetParentMonument(nsIBox* aBox, nsCOMPtr<nsIBox>& aParentBox, nsIMonument** aParentMonument)
{
// go up and find our parent monument. Skip and non monument
// parents.
nsCOMPtr<nsIBoxLayout> layout;
nsCOMPtr<nsIMonument> parentMonument;
nsresult rv = NS_OK;
*aParentMonument = nsnull;
aBox->GetParentBox(&aBox);
while (aBox) {
aBox->GetLayoutManager(getter_AddRefs(layout));
parentMonument = do_QueryInterface(layout, &rv);
if (NS_SUCCEEDED(rv) && parentMonument) {
aParentBox = aBox;
*aParentMonument = parentMonument.get();
NS_IF_ADDREF(*aParentMonument);
return rv;
}
aBox->GetParentBox(&aBox);
}
aParentBox = nsnull;
*aParentMonument = nsnull;
return rv;
}
NS_IMETHODIMP
nsMonumentLayout::GetOtherMonuments(nsIBox* aBox, nsBoxSizeList** aList)
{
nsCOMPtr<nsIMonument> parent;
nsCOMPtr<nsIBox> parentBox;
GetParentMonument(aBox, parentBox, getter_AddRefs(parent));
if (parent)
return parent->GetOtherMonumentsAt(parentBox, 0, aList, this);
else
return NS_OK;
}
/**
* Get the monuments in the other temple at the give monument index
*/
NS_IMETHODIMP
nsMonumentLayout::GetOtherMonumentsAt(nsIBox* aBox, PRInt32 aIndexOfObelisk, nsBoxSizeList** aList, nsMonumentLayout* aRequestor)
{
nsresult rv = NS_OK;
PRInt32 index = -1;
nsIBox* child = nsnull;
aBox->GetChildBox(&child);
PRInt32 count = 0;
while(child)
{
nsCOMPtr<nsIBox> childBox = child;
nsCOMPtr<nsIScrollableFrame> scrollFrame = do_QueryInterface(child, &rv);
if (scrollFrame) {
nsIFrame* childFrame = nsnull;
scrollFrame->GetScrolledFrame(nsnull, childFrame);
if (!childFrame)
return NS_ERROR_FAILURE;
childBox = do_QueryInterface(childFrame);
}
nsCOMPtr<nsIBoxLayout> layout;
childBox->GetLayoutManager(getter_AddRefs(layout));
// only all monuments
nsCOMPtr<nsIMonument> monument = do_QueryInterface(layout, &rv);
if (NS_SUCCEEDED(rv) && monument)
{
if (layout == aRequestor) {
index = count;
break;
}
count++;
}
child->GetNextBox(&child);
}
NS_ASSERTION(index != -1,"Error can't find requestor!!");
aIndexOfObelisk += index;
nsCOMPtr<nsIMonument> parent;
nsCOMPtr<nsIBox> parentBox;
GetParentMonument(aBox, parentBox, getter_AddRefs(parent));
if (parent)
parent->GetOtherMonumentsAt(parentBox, aIndexOfObelisk, aList, this);
return NS_OK;
}
NS_IMETHODIMP
nsMonumentLayout::GetOtherTemple(nsIBox* aBox, nsTempleLayout** aTemple, nsIBox** aTempleBox, nsMonumentLayout* aRequestor)
{
nsCOMPtr<nsIMonument> parent;
nsCOMPtr<nsIBox> parentBox;
GetParentMonument(aBox, parentBox, getter_AddRefs(parent));
if(parent)
parent->GetOtherTemple(parentBox, aTemple, aTempleBox, this);
return NS_OK;
}
NS_IMETHODIMP
nsMonumentLayout::GetMonumentsAt(nsIBox* aBox, PRInt32 aMonumentIndex, nsBoxSizeList** aList)
{
nsBoxLayoutState state((nsIPresContext*)nsnull);
nsBoxSizeList* list = nsnull;
GetMonumentList(aBox, state, &list);
// create an info list for the given column.
PRInt32 count = 0;
while(list) {
if (count == aMonumentIndex)
{
*aList = list;
return NS_OK;
}
list = list->GetAdjacent();
count++;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsMonumentLayout::BuildBoxSizeList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSize*& aFirst, nsBoxSize*& aLast, PRBool aIsHorizontal)
{
aFirst = aLast = new (aState) nsBoxSize();
nsSize pref(0,0);
nsSize min(0,0);
nsSize max(NS_INTRINSICSIZE,NS_INTRINSICSIZE);
nscoord flex = 0;
nscoord ascent = 0;
aBox->GetPrefSize(aState, pref);
aBox->GetMinSize(aState, min);
aBox->GetMaxSize(aState, max);
aBox->GetAscent(aState, ascent);
aBox->GetFlex(aState, flex);
nsBox::BoundsCheck(min, pref, max);
nsMargin borderPadding(0,0,0,0);
aBox->GetBorderAndPadding(borderPadding);
nsMargin margin(0,0,0,0);
aBox->GetMargin(margin);
aFirst->Add(min, pref, max, ascent, flex, aIsHorizontal);
aFirst->Add(borderPadding,aIsHorizontal);
aFirst->Add(margin,aIsHorizontal);
return NS_OK;
}
NS_IMETHODIMP
nsMonumentLayout::GetMonumentList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList** aList)
{
nsIBox* child = nsnull;
aBox->GetChildBox(&child);
nsBoxSizeList* last = nsnull;
while(child)
{
nsBoxSizeList* newOne = new nsBoxSizeListNodeImpl(child);
if (*aList == nsnull)
*aList = last = newOne;
else {
last->SetAdjacent(aState, newOne);
last = newOne;
}
child->GetNextBox(&child);
}
return NS_OK;
}
NS_IMETHODIMP
nsMonumentLayout::EnscriptionChanged(nsBoxLayoutState& aState, PRInt32 aIndex)
{
NS_ERROR("Should Never be Called!");
return NS_OK;
}
NS_IMETHODIMP
nsMonumentLayout::DesecrateMonuments(nsIBox* aBox, nsBoxLayoutState& aState)
{
NS_ERROR("Should Never be Called!");
return NS_OK;
}
PRInt32
nsMonumentLayout::GetIndexOfChild(nsIBox* aBox, nsIBox* aChild)
{
nsIBox* child = nsnull;
aBox->GetChildBox(&child);
PRInt32 count = 0;
while(child)
{
if (child == aChild) {
return count;
}
child->GetNextBox(&child);
count++;
}
return -1;
}
NS_IMPL_ADDREF_INHERITED(nsMonumentLayout, nsBoxLayout);
NS_IMPL_RELEASE_INHERITED(nsMonumentLayout, nsBoxLayout);
NS_INTERFACE_MAP_BEGIN(nsMonumentLayout)
NS_INTERFACE_MAP_ENTRY(nsIMonument)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIMonument)
NS_INTERFACE_MAP_END_INHERITING(nsBoxLayout)

Просмотреть файл

@ -1,176 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/**
Author:
Eric D Vaughan
**/
#ifndef nsMonumentLayout_h___
#define nsMonumentLayout_h___
#include "nsSprocketLayout.h"
#include "nsIMonument.h"
class nsTempleLayout;
class nsGridLayout;
class nsBoxLayoutState;
class nsIPresShell;
#define PARENT_STACK_SIZE 100
class nsLayoutIterator
{
public:
nsLayoutIterator(nsIBox* aBox);
virtual void Reset();
virtual PRBool GetNextLayout(nsIBoxLayout** aLayout, PRBool aSearchChildren = PR_FALSE);
virtual void GetBox(nsIBox** aBox) { *aBox = mBox; }
virtual PRBool DigDeep(nsIBoxLayout** aLayout, PRBool aSearchChildren);
protected:
nsIBox* mBox;
nsIBox* mStartBox;
PRInt32 mParentCount;
nsIBox* mParents[PARENT_STACK_SIZE];
};
class nsMonumentIterator: public nsLayoutIterator
{
public:
nsMonumentIterator(nsIBox* aBox);
virtual PRBool GetNextMonument(nsIMonument** aMonument, PRBool aSearchChildren = PR_FALSE);
virtual PRBool GetNextObelisk(nsObeliskLayout** aObelisk, PRBool aSearchChildren = PR_FALSE);
};
// nsBoxSizeListNodeImpl are OWNED by nsBoxSizeListImpl
class nsBoxSizeListNodeImpl : public nsBoxSizeList
{
public:
virtual nsBoxSize GetBoxSize(nsBoxLayoutState& aState, PRBool aIsHorizontal);
virtual nsBoxSizeList* GetFirst() { return nsnull; }
virtual nsBoxSizeList* GetLast() { return nsnull; }
virtual nsBoxSizeList* GetNext() { return mNext; }
virtual nsBoxSizeList* GetParent() { return mParent;}
virtual void SetParent(nsBoxSizeList* aParent) { mParent = aParent; }
virtual PRInt32 GetCount() { return 1; }
virtual void SetNext(nsBoxLayoutState& aState, nsBoxSizeList* aNext);
virtual void Append(nsBoxLayoutState& aState, nsBoxSizeList* aChild);
virtual void Clear(nsBoxLayoutState& aState) {}
virtual nsBoxSizeList* GetAt(PRInt32 aIndex);
virtual nsBoxSizeList* Get(nsIBox* aBox);
virtual PRBool SetListener(nsIBox* aBox, nsBoxSizeListener& aListener) { return PR_FALSE; }
virtual void RemoveListener() {}
virtual void Desecrate(nsBoxLayoutState& aState);
virtual void MarkDirty(nsBoxLayoutState& aState);
virtual void AddRef() { mRefCount++; }
virtual void Release(nsBoxLayoutState& aState);
virtual void Destroy(nsBoxLayoutState& aState);
virtual PRInt32 GetRefCount() { return mRefCount; }
virtual PRBool IsSet() { return mIsSet; }
virtual nsIBox* GetBox() { return mBox; }
virtual void SetAdjacent(nsBoxLayoutState& aState, nsBoxSizeList* aAdjacent);
virtual nsBoxSizeList* GetAdjacent() { return mAdjacent; }
nsBoxSizeListNodeImpl(nsIBox* aBox);
virtual ~nsBoxSizeListNodeImpl();
nsBoxSizeList* mNext;
nsBoxSizeList* mParent;
nsBoxSizeList* mAdjacent; // OWN
nsIBox* mBox;
PRInt32 mRefCount;
PRBool mIsSet;
};
// nsBoxSizeListImpl are OWNED by nsTempleLayout
class nsBoxSizeListImpl : public nsBoxSizeListNodeImpl
{
public:
virtual nsBoxSize GetBoxSize(nsBoxLayoutState& aState, PRBool aIsHorizontal);
virtual nsBoxSizeList* GetFirst() { return mFirst; }
virtual nsBoxSizeList* GetLast() { return mLast; }
virtual PRInt32 GetCount() { return mCount; }
virtual void Desecrate(nsBoxLayoutState& aState);
virtual void MarkDirty(nsBoxLayoutState& aState);
virtual void Append(nsBoxLayoutState& aState, nsBoxSizeList* aChild);
virtual void Clear(nsBoxLayoutState& aState);
virtual PRBool SetListener(nsIBox* aBox, nsBoxSizeListener& aListener);
virtual void RemoveListener();
virtual void Release(nsBoxLayoutState& aState);
virtual void Destroy(nsBoxLayoutState& aState);
nsBoxSizeListImpl(nsIBox* aBox);
virtual ~nsBoxSizeListImpl();
nsBoxSizeList* mFirst; // OWN children who are nsBoxSizeListNodeImpl but not nsBoxSizeListImpl
nsBoxSizeList* mLast; // OWN children who are nsBoxSizeListNodeImpl but not nsBoxSizeListImpl
PRInt32 mCount;
nsBoxSize mBoxSize;
nsBoxSizeListener* mListener;
nsIBox* mListenerBox;
};
class nsMonumentLayout : public nsSprocketLayout,
public nsIMonument
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_IMETHOD CastToTemple(nsTempleLayout** aTemple);
NS_IMETHOD CastToObelisk(nsObeliskLayout** aObelisk);
NS_IMETHOD CastToGrid(nsGridLayout** aGrid);
NS_IMETHOD GetOtherMonuments(nsIBox* aBox, nsBoxSizeList** aList);
NS_IMETHOD GetOtherMonumentsAt(nsIBox* aBox, PRInt32 aIndexOfObelisk, nsBoxSizeList** aList, nsMonumentLayout* aRequestor = nsnull);
NS_IMETHOD GetOtherTemple(nsIBox* aBox, nsTempleLayout** aTemple, nsIBox** aTempleBox, nsMonumentLayout* aRequestor = nsnull);
NS_IMETHOD GetMonumentsAt(nsIBox* aBox, PRInt32 aMonumentIndex, nsBoxSizeList** aList);
NS_IMETHOD BuildBoxSizeList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSize*& aFirst, nsBoxSize*& aLast, PRBool aIsHorizontal);
NS_IMETHOD GetParentMonument(nsIBox* aBox, nsCOMPtr<nsIBox>& aParentBox, nsIMonument** aParentMonument);
NS_IMETHOD GetMonumentList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList** aList);
NS_IMETHOD EnscriptionChanged(nsBoxLayoutState& aState, PRInt32 aIndex);
NS_IMETHOD DesecrateMonuments(nsIBox* aBox, nsBoxLayoutState& aState);
protected:
virtual PRInt32 GetIndexOfChild(nsIBox* aBox, nsIBox* aChild);
nsMonumentLayout(nsIPresShell* aShell);
};
#endif

Просмотреть файл

@ -1,451 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// Eric Vaughan
// Netscape Communications
//
// See documentation in associated header file
//
#include "nsObeliskLayout.h"
#include "nsTempleLayout.h"
#include "nsBoxLayoutState.h"
#include "nsBox.h"
#include "nsIScrollableFrame.h"
nsresult
NS_NewObeliskLayout( nsIPresShell* aPresShell, nsCOMPtr<nsIBoxLayout>& aNewLayout)
{
aNewLayout = new nsObeliskLayout(aPresShell);
return NS_OK;
}
nsObeliskLayout::nsObeliskLayout(nsIPresShell* aPresShell):nsMonumentLayout(aPresShell), mOtherMonumentList(nsnull)
{
mOtherMonumentList = nsnull;
}
nsObeliskLayout::~nsObeliskLayout()
{
if (mOtherMonumentList)
mOtherMonumentList->RemoveListener();
}
NS_IMETHODIMP
nsObeliskLayout::CastToObelisk(nsObeliskLayout** aObelisk)
{
*aObelisk = this;
return NS_OK;
}
void
nsObeliskLayout::UpdateMonuments(nsIBox* aBox, nsBoxLayoutState& aState)
{
if (!mOtherMonumentList)
{
GetOtherMonuments(aBox, &mOtherMonumentList);
if (mOtherMonumentList) {
// if we fail to set the listener the null out our list.
// this could happend if someone put more than 1 <columns> or <rows> tags in a grid. This is
// technically illegal. But at the moment we can't stop them from doing it.
PRBool wasSet = mOtherMonumentList->SetListener(aBox, *this);
NS_ASSERTION(wasSet, "Too many columns or rows!");
// recover gracefully for the optimized bits.
if (!wasSet)
mOtherMonumentList = nsnull;
}
}
}
NS_IMETHODIMP
nsObeliskLayout::GetPrefSize(nsIBox* aBox, nsBoxLayoutState& aState, nsSize& aSize)
{
nsresult rv = nsMonumentLayout::GetPrefSize(aBox, aState, aSize);
UpdateMonuments(aBox, aState);
nsBoxSizeList* node = mOtherMonumentList;
PRBool isHorizontal = PR_FALSE;
aBox->GetOrientation(isHorizontal);
if (node) {
// if the infos pref width is greater than aSize's use it.
// if the infos min width is greater than aSize's use it.
// if the infos max width is smaller than aSizes then set it.
nsBoxSize size = node->GetBoxSize(aState, isHorizontal);
nscoord s = size.pref;
nsMargin bp(0,0,0,0);
aBox->GetBorderAndPadding(bp);
if (isHorizontal) {
s += bp.top + bp.bottom;
} else {
s += bp.left + bp.right;
}
nscoord& s2 = GET_HEIGHT(aSize, isHorizontal);
if (s > s2)
s2 = s;
}
return rv;
}
NS_IMETHODIMP
nsObeliskLayout::GetMinSize(nsIBox* aBox, nsBoxLayoutState& aState, nsSize& aSize)
{
//nsresult rv = nsMonumentLayout::GetMinSize(aBox, aState, aSize);
PRBool isHorizontal = PR_FALSE;
aBox->GetOrientation(isHorizontal);
aSize.width = 0;
aSize.height = 0;
// run through all the children and get there min, max, and preferred sizes
// return us the size of the box
nsIBox* child = nsnull;
aBox->GetChildBox(&child);
// our flexes are determined by the other temple. So in getting out min size we need to
// iterator over our temples obelisks.
nsTempleLayout* temple = nsnull;
nsIBox* aTempleBox = nsnull;
GetOtherTemple(aBox, &temple, &aTempleBox);
NS_IF_RELEASE(temple);
nsMonumentIterator it(aTempleBox);
while (child)
{
// ignore collapsed children
//PRBool isCollapsed = PR_FALSE;
//aBox->IsCollapsed(aState, isCollapsed);
//if (!isCollapsed)
//{
nsSize min(0,0);
nsSize pref(0,0);
nscoord flex = 0;
child->GetMinSize(aState, min);
// get the next obelisk and use its flex.
nsObeliskLayout* obelisk;
it.GetNextObelisk(&obelisk, PR_TRUE);
nsIBox* obeliskBox = nsnull;
it.GetBox(&obeliskBox);
if (obeliskBox) {
obeliskBox->GetFlex(aState, flex);
} else {
child->GetFlex(aState, flex);
}
// if the child is not flexible then
// its min size is its pref size.
if (flex == 0) {
child->GetPrefSize(aState, pref);
if (isHorizontal)
min.width = pref.width;
else
min.height = pref.height;
}
AddMargin(child, min);
AddLargestSize(aSize, min, isHorizontal);
//}
child->GetNextBox(&child);
}
UpdateMonuments(aBox, aState);
nsBoxSizeList* node = mOtherMonumentList;
if (node) {
// if the infos pref width is greater than aSize's use it.
// if the infos min width is greater than aSize's use it.
// if the infos max width is smaller than aSizes then set it.
nsBoxSize size = node->GetBoxSize(aState, isHorizontal);
nscoord s = size.min;
nsMargin bp(0,0,0,0);
aBox->GetBorderAndPadding(bp);
if (isHorizontal) {
s += bp.top + bp.bottom;
} else {
s += bp.left + bp.right;
}
nscoord& s2 = GET_HEIGHT(aSize, isHorizontal);
if (s > s2)
s2 = s;
}
return NS_OK;
}
NS_IMETHODIMP
nsObeliskLayout::GetMaxSize(nsIBox* aBox, nsBoxLayoutState& aState, nsSize& aSize)
{
nsresult rv = nsMonumentLayout::GetMaxSize(aBox, aState, aSize);
UpdateMonuments(aBox, aState);
nsBoxSizeList* node = mOtherMonumentList;
PRBool isHorizontal = PR_FALSE;
aBox->GetOrientation(isHorizontal);
if (node) {
// if the infos pref width is greater than aSize's use it.
// if the infos min width is greater than aSize's use it.
// if the infos max width is smaller than aSizes then set it.
nsBoxSize size = node->GetBoxSize(aState, isHorizontal);
nscoord s = size.max;
nscoord& s2 = GET_HEIGHT(aSize, isHorizontal);
if (s > s2)
s2 = s;
}
return rv;
}
NS_IMETHODIMP
nsObeliskLayout::ChildBecameDirty(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aChild)
{
// if one of our cells has changed size and needs reflow
// make sure we clean any cached information about it.
nsCOMPtr<nsIMonument> parent;
nsCOMPtr<nsIBox> parentBox;
GetParentMonument(aBox, parentBox, getter_AddRefs(parent));
if (!parent)
return NS_OK;
nsIBox* child = nsnull;
aBox->GetChildBox(&child);
PRInt32 count = 0;
nsCOMPtr<nsIBoxLayout> layout;
while(child)
{
if (child == aChild) {
parent->EnscriptionChanged(aState, count);
return NS_OK;
}
child->GetNextBox(&child);
count++;
}
return NS_OK;
}
NS_IMETHODIMP
nsObeliskLayout::BecameDirty(nsIBox* aBox, nsBoxLayoutState& aState)
{
/*
nsCOMPtr<nsIMonument> parent;
nsCOMPtr<nsIBox> parentBox;
GetParentMonument(aBox, parentBox, getter_AddRefs(parent));
parent->DesecrateMonuments(aBox, aState);
*/
UpdateMonuments(aBox, aState);
if (mOtherMonumentList)
mOtherMonumentList->MarkDirty(aState);
return NS_OK;
}
void
nsObeliskLayout::PopulateBoxSizes(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSize*& aBoxSizes, nsComputedBoxSize*& aComputedBoxSizes, nscoord& aMinSize, nscoord& aMaxSize, PRInt32& aFlexes)
{
nsTempleLayout* temple = nsnull;
nsIBox* aTempleBox = nsnull;
GetOtherTemple(aBox, &temple, &aTempleBox);
if (temple) {
// substitute our sizes for the other temples obelisk sizes.
PRBool isHorizontal = PR_FALSE;
aTempleBox->GetOrientation(isHorizontal);
nsBoxSize* first = nsnull;
nsBoxSize* last = nsnull;
temple->BuildBoxSizeList(aTempleBox, aState, first, last, isHorizontal);
aBoxSizes = first;
}
nsSprocketLayout::PopulateBoxSizes(aBox, aState, aBoxSizes, aComputedBoxSizes, aMinSize, aMaxSize, aFlexes);
NS_IF_RELEASE(temple);
}
void
nsObeliskLayout::ComputeChildSizes(nsIBox* aBox,
nsBoxLayoutState& aState,
nscoord& aGivenSize,
nsBoxSize* aBoxSizes,
nsComputedBoxSize*& aComputedBoxSizes)
{
nsCOMPtr<nsIBoxLayout> layout;
nsCOMPtr<nsIMonument> parentMonument;
nsCOMPtr<nsIScrollableFrame> scrollable;
nsresult rv = NS_OK;
aBox->GetParentBox(&aBox);
nscoord size = aGivenSize;
while (aBox) {
aBox->GetLayoutManager(getter_AddRefs(layout));
parentMonument = do_QueryInterface(layout, &rv);
if (NS_SUCCEEDED(rv) && parentMonument) {
// we have a parent monument good. Go up until we hit the grid.
nsGridLayout* grid;
parentMonument->CastToGrid(&grid);
if (grid) {
if (size > aGivenSize) {
nscoord diff = size - aGivenSize;
aGivenSize += diff;
nsSprocketLayout::ComputeChildSizes(aBox, aState, aGivenSize, aBoxSizes, aComputedBoxSizes);
nsComputedBoxSize* s = aComputedBoxSizes;
nsComputedBoxSize* last = aComputedBoxSizes;
while(s)
{
last = s;
s = s->next;
}
last->size -= diff;
aGivenSize -= diff;
} else {
nsSprocketLayout::ComputeChildSizes(aBox, aState, aGivenSize, aBoxSizes, aComputedBoxSizes);
}
return;
}
} else {
scrollable = do_QueryInterface(aBox, &rv);
if (NS_SUCCEEDED(rv)) {
// oops we are in a scrollable. Did it change our size?
// if so remove the excess space.
nsRect r;
aBox->GetBounds(r);
PRBool isHorizontal = PR_FALSE;
aBox->GetOrientation(isHorizontal);
if (size < GET_WIDTH(r, isHorizontal)) {
if (isHorizontal) {
size = r.width;
} else {
size = r.height;
}
}
}
}
aBox->GetParentBox(&aBox);
}
// Not in GRID!!! do the default.
nsSprocketLayout::ComputeChildSizes(aBox, aState, aGivenSize, aBoxSizes, aComputedBoxSizes);
}
void
nsObeliskLayout::WillBeDestroyed(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList& aList)
{
Desecrated(aBox, aState, aList);
mOtherMonumentList = nsnull;
}
void
nsObeliskLayout::Desecrated(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList& aList)
{
NS_ASSERTION(&aList == mOtherMonumentList,"Wrong list!!");
if (mOtherMonumentList) {
nsCOMPtr<nsIBoxLayout> layout;
aBox->GetLayoutManager(getter_AddRefs(layout));
aBox->SetLayoutManager(nsnull);
aBox->MarkDirtyChildren(aState);
aBox->SetLayoutManager(layout);
}
}
NS_IMETHODIMP
nsObeliskLayout::ChildrenInserted(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aPrevBox, nsIBox* aChildList)
{
nsCOMPtr<nsIMonument> parent;
nsCOMPtr<nsIBox> parentBox;
GetParentMonument(aBox, parentBox, getter_AddRefs(parent));
if (parent)
return parent->DesecrateMonuments(aBox, aState);
else
return NS_OK;
}
NS_IMETHODIMP
nsObeliskLayout::ChildrenAppended(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aChildList)
{
nsCOMPtr<nsIMonument> parent;
nsCOMPtr<nsIBox> parentBox;
GetParentMonument(aBox, parentBox, getter_AddRefs(parent));
if (parent)
return parent->DesecrateMonuments(aBox, aState);
else
return NS_OK;
}
NS_IMETHODIMP
nsObeliskLayout::ChildrenRemoved(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aChildList)
{
nsCOMPtr<nsIMonument> parent;
nsCOMPtr<nsIBox> parentBox;
GetParentMonument(aBox, parentBox, getter_AddRefs(parent));
if (parent)
return parent->DesecrateMonuments(aBox, aState);
else
return NS_OK;
}

Просмотреть файл

@ -1,101 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/**
Author:
Eric D Vaughan
**/
#ifndef nsObeliskLayout_h___
#define nsObeliskLayout_h___
#include "nsMonumentLayout.h"
#include "nsCOMPtr.h"
class nsObeliskLayout : public nsMonumentLayout,
public nsBoxSizeListener
{
public:
friend nsresult NS_NewObeliskLayout(nsIPresShell* aPresShell, nsCOMPtr<nsIBoxLayout>& aNewLayout);
NS_IMETHOD GetPrefSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
NS_IMETHOD GetMinSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
NS_IMETHOD GetMaxSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
NS_IMETHOD CastToObelisk(nsObeliskLayout** aObelisk);
NS_IMETHOD ChildBecameDirty(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aChild);
NS_IMETHOD BecameDirty(nsIBox* aBox, nsBoxLayoutState& aState);
NS_IMETHOD ChildrenInserted(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aPrevBox, nsIBox* aChildList);
NS_IMETHOD ChildrenAppended(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aChildList);
NS_IMETHOD ChildrenRemoved(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aChildList);
protected:
void ChildNeedsLayout(nsIBox* aBox, nsIBoxLayout* aChild);
virtual void UpdateMonuments(nsIBox* aBox, nsBoxLayoutState& aState);
/*
virtual void ComputeChildSizes(nsIBox* aBox,
nsBoxLayoutState& aState,
nscoord& aGivenSize,
nsBoxSize* aBoxSizes,
nsComputedBoxSize*& aComputedBoxSizes);
*/
virtual void PopulateBoxSizes(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsBoxSize*& aBoxSizes, nsComputedBoxSize*& aComputedBoxSizes, nscoord& aMinSize, nscoord& aMaxSize, PRInt32& aFlexes);
virtual void ComputeChildSizes(nsIBox* aBox,
nsBoxLayoutState& aState,
nscoord& aGivenSize,
nsBoxSize* aBoxSizes,
nsComputedBoxSize*& aComputedBoxSizes);
virtual void WillBeDestroyed(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList& aList);
virtual void Desecrated(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList& aList);
nsObeliskLayout(nsIPresShell* aShell);
virtual ~nsObeliskLayout();
private:
nsBoxSizeList* mOtherMonumentList;
}; // class nsObeliskLayout
#endif

Просмотреть файл

@ -1,265 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
//
// Eric Vaughan
// Netscape Communications
//
// See documentation in associated header file
//
#include "nsTempleLayout.h"
#include "nsIBox.h"
#include "nsCOMPtr.h"
#include "nsIScrollableFrame.h"
#include "nsBoxLayoutState.h"
nsresult
NS_NewTempleLayout( nsIPresShell* aPresShell, nsCOMPtr<nsIBoxLayout>& aNewLayout)
{
aNewLayout = new nsTempleLayout(aPresShell);
return NS_OK;
}
nsTempleLayout::nsTempleLayout(nsIPresShell* aPresShell):nsMonumentLayout(aPresShell), mMonuments(nsnull)
{
}
nsTempleLayout::~nsTempleLayout()
{
if (mMonuments) {
nsBoxLayoutState state((nsIPresContext*)nsnull);
mMonuments->Destroy(state);
}
}
NS_IMETHODIMP
nsTempleLayout::CastToTemple(nsTempleLayout** aTemple)
{
*aTemple = this;
return NS_OK;
}
NS_IMETHODIMP
nsTempleLayout::EnscriptionChanged(nsBoxLayoutState& aState, PRInt32 aIndex)
{
// if a cell changes size.
if (mMonuments) {
nsBoxSizeList* size = mMonuments->GetAt(aIndex);
if (size)
size->Desecrate(aState);
}
return NS_OK;
}
NS_IMETHODIMP
nsTempleLayout::GetMonumentList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList** aList)
{
if (mMonuments) {
*aList = mMonuments;
return NS_OK;
}
// run through our children.
// ask each child for its monument list
// append the list to our list
nsIBox* firstChild = nsnull;
aBox->GetChildBox(&firstChild);
nsBoxSizeList* current = nsnull;
nsCOMPtr<nsIMonument> monument;
nsMonumentIterator it(firstChild);
nsIBox* box = nsnull;
while(it.GetNextMonument(getter_AddRefs(monument))) {
it.GetBox(&box);
current = mMonuments;
nsBoxSizeList* node = nsnull;
monument->GetMonumentList(box, aState, &node);
while(node)
{
if (!mMonuments) {
mMonuments = new nsBoxSizeListImpl(firstChild);
current = mMonuments;
}
current->Append(aState, node);
node = node->GetAdjacent();
if (node && !current->GetAdjacent()) {
nsBoxSizeList* newOne = new nsBoxSizeListImpl(box);
current->SetAdjacent(aState, newOne);
current = newOne;
} else {
current = current->GetAdjacent();
}
}
}
*aList = mMonuments;
return NS_OK;
}
NS_IMETHODIMP
nsTempleLayout::BuildBoxSizeList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSize*& aFirst, nsBoxSize*& aLast, PRBool aIsHorizontal)
{
// ok we need to build a nsBoxSize for each obelisk in this temple. We will then return the list of them.
// We are just returning a flattened list that we will use to layout our each cell.
nsIBox* box = nsnull;
aBox->GetChildBox(&box);
aFirst = nsnull;
aLast = nsnull;
nsBoxSize* first;
nsBoxSize* last;
PRInt32 count = 0;
nsCOMPtr<nsIBoxLayout> layout;
nsLayoutIterator it(box);
while(it.GetNextLayout(getter_AddRefs(layout))) {
it.GetBox(&box);
if (layout) {
nsresult rv = NS_OK;
nsCOMPtr<nsIMonument> monument = do_QueryInterface(layout, &rv);
if (monument)
monument->BuildBoxSizeList(box, aState, first, last, aIsHorizontal);
else {
nsMonumentLayout::BuildBoxSizeList(box, aState, first, last, aIsHorizontal);
first->bogus = PR_TRUE;
}
if (count == 0)
aFirst = first;
else if (aLast)
(aLast)->next = first;
aLast = last;
}
count++;
}
// ok now we might have a margin or border. If we do then we need to take that into account. One example
// might be if we are oriented vertically making us a "columns" and we contain a horizontal obelisk "row".
// Now say we have a left border of 10px. Well if we just layed things out then the whole row would be pushed over and
// the columns would not not line up. So we must take the space from somewhere. So if its on the left we take from the first
// child (which is leftmost) and if its on the right we take from the last child (which is rightmost). So for our example we
// need to subtract 10px from the first child.
// so get the border and padding and add them up.
nsMargin borderPadding(0,0,0,0);
aBox->GetBorderAndPadding(borderPadding);
nsMargin margin(0,0,0,0);
aBox->GetMargin(margin);
// add the margins up
nsMargin leftMargin(borderPadding.left + margin.left, borderPadding.top + margin.top, 0, 0);
nsMargin rightMargin(0,0, borderPadding.right + margin.right, borderPadding.bottom + margin.bottom);
// Subtract them out.
PRBool isHorizontal = PR_FALSE;
aBox->GetOrientation(isHorizontal);
if (aFirst)
aFirst->Add(leftMargin,isHorizontal);
if (aLast)
aLast->Add(rightMargin,isHorizontal);
return NS_OK;
}
NS_IMETHODIMP
nsTempleLayout::ChildrenInserted(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aPrevBox, nsIBox* aChildList)
{
DesecrateMonuments(aBox, aState);
return NS_OK;
}
NS_IMETHODIMP
nsTempleLayout::ChildrenAppended(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aChildList)
{
DesecrateMonuments(aBox, aState);
return NS_OK;
}
NS_IMETHODIMP
nsTempleLayout::ChildrenRemoved(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aChildList)
{
DesecrateMonuments(aBox, aState);
return NS_OK;
}
NS_IMETHODIMP
nsTempleLayout::DesecrateMonuments(nsIBox* aBox, nsBoxLayoutState& aState)
{
nsCOMPtr<nsIMonument> parent;
nsCOMPtr<nsIBox> parentBox;
GetParentMonument(aBox, parentBox, getter_AddRefs(parent));
if (parent)
parent->DesecrateMonuments(parentBox, aState);
if (mMonuments) {
mMonuments->Destroy(aState);
mMonuments = nsnull;
}
return NS_OK;
}
// redefined because the normal GetMinSize in sprocket looks at flex
// if the child is not flexible then its min size is its pref size.
// but in this case its up to the column. The column's flex is the
// flex thats used.
NS_IMETHODIMP
nsTempleLayout::GetMinSize(nsIBox* aBox, nsBoxLayoutState& aState, nsSize& aSize)
{
return nsSprocketLayout::GetMinSize(aBox, aState, aSize);
}

Просмотреть файл

@ -1,76 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/**
Author:
Eric D Vaughan
**/
#ifndef nsTempleLayout_h___
#define nsTempleLayout_h___
#include "nsMonumentLayout.h"
class nsTempleLayout : public nsMonumentLayout
{
public:
friend nsresult NS_NewTempleLayout(nsIPresShell* aPresShell, nsCOMPtr<nsIBoxLayout>& aNewLayout);
NS_IMETHOD CastToTemple(nsTempleLayout** aTemple);
NS_IMETHOD BuildBoxSizeList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSize*& aFirst, nsBoxSize*& aLast, PRBool aIsHorizontal);
NS_IMETHOD GetMonumentList(nsIBox* aBox, nsBoxLayoutState& aState, nsBoxSizeList** aList);
NS_IMETHOD ChildrenInserted(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aPrevBox, nsIBox* aChildList);
NS_IMETHOD ChildrenAppended(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aChildList);
NS_IMETHOD ChildrenRemoved(nsIBox* aBox, nsBoxLayoutState& aState, nsIBox* aChildList);
NS_IMETHOD DesecrateMonuments(nsIBox* aBox, nsBoxLayoutState& aState);
NS_IMETHOD EnscriptionChanged(nsBoxLayoutState& aState, PRInt32 aIndex);
NS_IMETHOD GetMinSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize);
protected:
nsTempleLayout(nsIPresShell* aShell);
virtual ~nsTempleLayout();
private:
nsBoxSizeList* mMonuments;
};
#endif

Просмотреть файл

@ -1,473 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsToolbarDragListener.h"
#include "nsToolbarFrame.h"
#include "nsCOMPtr.h"
#include "nsIDOMMouseEvent.h"
#include "nsIPresContext.h"
#include "nsIContent.h"
#include "nsIDOMElement.h"
#include "nsXULAtoms.h"
#include "nsIEventStateManager.h"
#include "nsISupportsPrimitives.h"
#include "nsINameSpaceManager.h"
#include "nsIDOMXULDocument.h"
#include "nsIDocument.h"
#include "nsIPresShell.h"
#include "nsIDOMEventTarget.h"
NS_IMPL_ADDREF(nsToolbarDragListener)
NS_IMPL_RELEASE(nsToolbarDragListener)
NS_IMPL_QUERY_INTERFACE2(nsToolbarDragListener, nsIDOMDragListener, nsIDOMEventListener)
//
// nsToolbarDragListener ctor
//
// Init member variables. We can't really do much of anything important here because
// any subframes might not be totally intialized yet, or in the hash table
//
nsToolbarDragListener :: nsToolbarDragListener ( nsToolbarFrame* inToolbar, nsIPresContext* inPresContext )
: mToolbar(inToolbar), mPresContext(inPresContext), mCurrentDropLoc(-1)
{
NS_INIT_REFCNT();
// we really need this all over the place. just be safe that we have it.
NS_ASSERTION ( mPresContext, "no pres context set on toolbar drag listener" );
} // nsToolbarDragListener ctor
//
// nsToolbarDragListener dtor
//
// Cleanup.
//
nsToolbarDragListener::~nsToolbarDragListener()
{
}
////////////////////////////////////////////////////////////////////////
nsresult
nsToolbarDragListener::HandleEvent(nsIDOMEvent* aEvent)
{
return NS_OK;
}
////////////////////////////////////////////////////////////////////////
nsresult
nsToolbarDragListener::DragGesture(nsIDOMEvent* aDragEvent)
{
// this code should all be in JS.
return NS_OK;
}
////////////////////////////////////////////////////////////////////////
nsresult
nsToolbarDragListener::DragEnter(nsIDOMEvent* aDragEvent)
{
// We don't need to do anything special here. If anything does need to be done,
// the code should all be in JS.
return NS_OK;
}
//
// ItemMouseIsOver
//
// Figure out which child item mouse is over. |outIndex| is the index of the item the object
// should be dropped _before_. Therefore if the item should be dropped at the end, the index
// will be greater than the number of items in the list. |outOnChild| is true if the item
// is a container and the drop would be "on" that item.
//
void
nsToolbarDragListener :: ItemMouseIsOver ( nsIDOMEvent* aDragEvent, nscoord* outXLoc,
PRUint32* outIndex, PRBool* outOnChild )
{
*outOnChild = PR_FALSE;
// figure out which frame is the right one for determining the drop feedback. Do we
// want to do this every time? We certainly can't do it upon toolbar creation (hash
// tables not setup at that time), so we're forced to do it now. What happens if while
// we're dragging some rule gets fired that causes the frame to go away?
nsIFrame* dropAreaFrame = LocateDropAreaFrame();
if ( !dropAreaFrame ) {
// gaaak, we're doomed.
outIndex = 0;
outXLoc = 0;
return;
}
//
// Get the mouse coordinates from the DOM event, but they will be in the
// window/widget coordinate system. We must first get them into the frame-relative
// coordinate system. Yuck.
//
// get mouse coordinates and translate them into twips
nsCOMPtr<nsIDOMMouseEvent> mouseEvent(do_QueryInterface(aDragEvent));
PRInt32 x,y = 0;
mouseEvent->GetClientX(&x);
mouseEvent->GetClientY(&y);
float p2t;
mPresContext->GetScaledPixelsToTwips(&p2t);
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
nscoord xp = NSIntPixelsToTwips(x, p2t);
nscoord yp = NSIntPixelsToTwips(y, p2t);
// compute the offset to top level in twips
PRInt32 frameOffsetX = 0, frameOffsetY = 0;
nsIFrame* curr = dropAreaFrame;
curr->GetParent(&curr);
float t2p;
mPresContext->GetTwipsToPixels(&t2p);
while ( curr ) {
nsPoint origin;
curr->GetOrigin(origin); // in twips
frameOffsetX += origin.x; // build the offset incrementally
frameOffsetY += origin.y;
curr->GetParent(&curr); // moving up the chain
} // until we reach the top
// subtract the offset from the x,y coord to put into frame relative coordinates.
xp -= frameOffsetX;
yp -= frameOffsetY;
nsPoint pnt(xp, yp);
// get the toolbar's rect
nsRect tbRect;
dropAreaFrame->GetRect(tbRect);
PRUint32 count = 0;
PRBool found = PR_FALSE;
nsIFrame* childFrame;
nsRect rect; // child frame's rect
nsRect prevRect(-1, -1, 0, 0);
//
// Now loop through the child and see if the mouse is over a child
//
dropAreaFrame->FirstChild(mPresContext, nsnull, &childFrame);
while ( childFrame ) {
// The mouse coords are in the toolbar's domain
// Get child's rect and adjust to the toolbar's domain
childFrame->GetRect(rect);
rect.MoveBy(tbRect.x, tbRect.y);
// remember the previous child x location
if (pnt.x < rect.x && prevRect.x == -1)
prevRect = rect;
// now check to see if the mouse inside an items bounds
if (rect.Contains(pnt)) {
nsCOMPtr<nsIContent> content;
childFrame->GetContent(getter_AddRefs(content));
if ( content ) {
nsCOMPtr<nsIAtom> tag;
content->GetTag(*getter_AddRefs(tag));
// for now I am checking for both titlebutton and toolbar items
if (tag.get() == nsXULAtoms::toolbaritem) {
// now check if item is a container
PRBool isContainer = PR_FALSE;
nsCOMPtr<nsIDOMElement> domElement ( do_QueryInterface(content) );
if ( domElement ) {
nsAutoString value;
domElement->GetAttribute(NS_LITERAL_STRING("container"), value); // can't use an atom here =(
isContainer = value.Equals(NS_LITERAL_STRING("true"));
}
else
NS_WARNING("Not a DOM element");
// if we have a container, the area is broken up into 3 pieces (left, middle, right). If
// it isn't it's only broken up into two (left and right)
PRInt32 xc = -1;
if ( isContainer ) {
if (pnt.x <= (rect.x + (rect.width / 4))) {
*outIndex = count;
xc = rect.x - tbRect.x;
}
else if (pnt.x >= (rect.x + PRInt32(float(rect.width) *0.75))) {
*outIndex = count + 1;
xc = rect.x - tbRect.x + rect.width - onePixel;
}
else {
// we're on a container, don't draw anything so xc shouldn't get set.
*outIndex = count;
*outOnChild = PR_TRUE;
}
} else {
if (pnt.x <= (rect.x + (rect.width / 2))) {
*outIndex = count;
xc = rect.x - tbRect.x;
}
else {
*outIndex = count + 1;
xc = rect.x - tbRect.x + rect.width + onePixel;
}
}
*outXLoc = xc;
}
else {
// mouse is over something (probably a spacer) so return the left side of
// the spacer.
*outXLoc = rect.x - tbRect.x;
*outIndex = count;
}
// found something, break out of the loop
found = PR_TRUE;
break;
}
} // if mouse is in an item
nsresult rv = childFrame->GetNextSibling(&childFrame);
NS_ASSERTION(rv == NS_OK,"failed to get next child");
count++;
} // foreach child
if (!found) {
*outIndex = count; // already incremented past last item
if ( count )
*outXLoc = prevRect.x - tbRect.x + rect.width + onePixel;
else
*outXLoc = onePixel;
}
}
//
// DragOver
//
// The mouse has moved over the toolbar while a drag is happening. We really just want to
// "annotate" the toolbar with the current drop location. We don't want to make any judgement
// as this stage as to whether or not the drag should be accepted or draw any feedback.
//
nsresult
nsToolbarDragListener::DragOver(nsIDOMEvent* aDragEvent)
{
// Check to see if the mouse is over an item and which one it is.
nscoord xLoc = 0;
PRBool onChild;
PRUint32 beforeIndex = 0;
ItemMouseIsOver(aDragEvent, &xLoc, &beforeIndex, &onChild);
if ( xLoc != mCurrentDropLoc ) {
// stash the new location in the toolbar's content model. Note that the toolbar code doesn't
// care at all about "tb-droplocation", only the coordinate so there is no need to send the
// AttributeChanged() about that attribute.
nsCOMPtr<nsIContent> content;
mToolbar->GetContent ( getter_AddRefs(content) );
if ( content ) {
char buffer[10];
// need the cast, because on some platforms, PR[U]int32 != long, but we're using "%ld"
sprintf(buffer, "%ld", NS_STATIC_CAST(long, xLoc));
content->SetAttribute ( kNameSpaceID_None, nsXULAtoms::ddDropLocationCoord, NS_ConvertASCIItoUCS2(buffer), PR_TRUE );
sprintf(buffer, "%ld", NS_STATIC_CAST(long, beforeIndex));
content->SetAttribute ( kNameSpaceID_None, nsXULAtoms::ddDropLocation, NS_ConvertASCIItoUCS2(buffer), PR_FALSE );
content->SetAttribute ( kNameSpaceID_None, nsXULAtoms::ddDropOn, NS_ConvertASCIItoUCS2(onChild ? "true" : "false"), PR_FALSE );
}
// cache the current drop location
mCurrentDropLoc = xLoc;
}
// NS_OK means event is NOT consumed. We want to make sure JS gets this so it
// can determine if the drag is allowed.
return NS_OK;
}
//
// DragExit
//
// Handle when the mouse leaves the toolbar. We have to do some extra checking of both
// the target and the relatedNode to see if they are our children, but the gist is if
// the mouse leaves the toolbar for some other destination, reset the drop feedback
// attributes and trigger a repaint.
//
nsresult
nsToolbarDragListener::DragExit(nsIDOMEvent* aDragEvent)
{
nsCOMPtr<nsIDOMMouseEvent> mouseEvent ( do_QueryInterface(aDragEvent) );
if ( !mouseEvent )
return NS_OK;
nsCOMPtr<nsIDOMEventTarget> relatedTarget;
mouseEvent->GetRelatedTarget ( getter_AddRefs(relatedTarget) );
nsCOMPtr<nsIDOMNode> relatedNode;
if (relatedTarget) relatedNode = do_QueryInterface(relatedTarget);
nsCOMPtr<nsIDOMEventTarget> target;
aDragEvent->GetTarget ( getter_AddRefs(target) );
nsCOMPtr<nsIDOMNode> targetNode = nsnull;
if (target) targetNode = do_QueryInterface(target);
// we only care about the case where the toolbar or one of its children
// is the target of this dragExit event. Recall we get all exit events because
// they will bubble up to us.
if ( !IsNodeAChild(targetNode) )
return NS_OK;
if ( ! IsNodeAChild(relatedNode) ) {
nsCOMPtr<nsIContent> myContent;
mToolbar->GetContent ( getter_AddRefs(myContent) );
// tell the toolbar to not do any more drop feedback. Note that the toolbar code doesn't
// care at all about "tb-droplocation", only the coordinate so there is no need to send the
// AttributeChanged() about that attribute.
myContent->SetAttribute ( kNameSpaceID_None, nsXULAtoms::ddDropLocationCoord, NS_LITERAL_STRING("-1"), PR_TRUE );
myContent->SetAttribute ( kNameSpaceID_None, nsXULAtoms::ddDropLocation, NS_LITERAL_STRING("-1"), PR_FALSE );
myContent->SetAttribute ( kNameSpaceID_None, nsXULAtoms::ddTriggerRepaint, NS_LITERAL_STRING("1"), PR_TRUE );
// reset the current drop location
mCurrentDropLoc = -1;
}
return NS_OK; // don't consume event
}
//
// IsNodeAChild
//
// Returns TRUE if the given dom node is a child (or equals) this toolbar
//
PRBool
nsToolbarDragListener :: IsNodeAChild ( nsIDOMNode* inNode )
{
PRBool foundAsChild = PR_FALSE;
nsCOMPtr<nsIContent> myContent;
mToolbar->GetContent ( getter_AddRefs(myContent) );
nsCOMPtr<nsIDOMNode> myContentAsNode ( do_QueryInterface(myContent) );
NS_ASSERTION ( myContent && myContentAsNode, "No content nodes" );
nsCOMPtr<nsIDOMNode> currNode ( inNode );
while ( currNode ) {
// did we hit the toolbar?
if ( currNode == myContentAsNode ) {
foundAsChild = PR_TRUE;
break;
}
// if not, keep going
nsCOMPtr<nsIDOMNode> temp ( currNode );
temp->GetParentNode(getter_AddRefs(currNode));
} // while we're going up the parent chain
return foundAsChild;
} // IsNodeAChild
////////////////////////////////////////////////////////////////////////
nsresult
nsToolbarDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
{
// this code should all be in JS.
return NS_OK;
}
//
// LocateDropAreaFrame
//
// Returns the frame (or subframe) that contains the buttons that can be dragged.
// Either it will be the toolbar frame as a whole, or it will be some subframe of the bar id'd by
// the |dragdroparea| attribute.
//
nsIFrame*
nsToolbarDragListener :: LocateDropAreaFrame ( )
{
nsIFrame* retVal = nsnull;
// is a subframe the drag/drop area? determine if the attribute is set.
nsString dropAreaID;
PRBool dropAreaIsSubframe = PR_FALSE;
nsCOMPtr<nsIContent> toolbarContent;
mToolbar->GetContent ( getter_AddRefs(toolbarContent) );
if ( toolbarContent ) {
if ( toolbarContent->GetAttribute(kNameSpaceID_None, nsXULAtoms::ddDragDropArea, dropAreaID) == NS_CONTENT_ATTR_HAS_VALUE )
dropAreaIsSubframe = PR_TRUE;
}
// if there is a named subframe, go find it, otherwise use the entire toolbar
if ( dropAreaIsSubframe ) {
// get the presShell so we can call GetPrimaryFrameFor later.
nsCOMPtr<nsIPresShell> presShell;
mPresContext->GetShell ( getter_AddRefs(presShell) );
// get the document so we can get do a GetElementByID.
nsCOMPtr<nsIDocument> document;
toolbarContent->GetDocument ( *getter_AddRefs(document) );
if ( document ) {
nsCOMPtr<nsIDOMXULDocument> xulDoc ( do_QueryInterface(document) );
if ( xulDoc ) {
nsCOMPtr<nsIDOMElement> domElementOfSubframe;
xulDoc->GetElementById ( dropAreaID, getter_AddRefs(domElementOfSubframe) );
// finally get the frame associated with that dom node
nsCOMPtr<nsIContent> contentOfSubframe ( do_QueryInterface(domElementOfSubframe) );
if ( contentOfSubframe && presShell )
presShell->GetPrimaryFrameFor ( contentOfSubframe, &retVal );
}
}
} // if named subframe
else
retVal = mToolbar;
NS_ASSERTION ( retVal, "toolbar drag listener couldn't figure out the drag area." );
return retVal;
} // LocateDropAreaFrame

Просмотреть файл

@ -1,92 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsToolbarDragListener_h__
#define nsToolbarDragListener_h__
#include "nsIDOMDragListener.h"
#include "nsCoord.h"
class nsToolbarFrame;
class nsIPresContext;
class nsIDOMEvent;
class nsIFrame;
class nsIDOMNode;
class nsToolbarDragListener : public nsIDOMDragListener
{
public:
// default ctor and dtor
nsToolbarDragListener ( nsToolbarFrame* inToolbar, nsIPresContext* inPresContext );
virtual ~nsToolbarDragListener();
// interfaces for addref and release and queryinterface
NS_DECL_ISUPPORTS
// nsIDOMDragListener
virtual nsresult HandleEvent(nsIDOMEvent* aEvent);
virtual nsresult DragEnter(nsIDOMEvent* aDragEvent);
virtual nsresult DragOver(nsIDOMEvent* aDragEvent);
virtual nsresult DragExit(nsIDOMEvent* aDragEvent);
virtual nsresult DragDrop(nsIDOMEvent* aDragEvent);
virtual nsresult DragGesture(nsIDOMEvent* aDragEvent);
protected:
// Figure out which child item mouse is over. |outIndex| is the index of the item the object
// should be dropped _before_. Therefore if the item should be dropped at the end, the index
// will be greater than the number of items in the list. |outOnChild| is true if the item
// is a container and the drop would be "on" that item.
void ItemMouseIsOver(nsIDOMEvent* aDragEvent, nscoord* outXLoc, PRUint32* outIndex, PRBool* outOnChild);
// Utility to help determine if a node is a child of the toolbar
PRBool IsNodeAChild ( nsIDOMNode* inNode ) ;
// Find the frame (or subframe) that contains the buttons that can be dragged.
nsIFrame* LocateDropAreaFrame ( ) ;
nsToolbarFrame * mToolbar; // toolbar owns me, don't be circular
nsIPresContext * mPresContext; // weak reference
PRInt32 mCurrentDropLoc;
}; // class nsToolbarDragListener
#endif

Просмотреть файл

@ -1,192 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Pierre Phaneuf <pp@ludusdesign.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsToolbarItemFrame.h"
#include "nsCOMPtr.h"
#include "nsReadableUtils.h"
#include "nsWidgetsCID.h"
// Drag & Drop, Clipboard Support
static NS_DEFINE_CID(kCDragServiceCID, NS_DRAGSERVICE_CID);
static NS_DEFINE_CID(kCTransferableCID, NS_TRANSFERABLE_CID);
static NS_DEFINE_IID(kCDataFlavorCID, NS_DATAFLAVOR_CID);
//
// NS_NewToolbarItemFrame (friend)
//
// Creates a new toolbar item frame and returns it in |aNewFrame|
//
nsresult
NS_NewToolbarItemFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame )
{
NS_PRECONDITION(aNewFrame, "null OUT ptr");
if ( !aNewFrame )
return NS_ERROR_NULL_POINTER;
nsToolbarItemFrame* it = new (aPresShell) nsToolbarItemFrame(aPresShell);
if ( !it )
return NS_ERROR_OUT_OF_MEMORY;
*aNewFrame = it;
return NS_OK;
} // NS_NewToolbarItemFrame
//
// nsToolbarItemFrame ctor and dtor
//
nsToolbarItemFrame::nsToolbarItemFrame(nsIPresShell* aPresShell):nsBoxFrame(aPresShell)
{
}
nsToolbarItemFrame::~nsToolbarItemFrame()
{
}
//
// Init
//
// Ummm, just forwards for now.
//
NS_IMETHODIMP
nsToolbarItemFrame::Init(nsIPresContext* aPresContext,
nsIContent* aContent,
nsIFrame* aParent,
nsIStyleContext* aContext,
nsIFrame* aPrevInFlow)
{
nsresult rv = nsBoxFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
return rv;
}
//
// Init
//
// Ummm, just forwards for now. Most of this code is now in the drag listener's
// mouseMoved event.
//
// ¥¥¥ remove all this.
//
NS_IMETHODIMP
nsToolbarItemFrame::HandleEvent(nsIPresContext* aPresContext,
nsGUIEvent* aEvent,
nsEventStatus* aEventStatus)
{
// if disabled do nothing
/*if (PR_TRUE == mRenderer.isDisabled()) {
return NS_OK;
}
switch (aEvent->message) {
case NS_KEY_PRESS:
if (NS_KEY_EVENT == aEvent->eventStructType) {
nsKeyEvent* keyEvent = (nsKeyEvent*)aEvent;
if (NS_VK_SPACE == keyEvent->keyCode || NS_VK_RETURN == keyEvent->keyCode) {
MouseClicked(aPresContext);
}
}
break;
case NS_MOUSE_LEFT_CLICK:
MouseClicked(aPresContext);
break;
}
*/
/* // Start Drag
nsIDragService* dragService;
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
NS_GET_IID(nsIDragService),
(nsISupports **)&dragService);
if (NS_OK == rv) {
nsCOMPtr<nsITransferable> trans;
rv = nsComponentManager::CreateInstance(kCTransferableCID, nsnull,
NS_GET_IID(nsITransferable), getter_AddRefs(trans));
nsCOMPtr<nsITransferable> trans2;
rv = nsComponentManager::CreateInstance(kCTransferableCID, nsnull,
NS_GET_IID(nsITransferable), getter_AddRefs(trans2));
if ( trans && trans2 ) {
nsString textPlainFlavor ( "text/plain" );
trans->AddDataFlavor(&textPlainFlavor);
nsString dragText = "Drag Text";
PRUint32 len = 9;
trans->SetTransferData(&textPlainFlavor, ToNewCString(dragText), len); // transferable consumes the data
trans2->AddDataFlavor(&textPlainFlavor);
nsString dragText2 = "More Drag Text";
len = 14;
trans2->SetTransferData(&textPlainFlavor, ToNewCString(dragText2), len); // transferable consumes the data
nsCOMPtr<nsISupportsArray> items;
NS_NewISupportsArray(getter_AddRefs(items));
if ( items ) {
items->AppendElement(trans);
items->AppendElement(trans2);
dragService->InvokeDragSession(items, nsnull, nsIDragService::DRAGDROP_ACTION_COPY | nsIDragService::DRAGDROP_ACTION_MOVE);
}
}
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
} */
printf("ToolbarItem %d\n", aEvent->message);
return nsBoxFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
}
/*
* We are a frame and we do not maintain a ref count
*/
NS_IMETHODIMP_(nsrefcnt)
nsToolbarItemFrame::AddRef(void)
{
return NS_OK;
}
NS_IMETHODIMP_(nsrefcnt)
nsToolbarItemFrame::Release(void)
{
return NS_OK;
}

Просмотреть файл

@ -1,74 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsToolbarItemFrame_h___
#define nsToolbarItemFrame_h___
#include "nsBoxFrame.h"
class nsIFrame;
class nsIPresContext;
class nsIStyleContext;
class nsToolbarItemFrame : public nsBoxFrame
{
public:
nsToolbarItemFrame(nsIPresShell* aShell);
virtual ~nsToolbarItemFrame();
friend nsresult NS_NewToolbarItemFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
NS_IMETHOD_(nsrefcnt) AddRef(void);
NS_IMETHOD_(nsrefcnt) Release(void);
NS_IMETHOD Init(nsIPresContext* aPresContext,
nsIContent* aContent,
nsIFrame* aParent,
nsIStyleContext* aContext,
nsIFrame* asPrevInFlow);
NS_IMETHOD HandleEvent(nsIPresContext* aPresContext,
nsGUIEvent* aEvent,
nsEventStatus* aEventStatus);
}; // class nsToolbarItemFrame
#endif /* nsToolbarItemFrame_h___ */

Просмотреть файл

@ -64,11 +64,7 @@ NS_NewTreeLayout( nsIPresShell* aPresShell, nsCOMPtr<nsIBoxLayout>& aNewLayout)
}
nsTreeLayout::nsTreeLayout(nsIPresShell* aPresShell):
#ifdef MOZ_GRID2
nsGridRowGroupLayout(aPresShell)
#else
nsTempleLayout(aPresShell)
#endif
{
}
@ -111,11 +107,7 @@ nsXULTreeSliceFrame* nsTreeLayout::GetRowFrame(nsIBox* aBox)
NS_IMETHODIMP
nsTreeLayout::GetPrefSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
{
#ifdef MOZ_GRID2
nsresult rv = nsGridRowGroupLayout::GetPrefSize(aBox, aBoxLayoutState, aSize);
#else
nsresult rv = nsTempleLayout::GetPrefSize(aBox, aBoxLayoutState, aSize);
#endif
nsXULTreeOuterGroupFrame* frame = GetOuterFrame(aBox);
if (frame) {
@ -144,11 +136,7 @@ nsTreeLayout::GetPrefSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSiz
NS_IMETHODIMP
nsTreeLayout::GetMinSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
{
#ifdef MOZ_GRID2
nsresult rv = nsGridRowGroupLayout::GetMinSize(aBox, aBoxLayoutState, aSize);
#else
nsresult rv = nsTempleLayout::GetMinSize(aBox, aBoxLayoutState, aSize);
#endif
nsXULTreeOuterGroupFrame* frame = GetOuterFrame(aBox);
if (frame) {
@ -177,11 +165,7 @@ nsTreeLayout::GetMinSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize
NS_IMETHODIMP
nsTreeLayout::GetMaxSize(nsIBox* aBox, nsBoxLayoutState& aBoxLayoutState, nsSize& aSize)
{
#ifdef MOZ_GRID2
nsresult rv = nsGridRowGroupLayout::GetMaxSize(aBox, aBoxLayoutState, aSize);
#else
nsresult rv = nsTempleLayout::GetMaxSize(aBox, aBoxLayoutState, aSize);
#endif
nsXULTreeOuterGroupFrame* frame = GetOuterFrame(aBox);
if (frame) {

Просмотреть файл

@ -45,25 +45,14 @@
#ifndef nsTreeLayout_h___
#define nsTreeLayout_h___
#define MOZ_GRID2 1
#ifdef MOZ_GRID2
#include "nsGridRowGroupLayout.h"
#else
#include "nsTempleLayout.h"
#endif
#include "nsGridRowGroupLayout.h"
#include "nsXULTreeOuterGroupFrame.h"
#include "nsXULTreeSliceFrame.h"
class nsIBox;
class nsBoxLayoutState;
#ifdef MOZ_GRID2
class nsTreeLayout : public nsGridRowGroupLayout
#else
class nsTreeLayout : public nsTempleLayout
#endif
{
public:
nsTreeLayout(nsIPresShell* aShell);

Просмотреть файл

@ -43,19 +43,10 @@
#include "nsIStyleContext.h"
#include "nsINameSpaceManager.h"
#include "nsIXULTreeSlice.h"
#include "nsIMonument.h"
#include "nsIBoxLayout.h"
#include "nsMonumentLayout.h"
#define MOZ_GRID2 1
#ifdef MOZ_GRID2
#include "nsGrid.h"
#include "nsGridRow.h"
#else
#include "nsGridLayout.h"
#include "nsTempleLayout.h"
#endif
@ -137,7 +128,6 @@ nsXULTreeCellFrame::GetFrameForPoint(nsIPresContext* aPresContext,
nsCOMPtr<nsIBox> box(do_QueryInterface(mParent));
nsCOMPtr<nsIBoxLayout> lm;
#ifdef MOZ_GRID2
box->GetLayoutManager(getter_AddRefs(lm));
nsCOMPtr<nsIGridPart> part(do_QueryInterface(lm));
@ -147,39 +137,6 @@ nsXULTreeCellFrame::GetFrameForPoint(nsIPresContext* aPresContext,
nsIBox* splitBox = nsnull;
if (grid->GetColumnCount() > 0)
splitBox = grid->GetColumnAt(i)->GetBox();
#else
box->GetLayoutManager(getter_AddRefs(lm));
nsCOMPtr<nsIMonument> mon(do_QueryInterface(lm));
nsTempleLayout* temple = nsnull;
nsIBox* templeBox = nsnull;
mon->GetOtherTemple(box, &temple, &templeBox);
NS_IF_RELEASE(temple);
nsMonumentIterator iter(templeBox);
nsIBox* child = nsnull;
nsObeliskLayout* ob;
PRInt32 currIndex = 0;
if (left)
i--;
do {
if (i < 0) break;
iter.GetNextObelisk(&ob, PR_TRUE);
iter.GetBox(&child);
if (currIndex >= i)
break;
currIndex++;
} while (child);
nsIBox* splitBox = nsnull;
if (child)
child->GetNextBox(&splitBox);
#endif
nsIFrame* splitter = nsnull;
if (splitBox)

Просмотреть файл

@ -54,7 +54,6 @@
#include "nsIDragService.h"
#include "nsIServiceManager.h"
#include "nsIScrollableView.h"
#include "nsIMonument.h"
#include "nsTreeLayout.h"
#include "nsITimer.h"
#include "nsIBindingManager.h"
@ -65,13 +64,7 @@
#include "nsIStyleContext.h"
#include "nsIDOMText.h"
#define MOZ_GRID2 1
#ifdef MOZ_GRID2
#include "nsGridRowGroupLayout.h"
#else
#include "nsTempleLayout.h"
#endif
#include "nsGridRowGroupLayout.h"
#define TICK_FACTOR 50