43 #include "FXRectangle.h"
44 #include "FXRegistry.h"
45 #include "FXAccelTable.h"
48 #include "FXTextField.h"
54 #ifdef CHECK_MEMORY_LEAKS
56 #endif // CHECK_MEMORY_LEAKS
76 #define BUTTONWIDTH 12
79 #define INTMAX 2147483647
80 #define INTMIN (-INTMAX-1)
82 #define SPINDIAL_MASK (SPINDIAL_CYCLIC|SPINDIAL_NOTEXT|SPINDIAL_NOBUTTONS|SPINDIAL_NODIAL|SPINDIAL_NOMAX|SPINDIAL_NOMIN|SPINDIAL_LOG)
114 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0,
115 FXint pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD):
116 FXDial(p, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb) {}
145 return target->handle(o, s, p);
151 return FXDial::onLeftBtnPress(o, s, p);
155 return FXDial::onLeftBtnRelease(o, s, p);
162 FXEvent*
event = (FXEvent*)p;
163 if (options & DIAL_HORIZONTAL) {
164 dragpoint =
event->win_x;
166 dragpoint =
event->win_y;
168 getApp()->addTimeout(
this,
ID_AUTOSPIN, getApp()->getScrollSpeed());
183 getApp()->addTimeout(
this,
ID_AUTOSPIN, getApp()->getScrollSpeed());
184 setValue(getValue() +
int((dragpoint - dragpos) /
float(5)));
187 target->handle(
this, FXSEL(SEL_CHANGED, message), &v);
196 if (target && target->handle(
this, FXSEL(SEL_MOTION, message), p)) {
200 FXbool bJump = FALSE;
201 FXEvent* e = (FXEvent*)p;
202 if (!(flags & FLAG_PRESSED)) {
205 FXWindow* rootWin = getApp()->getRootWindow();
206 FXint x = e->root_x, y = e->root_y;
207 if (e->root_x >= rootWin->getWidth() - 1) {
211 }
else if (e->root_x <= 10) {
216 if (e->root_y >= rootWin->getHeight() - 1) {
220 }
else if (e->root_y <= 10) {
226 rootWin->setCursorPosition(x, y);
229 return FXDial::onMotion(o, s, p);
259 FXuint opts = ARROW_NORMAL,
260 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0,
261 FXint pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD):
262 FXArrowButton(p, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb) {}
287 return target->handle(o, s, p);
293 return FXArrowButton::onLeftBtnPress(o, s, p);
297 return FXArrowButton::onLeftBtnRelease(o, s, p);
329 FXuint opts = TEXTFIELD_NORMAL,
330 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0, FXint
331 pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD
333 FXTextField(p, ncols, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb),
376 if (target && target->handle(
this, FXSEL(SEL_MOTION, message), ptr)) {
379 return FXTextField::onMotion(o, s, ptr);
384 setText(FXStringFormat(
fmtString.text(), *((FXdouble*)ptr)));
438 flags = (flags | FLAG_ENABLED | FLAG_SHOWN)&~FLAG_UPDATE;
454 FXRealSpinDial::FXRealSpinDial(FXComposite* p, FXint cols,
FXObject* tgt, FXSelector sel, FXuint opts, FXint x, FXint y, FXint w, FXint h, FXint pl, FXint pr, FXint pt, FXint pb):
455 FXPacker(p, opts&~(FRAME_RIDGE), x, y, w, h, 0, 0, 0, 0, 0, 0) {
456 flags = (flags | FLAG_ENABLED | FLAG_SHOWN)&~FLAG_UPDATE;
459 dial =
new FXRealSpinDialDial(
this,
this,
ID_DIAL, DIAL_VERTICAL, 0, 0, 0, 0, 0, 0, 0, 0);
460 dial->setNotchSpacing(450);
462 upButton =
new FXRealSpinDialBtn(
this,
this,
ID_INCREMENT, FRAME_RAISED | FRAME_THICK | ARROW_UP | ARROW_REPEAT, 0, 0, 0, 0, 0, 0, 0, 0);
463 downButton =
new FXRealSpinDialBtn(
this,
this,
ID_DECREMENT, FRAME_RAISED | FRAME_THICK | ARROW_DOWN | ARROW_REPEAT, 0, 0, 0, 0, 0, 0, 0, 0);
466 textField =
new FXRealSpinDialText(
this, cols,
this,
ID_ENTRY, (opts & ~(
SPINDIAL_NOMAX |
SPINDIAL_NOMIN)) | TEXTFIELD_REAL | JUSTIFY_RIGHT, 0, 0, 0, 0, pl, pr, pt, pb);
492 return textField->getDefaultHeight() + (border << 1);
504 if (!(flags & FLAG_ENABLED)) {
514 if (flags & FLAG_ENABLED) {
524 FXint dialHeight, buttonHeight, textHeight;
526 textHeight = height - 2 * border;
527 dialHeight = textHeight;
528 buttonHeight = textHeight >> 1;
531 if ((options & hideOpts) == hideOpts) {
532 flags &= ~FLAG_DIRTY;
536 FXint right = width - border;
545 upButton->position(border, border, bw, buttonHeight);
546 downButton->position(border, height - buttonHeight - border, bw, buttonHeight);
549 dial->position(left, border, right - left, dialHeight);
551 upButton->position(border, border, right - border, buttonHeight);
552 downButton->position(border, height - buttonHeight - border, right - border, buttonHeight);
558 dial->position(right - w, border, w, dialHeight);
563 upButton->position(right - w, border, w, buttonHeight);
564 downButton->position(right - w, height - buttonHeight - border, w, buttonHeight);
567 textField->position(border, border, right - border, textHeight);
569 flags &= ~FLAG_DIRTY;
576 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
578 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
591 if (FXApp::instance()->getKeyState(CONTROLMASK)) {
593 }
else if (FXApp::instance()->getKeyState(SHIFTMASK)) {
606 if (options & SPINDIAL_LOG) {
608 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lnp = log(newpos);
609 newpos = exp(lr0 + fmod(lnp - lr0, lr1 - lr0));
617 if (options & SPINDIAL_LOG) {
619 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lpos = log(
pos);
620 FXdouble span = lr1 - lr0;
621 newpos = exp(lr0 + fmod(lpos - lr0 + 1 + (span - inc), span));
631 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
651 if (isEnabled() && ((options & REALSPIN_CYCLIC) || (
pos <
range[1]))) {
652 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
654 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
675 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
683 if (isEnabled() && ((options & REALSPIN_CYCLIC) || (
range[0] <
pos))) {
684 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
686 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
707 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
716 return target && target->handle(
this, FXSEL(SEL_UPDATE, message), NULL);
729 if (((FXEvent*)p)->code > 0) {
735 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
742 register FXdouble value = FXDoubleVal(
textField->getText());
743 if (value <
range[0]) {
746 if (value >
range[1]) {
752 target->handle(
this, FXSEL(SEL_CHANGED, message), (
void*)&
pos);
763 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
771 FXEvent*
event = (FXEvent*)ptr;
776 if (target && target->handle(
this, FXSEL(SEL_KEYPRESS, message), ptr)) {
787 switch (event->code) {
792 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
799 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
803 return textField->handle(sender, sel, ptr);
810 FXEvent*
event = (FXEvent*)ptr;
815 if (target && target->handle(
this, FXSEL(SEL_KEYRELEASE, message), ptr)) {
818 switch (event->code) {
825 return textField->handle(sender, sel, ptr);
861 FXdouble lo = (FXdouble)((FXint*)ptr)[0];
862 FXdouble hi = (FXdouble)((FXint*)ptr)[1];
870 ((FXdouble*)ptr)[0] =
range[0];
871 ((FXdouble*)ptr)[1] =
range[1];
892 setRange(((FXdouble*)ptr)[0], ((FXdouble*)ptr)[1]);
899 getRange(((FXdouble*)ptr)[0], ((FXdouble*)ptr)[1]);
907 FXdouble inc =
incr[incMode + 1];
914 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lnp = log(newpos);
915 newpos = exp(lr0 + fmod(lnp - lr0, lr1 - lr0));
930 FXdouble inc =
incr[incMode + 1];
937 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lpos = log(
pos);
938 FXdouble span = lr1 - lr0;
939 newpos = exp(lr0 + fmod(lpos - lr0 + 1 + (span - inc), span));
970 fxerror(
"%s::setRange: trying to set negative range.\n", getClassName());
982 if (value <
range[0]) {
985 if (value >
range[1]) {
989 textField->handle(
this, FXSEL(SEL_COMMAND, ID_SETREALVALUE), &value);
998 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1004 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1010 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1016 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1033 if (options != opts) {
1055 dial->setHelpText(text);
1070 dial->setTipText(text);
1086 if (options != opts) {
1088 range[0] = -DBL_MAX;
1118 dial->setBackColor(clr);
1123 return dial->getBackColor();
1209 FXPacker::save(store);
1245 FXRealSpinDial::selectAll() {
long onCmdDecrement(FXObject *, FXSelector, void *)
long onCmdGetIntRange(FXObject *, FXSelector, void *)
long onCmdGetRealRange(FXObject *, FXSelector, void *)
FXRealSpinDialText(FXComposite *p, FXint ncols, FXObject *tgt=NULL, FXSelector sel=0, FXuint opts=TEXTFIELD_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
Construct a text widget.
void setFineIncrement(FXdouble increment)
Change spinner fine adjustment increment (when CTRL key held down)
long onKey(FXObject *, FXSelector, void *)
FXbool isTextVisible() const
Return TRUE if text is visible.
FXColor getTextColor() const
Return text color.
long onUpdEntry(FXObject *, FXSelector, void *)
FXRealSpinDialBtn(FXComposite *p, FXObject *tgt=NULL, FXSelector sel=0, FXuint opts=ARROW_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
Construct a dial widget.
void setFont(FXFont *fnt)
Set the text font.
void setDialColor(FXColor clr)
Change color of the dial.
virtual FXint getDefaultHeight()
Return default height.
virtual void load(FXStream &store)
Load spinner from a stream.
virtual void setValue(FXdouble value)
Change current value.
long onButtonPress(FXObject *, FXSelector, void *)
long onCmdSetIntRange(FXObject *, FXSelector, void *)
void setNumberFormat(FXint prec, FXbool bExp=FALSE)
void setCoarseIncrement(FXdouble increment)
Change spinner coarse adjustment increment (when SHIFT key held down)
FXArrowButton * downButton
virtual FXint getDefaultWidth()
Return default width.
void setSpinnerStyle(FXuint style)
Change spinner style.
void setCursorColor(FXColor clr)
Changes the cursor color.
long onCmdSetValue(FXObject *, FXSelector, void *)
virtual void create()
Create server-side resources.
long onCmdSetRealRange(FXObject *, FXSelector, void *)
long onKeyPress(FXObject *, FXSelector, void *)
const FXDial & getDial() const
FXColor getUpArrowColor() const
Return color of the up arrow.
virtual void disable()
Disable spinner.
long onRightButtonRelease(FXObject *, FXSelector, void *)
FXRealSpinDialDial & operator=(const FXRealSpinDialDial &)
FXbool isEditable() const
Return TRUE if text field is editable.
FXRealSpinDialDial(FXComposite *p, FXObject *tgt=NULL, FXSelector sel=0, FXuint opts=DIAL_NORMAL, FXint x=0, FXint y=0, FXint w=0, FXint h=0, FXint pl=DEFAULT_PAD, FXint pr=DEFAULT_PAD, FXint pt=DEFAULT_PAD, FXint pb=DEFAULT_PAD)
Construct a dial widget.
void setEditable(FXbool edit=TRUE)
Allow editing of the text field.
void setTextColor(FXColor clr)
Change text color.
long onButtonRelease(FXObject *, FXSelector, void *)
void decrement(FXint incMode=SPINDIAL_INC_NORMAL)
Decrement spinner.
FXbool getNumberFormatExponent() const
void setSelBackColor(FXColor clr)
Change selected background color.
void setRange(FXdouble lo, FXdouble hi)
Change the spinner's range.
long onCmdEntry(FXObject *, FXSelector, void *)
long onCmdSetIntValue(FXObject *, FXSelector, void *)
long onMotion(FXObject *, FXSelector, void *)
FXdouble getValue() const
Return current value.
long onButtonPress(FXObject *, FXSelector, void *)
virtual void save(FXStream &store) const
Save spinner to a stream.
FXint getNumberFormatPrecision() const
long onUpdDial(FXObject *, FXSelector, void *)
FXString getNumberFormatString() const
Return the format string for number display.
void setFormatString(const FXchar *fmt)
FXString getTipText() const
Get the tool tip message for this spinner.
void setTipText(const FXString &text)
Set the tool tip message for this spinner.
long onButtonRelease(FXObject *, FXSelector, void *)
virtual ~FXRealSpinDial()
Destructor.
FXColor getSelBackColor() const
Return selected background color.
void setCyclic(FXbool cyclic)
Set to cyclic mode, i.e. wrap around at maximum/minimum.
FXColor getSelTextColor() const
Return selected text color.
long onKeyRelease(FXObject *, FXSelector, void *)
long onUpdDecrement(FXObject *, FXSelector, void *)
long onCmdDial(FXObject *, FXSelector, void *)
void setFormatString(const FXchar *fmt)
FXColor getCursorColor() const
Return the cursor color.
void getRange(FXdouble &lo, FXdouble &hi) const
Get the spinner's current range.
long onCmdGetRealValue(FXObject *, FXSelector, void *)
FXString getNumberFormatString() const
FXColor getDownArrowColor() const
Return color of the the down arrow.
void setTextVisible(FXbool shown)
Set text visible flag.
void setNumberFormat(FXint prec, FXbool bExp=FALSE)
long onKey(FXObject *, FXSelector, void *)
long onCmdIncrement(FXObject *, FXSelector, void *)
FXColor getDialColor() const
Return color of the dial.
long onMotion(FXObject *, FXSelector, void *)
void increment(FXint incMode=SPINDIAL_INC_NORMAL)
Increment spinner.
FXint getNumberFormatPrecision() const
Return the digits of precision used to display numbers.
long onChgEntry(FXObject *, FXSelector, void *)
FXuint getSpinnerStyle() const
Return current spinner style.
long onCmdSetRealValue(FXObject *, FXSelector, void *)
FXbool getNumberFormatExponent() const
Return whether the exponent is used in number display.
void setHelpText(const FXString &text)
Set the status line help text for this spinner.
FXbool isCyclic() const
Return TRUE if in cyclic mode.
FXRealSpinDialBtn & operator=(const FXRealSpinDialBtn &)
FXString getHelpText() const
Get the status line help text for this spinner.
void setDownArrowColor(FXColor clr)
Change color of the down arrow.
long onMotion(FXObject *, FXSelector, void *)
void setIncrement(FXdouble increment)
Change spinner increment.
long onCmdGetIntValue(FXObject *, FXSelector, void *)
long onUpdIncrement(FXObject *, FXSelector, void *)
void setIncrements(FXdouble fine, FXdouble norm, FXdouble coarse)
Change all spinner increment.
FXDEFMAP(FXRealSpinDialDial) FXSpinDialMap[]
virtual void layout()
Perform layout.
long onMouseWheel(FXObject *, FXSelector, void *)
FXFont * getFont() const
Get the text font.
void setSelTextColor(FXColor clr)
Change selected text color.
MSNet * load(OptionsCont &oc)
FXRealSpinDialText * textField
long onAuto(FXObject *, FXSelector, void *)
long onRightButtonPress(FXObject *, FXSelector, void *)
FXRealSpinDialText & operator=(const FXRealSpinDialText &)
virtual void enable()
Enable spinner.
void setUpArrowColor(FXColor clr)
Change color of the up arrow.
long onCmdSetRealValue(FXObject *, FXSelector, void *)
long onChgDial(FXObject *, FXSelector, void *)