home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / SpinBox.C < prev    next >
C/C++ Source or Header  |  1998-06-10  |  5KB  |  199 lines

  1. // $Id: SpinBox.C,v 1.3 1998/06/10 17:33:36 zeller Exp $ -*- C++ -*-
  2. // Create a spin box
  3.  
  4. // Copyright (C) 1998 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char SpinBox_rcsid[] = 
  30.     "$Id: SpinBox.C,v 1.3 1998/06/10 17:33:36 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. // #define as 0 to rely exclusively on our replacement routines
  37. // #define USE_XM_SPINBOX 0
  38.  
  39. #include "SpinBox.h"
  40.  
  41. #include "assert.h"
  42. #include "strclass.h"
  43. #include "string-fun.h"
  44. #include "verify.h"
  45. #include "TimeOut.h"
  46.  
  47. #include <stdlib.h>
  48.  
  49. #include <Xm/Xm.h>
  50. #include <Xm/ArrowB.h>
  51. #include <Xm/TextF.h>
  52.  
  53. // Whether to use XmSpinBox
  54. #ifndef USE_XM_SPINBOX
  55. #if XmVersion >= 2000
  56. #define USE_XM_SPINBOX 1
  57. #else
  58. #define USE_XM_SPINBOX 0
  59. #endif
  60. #endif
  61.  
  62. #if USE_XM_SPINBOX
  63. #include <Xm/SpinB.h>
  64. #endif
  65.  
  66.  
  67. //-----------------------------------------------------------------------
  68. // SpinBox helpers
  69. //-----------------------------------------------------------------------
  70.  
  71. #if !USE_XM_SPINBOX
  72. static void add_to_value(Widget text, int offset)
  73. {
  74.     String value = XmTextFieldGetString(text);
  75.     int v = atoi(value) + offset;
  76.  
  77.     if (v >= 0)
  78.     {
  79.     string s = itostring(v);
  80.     XmTextFieldSetString(text, (String)s);
  81.     }
  82.     XtFree(value);
  83. }
  84.  
  85. static Widget spin_text;
  86. static XtIntervalId spin_timer;
  87. static int spin_offset;
  88.  
  89. static void RepeatSpinCB(XtPointer, XtIntervalId *id)
  90. {
  91.     assert(*id == spin_timer);
  92.     (void) id;
  93.  
  94.     add_to_value(spin_text, spin_offset);
  95.  
  96.     spin_timer = XtAppAddTimeOut(XtWidgetToApplicationContext(spin_text),
  97.                  200, RepeatSpinCB, 0);
  98. }
  99.  
  100. static void StartSpinCB(Widget w, XtPointer client_data, XtPointer)
  101. {
  102.     spin_text = Widget(client_data);
  103.  
  104.     unsigned char direction = (unsigned char)-1;
  105.     XtVaGetValues(w, XmNarrowDirection, &direction, NULL);
  106.  
  107.     switch (direction)
  108.     {
  109.     case XmARROW_LEFT:
  110.     case XmARROW_UP:
  111.     spin_offset = -1;
  112.     break;
  113.  
  114.     case XmARROW_RIGHT:
  115.     case XmARROW_DOWN:
  116.     spin_offset = +1;
  117.     break;
  118.  
  119.     default:
  120.     spin_offset = 0;
  121.     break;
  122.     }
  123.  
  124.     add_to_value(spin_text, spin_offset);
  125.  
  126.     if (spin_timer != 0)
  127.     {
  128.     XtRemoveTimeOut(spin_timer);
  129.     spin_timer = 0;
  130.     }
  131.  
  132.     spin_timer = XtAppAddTimeOut(XtWidgetToApplicationContext(spin_text),
  133.                  250, RepeatSpinCB, 0);
  134. }
  135.  
  136. static void StopSpinCB(Widget, XtPointer, XtPointer)
  137. {
  138.     if (spin_timer != 0)
  139.     {
  140.     XtRemoveTimeOut(spin_timer);
  141.     spin_timer = 0;
  142.     }
  143. }
  144.  
  145. static Widget create_spin_arrow(Widget parent, unsigned char direction,
  146.                 Widget text)
  147. {
  148.     Pixel foreground;
  149.     XtVaGetValues(parent, XmNbackground, &foreground, 0);
  150.  
  151.     Arg args[10];
  152.     Cardinal arg = 0;
  153.     XtSetArg(args[arg], XmNarrowDirection,  direction);  arg++;
  154.     XtSetArg(args[arg], XmNshadowThickness, 0);          arg++;
  155.     XtSetArg(args[arg], XmNforeground,      foreground); arg++;
  156.     Widget arrow = XmCreateArrowButton(parent, "arrow", args, arg);
  157.     XtManageChild(arrow);
  158.  
  159.     XtAddCallback(arrow, XmNarmCallback, StartSpinCB, XtPointer(text));
  160.     XtAddCallback(arrow, XmNdisarmCallback, StopSpinCB, XtPointer(text));
  161.  
  162.     return arrow;
  163. }
  164. #endif // !USE_XM_SPINBOX
  165.  
  166.  
  167. //-----------------------------------------------------------------------
  168. // SpinBox creation
  169. //-----------------------------------------------------------------------
  170.  
  171. // Create a spin box
  172. Widget CreateSpinBox(Widget parent, String name, ArgList _args, Cardinal _arg)
  173. {
  174.     ArgList args = new Arg[_arg + 10];
  175.     Cardinal arg = 0;
  176.  
  177.     for (Cardinal i = 0; i < _arg; i++)
  178.     args[arg++] = _args[i];
  179.  
  180.     Widget spin = parent;
  181.  
  182. #if USE_XM_SPINBOX
  183.     XtSetArg(args[arg], XmNhighlightThickness, 0); arg++;
  184.     spin = XmCreateSpinBox(parent, "spin", args, arg);
  185.     XtManageChild(spin);
  186. #endif
  187.  
  188.     Widget text = verify(XmCreateTextField(spin, name, args, arg));
  189.     XtManageChild(text);
  190.     
  191. #if !USE_XM_SPINBOX
  192.     create_spin_arrow(parent, XmARROW_LEFT,  text);
  193.     create_spin_arrow(parent, XmARROW_RIGHT, text);
  194. #endif
  195.  
  196.     delete[] args;
  197.     return text;
  198. }
  199.