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)
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());
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);
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);
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),
375 if (target && target->handle(
this, FXSEL(SEL_MOTION, message), ptr)) {
378 return FXTextField::onMotion(o, s, ptr);
383 setText(FXStringFormat(
fmtString.text(), *((FXdouble*)ptr)));
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 *)
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 *)