home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / yacl-012.zip / ui / scrolbar.cxx < prev    next >
C/C++ Source or Header  |  1995-04-04  |  10KB  |  357 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6. /*
  7.  *
  8.  *          Copyright (C) 1994, M. A. Sridhar
  9.  *  
  10.  *
  11.  *     This software is Copyright M. A. Sridhar, 1994. You are free
  12.  *     to copy, modify or distribute this software  as you see fit,
  13.  *     and to use  it  for  any  purpose, provided   this copyright
  14.  *     notice and the following   disclaimer are included  with all
  15.  *     copies.
  16.  *
  17.  *                        DISCLAIMER
  18.  *
  19.  *     The author makes no warranties, either expressed or implied,
  20.  *     with respect  to  this  software, its  quality, performance,
  21.  *     merchantability, or fitness for any particular purpose. This
  22.  *     software is distributed  AS IS.  The  user of this  software
  23.  *     assumes all risks  as to its quality  and performance. In no
  24.  *     event shall the author be liable for any direct, indirect or
  25.  *     consequential damages, even if the  author has been  advised
  26.  *     as to the possibility of such damages.
  27.  *
  28.  */
  29.  
  30.  
  31.  
  32. #if defined(__GNUC__)
  33. #pragma implementation
  34. #endif
  35.  
  36.  
  37. #include "ui/scrolbar.h"
  38. #include "ui/cntroler.h"
  39. #include "ui/interval.h"
  40.  
  41. #if defined(__MS_WINDOWS__)
  42. #include <windows.h>
  43.  
  44. #elif defined(__X_MOTIF__)
  45. #include <Xm/ScrollBar.h> 
  46.  
  47. #endif
  48.  
  49. #if defined(__GNUC__) && __GNUC_MINOR__ >= 6
  50. template class CL_Binding<UI_ScrollBar>;
  51. #endif
  52.  
  53.  
  54. /*------------------ ScrollBar Object ---------------------------*/
  55.  
  56. typedef CL_Binding<UI_ScrollBar> Bind;
  57.  
  58. UI_ScrollBar::UI_ScrollBar (UI_VObjCollection* p,
  59.                             const UI_Rectangle& shape,
  60.                             UI_ViewID id, long bstyle)
  61. :  UI_SimpleVObject (p, shape, id, bstyle), _range (0, 100)
  62.     _model = new CL_Interval (0,0);
  63.     _ownModel = TRUE;
  64.     Bind bind (this, &UI_ScrollBar::_RangeChanged);
  65.     _range.AddDependent (bind, 1); // Second parameter unused
  66.     _lineAmount = 1;
  67.     _pageAmount = 10;
  68.     _smoothScroll = TRUE;
  69.     _vertical = TRUE;
  70. }
  71.  
  72.  
  73. UI_ScrollBar::~UI_ScrollBar()
  74. {
  75. }
  76.  
  77.  
  78.  
  79. UI_WindowClass UI_ScrollBar::WindowClass () const
  80. {
  81. #if defined(__MS_WINDOWS__)
  82.     return "scrollbar";
  83. #elif defined(__OS2__)
  84.     return WC_SCROLLBAR;
  85. #elif defined(__X_MOTIF__)
  86.     return xmScrollBarWidgetClass;
  87. #endif
  88. }
  89.  
  90.  
  91. bool UI_ScrollBar::MakeVisualElement ()
  92. {
  93.     bool b = UI_SimpleVObject::MakeVisualElement ();
  94. #if defined(__X_MOTIF__)
  95.     Arg args[1];
  96.     XtSetArg    (args[0], XmNorientation,
  97.                  _vertical ? XmVERTICAL : XmHORIZONTAL);
  98.     XtSetValues (_xwidget, args, 1);
  99. #endif
  100.     return b;
  101. }
  102.  
  103.  
  104. void UI_ScrollBar::_PrivateInitialize()
  105. {
  106.     UI_SimpleVObject::_PrivateInitialize();
  107.  
  108. #if defined(__MS_WINDOWS__)
  109.     SetScrollRange ((HWND) _handle, SB_CTL, _range.Low(), _range.High(),
  110.                     TRUE);
  111.     CL_Interval& interval = *(CL_Interval*) _model;
  112.     SetScrollPos (_handle, SB_CTL, interval.Low(), TRUE);
  113. #elif defined(__OS2__)
  114.     _RangeChanged (*this, 0); // Force an initialization of range
  115.     _ModelChanged (*this, 0); // Force initialization of model
  116. #elif defined(__X_MOTIF__)
  117.  
  118.     _RangeChanged (*this, 0); // Force an initialization of range
  119.     _ModelChanged (*this, 0); // Force initialization of model
  120.     XtAddCallback (_xwidget, XmNdragCallback, 
  121.                    &UI_ScrollBar::ScrollBarCallback, (XtPointer) this);
  122.     XtAddCallback (_xwidget, XmNincrementCallback, 
  123.                    &UI_ScrollBar::ScrollBarCallback, (XtPointer) this);
  124.     XtAddCallback (_xwidget, XmNpageIncrementCallback, 
  125.                    &UI_ScrollBar::ScrollBarCallback, (XtPointer) this);
  126.     XtAddCallback (_xwidget, XmNdecrementCallback, 
  127.                    &UI_ScrollBar::ScrollBarCallback, (XtPointer) this);
  128.     XtAddCallback (_xwidget, XmNpageDecrementCallback, 
  129.                    &UI_ScrollBar::ScrollBarCallback, (XtPointer) this);
  130.     XtAddCallback (_xwidget, XmNtoBottomCallback, 
  131.                    &UI_ScrollBar::ScrollBarCallback, (XtPointer) this);
  132.     XtAddCallback (_xwidget, XmNtoTopCallback, 
  133.                    &UI_ScrollBar::ScrollBarCallback, (XtPointer) this);
  134.     XtAddCallback (_xwidget, XmNvalueChangedCallback, 
  135.                    &UI_ScrollBar::ScrollBarCallback, (XtPointer) this);
  136. #endif
  137. }
  138.  
  139.  
  140. #if defined(__X_MOTIF__)
  141. void UI_ScrollBar::ScrollBarCallback (Widget w, void* client, void* call)
  142. {
  143.     UI_ScrollBar* bar = (UI_ScrollBar *) client;
  144.     UI_EventType type;
  145.     XmScrollBarCallbackStruct* cb = (XmScrollBarCallbackStruct*) call;
  146.     switch (cb->reason) {
  147.     case XmCR_DRAG:
  148.         type = Event_Scroll;
  149.         break;
  150.         
  151.     case XmCR_DECREMENT:
  152.         type = Event_ScrollBackwardLine;
  153.         break;
  154.         
  155.     case XmCR_INCREMENT:
  156.         type = Event_ScrollForwardLine;
  157.         break;
  158.         
  159.     case XmCR_PAGE_DECREMENT:
  160.         type = Event_ScrollBackwardPage;
  161.         break;
  162.         
  163.     case XmCR_PAGE_INCREMENT:
  164.         type = Event_ScrollForwardPage;
  165.         break;
  166.  
  167.     case XmCR_TO_TOP:
  168.         type = Event_ScrollToBegin;
  169.         break;
  170.  
  171.     case XmCR_TO_BOTTOM:
  172.         type = Event_ScrollToEnd;
  173.         break;
  174.  
  175.     case XmCR_VALUE_CHANGED:
  176.         type = Event_FinishScroll;
  177.         break;
  178.  
  179.     default:
  180.         CL_Error::Warning ("UI_ScrollBar callback: unknown reason");
  181.         break;
  182.     };
  183.     int val, slsize, inc, page_inc;
  184.     XmScrollBarGetValues (bar->_xwidget, &val, &slsize, &inc, &page_inc);
  185.     bar->_SetModelValue (CL_Interval (val, val+slsize-1));
  186.     UI_Event* evt = new UI_Event (type, bar, bar);
  187.     evt->param = val;
  188.     _Controller->AddEvent (evt);
  189. }
  190.  
  191. #endif // __X_MOTIF__
  192.  
  193.  
  194. bool UI_ScrollBar::HandleEvent (UI_Event* e)
  195. {
  196.     UI_EventType type = e->Type();
  197.     if (type < Event_Scroll || type > Event_ScrollToPosition) {
  198.         return ProcessEvent (e);
  199.     }
  200.  
  201.     long pos = ((CL_Interval*) _model)->Low();
  202.     switch (type) {
  203.     case Event_ScrollToBegin:
  204.         pos = _range.Low();
  205.         break;
  206.         
  207.     case Event_ScrollToEnd:
  208.         pos = _range.High();
  209.         break;
  210.         
  211.     case Event_ScrollForwardLine:
  212.         pos = minl (_range.High(), pos + _lineAmount);
  213.         break;
  214.         
  215.     case Event_ScrollBackwardLine:
  216.         pos = maxl (_range.Low(), pos - _lineAmount);
  217.         break;
  218.  
  219.     case Event_ScrollForwardPage:
  220.         pos = minl (_range.High(), pos + _pageAmount);
  221.         break;
  222.         
  223.     case Event_ScrollBackwardPage:
  224.         pos = maxl (_range.Low (), pos - _pageAmount);
  225.         break;
  226.  
  227.     case Event_ScrollToPosition:
  228.     case Event_Scroll:
  229.         pos = e->param;
  230.         break;
  231.  
  232.     default:
  233.         break;
  234.     }        
  235. #if defined(__MS_WINDOWS__)
  236.     _SetModelValue (CL_Interval (pos, pos));
  237.     SetScrollPos (_handle, SB_CTL, pos, TRUE);
  238. #elif defined(__OS2__)
  239.     WinSendMsg (_handle, SBM_SETPOS, (MPARAM) pos, 0);
  240.     long len = ((CL_Interval*) _model)->Length();
  241.     _SetModelValue (CL_Interval (pos, pos + len-1));
  242. #endif
  243.     if (_clientSet.Size () == 0)
  244.         return FALSE;
  245.     if (type != Event_Scroll || _smoothScroll)
  246.         _clientSet.NotifyAll (*this);
  247.     return TRUE;
  248. }
  249.  
  250.  
  251. CL_Interval& UI_ScrollBar::Range ()
  252. {
  253.     return _range;
  254. }
  255.  
  256.  
  257.  
  258. #if defined(__X_MOTIF__)
  259. static void _SetResources (Widget scroll, const CL_Interval& model,
  260.                            const CL_Interval& range, short line, short page)
  261. {
  262.     XmScrollBarSetValues (scroll, model.Low(), model.Length(),  line, page,
  263.                           FALSE);
  264.     Arg args[2];
  265.     XtSetArg    (args[0] , XmNminimum, range.Low  ());
  266.     XtSetArg    (args[1] , XmNmaximum, range.High () + model.Length());
  267.     XtSetValues (scroll, args, 2);
  268.     XmUpdateDisplay (scroll);
  269. }
  270.  
  271. #endif
  272.  
  273. bool UI_ScrollBar::_ModelChanged (CL_Object&, long)
  274. {
  275. #if defined(__MS_WINDOWS__)
  276.     if (_handle)
  277.         SetScrollPos   (_handle, SB_CTL, ((CL_Interval*) _model)->Low(),
  278.                         TRUE);
  279. #elif defined(__OS2__)
  280.     if (_handle) {
  281.         CL_Interval& value = *(CL_Interval*) _model;
  282.         WinSendMsg (_handle, SBM_SETSCROLLBAR,
  283.                     MPFROM2SHORT (value.Low(), value.High()),
  284.                     MPFROM2SHORT (_range.Low(), _range.High()));
  285.     }
  286. #elif defined(__X_MOTIF__)
  287.     if (_xwidget) {
  288.         CL_Interval& value = *(CL_Interval*) _model;
  289.         _SetResources (_xwidget, value, _range, _lineAmount, _pageAmount);
  290.     }
  291. #endif
  292.     return TRUE;
  293. }
  294.  
  295. bool UI_ScrollBar::_RangeChanged (CL_Object&, long)
  296. {
  297. #if defined(__MS_WINDOWS__)
  298.     if (_handle > 0)
  299.         SetScrollRange (_handle, SB_CTL, _range.Low(), _range.High(),
  300.                         TRUE);
  301. #elif defined(__OS2__)
  302.     if (_handle) {
  303.         CL_Interval& value = *(CL_Interval*) _model;
  304.         WinSendMsg (_handle, SBM_SETSCROLLBAR,
  305.                     MPFROM2SHORT (value.Low(), value.High()),
  306.                     MPFROM2SHORT (_range.Low(), _range.High()));
  307.     }
  308.                     
  309. #elif defined(__X_MOTIF__)
  310.     if (_xwidget) {
  311.         CL_Interval& value = *(CL_Interval*) _model;
  312.         _SetResources (_xwidget, value, _range, _lineAmount, _pageAmount);
  313.     }
  314. #endif
  315.     return TRUE;
  316. }
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323. /*---------------------VScrollBar------------------------------------*/
  324.  
  325. UI_VScrollBar::UI_VScrollBar
  326.     (UI_VObjCollection* p, const UI_Rectangle& shape,
  327.      UI_ViewID id, long bstyle)
  328. : UI_ScrollBar (p, shape, id, bstyle)
  329. {
  330. #if defined (__MS_WINDOWS__)
  331.     if (_style == -1)
  332.         _style = WS_VISIBLE | SBS_VERT | WS_CHILD;
  333. #elif defined (__OS2__)
  334.     _style = SBS_VERT | WS_VISIBLE;
  335. #endif
  336. }
  337.  
  338.  
  339.  
  340.  
  341. /*-------------------------HScrollBar----------------------------*/
  342.  
  343. UI_HScrollBar::UI_HScrollBar
  344.     (UI_VObjCollection* p, const UI_Rectangle& shape,
  345.      UI_ViewID id, long bstyle)
  346. : UI_ScrollBar (p, shape, id, bstyle)
  347. {
  348. #if defined(__MS_WINDOWS__)
  349.     if (_style == -1)
  350.         _style = WS_VISIBLE | SBS_HORZ | WS_CHILD;
  351. #elif defined (__OS2__)
  352.     _style = SBS_HORZ | WS_VISIBLE;
  353. #endif
  354. }
  355.  
  356.