2001-09-29 00:14:13 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
2004-04-18 18:30:37 +04:00
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
1998-09-10 21:23:31 +04:00
|
|
|
*
|
2004-04-18 18:30:37 +04:00
|
|
|
* The contents of this file are subject to the Mozilla 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/MPL/
|
1998-09-10 21:23:31 +04:00
|
|
|
*
|
2001-09-29 00:14:13 +04:00
|
|
|
* 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.
|
1998-09-10 21:23:31 +04:00
|
|
|
*
|
1999-11-06 06:40:37 +03:00
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
2004-04-18 18:30:37 +04:00
|
|
|
* The Initial Developer of the Original Code is
|
2001-09-29 00:14:13 +04:00
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
1999-11-06 06:40:37 +03:00
|
|
|
*
|
2001-09-29 00:14:13 +04:00
|
|
|
* Contributor(s):
|
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
2004-04-18 18:30:37 +04:00
|
|
|
* either of 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"),
|
2001-09-29 00:14:13 +04:00
|
|
|
* 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
|
2004-04-18 18:30:37 +04:00
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
2001-09-29 00:14:13 +04:00
|
|
|
* 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
|
2004-04-18 18:30:37 +04:00
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
2001-09-29 00:14:13 +04:00
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
2006-03-29 22:29:03 +04:00
|
|
|
|
|
|
|
/* rendering object for HTML <frameset> elements */
|
|
|
|
|
1998-09-10 21:23:31 +04:00
|
|
|
#ifndef nsHTMLFrameset_h___
|
|
|
|
#define nsHTMLFrameset_h___
|
|
|
|
|
2007-01-30 03:06:41 +03:00
|
|
|
#include "nsGkAtoms.h"
|
1998-09-10 21:23:31 +04:00
|
|
|
#include "nsHTMLContainerFrame.h"
|
1998-09-25 01:37:45 +04:00
|
|
|
#include "nsColor.h"
|
2001-11-02 05:19:49 +03:00
|
|
|
#include "nsIObserver.h"
|
|
|
|
#include "nsWeakPtr.h"
|
2002-08-06 05:06:50 +04:00
|
|
|
#include "nsIFrameSetElement.h"
|
1998-09-10 21:23:31 +04:00
|
|
|
|
|
|
|
class nsIContent;
|
|
|
|
class nsIFrame;
|
2004-08-01 03:15:21 +04:00
|
|
|
class nsPresContext;
|
1998-09-10 21:23:31 +04:00
|
|
|
class nsIRenderingContext;
|
|
|
|
struct nsRect;
|
1998-10-02 08:10:00 +04:00
|
|
|
struct nsHTMLReflowState;
|
1998-09-10 21:23:31 +04:00
|
|
|
struct nsSize;
|
|
|
|
class nsIAtom;
|
|
|
|
class nsHTMLFramesetBorderFrame;
|
2005-04-29 03:48:28 +04:00
|
|
|
class nsGUIEvent;
|
1998-09-10 21:23:31 +04:00
|
|
|
class nsHTMLFramesetFrame;
|
|
|
|
|
|
|
|
#define NS_IFRAMESETFRAME_IID \
|
2002-04-17 08:17:16 +04:00
|
|
|
{ 0xf47deac0, 0x4200, 0x11d2, \
|
|
|
|
{ 0x80, 0x3c, 0x0, 0x60, 0x8, 0x15, 0xa7, 0x91 } }
|
1998-09-10 21:23:31 +04:00
|
|
|
|
|
|
|
#define NO_COLOR 0xFFFFFFFA
|
|
|
|
|
|
|
|
struct nsBorderColor
|
|
|
|
{
|
|
|
|
nscolor mLeft;
|
|
|
|
nscolor mRight;
|
|
|
|
nscolor mTop;
|
|
|
|
nscolor mBottom;
|
|
|
|
|
|
|
|
nsBorderColor() { Set(NO_COLOR); }
|
|
|
|
~nsBorderColor() {}
|
|
|
|
void Set(nscolor aColor) { mLeft = mRight = mTop = mBottom = aColor; }
|
|
|
|
};
|
|
|
|
|
|
|
|
enum nsFrameborder {
|
|
|
|
eFrameborder_Yes = 0,
|
|
|
|
eFrameborder_No,
|
|
|
|
eFrameborder_Notset
|
|
|
|
};
|
|
|
|
|
|
|
|
struct nsFramesetDrag {
|
1999-03-10 09:13:35 +03:00
|
|
|
PRBool mVertical; // vertical if true, otherwise horizontal
|
|
|
|
PRInt32 mIndex; // index of left col or top row of effected area
|
|
|
|
PRInt32 mChange; // pos for left to right or top to bottom, neg otherwise
|
|
|
|
nsHTMLFramesetFrame* mSource; // frameset whose border was dragged to cause the resize
|
|
|
|
PRBool mActive;
|
|
|
|
|
|
|
|
nsFramesetDrag();
|
|
|
|
nsFramesetDrag(PRBool aVertical,
|
|
|
|
PRInt32 aIndex,
|
|
|
|
PRInt32 aChange,
|
|
|
|
nsHTMLFramesetFrame* aSource);
|
|
|
|
void Reset(PRBool aVertical,
|
|
|
|
PRInt32 aIndex,
|
|
|
|
PRInt32 aChange,
|
|
|
|
nsHTMLFramesetFrame* aSource);
|
|
|
|
void UnSet();
|
1998-09-10 21:23:31 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
* nsHTMLFramesetFrame
|
|
|
|
******************************************************************************/
|
2004-04-30 03:34:19 +04:00
|
|
|
class nsHTMLFramesetFrame : public nsHTMLContainerFrame
|
2001-11-02 05:19:49 +03:00
|
|
|
{
|
2002-04-05 09:42:10 +04:00
|
|
|
public:
|
2002-04-17 08:17:16 +04:00
|
|
|
// Woohoo, concrete class with an IID!
|
2005-11-11 17:36:26 +03:00
|
|
|
NS_DECLARE_STATIC_IID_ACCESSOR(NS_IFRAMESETFRAME_IID)
|
2002-04-17 08:17:16 +04:00
|
|
|
|
2006-03-27 01:30:36 +04:00
|
|
|
nsHTMLFramesetFrame(nsStyleContext* aContext);
|
1998-09-10 21:23:31 +04:00
|
|
|
|
|
|
|
virtual ~nsHTMLFramesetFrame();
|
|
|
|
|
2004-04-30 03:34:19 +04:00
|
|
|
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
1999-03-10 09:13:35 +03:00
|
|
|
|
2006-03-09 21:55:21 +03:00
|
|
|
NS_IMETHOD Init(nsIContent* aContent,
|
1999-03-10 09:13:35 +03:00
|
|
|
nsIFrame* aParent,
|
|
|
|
nsIFrame* aPrevInFlow);
|
1998-09-10 21:23:31 +04:00
|
|
|
|
|
|
|
static PRBool gDragInProgress;
|
1999-03-10 09:13:35 +03:00
|
|
|
|
1998-09-10 21:23:31 +04:00
|
|
|
void GetSizeOfChild(nsIFrame* aChild, nsSize& aSize);
|
|
|
|
|
1999-03-10 09:13:35 +03:00
|
|
|
void GetSizeOfChildAt(PRInt32 aIndexInParent,
|
|
|
|
nsSize& aSize,
|
|
|
|
nsPoint& aCellIndex);
|
1998-09-10 21:23:31 +04:00
|
|
|
|
|
|
|
static nsHTMLFramesetFrame* GetFramesetParent(nsIFrame* aChild);
|
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
NS_IMETHOD HandleEvent(nsPresContext* aPresContext,
|
1999-03-10 09:13:35 +03:00
|
|
|
nsGUIEvent* aEvent,
|
1999-11-24 09:03:41 +03:00
|
|
|
nsEventStatus* aEventStatus);
|
1998-09-10 21:23:31 +04:00
|
|
|
|
2004-12-31 00:56:11 +03:00
|
|
|
NS_IMETHOD GetCursor(const nsPoint& aPoint,
|
|
|
|
nsIFrame::Cursor& aCursor);
|
1998-09-10 21:23:31 +04:00
|
|
|
|
2006-01-26 05:29:17 +03:00
|
|
|
NS_IMETHOD BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
const nsDisplayListSet& aLists);
|
1998-09-10 21:23:31 +04:00
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
NS_IMETHOD Reflow(nsPresContext* aPresContext,
|
1998-10-02 08:10:00 +04:00
|
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
|
|
const nsHTMLReflowState& aReflowState,
|
|
|
|
nsReflowStatus& aStatus);
|
1998-09-10 21:23:31 +04:00
|
|
|
|
2005-09-06 06:14:36 +04:00
|
|
|
virtual nsIAtom* GetType() const;
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 08:38:33 +03:00
|
|
|
#ifdef DEBUG
|
|
|
|
NS_IMETHOD GetFrameName(nsAString& aResult) const;
|
|
|
|
#endif
|
2005-09-06 06:14:36 +04:00
|
|
|
|
2005-08-17 02:52:48 +04:00
|
|
|
virtual PRBool IsLeaf() const;
|
|
|
|
|
1998-09-10 21:23:31 +04:00
|
|
|
NS_IMETHOD VerifyTree() const;
|
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
void StartMouseDrag(nsPresContext* aPresContext,
|
1999-03-10 09:13:35 +03:00
|
|
|
nsHTMLFramesetBorderFrame* aBorder,
|
|
|
|
nsGUIEvent* aEvent);
|
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
void MouseDrag(nsPresContext* aPresContext,
|
1999-03-10 09:13:35 +03:00
|
|
|
nsGUIEvent* aEvent);
|
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
void EndMouseDrag(nsPresContext* aPresContext);
|
1998-09-10 21:23:31 +04:00
|
|
|
|
|
|
|
nsFrameborder GetParentFrameborder() { return mParentFrameborder; }
|
|
|
|
|
1999-03-10 09:13:35 +03:00
|
|
|
void SetParentFrameborder(nsFrameborder aValue) { mParentFrameborder = aValue; }
|
1998-11-28 21:59:38 +03:00
|
|
|
|
1999-03-10 09:13:35 +03:00
|
|
|
nsFramesetDrag& GetDrag() { return mDrag; }
|
1998-09-10 21:23:31 +04:00
|
|
|
|
2001-04-12 12:16:54 +04:00
|
|
|
void RecalculateBorderResize();
|
|
|
|
|
1999-03-10 09:13:35 +03:00
|
|
|
protected:
|
|
|
|
void Scale(nscoord aDesired,
|
|
|
|
PRInt32 aNumIndicies,
|
|
|
|
PRInt32* aIndicies,
|
2000-01-07 08:49:20 +03:00
|
|
|
PRInt32 aNumItems,
|
1999-03-10 09:13:35 +03:00
|
|
|
PRInt32* aItems);
|
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
void CalculateRowCol(nsPresContext* aPresContext,
|
2002-08-06 05:06:50 +04:00
|
|
|
nscoord aSize,
|
|
|
|
PRInt32 aNumSpecs,
|
|
|
|
const nsFramesetSpec* aSpecs,
|
|
|
|
nscoord* aValues);
|
1999-03-10 09:13:35 +03:00
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
void GenerateRowCol(nsPresContext* aPresContext,
|
2002-08-06 05:06:50 +04:00
|
|
|
nscoord aSize,
|
|
|
|
PRInt32 aNumSpecs,
|
|
|
|
const nsFramesetSpec* aSpecs,
|
|
|
|
nscoord* aValues,
|
|
|
|
nsString& aNewAttr);
|
1999-06-11 04:51:05 +04:00
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
virtual void GetDesiredSize(nsPresContext* aPresContext,
|
1998-10-02 08:10:00 +04:00
|
|
|
const nsHTMLReflowState& aReflowState,
|
1999-03-10 09:13:35 +03:00
|
|
|
nsHTMLReflowMetrics& aDesiredSize);
|
1998-09-10 21:23:31 +04:00
|
|
|
|
2004-08-01 03:15:21 +04:00
|
|
|
PRInt32 GetBorderWidth(nsPresContext* aPresContext,
|
2001-11-06 03:44:25 +03:00
|
|
|
PRBool aTakeForcingIntoAccount);
|
1999-03-10 09:13:35 +03:00
|
|
|
|
1998-09-10 21:23:31 +04:00
|
|
|
PRInt32 GetParentBorderWidth() { return mParentBorderWidth; }
|
1999-03-10 09:13:35 +03:00
|
|
|
|
|
|
|
void SetParentBorderWidth(PRInt32 aWidth) { mParentBorderWidth = aWidth; }
|
|
|
|
|
1998-09-10 21:23:31 +04:00
|
|
|
nscolor GetParentBorderColor() { return mParentBorderColor; }
|
1999-03-10 09:13:35 +03:00
|
|
|
|
|
|
|
void SetParentBorderColor(nscolor aColor) { mParentBorderColor = aColor; }
|
1998-09-10 21:23:31 +04:00
|
|
|
|
2001-12-07 22:40:07 +03:00
|
|
|
nsFrameborder GetFrameBorder();
|
1999-03-10 09:13:35 +03:00
|
|
|
|
2001-12-07 22:40:07 +03:00
|
|
|
nsFrameborder GetFrameBorder(nsIContent* aContent);
|
1999-03-10 09:13:35 +03:00
|
|
|
|
1998-09-10 21:23:31 +04:00
|
|
|
nscolor GetBorderColor();
|
1999-03-10 09:13:35 +03:00
|
|
|
|
1998-09-10 21:23:31 +04:00
|
|
|
nscolor GetBorderColor(nsIContent* aFrameContent);
|
1999-03-10 09:13:35 +03:00
|
|
|
|
1998-09-10 21:23:31 +04:00
|
|
|
PRBool GetNoResize(nsIFrame* aChildFrame);
|
|
|
|
|
|
|
|
virtual PRIntn GetSkipSides() const;
|
|
|
|
|
1998-10-02 08:10:00 +04:00
|
|
|
void ReflowPlaceChild(nsIFrame* aChild,
|
2004-08-01 03:15:21 +04:00
|
|
|
nsPresContext* aPresContext,
|
1998-10-02 08:10:00 +04:00
|
|
|
const nsHTMLReflowState& aReflowState,
|
|
|
|
nsPoint& aOffset,
|
|
|
|
nsSize& aSize,
|
|
|
|
nsPoint* aCellIndex = 0);
|
1998-09-10 21:23:31 +04:00
|
|
|
|
1999-03-10 09:13:35 +03:00
|
|
|
PRBool CanResize(PRBool aVertical,
|
|
|
|
PRBool aLeft);
|
|
|
|
|
|
|
|
PRBool CanChildResize(PRBool aVertical,
|
|
|
|
PRBool aLeft,
|
|
|
|
PRInt32 aChildX,
|
|
|
|
PRBool aFrameset);
|
|
|
|
|
|
|
|
void SetBorderResize(PRInt32* aChildTypes,
|
|
|
|
nsHTMLFramesetBorderFrame* aBorderFrame);
|
|
|
|
|
1998-09-10 21:23:31 +04:00
|
|
|
PRBool ChildIsFrameset(nsIFrame* aChild);
|
|
|
|
|
2004-04-30 03:34:19 +04:00
|
|
|
static int FrameResizePrefCallback(const char* aPref, void* aClosure);
|
|
|
|
|
1998-09-10 21:23:31 +04:00
|
|
|
PRInt32 mNumRows;
|
|
|
|
nscoord* mRowSizes; // currently computed row sizes
|
|
|
|
PRInt32 mNumCols;
|
|
|
|
nscoord* mColSizes; // currently computed col sizes
|
|
|
|
PRInt32 mNonBorderChildCount;
|
|
|
|
PRInt32 mNonBlankChildCount;
|
|
|
|
PRInt32 mEdgeVisibility;
|
|
|
|
nsBorderColor mEdgeColors;
|
|
|
|
nsFrameborder mParentFrameborder;
|
|
|
|
nscolor mParentBorderColor;
|
|
|
|
PRInt32 mParentBorderWidth;
|
|
|
|
|
|
|
|
nsHTMLFramesetBorderFrame* mDragger;
|
1999-03-10 09:13:35 +03:00
|
|
|
nsFramesetDrag mDrag;
|
1999-06-11 05:18:50 +04:00
|
|
|
nsPoint mFirstDragPoint;
|
|
|
|
PRInt32 mPrevNeighborOrigSize; // used during resize
|
|
|
|
PRInt32 mNextNeighborOrigSize;
|
1998-09-10 21:23:31 +04:00
|
|
|
PRInt32 mMinDrag;
|
1998-09-24 21:56:35 +04:00
|
|
|
PRInt32 mChildCount;
|
1999-03-10 09:13:35 +03:00
|
|
|
nsHTMLFramesetFrame* mTopLevelFrameset;
|
2001-04-12 12:16:54 +04:00
|
|
|
nsHTMLFramesetBorderFrame** mVerBorders; // vertical borders
|
|
|
|
nsHTMLFramesetBorderFrame** mHorBorders; // horizontal borders
|
2001-10-07 04:19:01 +04:00
|
|
|
|
|
|
|
PRInt32* mChildTypes; // frameset/frame distinction of children
|
|
|
|
nsFrameborder* mChildFrameborder; // the frameborder attr of children
|
|
|
|
nsBorderColor* mChildBorderColors;
|
|
|
|
|
2001-11-02 05:19:49 +03:00
|
|
|
PRBool mForceFrameResizability;
|
1998-09-10 21:23:31 +04:00
|
|
|
};
|
|
|
|
|
2005-11-11 17:36:26 +03:00
|
|
|
NS_DEFINE_STATIC_IID_ACCESSOR(nsHTMLFramesetFrame, NS_IFRAMESETFRAME_IID)
|
1998-09-10 21:23:31 +04:00
|
|
|
|
|
|
|
#endif
|