зеркало из https://github.com/mozilla/pjs.git
First Checked In.
This commit is contained in:
Родитель
23f81e9c7c
Коммит
581acc5c8a
|
@ -0,0 +1,289 @@
|
|||
/* -*- 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 "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include "nsTriStateCheckboxFrame.h"
|
||||
|
||||
#include "nsFormControlHelper.h"
|
||||
#include "nsIContent.h"
|
||||
#include "prtypes.h"
|
||||
#include "nsIFrame.h"
|
||||
#include "nsIAtom.h"
|
||||
#include "nsIPresContext.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
#include "nsIStyleContext.h"
|
||||
#include "nsStyleUtil.h"
|
||||
#include "nsIFormControl.h"
|
||||
#include "nsCSSRendering.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
|
||||
|
||||
//
|
||||
// NS_NewTriStateCheckboxFrame
|
||||
//
|
||||
// Wrapper for creating a new tristate checkbox
|
||||
//
|
||||
nsresult
|
||||
NS_NewTriStateCheckboxFrame(nsIFrame*& aResult)
|
||||
{
|
||||
aResult = new nsTriStateCheckboxFrame;
|
||||
if ( !aResult )
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// nsTriStateCheckboxFrame cntr
|
||||
//
|
||||
nsTriStateCheckboxFrame::nsTriStateCheckboxFrame()
|
||||
: mMouseDownOnCheckbox(PR_FALSE)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// GetCurrentCheckState
|
||||
//
|
||||
// Looks in the DOM to find out what the value is. 0 is off, 1 is on, 2 is mixed.
|
||||
// This will default to "off" if no value is set in the DOM.
|
||||
//
|
||||
nsresult
|
||||
nsTriStateCheckboxFrame::GetCurrentCheckState(CheckState *outState)
|
||||
{
|
||||
nsString value;
|
||||
nsresult res = mContent->GetAttribute ( kNameSpaceID_None, nsHTMLAtoms::value, value );
|
||||
if ( res == NS_CONTENT_ATTR_HAS_VALUE )
|
||||
*outState = StringToCheckState(value);
|
||||
else
|
||||
*outState = eOff;
|
||||
|
||||
printf("getting value, it is %s\n", value.ToNewCString());
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// SetCurrentCheckState
|
||||
//
|
||||
// Sets the value in the DOM. 0 is off, 1 is on, 2 is mixed.
|
||||
//
|
||||
nsresult
|
||||
nsTriStateCheckboxFrame::SetCurrentCheckState(CheckState aState)
|
||||
{
|
||||
nsString valueAsString;
|
||||
CheckStateToString ( aState, valueAsString );
|
||||
printf("setting value, it is %s\n", valueAsString.ToNewCString());
|
||||
return mContent->SetAttribute ( kNameSpaceID_None, nsHTMLAtoms::value, valueAsString, PR_TRUE );
|
||||
|
||||
} // SetCurrentCheckState
|
||||
|
||||
|
||||
//
|
||||
// MouseClicked
|
||||
//
|
||||
// handle when the mouse is clicked in the box. If the check is on or off, toggle it.
|
||||
// If the state is mixed, then set it to off. You can't ever get back to mixed.
|
||||
//
|
||||
void
|
||||
nsTriStateCheckboxFrame::MouseClicked(nsIPresContext* aPresContext)
|
||||
{
|
||||
mMouseDownOnCheckbox = PR_FALSE;
|
||||
CheckState oldState;
|
||||
GetCurrentCheckState(&oldState);
|
||||
CheckState newState = eOn;
|
||||
switch ( oldState ) {
|
||||
case eOn:
|
||||
case eMixed:
|
||||
newState = eOff;
|
||||
break;
|
||||
}
|
||||
SetCurrentCheckState(newState);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// GetMaxNumValues
|
||||
//
|
||||
// Because we have a mixed state, we go up to two.
|
||||
//
|
||||
PRInt32
|
||||
nsTriStateCheckboxFrame::GetMaxNumValues()
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// PaintCheckBox
|
||||
//
|
||||
// Paint the checkbox depending on the mode
|
||||
//
|
||||
void
|
||||
nsTriStateCheckboxFrame::PaintCheckBox(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer)
|
||||
{
|
||||
aRenderingContext.PushState();
|
||||
|
||||
float p2t;
|
||||
aPresContext.GetScaledPixelsToTwips(&p2t);
|
||||
|
||||
CheckState checked = eOff;
|
||||
|
||||
// Get current checked state through content model.
|
||||
// XXX: This is very inefficient, but it is necessary in the case of printing.
|
||||
// During printing the Paint is called but the actual state of the checkbox
|
||||
// is in a frame in presentation shell 0.
|
||||
/*XXXnsresult result = */GetCurrentCheckState(&checked);
|
||||
if ( checked == eOn ) {
|
||||
// Draw check mark
|
||||
const nsStyleColor* color = (const nsStyleColor*)
|
||||
mStyleContext->GetStyleData(eStyleStruct_Color);
|
||||
aRenderingContext.SetColor(color->mColor);
|
||||
printf("painting checkbox\n");
|
||||
nsFormControlHelper::PaintCheckMark(aRenderingContext,
|
||||
p2t, mRect.width, mRect.height);
|
||||
|
||||
}
|
||||
PRBool clip;
|
||||
aRenderingContext.PopState(clip);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Paint
|
||||
//
|
||||
// Overidden to handle drawing the checkmark in addition to everything else
|
||||
//
|
||||
NS_METHOD
|
||||
nsTriStateCheckboxFrame::Paint(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer)
|
||||
{
|
||||
printf("painting checkbox\n");
|
||||
// Paint the background
|
||||
nsFormControlFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||
if (NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) {
|
||||
// Paint the checkmark
|
||||
PaintCheckBox(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// HandleEvent
|
||||
//
|
||||
// Track the mouse and handle clicks
|
||||
//
|
||||
NS_METHOD
|
||||
nsTriStateCheckboxFrame::HandleEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus)
|
||||
{
|
||||
if (nsEventStatus_eConsumeNoDefault == aEventStatus) {
|
||||
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;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Handle GFX rendered widget Mouse Down event
|
||||
switch (aEvent->message) {
|
||||
case NS_MOUSE_LEFT_BUTTON_DOWN:
|
||||
mMouseDownOnCheckbox = PR_TRUE;
|
||||
//XXX: TODO render gray rectangle on mouse down
|
||||
break;
|
||||
|
||||
case NS_MOUSE_EXIT:
|
||||
mMouseDownOnCheckbox = PR_FALSE;
|
||||
//XXX: TO DO clear gray rectangle on mouse up
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return(nsFormControlFrame::HandleEvent(aPresContext, aEvent, aEventStatus));
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// RequiresWidget
|
||||
//
|
||||
// Tell callers that we are GFX rendered through and through
|
||||
//
|
||||
nsresult
|
||||
nsTriStateCheckboxFrame::RequiresWidget(PRBool& aRequiresWidget)
|
||||
{
|
||||
aRequiresWidget = PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// StringToCheckState
|
||||
//
|
||||
// Converts from a string to a CheckState enum
|
||||
//
|
||||
nsTriStateCheckboxFrame::CheckState
|
||||
nsTriStateCheckboxFrame :: StringToCheckState ( const nsString & aStateAsString )
|
||||
{
|
||||
if ( aStateAsString == NS_STRING_TRUE )
|
||||
return eOn;
|
||||
else if ( aStateAsString == NS_STRING_FALSE )
|
||||
return eOff;
|
||||
|
||||
// not true and not false means mixed
|
||||
return eMixed;
|
||||
|
||||
} // StringToCheckState
|
||||
|
||||
|
||||
//
|
||||
// CheckStateToString
|
||||
//
|
||||
// Converts from a CheckState to a string
|
||||
//
|
||||
void
|
||||
nsTriStateCheckboxFrame :: CheckStateToString ( CheckState inState, nsString& outStateAsString )
|
||||
{
|
||||
switch ( inState ) {
|
||||
case eOn:
|
||||
outStateAsString = NS_STRING_TRUE;
|
||||
break;
|
||||
|
||||
case eOff:
|
||||
outStateAsString = NS_STRING_FALSE;
|
||||
break;
|
||||
|
||||
case eMixed:
|
||||
outStateAsString = "2";
|
||||
break;
|
||||
}
|
||||
} // CheckStateToString
|
|
@ -0,0 +1,110 @@
|
|||
/* -*- 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 "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
//
|
||||
// nsTriStateCheckboxFrame
|
||||
//
|
||||
// A sibling of a checkbox, but with an extra state, mixed, that represents
|
||||
// something in between on and off.
|
||||
//
|
||||
// An example will explain it best. Say you
|
||||
// select some text, part of which is bold, and go to a dialog that lets you
|
||||
// customize the styles of that text. The checkboxes for each style should
|
||||
// represent the current state of the text, but what value should the "Bold"
|
||||
// checkbox have? All the text isn't bold, so it shouldn't be on, but some
|
||||
// if it is, so you want to indicate that to the user. Hence, a 3rd state.
|
||||
//
|
||||
// Clicking the control when it is mixed would uncheck the control, as if
|
||||
// it is totally off. In the above example, the entire selection would be
|
||||
// unbolded. Clicking it again would check the control and bold the entire
|
||||
// selection. Note that there is no way to get back to the mixed state. This
|
||||
// is by design. It just doesn't make any sense. What that action really means
|
||||
// would be satisfied by "Cancel" or "Undo" which is beyond the scope of
|
||||
// the control.
|
||||
//
|
||||
|
||||
#ifndef nsTriStateCheckboxFrame_h__
|
||||
#define nsTriStateCheckboxFrame_h__
|
||||
|
||||
|
||||
#include "nsFormControlFrame.h"
|
||||
#include "prtypes.h"
|
||||
|
||||
class nsIPresContext;
|
||||
class nsString;
|
||||
class nsIContent;
|
||||
class nsIAtom;
|
||||
|
||||
|
||||
nsresult NS_NewTriStateCheckboxFrame(nsIFrame*& aResult) ;
|
||||
|
||||
|
||||
class nsTriStateCheckboxFrame : public nsFormControlFrame
|
||||
{
|
||||
public:
|
||||
nsTriStateCheckboxFrame();
|
||||
|
||||
NS_IMETHOD GetFrameName(nsString& aResult) const {
|
||||
return MakeFrameName("TriStateCheckboxFrame", aResult);
|
||||
}
|
||||
|
||||
|
||||
virtual PRInt32 GetMaxNumValues();
|
||||
|
||||
// nsFormControlFrame overrides
|
||||
nsresult RequiresWidget(PRBool &aHasWidget);
|
||||
|
||||
//
|
||||
// Methods used to GFX-render the checkbox
|
||||
//
|
||||
|
||||
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer);
|
||||
|
||||
NS_IMETHOD HandleEvent(nsIPresContext& aPresContext,
|
||||
nsGUIEvent* aEvent,
|
||||
nsEventStatus& aEventStatus);
|
||||
|
||||
//End of GFX-rendering methods
|
||||
|
||||
protected:
|
||||
|
||||
enum CheckState { eOff, eOn, eMixed } ;
|
||||
|
||||
nsresult GetCurrentCheckState(CheckState *outState) ;
|
||||
nsresult SetCurrentCheckState(CheckState aState) ;
|
||||
|
||||
virtual void MouseClicked(nsIPresContext* aPresContext);
|
||||
|
||||
virtual void PaintCheckBox(nsIPresContext& aPresContext,
|
||||
nsIRenderingContext& aRenderingContext,
|
||||
const nsRect& aDirtyRect,
|
||||
nsFramePaintLayer aWhichLayer);
|
||||
|
||||
// utility routine for converting from DOM values to internal enum
|
||||
void CheckStateToString ( CheckState inState, nsString& outStateAsString ) ;
|
||||
CheckState StringToCheckState ( const nsString & aStateAsString ) ;
|
||||
|
||||
//GFX-rendered state variables
|
||||
PRBool mMouseDownOnCheckbox;
|
||||
|
||||
}; // class nsTriStateCheckboxFrame
|
||||
|
||||
#endif
|
Загрузка…
Ссылка в новой задаче