42 #include "FXRectangle.h"
43 #include "FXRegistry.h"
44 #include "FXAccelTable.h"
47 #include "FXTextField.h"
53 #ifdef CHECK_MEMORY_LEAKS
55 #endif // CHECK_MEMORY_LEAKS
75 #define BUTTONWIDTH 12
78 #define INTMAX 2147483647
79 #define INTMIN (-INTMAX-1)
81 #define SPINDIAL_MASK (SPINDIAL_CYCLIC|SPINDIAL_NOTEXT|SPINDIAL_NOBUTTONS|SPINDIAL_NODIAL|SPINDIAL_NOMAX|SPINDIAL_NOMIN|SPINDIAL_LOG)
98 long onKey(
FXObject*, FXSelector,
void*);
99 long onButtonPress(
FXObject*, FXSelector,
void*);
100 long onButtonRelease(
FXObject*, FXSelector,
void*);
101 long onRightButtonPress(
FXObject*, FXSelector,
void*);
102 long onRightButtonRelease(
FXObject*, FXSelector,
void*);
103 long onMotion(
FXObject*, FXSelector,
void*);
104 long onAuto(
FXObject*, FXSelector,
void*);
106 ID_AUTOSPIN = FXDial::ID_LAST,
113 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0,
114 FXint pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD):
115 FXDial(p, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb) {}
144 return target->handle(o, s, p);
150 return FXDial::onLeftBtnPress(o, s, p);
154 return FXDial::onLeftBtnRelease(o, s, p);
161 FXEvent*
event = (FXEvent*)p;
162 if (options & DIAL_HORIZONTAL) {
163 dragpoint =
event->win_x;
165 dragpoint =
event->win_y;
167 getApp()->addTimeout(
this, ID_AUTOSPIN, getApp()->getScrollSpeed());
174 getApp()->removeTimeout(
this, ID_AUTOSPIN);
182 getApp()->addTimeout(
this, ID_AUTOSPIN, getApp()->getScrollSpeed());
183 setValue(getValue() +
int((dragpoint - dragpos) /
float(5)));
186 target->handle(
this, FXSEL(SEL_CHANGED, message), &v);
195 if (target && target->handle(
this, FXSEL(SEL_MOTION, message), p)) {
199 FXbool bJump = FALSE;
200 FXEvent* e = (FXEvent*)p;
201 if (!(flags & FLAG_PRESSED)) {
204 FXWindow* rootWin = getApp()->getRootWindow();
205 FXint x = e->root_x, y = e->root_y;
206 if (e->root_x >= rootWin->getWidth() - 1) {
210 }
else if (e->root_x <= 10) {
215 if (e->root_y >= rootWin->getHeight() - 1) {
219 }
else if (e->root_y <= 10) {
225 rootWin->setCursorPosition(x, y);
228 return FXDial::onMotion(o, s, p);
247 long onKey(
FXObject*, FXSelector,
void*);
248 long onButtonPress(
FXObject*, FXSelector,
void*);
249 long onButtonRelease(
FXObject*, FXSelector,
void*);
251 ID_AUTOSPIN = FXDial::ID_LAST,
258 FXuint opts = ARROW_NORMAL,
259 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0,
260 FXint pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD):
261 FXArrowButton(p, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb) {}
286 return target->handle(o, s, p);
292 return FXArrowButton::onLeftBtnPress(o, s, p);
296 return FXArrowButton::onLeftBtnRelease(o, s, p);
316 long onCmdSetRealValue(
FXObject*, FXSelector,
void*);
317 long onMotion(
FXObject*, FXSelector,
void*);
319 ID_LAST = FXTextField::ID_LAST
328 FXuint opts = TEXTFIELD_NORMAL,
329 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0, FXint
330 pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD
332 FXTextField(p, ncols, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb),
340 flags &= ~FLAG_FMTSTRING;
350 flags |= FLAG_FMTSTRING;
375 if (target && target->handle(
this, FXSEL(SEL_MOTION, message), ptr)) {
378 return FXTextField::onMotion(o, s, ptr);
382 if (flags & FLAG_FMTSTRING) {
383 setText(FXStringFormat(fmtString.text(), *((FXdouble*)ptr)));
385 setText(FXStringVal(*((FXdouble*)ptr), precision, exponent));
437 flags = (flags | FLAG_ENABLED | FLAG_SHOWN)&~FLAG_UPDATE;
453 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):
454 FXPacker(p, opts&~(FRAME_RIDGE), x, y, w, h, 0, 0, 0, 0, 0, 0) {
455 flags = (flags | FLAG_ENABLED | FLAG_SHOWN)&~FLAG_UPDATE;
458 dial =
new FXRealSpinDialDial(
this,
this,
ID_DIAL, DIAL_VERTICAL, 0, 0, 0, 0, 0, 0, 0, 0);
459 dial->setNotchSpacing(450);
461 upButton =
new FXRealSpinDialBtn(
this,
this,
ID_INCREMENT, FRAME_RAISED | FRAME_THICK | ARROW_UP | ARROW_REPEAT, 0, 0, 0, 0, 0, 0, 0, 0);
462 downButton =
new FXRealSpinDialBtn(
this,
this,
ID_DECREMENT, FRAME_RAISED | FRAME_THICK | ARROW_DOWN | ARROW_REPEAT, 0, 0, 0, 0, 0, 0, 0, 0);
463 textField =
new FXRealSpinDialText(
this, cols,
this,
ID_ENTRY, (opts & FRAME_RIDGE) | TEXTFIELD_REAL | JUSTIFY_RIGHT, 0, 0, 0, 0, pl, pr, pt, pb);
489 return textField->getDefaultHeight() + (border << 1);
501 if (!(flags & FLAG_ENABLED)) {
511 if (flags & FLAG_ENABLED) {
521 FXint dialHeight, buttonHeight, textHeight;
523 textHeight = height - 2 * border;
524 dialHeight = textHeight;
525 buttonHeight = textHeight >> 1;
528 if ((options & hideOpts) == hideOpts) {
529 flags &= ~FLAG_DIRTY;
533 FXint right = width - border;
542 upButton->position(border, border, bw, buttonHeight);
543 downButton->position(border, height - buttonHeight - border, bw, buttonHeight);
546 dial->position(left, border, right - left, dialHeight);
548 upButton->position(border, border, right - border, buttonHeight);
549 downButton->position(border, height - buttonHeight - border, right - border, buttonHeight);
555 dial->position(right - w, border, w, dialHeight);
560 upButton->position(right - w, border, w, buttonHeight);
561 downButton->position(right - w, height - buttonHeight - border, w, buttonHeight);
564 textField->position(border, border, right - border, textHeight);
566 flags &= ~FLAG_DIRTY;
573 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
575 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
588 if (FXApp::instance()->getKeyState(CONTROLMASK)) {
590 }
else if (FXApp::instance()->getKeyState(SHIFTMASK)) {
603 if (options & SPINDIAL_LOG) {
605 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lnp = log(newpos);
606 newpos = exp(lr0 + fmod(lnp - lr0, lr1 - lr0));
614 if (options & SPINDIAL_LOG) {
616 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lpos = log(
pos);
617 FXdouble span = lr1 - lr0;
618 newpos = exp(lr0 + fmod(lpos - lr0 + 1 + (span - inc), span));
628 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
648 if (isEnabled() && ((options & REALSPIN_CYCLIC) || (
pos <
range[1]))) {
649 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
651 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
672 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
680 if (isEnabled() && ((options & REALSPIN_CYCLIC) || (
range[0] <
pos))) {
681 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
683 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
704 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
713 return target && target->handle(
this, FXSEL(SEL_UPDATE, message), NULL);
726 if (((FXEvent*)p)->code > 0) {
732 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
739 register FXdouble value = FXDoubleVal(
textField->getText());
740 if (value <
range[0]) {
743 if (value >
range[1]) {
749 target->handle(
this, FXSEL(SEL_CHANGED, message), (
void*)&
pos);
760 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
768 FXEvent*
event = (FXEvent*)ptr;
773 if (target && target->handle(
this, FXSEL(SEL_KEYPRESS, message), ptr)) {
784 switch (event->code) {
789 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
796 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
800 return textField->handle(sender, sel, ptr);
807 FXEvent*
event = (FXEvent*)ptr;
812 if (target && target->handle(
this, FXSEL(SEL_KEYRELEASE, message), ptr)) {
815 switch (event->code) {
822 return textField->handle(sender, sel, ptr);
858 FXdouble lo = (FXdouble)((FXint*)ptr)[0];
859 FXdouble hi = (FXdouble)((FXint*)ptr)[1];
867 ((FXdouble*)ptr)[0] =
range[0];
868 ((FXdouble*)ptr)[1] =
range[1];
889 setRange(((FXdouble*)ptr)[0], ((FXdouble*)ptr)[1]);
896 getRange(((FXdouble*)ptr)[0], ((FXdouble*)ptr)[1]);
904 FXdouble inc =
incr[incMode + 1];
911 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lnp = log(newpos);
912 newpos = exp(lr0 + fmod(lnp - lr0, lr1 - lr0));
927 FXdouble inc =
incr[incMode + 1];
934 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lpos = log(
pos);
935 FXdouble span = lr1 - lr0;
936 newpos = exp(lr0 + fmod(lpos - lr0 + 1 + (span - inc), span));
967 fxerror(
"%s::setRange: trying to set negative range.\n", getClassName());
979 if (value <
range[0]) {
982 if (value >
range[1]) {
986 textField->handle(
this, FXSEL(SEL_COMMAND, ID_SETREALVALUE), &value);
995 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1001 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1007 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1013 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1030 if (options != opts) {
1052 dial->setHelpText(text);
1067 dial->setTipText(text);
1083 if (options != opts) {
1085 range[0] = -DBL_MAX;
1115 dial->setBackColor(clr);
1120 return dial->getBackColor();
1206 FXPacker::save(store);
1242 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 *)
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 *)