67 #include "FXRectangle.h" 68 #include "FXRegistry.h" 69 #include "FXAccelTable.h" 72 #include "FXTextField.h" 97 #define BUTTONWIDTH 12 100 #define INTMAX 2147483647 101 #define INTMIN (-INTMAX-1) 103 #define SPINDIAL_MASK (SPINDIAL_CYCLIC|SPINDIAL_NOTEXT|SPINDIAL_NOBUTTONS|SPINDIAL_NODIAL|SPINDIAL_NOMAX|SPINDIAL_NOMIN|SPINDIAL_LOG) 120 long onKey(FXObject*, FXSelector,
void*);
125 long onMotion(FXObject*, FXSelector,
void*);
126 long onAuto(FXObject*, FXSelector,
void*);
134 FXRealSpinDialDial(FXComposite* p, FXObject* tgt = NULL, FXSelector sel = 0, FXuint opts = DIAL_NORMAL,
135 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0,
136 FXint pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD):
137 FXDial(p, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb) {}
166 return target->handle(o, s, p);
172 return FXDial::onLeftBtnPress(o, s, p);
176 return FXDial::onLeftBtnRelease(o, s, p);
183 FXEvent*
event = (FXEvent*)p;
184 if (options & DIAL_HORIZONTAL) {
185 dragpoint =
event->win_x;
187 dragpoint =
event->win_y;
189 getApp()->addTimeout(
this,
ID_AUTOSPIN, getApp()->getScrollSpeed());
204 getApp()->addTimeout(
this,
ID_AUTOSPIN, getApp()->getScrollSpeed());
205 setValue(getValue() +
int((dragpoint - dragpos) /
float(5)));
208 target->handle(
this, FXSEL(SEL_CHANGED, message), &v);
217 if (target && target->handle(
this, FXSEL(SEL_MOTION, message), p)) {
221 FXbool bJump = FALSE;
222 FXEvent* e = (FXEvent*)p;
223 if (!(flags & FLAG_PRESSED)) {
226 FXWindow* rootWin = getApp()->getRootWindow();
227 FXint x = e->root_x, y = e->root_y;
228 if (e->root_x >= rootWin->getWidth() - 1) {
232 }
else if (e->root_x <= 10) {
237 if (e->root_y >= rootWin->getHeight() - 1) {
241 }
else if (e->root_y <= 10) {
247 rootWin->setCursorPosition(x, y);
250 return FXDial::onMotion(o, s, p);
269 long onKey(FXObject*, FXSelector,
void*);
280 FXuint opts = ARROW_NORMAL,
281 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0,
282 FXint pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD):
283 FXArrowButton(p, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb) {}
297 FXIMPLEMENT(
FXRealSpinDialBtn, FXArrowButton, FXSpinDialBtnMap, ARRAYNUMBER(FXSpinDialBtnMap))
308 return target->handle(o, s, p);
314 return FXArrowButton::onLeftBtnPress(o, s, p);
318 return FXArrowButton::onLeftBtnRelease(o, s, p);
338 long onCmdSetRealValue(FXObject*, FXSelector,
void*);
339 long onMotion(FXObject*, FXSelector,
void*);
350 FXuint opts = TEXTFIELD_NORMAL,
351 FXint x = 0, FXint y = 0, FXint w = 0, FXint h = 0, FXint
352 pl = DEFAULT_PAD, FXint pr = DEFAULT_PAD, FXint pt = DEFAULT_PAD, FXint pb = DEFAULT_PAD
354 FXTextField(p, ncols, tgt, sel, opts, x, y, w, h, pl, pr, pt, pb),
362 flags &= ~FLAG_FMTSTRING;
372 flags |= FLAG_FMTSTRING;
389 FXIMPLEMENT(
FXRealSpinDialText, FXTextField, FXSpinDialTextMap, ARRAYNUMBER(FXSpinDialTextMap))
397 if (target && target->handle(
this, FXSEL(SEL_MOTION, message), ptr)) {
400 return FXTextField::onMotion(o, s, ptr);
404 if (flags & FLAG_FMTSTRING) {
405 setText(FXStringFormat(fmtString.text(), *((FXdouble*)ptr)));
407 setText(FXStringVal(*((FXdouble*)ptr), precision, exponent));
454 FXIMPLEMENT(
FXRealSpinDial, FXPacker, FXRealSpinDialMap, ARRAYNUMBER(FXRealSpinDialMap))
459 flags = (flags | FLAG_ENABLED | FLAG_SHOWN) & ~FLAG_UPDATE;
475 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):
476 FXPacker(p, opts & ~(FRAME_RIDGE), x, y, w, h, 0, 0, 0, 0, 0, 0) {
477 flags = (flags | FLAG_ENABLED | FLAG_SHOWN) & ~FLAG_UPDATE;
480 dial =
new FXRealSpinDialDial(
this,
this,
ID_DIAL, DIAL_VERTICAL, 0, 0, 0, 0, 0, 0, 0, 0);
481 dial->setNotchSpacing(450);
483 upButton =
new FXRealSpinDialBtn(
this,
this,
ID_INCREMENT, FRAME_RAISED | FRAME_THICK | ARROW_UP | ARROW_REPEAT, 0, 0, 0, 0, 0, 0, 0, 0);
484 downButton =
new FXRealSpinDialBtn(
this,
this,
ID_DECREMENT, FRAME_RAISED | FRAME_THICK | ARROW_DOWN | ARROW_REPEAT, 0, 0, 0, 0, 0, 0, 0, 0);
487 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);
513 return textField->getDefaultHeight() + (border << 1);
525 if (!(flags & FLAG_ENABLED)) {
535 if (flags & FLAG_ENABLED) {
545 FXint dialHeight, buttonHeight, textHeight;
547 textHeight = height - 2 * border;
548 dialHeight = textHeight;
549 buttonHeight = textHeight >> 1;
552 if ((options & hideOpts) == hideOpts) {
553 flags &= ~FLAG_DIRTY;
557 FXint right = width - border;
566 upButton->position(border, border, bw, buttonHeight);
567 downButton->position(border, height - buttonHeight - border, bw, buttonHeight);
570 dial->position(left, border, right - left, dialHeight);
572 upButton->position(border, border, right - border, buttonHeight);
573 downButton->position(border, height - buttonHeight - border, right - border, buttonHeight);
579 dial->position(right - w, border, w, dialHeight);
584 upButton->position(right - w, border, w, buttonHeight);
585 downButton->position(right - w, height - buttonHeight - border, w, buttonHeight);
588 textField->position(border, border, right - border, textHeight);
590 flags &= ~FLAG_DIRTY;
597 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
599 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
612 if (FXApp::instance()->getKeyState(CONTROLMASK)) {
614 }
else if (FXApp::instance()->getKeyState(SHIFTMASK)) {
627 if (options & SPINDIAL_LOG) {
629 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lnp = log(newpos);
630 newpos = exp(lr0 + fmod(lnp - lr0, lr1 - lr0));
638 if (options & SPINDIAL_LOG) {
640 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lpos = log(
pos);
641 FXdouble span = lr1 - lr0;
642 newpos = exp(lr0 + fmod(lpos - lr0 + 1 + (span - inc), span));
652 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
672 if (isEnabled() && ((options & REALSPIN_CYCLIC) || (
pos <
range[1]))) {
673 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
675 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
696 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
704 if (isEnabled() && ((options & REALSPIN_CYCLIC) || (
range[0] <
pos))) {
705 sender->handle(
this, FXSEL(SEL_COMMAND, ID_ENABLE), NULL);
707 sender->handle(
this, FXSEL(SEL_COMMAND, ID_DISABLE), NULL);
728 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
737 return target && target->handle(
this, FXSEL(SEL_UPDATE, message), NULL);
750 if (((FXEvent*)p)->code > 0) {
756 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
763 FXdouble value = FXDoubleVal(
textField->getText());
764 if (value <
range[0]) {
767 if (value >
range[1]) {
773 target->handle(
this, FXSEL(SEL_CHANGED, message), (
void*)&
pos);
784 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
792 FXEvent*
event = (FXEvent*)ptr;
797 if (target && target->handle(
this, FXSEL(SEL_KEYPRESS, message), ptr)) {
808 switch (event->code) {
813 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
820 target->handle(
this, FXSEL(SEL_COMMAND, message), (
void*)&
pos);
824 return textField->handle(sender, sel, ptr);
831 FXEvent*
event = (FXEvent*)ptr;
836 if (target && target->handle(
this, FXSEL(SEL_KEYRELEASE, message), ptr)) {
839 switch (event->code) {
846 return textField->handle(sender, sel, ptr);
882 FXdouble lo = (FXdouble)((FXint*)ptr)[0];
883 FXdouble hi = (FXdouble)((FXint*)ptr)[1];
891 ((FXdouble*)ptr)[0] =
range[0];
892 ((FXdouble*)ptr)[1] =
range[1];
913 setRange(((FXdouble*)ptr)[0], ((FXdouble*)ptr)[1]);
920 getRange(((FXdouble*)ptr)[0], ((FXdouble*)ptr)[1]);
928 FXdouble inc =
incr[incMode + 1];
935 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lnp = log(newpos);
936 newpos = exp(lr0 + fmod(lnp - lr0, lr1 - lr0));
951 FXdouble inc =
incr[incMode + 1];
958 FXdouble lr0 = log(
range[0]), lr1 = log(
range[1]), lpos = log(
pos);
959 FXdouble span = lr1 - lr0;
960 newpos = exp(lr0 + fmod(lpos - lr0 + 1 + (span - inc), span));
991 fxerror(
"%s::setRange: trying to set negative range.\n", getClassName());
1003 if (value <
range[0]) {
1006 if (value >
range[1]) {
1010 textField->handle(
this, FXSEL(SEL_COMMAND, ID_SETREALVALUE), &value);
1019 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1025 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1031 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1037 fxerror(
"%s::setIncrement: negative or zero increment specified.\n", getClassName());
1054 if (options != opts) {
1076 dial->setHelpText(text);
1091 dial->setTipText(text);
1107 if (options != opts) {
1109 range[0] = -DBL_MAX;
1139 dial->setBackColor(clr);
1144 return dial->getBackColor();
1230 FXPacker::save(store);
1243 FXPacker::load(store);
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.
FXString getHelpText() const
Get the status line help text for this spinner.
FXbool isEditable() const
Return TRUE if text field is editable.
void selectAll()
Mark the text entry as selected.
void setFineIncrement(FXdouble increment)
Change spinner fine adjustment increment (when CTRL key held down)
FXuint getSpinnerStyle() const
Return current spinner style.
FXColor getDialColor() const
Return color of the dial.
long onKey(FXObject *, FXSelector, void *)
FXFont * getFont() const
Get the text font.
FXString getNumberFormatString() const
Return the format string for number display.
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.
FXbool getNumberFormatExponent() const
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.
FXString getTipText() const
Get the tool tip message for this spinner.
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.
FXbool isCyclic() const
Return TRUE if in cyclic mode.
FXint getNumberFormatPrecision() const
Return the digits of precision used to display numbers.
long onCmdSetValue(FXObject *, FXSelector, void *)
virtual void create()
Create server-side resources.
long onCmdSetRealRange(FXObject *, FXSelector, void *)
void getRange(FXdouble &lo, FXdouble &hi) const
Get the spinner's current range.
long onKeyPress(FXObject *, FXSelector, void *)
virtual void disable()
Disable spinner.
long onRightButtonRelease(FXObject *, FXSelector, void *)
FXColor getCursorColor() const
Return the cursor color.
FXRealSpinDialDial & operator=(const FXRealSpinDialDial &)
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.
const FXDial & getDial() const
void setSelBackColor(FXColor clr)
Change selected background color.
FXint getNumberFormatPrecision() const
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 *)
long onButtonPress(FXObject *, FXSelector, void *)
FXColor getSelTextColor() const
Return selected text color.
FXColor getTextColor() const
Return text color.
long onUpdDial(FXObject *, FXSelector, void *)
void setFormatString(const FXchar *fmt)
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.
long onKeyRelease(FXObject *, FXSelector, void *)
long onUpdDecrement(FXObject *, FXSelector, void *)
long onCmdDial(FXObject *, FXSelector, void *)
void setFormatString(const FXchar *fmt)
long onCmdGetRealValue(FXObject *, FXSelector, void *)
void setTextVisible(FXbool shown)
Set text visible flag.
FXbool getNumberFormatExponent() const
Return whether the exponent is used in number display.
void setNumberFormat(FXint prec, FXbool bExp=FALSE)
long onKey(FXObject *, FXSelector, void *)
long onCmdIncrement(FXObject *, FXSelector, void *)
long onMotion(FXObject *, FXSelector, void *)
FXString getNumberFormatString() const
void increment(FXint incMode=SPINDIAL_INC_NORMAL)
Increment spinner.
FXdouble getValue() const
Return current value.
long onChgEntry(FXObject *, FXSelector, void *)
long onCmdSetRealValue(FXObject *, FXSelector, void *)
void setHelpText(const FXString &text)
Set 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 *)
FXColor getDownArrowColor() const
Return color of the the down arrow.
void setSelTextColor(FXColor clr)
Change selected text color.
FXColor getUpArrowColor() const
Return color of the up arrow.
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 *)
FXbool isTextVisible() const
Return TRUE if text is visible.
long onChgDial(FXObject *, FXSelector, void *)
virtual void save(FXStream &store) const
Save spinner to a stream.