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);
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),
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);
407 setText(FXStringFormat(
fmtString.text(), *((FXdouble*)ptr)));
456 FXIMPLEMENT(
FXRealSpinDial, FXPacker, FXRealSpinDialMap, ARRAYNUMBER(FXRealSpinDialMap))
461 flags = (flags | FLAG_ENABLED | FLAG_SHOWN) & ~FLAG_UPDATE;
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);
1268 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 *)