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();
1245 FXRealSpinDial::selectAll() {