bug #5589. Selection area is now calculated using the inherited Reflow rather than using the calculations used for the native listbox control. Fixed varous other rendering bugs related to frame-based listboxes. bug #2797. GetSize is no longer needed in nsListControlFrame and it has been removed. Fixed frame-based combobox nsComboboxFrame so that will set it's label to the first option in the drop-down list if a default value has not been specified. Added optgroup style rules to ua.css. Opt groups now render, but there are remaining problems with selection. Modified nsButtonControlFrame::Reflow to call nsFormFrame::AddFormControlFrame. This fixes a bug where Gfx-rendered submit button's were not working. Refactored code in nsListControlFrame in preparation for supporting option groups. Refactored selection code into SingleSelect and MultiSelect paths. Removed unused code in nsListControlFrame. Removed mSelectedFrame member variable. It is no longer needed. Fixed nsListControlFrame::SetProperty so that it will toggle the selection in a single select listbox. git-svn-id: svn://10.0.0.236/trunk@30740 18797224-902f-48f8-a5cc-f745e15eee43
234 lines
8.0 KiB
C++
234 lines
8.0 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (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 Netscape are Copyright (C) 1998
|
|
* Netscape Communications Corporation. All Rights Reserved.
|
|
*/
|
|
#ifndef nsListControlFrame_h___
|
|
#define nsListControlFrame_h___
|
|
|
|
#include "nsScrollFrame.h"
|
|
#include "nsIDOMFocusListener.h"
|
|
#include "nsIPresContext.h"
|
|
#include "nsIFormControlFrame.h"
|
|
#include "nsIListControlFrame.h"
|
|
|
|
|
|
class nsIDOMHTMLSelectElement;
|
|
class nsIDOMHTMLCollection;
|
|
class nsIDOMHTMLOptionElement;
|
|
class nsFormFrame;
|
|
class nsScrollFrame;
|
|
class nsIComboboxControlFrame;
|
|
class nsVoidArray;
|
|
|
|
|
|
/**
|
|
* The block frame has two additional named child lists:
|
|
* - "Floater-list" which contains the floated frames
|
|
* - "Bullet-list" which contains the bullet frame
|
|
*
|
|
* @see nsLayoutAtoms::bulletList
|
|
* @see nsLayoutAtoms::floaterList
|
|
*/
|
|
class nsListControlFrame : public nsScrollFrame,
|
|
public nsIFormControlFrame,
|
|
public nsIListControlFrame
|
|
{
|
|
public:
|
|
friend nsresult NS_NewListControlFrame(nsIFrame*& aNewFrame);
|
|
|
|
// nsISupports
|
|
NS_DECL_ISUPPORTS
|
|
|
|
// nsISupports overrides
|
|
// NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
|
|
|
NS_IMETHOD GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame);
|
|
|
|
NS_IMETHOD HandleEvent(nsIPresContext& aPresContext,
|
|
nsGUIEvent* aEvent,
|
|
nsEventStatus& aEventStatus);
|
|
|
|
// nsIFrame
|
|
NS_IMETHOD SetInitialChildList(nsIPresContext& aPresContext,
|
|
nsIAtom* aListName,
|
|
nsIFrame* aChildList);
|
|
|
|
NS_IMETHOD Reflow(nsIPresContext& aCX,
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus);
|
|
|
|
NS_IMETHOD Init(nsIPresContext& aPresContext,
|
|
nsIContent* aContent,
|
|
nsIFrame* aParent,
|
|
nsIStyleContext* aContext,
|
|
nsIFrame* aPrevInFlow);
|
|
|
|
NS_IMETHOD Deselect();
|
|
|
|
// nsIFormControlFrame
|
|
NS_IMETHOD SetProperty(nsIAtom* aName, const nsString& aValue);
|
|
NS_IMETHOD GetProperty(nsIAtom* aName, nsString& aValue);
|
|
|
|
/*virtual nsresult Focus(nsIDOMEvent* aEvent);
|
|
virtual nsresult Blur(nsIDOMEvent* aEvent); */
|
|
|
|
NS_METHOD GetMultiple(PRBool* aResult, nsIDOMHTMLSelectElement* aSelect = nsnull);
|
|
|
|
// XXX the following methods are not referenced. They should be removed when it is
|
|
// confirmed that they are not needed
|
|
virtual nsresult GetSizeFromContent(PRInt32* aSize) const;
|
|
NS_IMETHOD GetMaxLength(PRInt32* aSize);
|
|
// XXX: End of the unreferenced methods
|
|
|
|
virtual nscoord GetVerticalInsidePadding(float aPixToTwip,
|
|
nscoord aInnerHeight) const;
|
|
virtual nscoord GetHorizontalInsidePadding(nsIPresContext& aPresContext,
|
|
float aPixToTwip,
|
|
nscoord aInnerWidth,
|
|
nscoord aCharWidth) const;
|
|
|
|
|
|
virtual nsresult RequiresWidget(PRBool &aRequiresWidget);
|
|
|
|
|
|
|
|
NS_IMETHOD GetFont(nsIPresContext* aPresContext,
|
|
nsFont& aFont);
|
|
|
|
|
|
|
|
NS_IMETHOD GetFormContent(nsIContent*& aContent) const;
|
|
|
|
|
|
/////////////////////////
|
|
// nsHTMLContainerFrame
|
|
/////////////////////////
|
|
virtual PRIntn GetSkipSides() const;
|
|
|
|
/////////////////////////
|
|
// nsIFormControlFrame
|
|
/////////////////////////
|
|
NS_IMETHOD GetType(PRInt32* aType) const;
|
|
|
|
NS_IMETHOD GetName(nsString* aName);
|
|
|
|
virtual void SetFocus(PRBool aOn = PR_TRUE, PRBool aRepaint = PR_FALSE);
|
|
|
|
virtual void MouseClicked(nsIPresContext* aPresContext);
|
|
|
|
virtual void Reset();
|
|
|
|
virtual PRBool IsSuccessful(nsIFormControlFrame* aSubmitter);
|
|
|
|
virtual PRInt32 GetMaxNumValues();
|
|
|
|
virtual PRBool GetNamesValues(PRInt32 aMaxNumValues, PRInt32& aNumValues,
|
|
nsString* aValues, nsString* aNames);
|
|
|
|
virtual void SetFormFrame(nsFormFrame* aFrame);
|
|
|
|
|
|
// nsIListControlFrame
|
|
NS_IMETHOD SetComboboxFrame(nsIFrame* aComboboxFrame);
|
|
NS_IMETHOD GetSelectedItem(nsString & aStr);
|
|
NS_IMETHOD AboutToDropDown();
|
|
NS_IMETHOD CaptureMouseEvents(PRBool aGrabMouseEvents);
|
|
|
|
// Static Methods
|
|
static nsIDOMHTMLSelectElement* GetSelect(nsIContent * aContent);
|
|
static nsIDOMHTMLCollection* GetOptions(nsIContent * aContent, nsIDOMHTMLSelectElement* aSelect = nsnull);
|
|
static nsIDOMHTMLOptionElement* GetOption(nsIDOMHTMLCollection& aOptions, PRUint32 aIndex);
|
|
static PRBool GetOptionValue(nsIDOMHTMLCollection& aCollecton, PRUint32 aIndex, nsString& aValue);
|
|
|
|
nsIContent* GetOptionContent(PRUint32 aIndex);
|
|
PRBool IsFrameSelected(PRUint32 aIndex);
|
|
void SetFrameSelected(PRUint32 aIndex, PRBool aSelected);
|
|
|
|
protected:
|
|
nsListControlFrame();
|
|
virtual ~nsListControlFrame();
|
|
|
|
PRInt32 GetNumberOfOptions();
|
|
|
|
nsIFrame * GetOptionFromChild(nsIFrame* aParentFrame);
|
|
|
|
nsresult GetFrameForPointUsing(const nsPoint& aPoint,
|
|
nsIAtom* aList,
|
|
nsIFrame** aFrame);
|
|
|
|
// Utility methods
|
|
|
|
void DisplaySelected(nsIContent* aContent);
|
|
void DisplayDeselected(nsIContent* aContent);
|
|
void UpdateItem(nsIContent* aContent, PRBool aSelected);
|
|
void ForceRedraw(nsIContent* aContent);
|
|
PRBool IsOptionGroup(nsIFrame* aFrame);
|
|
void ConstructSelectableList(nsIFrame* aFrame, nsVoidArray *aList);
|
|
nsIFrame* GetFirstSelectableFrame(nsVoidArray *aList, PRInt32& aPos);
|
|
nsIFrame* GetNextSelectableFrame(nsVoidArray *aList, PRInt32& aPos);
|
|
void SingleSelection();
|
|
void MultipleSelection(PRBool aIsShift, PRBool aIsControl);
|
|
void SelectIndex(PRInt32 aIndex);
|
|
void ToggleSelected(PRInt32 aIndex, nsIContent *aContent);
|
|
void SetSelectedIndex(PRInt32 aIndex, nsIContent *aContent);
|
|
void SetContentSelectedAttribute(PRUint32 aIndex, PRBool aSelected);
|
|
|
|
// nsHTMLContainerFrame overrides
|
|
|
|
void ClearSelection();
|
|
void InitializeFromContent(PRBool aDoDisplay = PR_FALSE);
|
|
|
|
void ExtendedSelection(PRInt32 aStartIndex, PRInt32 aEndIndex, PRBool aDoInvert, PRBool aSetValue);
|
|
|
|
NS_IMETHOD HandleLikeDropDownListEvent(nsIPresContext& aPresContext,
|
|
nsGUIEvent* aEvent,
|
|
nsEventStatus& aEventStatus);
|
|
NS_IMETHOD HandleLikeListEvent(nsIPresContext& aPresContext,
|
|
nsGUIEvent* aEvent,
|
|
nsEventStatus& aEventStatus);
|
|
PRInt32 SetContentSelected(nsIFrame * aHitFrame,
|
|
nsIContent *& aHitContent,
|
|
PRBool aDisplaySelected);
|
|
|
|
// Data Members
|
|
nscoord mBorderOffsetY;
|
|
nsFormFrame* mFormFrame;
|
|
PRInt32 mNumRows;
|
|
PRInt32 mNumSelections;
|
|
PRInt32 mMaxNumSelections;
|
|
PRBool mMultipleSelections;
|
|
PRInt32 mSelectedIndex;
|
|
PRInt32 mStartExtendedIndex;
|
|
PRInt32 mEndExtendedIndex;
|
|
nsIFrame * mHitFrame;
|
|
nsIContent * mHitContent;
|
|
nsIFrame * mCurrentHitFrame;
|
|
nsIContent * mCurrentHitContent;
|
|
nsIContent * mSelectedContent;
|
|
PRBool mIsInitializedFromContent;
|
|
nsIFrame * mContentFrame;
|
|
PRBool mInDropDownMode;
|
|
nsIComboboxControlFrame * mComboboxFrame;
|
|
nsString mSelectionStr;
|
|
nsVoidArray* mSelectableFrames;
|
|
|
|
};
|
|
|
|
#endif /* nsListControlFrame_h___ */
|
|
|