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)
99 long onKey(
FXObject*, FXSelector,
void*);
100 long onButtonPress(
FXObject*, FXSelector,
void*);
101 long onButtonRelease(
FXObject*, FXSelector,
void*);
102 long onRightButtonPress(
FXObject*, FXSelector,
void*);
103 long onRightButtonRelease(
FXObject*, FXSelector,
void*);
104 long onMotion(
FXObject*, FXSelector,
void*);
105 long onAuto(
FXObject*, FXSelector,
void*);
107 ID_AUTOSPIN = FXDial::ID_LAST,
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());
175 getApp()->removeTimeout(
this, ID_AUTOSPIN);
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);
248 long onKey(
FXObject*, FXSelector,
void*);
249 long onButtonPress(
FXObject*, FXSelector,
void*);
250 long onButtonRelease(
FXObject*, FXSelector,
void*);
252 ID_AUTOSPIN = FXDial::ID_LAST,
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);
317 long onCmdSetRealValue(
FXObject*, FXSelector,
void*);
318 long onMotion(
FXObject*, FXSelector,
void*);
320 ID_LAST = FXTextField::ID_LAST
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),
341 flags &= ~FLAG_FMTSTRING;
351 flags |= FLAG_FMTSTRING;
376 if (target && target->handle(
this, FXSEL(SEL_MOTION, message), ptr)) {
379 return FXTextField::onMotion(o, s, ptr);
383 if (flags & FLAG_FMTSTRING) {
384 setText(FXStringFormat(fmtString.text(), *((FXdouble*)ptr)));
386 setText(FXStringVal(*((FXdouble*)ptr), precision, exponent));
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 *)
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 *)