gecko-dev/layout/xul/base/src/nsSliderFrame.cpp

1162 lines
32 KiB
C++
Raw Normal View History

1999-04-20 21:39:52 +00:00
/* -*- 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.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/
1999-04-20 21:39:52 +00: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.
1999-04-20 21:39:52 +00:00
*
* 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.
*
2000-06-03 02:12:19 +00:00
* AUTHOR: Eric Vaughan
*
* Contributor(s):
2000-06-03 02:12:19 +00:00
* Tomi Leppikangas
* Davor Cubranic
1999-04-20 21:39:52 +00:00
*/
//
// Eric Vaughan
// Netscape Communications
//
// See documentation in associated header file
//
1999-04-20 21:39:52 +00:00
1999-04-20 21:43:09 +00:00
#include "nsSliderFrame.h"
1999-04-20 21:39:52 +00:00
#include "nsIStyleContext.h"
#include "nsIPresContext.h"
#include "nsIContent.h"
#include "nsCOMPtr.h"
#include "nsHTMLIIDs.h"
#include "nsUnitConversion.h"
1999-04-20 21:39:52 +00:00
#include "nsINameSpaceManager.h"
#include "nsXULAtoms.h"
#include "nsHTMLAtoms.h"
#include "nsIReflowCommand.h"
#include "nsHTMLParts.h"
#include "nsIPresShell.h"
#include "nsStyleChangeList.h"
#include "nsCSSRendering.h"
#include "nsHTMLAtoms.h"
#include "nsIDOMEventReceiver.h"
#include "nsIViewManager.h"
#include "nsIDOMMouseEvent.h"
#include "nsDocument.h"
#include "nsTitledButtonFrame.h"
#include "nsScrollbarButtonFrame.h"
1999-06-23 17:00:17 +00:00
#include "nsIScrollbarListener.h"
2000-06-06 23:13:05 +00:00
#include "nsIScrollbarMediator.h"
#include "nsIScrollbarFrame.h"
#include "nsISupportsArray.h"
1999-08-19 22:16:23 +00:00
#include "nsIXMLContent.h"
#include "nsXULAtoms.h"
#include "nsHTMLAtoms.h"
#include "nsINameSpaceManager.h"
#include "nsIScrollableView.h"
#include "nsRepeatService.h"
2000-03-31 07:02:06 +00:00
#include "nsBoxLayoutState.h"
#include "nsSprocketLayout.h"
#include "nsIPref.h"
#include "nsIServiceManager.h"
1999-08-19 22:16:23 +00:00
1999-10-12 00:16:06 +00:00
#define DEBUG_SLIDER PR_FALSE
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
1999-04-20 21:39:52 +00:00
nsresult
NS_NewSliderFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame)
1999-04-20 21:39:52 +00:00
{
NS_PRECONDITION(aNewFrame, "null OUT ptr");
if (nsnull == aNewFrame) {
return NS_ERROR_NULL_POINTER;
}
2000-03-31 07:02:06 +00:00
nsSliderFrame* it = new (aPresShell) nsSliderFrame(aPresShell);
if (nsnull == it)
1999-04-20 21:39:52 +00:00
return NS_ERROR_OUT_OF_MEMORY;
*aNewFrame = it;
1999-04-20 21:39:52 +00:00
return NS_OK;
} // NS_NewSliderFrame
1999-04-20 21:39:52 +00:00
2000-03-31 07:02:06 +00:00
nsSliderFrame::nsSliderFrame(nsIPresShell* aPresShell):nsBoxFrame(aPresShell),
mCurPos(0), mScrollbarListener(nsnull),mChange(0), mMediator(nsnull)
1999-04-20 21:39:52 +00:00
{
}
1999-04-20 21:39:52 +00:00
1999-08-19 22:16:23 +00:00
// stop timer
nsSliderFrame::~nsSliderFrame()
{
mRedrawImmediate = PR_FALSE;
1999-08-19 22:16:23 +00:00
}
NS_IMETHODIMP
nsSliderFrame::Init(nsIPresContext* aPresContext,
nsIContent* aContent,
nsIFrame* aParent,
nsIStyleContext* aContext,
nsIFrame* aPrevInFlow)
1999-04-20 21:39:52 +00:00
{
2000-03-31 07:02:06 +00:00
nsresult rv = nsBoxFrame::Init(aPresContext, aContent, aParent, aContext, aPrevInFlow);
nsresult rv2;
mMiddlePref=PR_FALSE;
nsCOMPtr<nsIPref> pref = do_GetService(kPrefCID, &rv2);
if(NS_SUCCEEDED(rv2))
pref->GetBoolPref("middlemouse.scrollbarPosition", &mMiddlePref);
CreateViewForFrame(aPresContext,this,aContext,PR_TRUE);
1999-08-19 22:16:23 +00:00
nsIView* view;
GetView(aPresContext, &view);
1999-08-19 22:16:23 +00:00
view->SetContentTransparency(PR_TRUE);
// XXX Hack
mPresContext = aPresContext;
return rv;
1999-04-20 21:39:52 +00:00
}
PRInt32
nsSliderFrame::GetCurrentPosition(nsIContent* content)
{
return GetIntegerAttribute(content, nsXULAtoms::curpos, 0);
}
PRInt32
nsSliderFrame::GetMaxPosition(nsIContent* content)
{
return GetIntegerAttribute(content, nsXULAtoms::maxpos, 100);
}
PRInt32
nsSliderFrame::GetIncrement(nsIContent* content)
{
return GetIntegerAttribute(content, nsXULAtoms::increment, 1);
}
PRInt32
nsSliderFrame::GetPageIncrement(nsIContent* content)
{
return GetIntegerAttribute(content, nsXULAtoms::pageincrement, 10);
}
PRInt32
nsSliderFrame::GetIntegerAttribute(nsIContent* content, nsIAtom* atom, PRInt32 defaultValue)
{
Landing changes Vidur made while the tree was closed for beta1 work, here's a list of the changes. r=me [1] Cutting down the size of content. Made nsIJSScriptObject inherit from nsIScriptObjectOwner [2] Cutting down the size of content. Made nsITextContent inherit from nsIContent. [3] Cutting down the size of content. Moved implementation of nsIDOMReceiver to nsListenerManager. This is not true aggregation since it isn't transitive, but it's OK for now. It will be necessary for nsListenerManager to have a reference to its content in the future anyway, so the transitivity could be done. dom/public/nsDOMPropEnums.h,v - bug 12559 dom/public/nsIJSScriptObject.h,v - [1] dom/public/html/MANIFEST,v - bug 12559 dom/public/html/Makefile.in,v - bug 12559 dom/public/html/makefile.win,v - bug 12559 dom/public/html/nsIDOMHTMLInputElement.h,v - bug 17544 dom/public/idl/html/HTMLAnchorElement.idl,v - bug 12559 dom/public/idl/html/HTMLAreaElement.idl,v - bug 12559 dom/public/idl/html/HTMLInputElement.idl,v - bug 17544 dom/src/base/nsGlobalWindow.cpp,v - bug 30700 dom/src/base/nsGlobalWindow.h,v - [1] dom/src/base/nsLocation.cpp,v - [1] dom/src/html/nsJSHTMLAnchorElement.cpp,v - bug 12559 dom/src/html/nsJSHTMLAreaElement.cpp,v - bug 12559 dom/src/html/nsJSHTMLInputElement.cpp,v - bug 17544 layout/base/public/nsIDocument.h,v - bug 27953 layout/base/public/nsITextContent.h,v - [2] layout/base/src/nsCommentNode.cpp,v - [2] layout/base/src/nsDocument.cpp,v - bug 27953 layout/base/src/nsDocument.h,v - bug 27953 layout/base/src/nsDocumentViewer.cpp,v - bug 27953 layout/base/src/nsGenericDOMDataNode.cpp,v - [3] layout/base/src/nsGenericDOMDataNode.h,v - [3] layout/base/src/nsGenericElement.cpp,v - [3] layout/base/src/nsGenericElement.h,v - [3] layout/base/src/nsNameSpaceManager.cpp,v - bug 7834 layout/base/src/nsStyleContext.cpp,v - outline property shouldn't reflow layout/base/src/nsTextNode.cpp,v - [2] layout/events/src/nsEventListenerManager.cpp,v - [3] layout/events/src/nsEventListenerManager.h,v - [3] layout/html/base/src/nsGfxScrollFrame.cpp,v - nsString->nsAutoString layout/html/content/src/nsAttributeContent.cpp,v - [2] layout/html/content/src/nsHTMLAnchorElement.cpp,v - [1][3] layout/html/content/src/nsHTMLAppletElement.cpp,v - [1][3] layout/html/content/src/nsHTMLAreaElement.cpp,v - [1][3] layout/html/content/src/nsHTMLBRElement.cpp,v - [1][3] layout/html/content/src/nsHTMLBaseElement.cpp,v - [1][3] layout/html/content/src/nsHTMLBaseFontElement.cpp,v - [1][3] layout/html/content/src/nsHTMLBodyElement.cpp,v - [1][3] layout/html/content/src/nsHTMLButtonElement.cpp,v - [1][3] layout/html/content/src/nsHTMLDListElement.cpp,v - [1][3] layout/html/content/src/nsHTMLDelElement.cpp,v - [1][3] layout/html/content/src/nsHTMLDirectoryElement.cpp,v - [1][3] layout/html/content/src/nsHTMLDivElement.cpp,v - [1][3] layout/html/content/src/nsHTMLEmbedElement.cpp,v - [1][3] layout/html/content/src/nsHTMLFieldSetElement.cpp,v - [1][3] layout/html/content/src/nsHTMLFontElement.cpp,v - [1][3] layout/html/content/src/nsHTMLFormElement.cpp,v - [1][3] layout/html/content/src/nsHTMLFrameElement.cpp,v - [1][3] layout/html/content/src/nsHTMLFrameSetElement.cpp,v - [1][3] layout/html/content/src/nsHTMLHRElement.cpp,v - [1][3] layout/html/content/src/nsHTMLHeadElement.cpp,v - [1][3] layout/html/content/src/nsHTMLHeadingElement.cpp,v - [1][3] layout/html/content/src/nsHTMLHtmlElement.cpp,v - [1][3] layout/html/content/src/nsHTMLIFrameElement.cpp,v - [1][3] layout/html/content/src/nsHTMLImageElement.cpp,v - [1][3] layout/html/content/src/nsHTMLInputElement.cpp,v - [1][3] layout/html/content/src/nsHTMLInsElement.cpp,v - [1][3] layout/html/content/src/nsHTMLIsIndexElement.cpp,v - [1][3] layout/html/content/src/nsHTMLLIElement.cpp,v - [1][3] layout/html/content/src/nsHTMLLabelElement.cpp,v - [1][3] layout/html/content/src/nsHTMLLayerElement.cpp,v - [1][3] layout/html/content/src/nsHTMLLegendElement.cpp,v - [1][3] layout/html/content/src/nsHTMLLinkElement.cpp,v - [1][3] layout/html/content/src/nsHTMLMapElement.cpp,v - [1][3] layout/html/content/src/nsHTMLMenuElement.cpp,v - [1][3] layout/html/content/src/nsHTMLMetaElement.cpp,v - [1][3] layout/html/content/src/nsHTMLModElement.cpp,v - [1][3] layout/html/content/src/nsHTMLOListElement.cpp,v - [1][3] layout/html/content/src/nsHTMLObjectElement.cpp,v - [1][3] layout/html/content/src/nsHTMLOptGroupElement.cpp,v - [1][3] layout/html/content/src/nsHTMLOptionElement.cpp,v - [1][3] layout/html/content/src/nsHTMLParagraphElement.cpp,v - [1][3] layout/html/content/src/nsHTMLParamElement.cpp,v - [1][3] layout/html/content/src/nsHTMLPreElement.cpp,v - [1][3] layout/html/content/src/nsHTMLQuoteElement.cpp,v - [1][3] layout/html/content/src/nsHTMLScriptElement.cpp,v - [1][3] layout/html/content/src/nsHTMLSelectElement.cpp,v - [1][3] layout/html/content/src/nsHTMLSpacerElement.cpp,v - [1][3] layout/html/content/src/nsHTMLSpanElement.cpp,v - [1][3] layout/html/content/src/nsHTMLStyleElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableCaptionElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableCellElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableColElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableColGroupElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableRowElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTableSectionElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTextAreaElement.cpp,v - [1][3] layout/html/content/src/nsHTMLTitleElement.cpp,v - [1][3] layout/html/content/src/nsHTMLUListElement.cpp,v - [1][3] layout/html/content/src/nsHTMLWBRElement.cpp,v - [1][3] layout/html/document/src/nsHTMLDocument.cpp,v - bug 27953 layout/html/document/src/nsHTMLDocument.h,v - bug 27953 layout/xml/content/src/nsXMLCDATASection.cpp,v - [1][2] layout/xml/content/src/nsXMLDocumentType.cpp,v - [1][2] layout/xml/content/src/nsXMLElement.h,v - [1][2] layout/xml/content/src/nsXMLEntity.cpp,v - [1][2] layout/xml/content/src/nsXMLNotation.cpp,v - [1][2] layout/xml/content/src/nsXMLProcessingInstruction.cpp,v - [1][2] layout/xul/base/src/nsBoxFrame.cpp,v - nsString->nsAutoString layout/xul/base/src/nsSliderFrame.cpp,v - nsString->nsAutoString netwerk/protocol/http/src/nsHTTPRequest.cpp,v - nsString->nsAutoString rdf/content/src/nsXULDocument.cpp,v - bug 27953 rdf/content/src/nsXULDocument.h,v - bug 27953 rdf/content/src/nsXULElement.h,v - [1] xpcom/base/IIDS.h,v - bug 12559
2000-03-17 13:27:00 +00:00
nsAutoString value;
if (NS_CONTENT_ATTR_HAS_VALUE == content->GetAttribute(kNameSpaceID_None, atom, value))
{
PRInt32 error;
// convert it to an integer
defaultValue = value.ToInteger(&error);
}
return defaultValue;
}
NS_IMETHODIMP
nsSliderFrame::AttributeChanged(nsIPresContext* aPresContext,
nsIContent* aChild,
PRInt32 aNameSpaceID,
nsIAtom* aAttribute,
PRInt32 aHint)
{
2000-03-31 07:02:06 +00:00
nsresult rv = nsBoxFrame::AttributeChanged(aPresContext, aChild,
aNameSpaceID, aAttribute, aHint);
// if the current position changes
if (aAttribute == nsXULAtoms::curpos) {
rv = CurrentPositionChanged(aPresContext);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to change position");
if (NS_FAILED(rv))
return rv;
1999-10-12 00:16:06 +00:00
} else if (aAttribute == nsXULAtoms::maxpos) {
// bounds check it.
2000-03-31 07:02:06 +00:00
nsIBox* scrollbarBox = GetScrollbar();
nsCOMPtr<nsIContent> scrollbar;
GetContentOf(scrollbarBox, getter_AddRefs(scrollbar));
1999-10-12 00:16:06 +00:00
PRInt32 current = GetCurrentPosition(scrollbar);
PRInt32 max = GetMaxPosition(scrollbar);
if (current < 0 || current > max)
{
2000-08-29 02:03:59 +00:00
if (current < 0)
current = 0;
else if (current > max)
current = max;
// set the new position but don't notify anyone. We already know
nsCOMPtr<nsIScrollbarFrame> scrollbarFrame(do_QueryInterface(scrollbarBox));
if (scrollbarFrame) {
nsCOMPtr<nsIScrollbarMediator> mediator;
scrollbarFrame->GetScrollbarMediator(getter_AddRefs(mediator));
if (mediator) {
mediator->PositionChanged(GetCurrentPosition(scrollbar), current);
return NS_OK;
}
}
char ch[100];
sprintf(ch,"%d", current);
scrollbar->SetAttribute(kNameSpaceID_None, nsXULAtoms::curpos, NS_ConvertASCIItoUCS2(ch), PR_FALSE);
1999-10-12 00:16:06 +00:00
}
}
if ((aHint != NS_STYLE_HINT_REFLOW) &&
(aAttribute == nsXULAtoms::maxpos ||
1999-08-19 22:16:23 +00:00
aAttribute == nsXULAtoms::pageincrement ||
aAttribute == nsXULAtoms::increment)) {
1999-08-19 22:16:23 +00:00
nsCOMPtr<nsIPresShell> shell;
aPresContext->GetShell(getter_AddRefs(shell));
2000-03-31 07:02:06 +00:00
nsBoxLayoutState state(aPresContext);
MarkDirtyChildren(state);
}
return rv;
}
NS_IMETHODIMP
nsSliderFrame::Paint(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
const nsRect& aDirtyRect,
nsFramePaintLayer aWhichLayer)
{
1999-08-19 22:16:23 +00:00
// if we are too small to have a thumb don't paint it.
2000-03-31 07:02:06 +00:00
nsIBox* thumb;
GetChildBox(&thumb);
NS_ASSERTION(thumb,"Slider does not have a thumb!!!!");
nsRect thumbRect;
thumb->GetBounds(thumbRect);
nsMargin m;
thumb->GetMargin(m);
thumbRect.Inflate(m);
nsRect crect;
GetClientRect(crect);
1999-08-19 22:16:23 +00:00
if (crect.width < thumbRect.width || crect.height < thumbRect.height)
1999-08-19 22:16:23 +00:00
{
if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) {
const nsStyleDisplay* disp = (const nsStyleDisplay*)
mStyleContext->GetStyleData(eStyleStruct_Display);
if (disp->IsVisibleOrCollapsed()) {
1999-08-19 22:16:23 +00:00
const nsStyleColor* myColor = (const nsStyleColor*)
mStyleContext->GetStyleData(eStyleStruct_Color);
const nsStyleSpacing* mySpacing = (const nsStyleSpacing*)
mStyleContext->GetStyleData(eStyleStruct_Spacing);
nsRect rect(0, 0, mRect.width, mRect.height);
nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this,
aDirtyRect, rect, *myColor, *mySpacing, 0, 0);
nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, this,
aDirtyRect, rect, *mySpacing, mStyleContext, 0);
}
}
return NS_OK;
}
2000-03-31 07:02:06 +00:00
return nsBoxFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
}
1999-04-20 21:39:52 +00:00
2000-03-31 07:02:06 +00:00
NS_IMETHODIMP
nsSliderFrame::DoLayout(nsBoxLayoutState& aState)
{
2000-03-31 07:02:06 +00:00
EnsureOrient();
if (mState & NS_STATE_DEBUG_WAS_SET) {
if (mState & NS_STATE_SET_TO_DEBUG)
SetDebug(aState, PR_TRUE);
2000-03-31 07:02:06 +00:00
else
SetDebug(aState, PR_FALSE);
1999-04-20 21:39:52 +00:00
}
2000-03-31 07:02:06 +00:00
// get the content area inside our borders
nsRect clientRect(0,0,0,0);
GetClientRect(clientRect);
2000-03-31 07:02:06 +00:00
// get the scrollbar
nsIBox* scrollbarBox = GetScrollbar();
nsCOMPtr<nsIContent> scrollbar;
GetContentOf(scrollbarBox, getter_AddRefs(scrollbar));
2000-03-31 07:02:06 +00:00
PRBool isHorizontal = IsHorizontal();
2000-03-31 07:02:06 +00:00
// get the thumb should be our only child
nsIBox* thumbBox = nsnull;
GetChildBox(&thumbBox);
2000-03-31 07:02:06 +00:00
NS_ASSERTION(thumbBox,"Slider does not have a thumb!!!!");
2000-03-31 07:02:06 +00:00
// get the thumb's pref size
nsSize thumbSize(0,0);
thumbBox->GetPrefSize(aState, thumbSize);
2000-03-31 07:02:06 +00:00
if (isHorizontal)
thumbSize.height = clientRect.height;
else
thumbSize.width = clientRect.width;
// get our current position and max position from our content node
1999-08-19 22:16:23 +00:00
PRInt32 curpospx = GetCurrentPosition(scrollbar);
PRInt32 maxpospx = GetMaxPosition(scrollbar);
1999-08-19 22:16:23 +00:00
if (curpospx < 0)
curpospx = 0;
else if (curpospx > maxpospx)
curpospx = maxpospx;
float p2t;
aState.GetPresContext()->GetScaledPixelsToTwips(&p2t);
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
1999-08-19 22:16:23 +00:00
// get max pos in twips
nscoord maxpos = maxpospx*onePixel;
1999-08-19 22:16:23 +00:00
// get our maxpos in twips. This is the space we have left over in the scrollbar
// after the height of the thumb has been removed
2000-03-31 07:02:06 +00:00
nscoord& desiredcoord = isHorizontal ? clientRect.width : clientRect.height;
nscoord& thumbcoord = isHorizontal ? thumbSize.width : thumbSize.height;
1999-08-19 22:16:23 +00:00
nscoord ourmaxpos = desiredcoord;
mRatio = float(ourmaxpos)/float(maxpos + ourmaxpos);
// if there is more room than the thumb need stretch the
// thumb
2000-03-31 07:02:06 +00:00
nscoord thumbsize = NSToCoordRound(ourmaxpos * mRatio);
2000-03-31 07:02:06 +00:00
1999-08-19 22:16:23 +00:00
if (thumbsize > thumbcoord) {
2000-03-31 07:02:06 +00:00
nscoord flex = 0;
thumbBox->GetFlex(aState, flex);
2000-03-31 07:02:06 +00:00
// if the thumb is flexible make the thumb bigger.
if (flex > 0) {
if (isHorizontal)
thumbSize.width = thumbsize;
2000-03-31 07:02:06 +00:00
else
thumbSize.height = thumbsize;
2000-03-31 07:02:06 +00:00
}
1999-08-19 22:16:23 +00:00
} else {
ourmaxpos -= thumbcoord;
mRatio = float(ourmaxpos)/float(maxpos);
1999-04-20 21:39:52 +00:00
}
1999-08-19 22:16:23 +00:00
nscoord curpos = curpospx*onePixel;
// set the thumbs y coord to be the current pos * the ratio.
1999-08-19 22:16:23 +00:00
nscoord pos = nscoord(float(curpos)*mRatio);
2000-03-31 07:02:06 +00:00
nsRect thumbRect(clientRect.x, clientRect.y, thumbSize.width, thumbSize.height);
if (isHorizontal)
1999-08-19 22:16:23 +00:00
thumbRect.x += pos;
else
1999-08-19 22:16:23 +00:00
thumbRect.y += pos;
nsRect oldThumbRect;
thumbBox->GetBounds(oldThumbRect);
LayoutChildAt(aState, thumbBox, thumbRect);
SyncLayout(aState);
1999-10-12 00:16:06 +00:00
if (DEBUG_SLIDER) {
PRInt32 c = GetCurrentPosition(scrollbar);
PRInt32 m = GetMaxPosition(scrollbar);
printf("Current=%d, max=%d\n",c,m);
}
// redraw only if thumb changed size.
if (oldThumbRect != thumbRect)
Redraw(aState);
return NS_OK;
}
NS_IMETHODIMP
nsSliderFrame::HandleEvent(nsIPresContext* aPresContext,
nsGUIEvent* aEvent,
nsEventStatus* aEventStatus)
{
2000-03-31 07:02:06 +00:00
nsIBox* scrollbarBox = GetScrollbar();
nsCOMPtr<nsIContent> scrollbar;
GetContentOf(scrollbarBox, getter_AddRefs(scrollbar));
2000-03-31 07:02:06 +00:00
PRBool isHorizontal = IsHorizontal();
if (isDraggingThumb(aPresContext))
{
// we want to draw immediately if the user doing it directly with the
// mouse that makes redrawing much faster.
mRedrawImmediate = PR_TRUE;
switch (aEvent->message) {
case NS_MOUSE_MOVE: {
// convert coord to pixels
nscoord pos = isHorizontal ? aEvent->point.x : aEvent->point.y;
1999-06-28 19:57:28 +00:00
// mDragStartPx is in pixels and is in our client areas coordinate system.
// so we need to first convert it so twips and then get it into our coordinate system.
// convert start to twips
nscoord startpx = mDragStartPx;
float p2t;
aPresContext->GetScaledPixelsToTwips(&p2t);
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
nscoord start = startpx*onePixel;
nsIFrame* thumbFrame = mFrames.FirstChild();
1999-06-28 19:57:28 +00:00
1999-08-19 22:16:23 +00:00
1999-06-28 19:57:28 +00:00
// get it into our coordintate system by subtracting our parents offsets.
nsIFrame* parent = this;
while(parent != nsnull)
{
1999-08-19 22:16:23 +00:00
// if we hit a scrollable view make sure we take into account
// how much we are scrolled.
nsIScrollableView* scrollingView;
nsIView* view;
parent->GetView(aPresContext, &view);
1999-08-19 22:16:23 +00:00
if (view) {
nsresult result = view->QueryInterface(NS_GET_IID(nsIScrollableView), (void**)&scrollingView);
1999-08-19 22:16:23 +00:00
if (NS_SUCCEEDED(result)) {
nscoord xoff = 0;
nscoord yoff = 0;
scrollingView->GetScrollPosition(xoff, yoff);
isHorizontal ? start += xoff : start += yoff;
}
}
1999-06-28 19:57:28 +00:00
nsRect r;
parent->GetRect(r);
isHorizontal ? start -= r.x : start -= r.y;
parent->GetParent(&parent);
}
//printf("Translated to start=%d\n",start);
start -= mThumbStart;
// take our current position and substract the start location
pos -= start;
// convert to pixels
nscoord pospx = pos/onePixel;
// convert to our internal coordinate system
pospx = nscoord(pospx/mRatio);
// set it
1999-08-19 22:16:23 +00:00
SetCurrentPosition(scrollbar, thumbFrame, pospx);
}
break;
case NS_MOUSE_MIDDLE_BUTTON_UP:
if(!mMiddlePref)
break;
case NS_MOUSE_LEFT_BUTTON_UP:
// stop capturing
//printf("stop capturing\n");
AddListener();
DragThumb(aPresContext, PR_FALSE);
mRedrawImmediate = PR_FALSE;//we MUST call nsFrame HandleEvent for mouse ups to maintain the selection state and capture state.
return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
}
// we want to draw immediately if the user doing it directly with the
// mouse that makes redrawing much faster. Switch it back now.
mRedrawImmediate = PR_FALSE;
1999-08-19 22:16:23 +00:00
//return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
return NS_OK;
}
else if (mMiddlePref && aEvent->message == NS_MOUSE_MIDDLE_BUTTON_DOWN) {
// convert coord from twips to pixels
nscoord pos = isHorizontal ? aEvent->point.x : aEvent->point.y;
float p2t;
aPresContext->GetScaledPixelsToTwips(&p2t);
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
nscoord pospx = pos/onePixel;
// adjust so that the middle of the thumb is placed under the click
nsIFrame* thumbFrame = mFrames.FirstChild();
nsSize thumbSize;
thumbFrame->GetSize(thumbSize);
nscoord thumbLength = isHorizontal ? thumbSize.width : thumbSize.height;
thumbLength /= onePixel;
pospx -= (thumbLength/2);
// convert to our internal coordinate system
pospx = nscoord(pospx/mRatio);
// set it
SetCurrentPosition(scrollbar, thumbFrame, pospx);
// hack to start dragging
nsIFrame* parent = this;
while(parent != nsnull)
{
// if we hit a scrollable view make sure we take into account
// how much we are scrolled.
nsIScrollableView* scrollingView;
nsIView* view;
parent->GetView(aPresContext, &view);
if (view) {
nsresult result = view->QueryInterface(NS_GET_IID(nsIScrollableView), (void**)&scrollingView);
if (NS_SUCCEEDED(result)) {
nscoord xoff = 0;
nscoord yoff = 0;
scrollingView->GetScrollPosition(xoff, yoff);
isHorizontal ? pos += xoff : pos += yoff;
}
}
nsRect r;
parent->GetRect(r);
isHorizontal ? pos += r.x : pos += r.y;
parent->GetParent(&parent);
}
RemoveListener();
DragThumb(mPresContext, PR_TRUE);
nsRect thumbRect;
thumbFrame->GetRect(thumbRect);
if (isHorizontal)
mThumbStart = thumbRect.x;
else
mThumbStart = thumbRect.y;
mDragStartPx =pos/onePixel;
}
1999-08-19 22:16:23 +00:00
// XXX hack until handle release is actually called in nsframe.
// if (aEvent->message == NS_MOUSE_EXIT_SYNTH || aEvent->message == NS_MOUSE_RIGHT_BUTTON_UP || aEvent->message == NS_MOUSE_LEFT_BUTTON_UP)
// HandleRelease(aPresContext, aEvent, aEventStatus);
if (aEvent->message == NS_MOUSE_EXIT_SYNTH || aEvent->message == NS_MOUSE_LEFT_BUTTON_UP)
1999-08-19 22:16:23 +00:00
HandleRelease(aPresContext, aEvent, aEventStatus);
1999-08-19 22:16:23 +00:00
return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
}
1999-08-19 22:16:23 +00:00
2000-03-31 07:02:06 +00:00
nsIBox*
nsSliderFrame::GetScrollbar()
{
// if we are in a scrollbar then return the scrollbar's content node
// if we are not then return ours.
nsIFrame* scrollbar;
nsScrollbarButtonFrame::GetParentWithTag(nsXULAtoms::scrollbar, this, scrollbar);
if (scrollbar == nsnull)
2000-03-31 07:02:06 +00:00
return this;
nsIBox* ibox = nsnull;
scrollbar->QueryInterface(NS_GET_IID(nsIBox), (void**)&ibox);
2000-03-31 07:02:06 +00:00
if (ibox == nsnull)
return this;
return ibox;
}
void
nsSliderFrame::GetContentOf(nsIBox* aBox, nsIContent** aContent)
2000-03-31 07:02:06 +00:00
{
nsIFrame* frame = nsnull;
aBox->GetFrame(&frame);
frame->GetContent(aContent);
}
void
1999-08-19 22:16:23 +00:00
nsSliderFrame::PageUpDown(nsIFrame* aThumbFrame, nscoord change)
{
// on a page up or down get our page increment. We get this by getting the scrollbar we are in and
// asking it for the current position and the page increment. If we are not in a scrollbar we will
// get the values from our own node.
2000-03-31 07:02:06 +00:00
nsIBox* scrollbarBox = GetScrollbar();
nsCOMPtr<nsIContent> scrollbar;
GetContentOf(scrollbarBox, getter_AddRefs(scrollbar));
1999-06-23 17:00:17 +00:00
if (mScrollbarListener)
mScrollbarListener->PagedUpDown(); // Let the listener decide our increment.
nscoord pageIncrement = GetPageIncrement(scrollbar);
PRInt32 curpos = GetCurrentPosition(scrollbar);
1999-08-19 22:16:23 +00:00
SetCurrentPosition(scrollbar, aThumbFrame, curpos + change*pageIncrement);
}
// called when the current position changed and we need to update the thumb's location
nsresult
nsSliderFrame::CurrentPositionChanged(nsIPresContext* aPresContext)
{
2000-03-31 07:02:06 +00:00
nsIBox* scrollbarBox = GetScrollbar();
nsCOMPtr<nsIContent> scrollbar;
GetContentOf(scrollbarBox, getter_AddRefs(scrollbar));
2000-03-31 07:02:06 +00:00
PRBool isHorizontal = IsHorizontal();
// get the current position
PRInt32 curpos = GetCurrentPosition(scrollbar);
1999-10-12 00:16:06 +00:00
// do nothing if the position did not change
if (mCurPos == curpos)
return NS_OK;
1999-10-12 00:16:06 +00:00
// get our current position and max position from our content node
PRInt32 maxpos = GetMaxPosition(scrollbar);
if (curpos < 0)
curpos = 0;
else if (curpos > maxpos)
curpos = maxpos;
// convert to pixels
float p2t;
aPresContext->GetScaledPixelsToTwips(&p2t);
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
nscoord curpospx = curpos*onePixel;
// get the thumb's rect
nsIFrame* thumbFrame = mFrames.FirstChild();
nsRect thumbRect;
thumbFrame->GetRect(thumbRect);
// get our border and padding
const nsStyleSpacing* spacing;
nsresult rv = GetStyleData(eStyleStruct_Spacing,
(const nsStyleStruct*&) spacing);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get spacing");
if (NS_FAILED(rv))
return rv;
2000-08-30 21:51:02 +00:00
nsRect clientRect;
GetClientRect(clientRect);
// figure out the new rect
nsRect newThumbRect(thumbRect);
if (isHorizontal)
2000-08-30 21:51:02 +00:00
newThumbRect.x = clientRect.x + nscoord(float(curpospx)*mRatio);
else
2000-08-30 21:51:02 +00:00
newThumbRect.y = clientRect.y + nscoord(float(curpospx)*mRatio);
// set the rect
thumbFrame->SetRect(aPresContext, newThumbRect);
// figure out the union of the rect so we know what to redraw
nsRect changeRect;
changeRect.UnionRect(thumbRect, newThumbRect);
// redraw just the change
Invalidate(aPresContext, changeRect, mRedrawImmediate);
1999-06-23 17:00:17 +00:00
if (mScrollbarListener)
mScrollbarListener->PositionChanged(aPresContext, mCurPos, curpos);
1999-06-23 17:00:17 +00:00
mCurPos = curpos;
return NS_OK;
}
void
1999-08-19 22:16:23 +00:00
nsSliderFrame::SetCurrentPosition(nsIContent* scrollbar, nsIFrame* aThumbFrame, nscoord newpos)
{
// get our current position and max position from our content node
PRInt32 maxpos = GetMaxPosition(scrollbar);
// get the new position and make sure it is in bounds
if (newpos > maxpos)
newpos = maxpos;
else if (newpos < 0)
newpos = 0;
2000-06-06 23:13:05 +00:00
nsIBox* scrollbarBox = GetScrollbar();
nsCOMPtr<nsIScrollbarFrame> scrollbarFrame(do_QueryInterface(scrollbarBox));
if (scrollbarFrame) {
// See if we have a mediator.
nsCOMPtr<nsIScrollbarMediator> mediator;
scrollbarFrame->GetScrollbarMediator(getter_AddRefs(mediator));
if (mediator) {
mediator->PositionChanged(GetCurrentPosition(scrollbar), newpos);
return;
}
}
char ch[100];
sprintf(ch,"%d", newpos);
// set the new position
2000-04-16 11:19:26 +00:00
scrollbar->SetAttribute(kNameSpaceID_None, nsXULAtoms::curpos, NS_ConvertASCIItoUCS2(ch), PR_TRUE);
1999-10-12 00:16:06 +00:00
if (DEBUG_SLIDER)
printf("Current Pos=%s\n",ch);
}
NS_IMETHODIMP nsSliderFrame::GetFrameForPoint(nsIPresContext* aPresContext,
const nsPoint& aPoint,
nsFramePaintLayer aWhichLayer,
nsIFrame** aFrame)
2000-03-31 07:02:06 +00:00
{
if ((aWhichLayer != NS_FRAME_PAINT_LAYER_FOREGROUND))
return NS_ERROR_FAILURE;
if (isDraggingThumb(aPresContext))
{
// XXX I assume it's better not to test for visibility here.
*aFrame = this;
return NS_OK;
}
2000-03-31 07:02:06 +00:00
if (!mRect.Contains(aPoint))
return NS_ERROR_FAILURE;
2000-03-31 07:02:06 +00:00
if (NS_SUCCEEDED(nsBoxFrame::GetFrameForPoint(aPresContext, aPoint, aWhichLayer, aFrame)))
return NS_OK;
// always return us (if visible)
const nsStyleDisplay* disp = (const nsStyleDisplay*)
mStyleContext->GetStyleData(eStyleStruct_Display);
if (disp->IsVisible()) {
*aFrame = this;
return NS_OK;
}
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsSliderFrame::SetInitialChildList(nsIPresContext* aPresContext,
nsIAtom* aListName,
nsIFrame* aChildList)
{
2000-03-31 07:02:06 +00:00
nsresult r = nsBoxFrame::SetInitialChildList(aPresContext, aListName, aChildList);
AddListener();
return r;
}
nsresult
nsSliderMediator::MouseDown(nsIDOMEvent* aMouseEvent)
{
if (mSlider)
return mSlider->MouseDown(aMouseEvent);
else
return NS_OK;
}
nsresult
nsSliderMediator::MouseUp(nsIDOMEvent* aMouseEvent)
{
if (mSlider)
return mSlider->MouseUp(aMouseEvent);
else
return NS_OK;
}
nsresult
nsSliderFrame::MouseDown(nsIDOMEvent* aMouseEvent)
{
//printf("Begin dragging\n");
2000-03-31 07:02:06 +00:00
PRBool isHorizontal = IsHorizontal();
nsCOMPtr<nsIDOMMouseEvent> mouseEvent(do_QueryInterface(aMouseEvent));
PRUint16 button = 0;
mouseEvent->GetButton(&button);
if((mMiddlePref && button != 1 && button != 2) ||
(!mMiddlePref && button != 1))
return NS_OK;
// If middle button, first place the middle of the slider thumb
// under the click
if (button == 2) {
nscoord pos;
nscoord pospx;
// mouseEvent has click coordinates in pixels, convert to twips first
isHorizontal ? mouseEvent->GetClientX(&pospx) : mouseEvent->GetClientY(&pospx);
float p2t;
// XXX hack
mPresContext->GetScaledPixelsToTwips(&p2t);
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
pos = pospx * onePixel;
// then get it into our coordinate system by subtracting our parents offsets.
nsIFrame* parent = this;
while(parent != nsnull) {
// if we hit a scrollable view make sure we take into account
// how much we are scrolled.
nsIScrollableView* scrollingView;
nsIView* view;
// XXX hack
parent->GetView(mPresContext, &view);
if (view) {
nsresult result = view->QueryInterface(NS_GET_IID(nsIScrollableView), (void**)&scrollingView);
if (NS_SUCCEEDED(result)) {
nscoord xoff = 0;
nscoord yoff = 0;
scrollingView->GetScrollPosition(xoff, yoff);
isHorizontal ? pos += xoff : pos += yoff;
}
}
nsRect r;
parent->GetRect(r);
isHorizontal ? pos -= r.x : pos -= r.y;
parent->GetParent(&parent);
}
// now convert back into pixels
pospx = pos/onePixel;
// adjust so that the middle of the thumb is placed under the click
nsIFrame* thumbFrame = mFrames.FirstChild();
nsRect thumbRect;
thumbFrame->GetRect(thumbRect);
nsSize thumbSize;
thumbFrame->GetSize(thumbSize);
nscoord thumbLength = isHorizontal ? thumbSize.width : thumbSize.height;
thumbLength /= onePixel;
pospx -= (thumbLength/2);
// finally, convert to scrollbar's internal coordinate system
pospx = nscoord(pospx/mRatio);
nsIBox* scrollbarBox = GetScrollbar();
nsCOMPtr<nsIContent> scrollbar;
GetContentOf(scrollbarBox, getter_AddRefs(scrollbar));
// set it
SetCurrentPosition(scrollbar, thumbFrame, pospx);
}
RemoveListener();
DragThumb(mPresContext, PR_TRUE);
PRInt32 c = 0;
if (isHorizontal)
mouseEvent->GetClientX(&c);
else
mouseEvent->GetClientY(&c);
mDragStartPx = c;
nsIFrame* thumbFrame = mFrames.FirstChild();
nsRect thumbRect;
thumbFrame->GetRect(thumbRect);
if (isHorizontal)
mThumbStart = thumbRect.x;
else
mThumbStart = thumbRect.y;
1999-06-28 19:57:28 +00:00
//printf("Pressed mDragStartPx=%d\n",mDragStartPx);
return NS_OK;
}
nsresult
nsSliderFrame::MouseUp(nsIDOMEvent* aMouseEvent)
{
// printf("Finish dragging\n");
1999-08-19 22:16:23 +00:00
return NS_OK;
}
NS_IMETHODIMP
nsSliderFrame :: DragThumb(nsIPresContext* aPresContext, PRBool aGrabMouseEvents)
{
// get its view
nsIView* view = nsnull;
GetView(aPresContext, &view);
nsCOMPtr<nsIViewManager> viewMan;
PRBool result;
if (view) {
view->GetViewManager(*getter_AddRefs(viewMan));
if (viewMan) {
if (aGrabMouseEvents) {
viewMan->GrabMouseEvents(view,result);
} else {
viewMan->GrabMouseEvents(nsnull,result);
}
}
}
return NS_OK;
}
PRBool
nsSliderFrame :: isDraggingThumb(nsIPresContext* aPresContext)
{
// get its view
nsIView* view = nsnull;
GetView(aPresContext, &view);
nsCOMPtr<nsIViewManager> viewMan;
if (view) {
view->GetViewManager(*getter_AddRefs(viewMan));
if (viewMan) {
nsIView* grabbingView;
viewMan->GetMouseEventGrabber(grabbingView);
if (grabbingView == view)
return PR_TRUE;
}
}
return PR_FALSE;
}
void
nsSliderFrame::AddListener()
{
if (!mMediator) {
mMediator = new nsSliderMediator(this);
NS_ADDREF(mMediator);
}
nsIFrame* thumbFrame = mFrames.FirstChild();
nsCOMPtr<nsIContent> content;
thumbFrame->GetContent(getter_AddRefs(content));
nsCOMPtr<nsIDOMEventReceiver> reciever(do_QueryInterface(content));
reciever->AddEventListenerByIID(mMediator, NS_GET_IID(nsIDOMMouseListener));
}
void
nsSliderFrame::RemoveListener()
{
NS_ASSERTION(mMediator, "No listener was ever added!!");
nsIFrame* thumbFrame = mFrames.FirstChild();
nsCOMPtr<nsIContent> content;
thumbFrame->GetContent(getter_AddRefs(content));
nsCOMPtr<nsIDOMEventReceiver> reciever(do_QueryInterface(content));
reciever->RemoveEventListenerByIID(mMediator, NS_GET_IID(nsIDOMMouseListener));
}
1999-06-23 17:00:17 +00:00
1999-08-19 22:16:23 +00:00
NS_IMETHODIMP
nsSliderFrame::HandlePress(nsIPresContext* aPresContext,
1999-08-19 22:16:23 +00:00
nsGUIEvent* aEvent,
nsEventStatus* aEventStatus)
1999-08-19 22:16:23 +00:00
{
2000-03-31 07:02:06 +00:00
PRBool isHorizontal = IsHorizontal();
1999-08-19 22:16:23 +00:00
nsIFrame* thumbFrame = mFrames.FirstChild();
nsRect thumbRect;
thumbFrame->GetRect(thumbRect);
nscoord change = 1;
if ((isHorizontal && aEvent->point.x < thumbRect.x) || (!isHorizontal && aEvent->point.y < thumbRect.y))
change = -1;
mChange = change;
mClickPoint = aEvent->point;
1999-08-19 22:16:23 +00:00
PageUpDown(thumbFrame, change);
nsRepeatService::GetInstance()->Start(mMediator);
1999-08-19 22:16:23 +00:00
return NS_OK;
}
NS_IMETHODIMP
nsSliderFrame::HandleRelease(nsIPresContext* aPresContext,
1999-08-19 22:16:23 +00:00
nsGUIEvent* aEvent,
nsEventStatus* aEventStatus)
1999-08-19 22:16:23 +00:00
{
nsRepeatService::GetInstance()->Stop();
return NS_OK;
}
1999-08-29 10:51:15 +00:00
NS_IMETHODIMP
nsSliderFrame::Destroy(nsIPresContext* aPresContext)
1999-08-29 10:51:15 +00:00
{
// tell our mediator if we have one we are gone.
if (mMediator) {
mMediator->SetSlider(nsnull);
NS_RELEASE(mMediator);
mMediator = nsnull;
}
// call base class Destroy()
2000-03-31 07:02:06 +00:00
return nsBoxFrame::Destroy(aPresContext);
}
NS_IMETHODIMP
nsSliderFrame::GetPrefSize(nsBoxLayoutState& aState, nsSize& aSize)
{
EnsureOrient();
return nsBoxFrame::GetPrefSize(aState, aSize);
}
NS_IMETHODIMP
nsSliderFrame::GetMinSize(nsBoxLayoutState& aState, nsSize& aSize)
{
EnsureOrient();
// our min size is just our borders and padding
return nsBox::GetMinSize(aState, aSize);
}
NS_IMETHODIMP
nsSliderFrame::GetMaxSize(nsBoxLayoutState& aState, nsSize& aSize)
{
EnsureOrient();
return nsBoxFrame::GetMaxSize(aState, aSize);
}
void
nsSliderFrame::EnsureOrient()
{
nsIBox* scrollbarBox = GetScrollbar();
nsIFrame* frame = nsnull;
scrollbarBox->GetFrame(&frame);
nsFrameState state;
frame->GetFrameState(&state);
PRBool isHorizontal = state & NS_STATE_IS_HORIZONTAL;
if (isHorizontal)
mState |= NS_STATE_IS_HORIZONTAL;
else
mState &= ~NS_STATE_IS_HORIZONTAL;
1999-08-29 10:51:15 +00:00
}
1999-08-19 22:16:23 +00:00
1999-06-23 17:00:17 +00:00
void
nsSliderFrame::SetScrollbarListener(nsIScrollbarListener* aListener)
{
// Don't addref/release this, since it's actually a frame.
mScrollbarListener = aListener;
}
1999-08-19 22:16:23 +00:00
NS_IMETHODIMP_(void) nsSliderMediator::Notify(nsITimer *timer)
{
if (mSlider)
mSlider->Notify(timer);
}
NS_IMETHODIMP_(void) nsSliderFrame::Notify(nsITimer *timer)
{
PRBool stop = PR_FALSE;
nsIFrame* thumbFrame = mFrames.FirstChild();
nsRect thumbRect;
thumbFrame->GetRect(thumbRect);
2000-03-31 07:02:06 +00:00
PRBool isHorizontal = IsHorizontal();
// see if the thumb has moved passed our original click point.
// if it has we want to stop.
if (isHorizontal) {
if (mChange < 0) {
if (thumbRect.x < mClickPoint.x)
stop = PR_TRUE;
} else {
if (thumbRect.x + thumbRect.width > mClickPoint.x)
stop = PR_TRUE;
}
} else {
if (mChange < 0) {
if (thumbRect.y < mClickPoint.y)
stop = PR_TRUE;
} else {
2000-02-14 01:42:09 +00:00
if (thumbRect.y + thumbRect.height > mClickPoint.y)
stop = PR_TRUE;
}
}
if (stop) {
nsRepeatService::GetInstance()->Stop();
} else {
PageUpDown(thumbFrame, mChange);
}
1999-08-19 22:16:23 +00:00
}
2000-03-31 07:02:06 +00:00
/*
2000-03-31 07:02:06 +00:00
class nsThumbFrame : public nsTitledButtonFrame
{
public:
friend nsresult NS_NewThumbFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);
NS_IMETHOD HandlePress(nsIPresContext* aPresContext,
nsGUIEvent * aEvent,
nsEventStatus* aEventStatus) { return NS_OK; }
NS_IMETHOD HandleMultiplePress(nsIPresContext* aPresContext,
nsGUIEvent * aEvent,
nsEventStatus* aEventStatus) { return NS_OK; }
NS_IMETHOD HandleDrag(nsIPresContext* aPresContext,
nsGUIEvent * aEvent,
nsEventStatus* aEventStatus) { return NS_OK; }
NS_IMETHOD HandleRelease(nsIPresContext* aPresContext,
nsGUIEvent * aEvent,
nsEventStatus* aEventStatus) { return NS_OK; }
nsThumbFrame(nsIPresShell* aPresShell):nsTitledButtonFrame(aPresShell) {}
};
nsresult
NS_NewThumbFrame ( nsIPresShell* aPresShell, nsIFrame** aNewFrame)
{
NS_PRECONDITION(aNewFrame, "null OUT ptr");
if (nsnull == aNewFrame) {
return NS_ERROR_NULL_POINTER;
}
nsThumbFrame* it = new (aPresShell) nsThumbFrame(aPresShell);
if (nsnull == it)
return NS_ERROR_OUT_OF_MEMORY;
*aNewFrame = it;
return NS_OK;
} // NS_NewSliderFrame
*/
NS_INTERFACE_MAP_BEGIN(nsSliderMediator)
NS_INTERFACE_MAP_ENTRY(nsIDOMMouseListener)
NS_INTERFACE_MAP_ENTRY(nsITimerCallback)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsITimerCallback)
NS_INTERFACE_MAP_END
NS_IMPL_ADDREF(nsSliderMediator);
NS_IMPL_RELEASE(nsSliderMediator);
2000-03-31 07:02:06 +00:00