66 #include "FXRectangle.h" 67 #include "FXRegistry.h" 68 #include "FXAccelTable.h" 71 #include "FXTextField.h" 77 #ifdef CHECK_MEMORY_LEAKS 79 #endif // CHECK_MEMORY_LEAKS 99 #define BUTTONWIDTH 12 102 #define INTMAX 2147483647 103 #define INTMIN (-INTMAX-1) 105 #define SPINDIAL_MASK (SPINDIAL_CYCLIC|SPINDIAL_NOTEXT|SPINDIAL_NOBUTTONS|SPINDIAL_NODIAL|SPINDIAL_NOMAX|SPINDIAL_NOMIN|SPINDIAL_LOG) 122 long onKey(FXObject*, FXSelector,
void*);
127 long onMotion(FXObject*, FXSelector,
void*);
128 long onAuto(FXObject*, FXSelector,
void*);
136 FXRealSpinDialDial(FXComposite* p, FXObject* tgt = NULL, FXSelector sel = 0, FXuint opts = DIAL_NORMAL,
137 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0,
138 FXint pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD):
139 FXDial(p, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb) {}
168 return target->handle(o, s, p);
174 return FXDial::onLeftBtnPress(o, s, p);
178 return FXDial::onLeftBtnRelease(o, s, p);
185 FXEvent*
event = (FXEvent*)p;
186 if (options & DIAL_HORIZONTAL) {
187 dragpoint =
event->win_x;
189 dragpoint =
event->win_y;
191 getApp()->addTimeout(
this,
ID_AUTOSPIN, getApp()->getScrollSpeed());
206 getApp()->addTimeout(
this,
ID_AUTOSPIN, getApp()->getScrollSpeed());
207 setValue(getValue() +
int((dragpoint - dragpos) /
float(5)));
210 target->handle(
this, FXSEL(SEL_CHANGED, message), &v);
219 if (target && target->handle(
this, FXSEL(SEL_MOTION, message), p)) {
223 FXbool bJump = FALSE;
224 FXEvent* e = (FXEvent*)p;
225 if (!(flags & FLAG_PRESSED)) {
228 FXWindow* rootWin = getApp()->getRootWindow();
229 FXint x = e->root_x, y = e->root_y;
230 if (e->root_x >= rootWin->getWidth() - 1) {
234 }
else if (e->root_x <= 10) {
239 if (e->root_y >= rootWin->getHeight() - 1) {
243 }
else if (e->root_y <= 10) {
249 rootWin->setCursorPosition(x, y);
252 return FXDial::onMotion(o, s, p);
271 long onKey(FXObject*, FXSelector,
void*);
282 FXuint opts = ARROW_NORMAL,
283 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0,
284 FXint pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD):
285 FXArrowButton(p, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb) {}
299 FXIMPLEMENT(
FXRealSpinDialBtn, FXArrowButton, FXSpinDialBtnMap, ARRAYNUMBER(FXSpinDialBtnMap))
310 return target->handle(o, s, p);
316 return FXArrowButton::onLeftBtnPress(o, s, p);
320 return FXArrowButton::onLeftBtnRelease(o, s, p);
340 long onCmdSetRealValue(FXObject*, FXSelector,
void*);
341 long onMotion(FXObject*, FXSelector,
void*);
352 FXuint opts = TEXTFIELD_NORMAL,
353 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0, FXint
354 pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD
356 FXTextField(p, ncols, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb),
364 flags &= ~FLAG_FMTSTRING;
374 flags |= FLAG_FMTSTRING;
391 FXIMPLEMENT(
FXRealSpinDialText, FXTextField, FXSpinDialTextMap, ARRAYNUMBER(FXSpinDialTextMap))
399 if (target && target->handle(
this, FXSEL(SEL_MOTION, message), ptr)) {
402 return FXTextField::onMotion(o, s, ptr);
406 if (flags & FLAG_FMTSTRING) {
407 setText(FXStringFormat(fmtString.text(), *((FXdouble*)ptr)));
409 setText(FXStringVal(*((FXdouble*)ptr), precision, exponent));
456 FXIMPLEMENT(
FXRealSpinDial, FXPacker, FXRealSpinDialMap, ARRAYNUMBER(FXRealSpinDialMap))
461 flags = (flags | FLAG_ENABLED | FLAG_SHOWN)&~FLAG_UPDATE;
463 dial = (FXDial*) - 1L;
477 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):
478 FXPacker(p, opts&~(FRAME_RIDGE), x, y, w, h, 0, 0, 0, 0, 0, 0) {
479 flags = (flags | FLAG_ENABLED | FLAG_SHOWN)&~FLAG_UPDATE;
482 dial =
new FXRealSpinDialDial(
this,
this,
ID_DIAL, DIAL_VERTICAL, 0, 0, 0, 0, 0, 0, 0, 0);
483 dial->setNotchSpacing(450);
485 upButton =
new FXRealSpinDialBtn(
this,
this,
ID_INCREMENT, FRAME_RAISED | FRAME_THICK | ARROW_UP | ARROW_REPEAT, 0, 0, 0, 0, 0, 0, 0, 0);
486 downButton =
new FXRealSpinDialBtn(
this,
this,
ID_DECREMENT, FRAME_RAISED | FRAME_THICK | ARROW_DOWN | ARROW_REPEAT, 0, 0, 0, 0, 0, 0, 0, 0);
489 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);
515 return textField->getDefaultHeight() + (border << 1);
527 if (!(flags & FLAG_ENABLED)) {
537 if (flags & FLAG_ENABLED) {
547 FXint dialHeight, buttonHeight, textHeight;
549 textHeight = height - 2 * border;
550 dialHeight = textHeight;
551 buttonHeight = textHeight >> 1;
554 if ((options & hideOpts) == hideOpts) {
555 flags &= ~FLAG_DIRTY;
559 FXint right = width - border;
568 upButton->position(border, border, bw, buttonHeight);
569 downButton->position(border, height - buttonHeight - border, bw, buttonHeight);
572 dial->position(left, border, right - left, dialHeight);
574 upButton->position(border, border, right - border, buttonHeight);
575 downButton->position(border, height - buttonHeight - border, right - border, buttonHeight);
581 dial->position(right - w, border, w, dialHeight);
586 upButton->position(right - w, border, w, buttonHeight);
587 downButton->position(right - w, height - buttonHeight - border, w, buttonHeight);
590 textField->position(border, border, right - border, textHeight);
592 flags &= ~FLAG_DIRTY;
599 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
601 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
614 if (FXApp::instance()->getKeyState(CONTROLMASK)) {
616 }
else if (FXApp::instance()->getKeyState(SHIFTMASK)) {
629 if (options & SPINDIAL_LOG) {
631 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lnp = log(newpos);
632 newpos = exp(lr0 + fmod(lnp - lr0, lr1 - lr0));
640 if (options & SPINDIAL_LOG) {
642 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lpos = log(
pos);
643 FXdouble span = lr1 - lr0;
644 newpos = exp(lr0 + fmod(lpos - lr0 + 1 + (span - inc), span));
654 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
674 if (isEnabled() && ((options & REALSPIN_CYCLIC) || (
pos <
range[1]))) {
675 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
677 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
698 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
706 if (isEnabled() && ((options & REALSPIN_CYCLIC) || (
range[0] <
pos))) {
707 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
709 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
730 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
739 return target && target->handle(
this, FXSEL(SEL_UPDATE, message), NULL);
752 if (((FXEvent*)p)->code > 0) {
758 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
765 register FXdouble value = FXDoubleVal(
textField->getText());
766 if (value <
range[0]) {
769 if (value >
range[1]) {
775 target->handle(
this, FXSEL(SEL_CHANGED, message), (
void*)&
pos);
786 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
794 FXEvent*
event = (FXEvent*)ptr;
799 if (target && target->handle(
this, FXSEL(SEL_KEYPRESS, message), ptr)) {
810 switch (event->code) {
815 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
822 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
826 return textField->handle(sender, sel, ptr);
833 FXEvent*
event = (FXEvent*)ptr;
838 if (target && target->handle(
this, FXSEL(SEL_KEYRELEASE, message), ptr)) {
841 switch (event->code) {
848 return textField->handle(sender, sel, ptr);
884 FXdouble lo = (FXdouble)((FXint*)ptr)[0];
885 FXdouble hi = (FXdouble)((FXint*)ptr)[1];
893 ((FXdouble*)ptr)[0] =
range[0];
894 ((FXdouble*)ptr)[1] =
range[1];
915 setRange(((FXdouble*)ptr)[0], ((FXdouble*)ptr)[1]);
922 getRange(((FXdouble*)ptr)[0], ((FXdouble*)ptr)[1]);
930 FXdouble inc =
incr[incMode + 1];
937 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lnp = log(newpos);
938 newpos = exp(lr0 + fmod(lnp - lr0, lr1 - lr0));
953 FXdouble inc =
incr[incMode + 1];
960 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lpos = log(
pos);
961 FXdouble span = lr1 - lr0;
962 newpos = exp(lr0 + fmod(lpos - lr0 + 1 + (span - inc), span));
993 fxerror(
"%s::setRange: trying to set negative range.\n", getClassName());
1005 if (value <
range[0]) {
1008 if (value >
range[1]) {
1012 textField->handle(
this, FXSEL(SEL_COMMAND, ID_SETREALVALUE), &value);
1021 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1027 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1033 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1039 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1056 if (options != opts) {
1078 dial->setHelpText(text);
1093 dial->setTipText(text);
1109 if (options != opts) {
1111 range[0] = -DBL_MAX;
1141 dial->setBackColor(clr);
1146 return dial->getBackColor();
1232 FXPacker::save(store);
1259 dial = (FXDial*) - 1L;
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 selectAll()
Mark the text entry as selected.
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.
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 *)
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 *)