home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ool.zip / OOL / source / xuserbtn.cpp < prev    next >
C/C++ Source or Header  |  1997-04-05  |  8KB  |  342 lines

  1. #include "xuserbtn.h"
  2. #include "xdefhdl.h"
  3. #include "xmoushdl.h"
  4. #include "xmousevn.h"
  5. #include "xbitmap.h"
  6. #include "XLine.h"
  7. #include "xbox.h"
  8. #include "xfont.h"
  9.  
  10.  
  11. class userbtnhandler:public XDefaultHandler
  12. {
  13.     public:
  14.         userbtnhandler(XWindow * w):XDefaultHandler(w) {;}
  15.         BOOL HandleEvent(ULONG, void *, void *);
  16. };
  17.  
  18.  
  19. class userbtnmousehandler:public XMouseHandler
  20. {
  21.     public:
  22.         userbtnmousehandler(XWindow * w):XMouseHandler(w) {;}
  23.         BOOL HandleEvent(XMouseEvent *);
  24. };
  25.  
  26.  
  27. /*@ 
  28. @class XUserButton
  29. @parent XSettingButton
  30. @type overview
  31. @symbol _
  32. */
  33.  
  34.  
  35. /*@ XUserButton::XUserButton( const XWindow * w, const XRect * r, const LONG id, const LONG st, const char * t, const SHORT yOff)
  36. @group constructors/destructors
  37. @remarks Constructs a userbuttom
  38. @parameters <t '°' c=2>
  39.                 °XWindow * owner      °the owner
  40.             °XRect * rect         °the rectangle
  41.             °USHORT id            °id of the window
  42.             °ULONG style          °style, valid values are:
  43.                                             <t '°' c=1>
  44.                                     °BU_HELP
  45.                                     °BU_DEFAULT
  46.                                     °BU_NOPOINTERFOCUS
  47.                                     °BU_NOCURSORSELECT
  48.                                     °BU_NOBORDER
  49.                                     °BU_TWOSTATE
  50.                                             </t>
  51.                                   (can be or-ed).
  52.             °const char * string  °text to display (default is NULL)
  53.             °SHORT yOffset        °an y-offset for the bitmap (useful if you use bimaps and text, default is NULL)
  54.                 </t>
  55. */
  56. XUserButton :: XUserButton(const XWindow * w, const XRect * r, const LONG id, const LONG st, const char *t, const SHORT yOff):XSettingButton(w, r, id, st | BS_PUSHBUTTON | BS_USERBUTTON, (const char *) "", (unsigned char *) WC_BUTTON)
  57. {
  58.     graph = NULL;
  59.     bmp[0] = bmp[1] = NULL;
  60.     isPressed = 0;
  61.     style = st;
  62.     graph = new XGraphicDevice(this);
  63.     XColor colPaleGray(COL_PALEGRAY);
  64.  
  65.     graph->SetBackgroundColor(&colPaleGray);
  66.     bmp[0] = new XBitmap(graph);
  67.     bmp[1] = new XBitmap(graph);
  68.  
  69.     XPoint p1(1, 2), p2(1, 0), p3, p4(1, 2), pa(0, 0), pb;
  70.  
  71.     p2.SetY(r->GetHeight() - 1);
  72.     p3.SetY(p2.GetY());
  73.     p3.SetX(r->GetWidth() - 1);
  74.     p4.SetX(p3.GetX());
  75.     pb.SetX(r->GetWidth());
  76.     pb.SetY(r->GetHeight());
  77.  
  78.     XColor colWhite(COL_WHITE);
  79.     XColor colGray(COL_DARKGRAY);
  80.  
  81.     line1 = new XLine(graph, &p1, &p2);
  82.     line1->SetColor(&colWhite);
  83.     line2 = new XLine(graph, &p2, &p3);
  84.     line2->SetLineWidth(LINEWIDTH_THICK);
  85.     line2->SetColor(&colWhite);
  86.     line3 = new XLine(graph, &p3, &p4);
  87.     line3->SetLineWidth(LINEWIDTH_THICK);
  88.     line3->SetColor(&colGray);
  89.     line4 = new XLine(graph, &p4, &p1);
  90.     line4->SetLineWidth(LINEWIDTH_THICK);
  91.     line4->SetColor(&colGray);
  92.  
  93.     XBox *box = new XBox(graph, &pa, &pb, FALSE);
  94.  
  95.     XFont *font = new XFont(graph, "Helvetica", 9);
  96.  
  97.     XRect rect;
  98.  
  99.     GetSize(&rect);
  100.     rect.SetX(2);
  101.     rect.SetY(2);
  102.     rect.SetWidth(rect.GetWidth() - 2);
  103.     rect.SetHeight(rect.GetHeight() - 2);
  104.     text = new XText(graph, font, &rect, t, DT_BOTTOM | DT_CENTER);
  105.  
  106.     if (style & BU_TWOSTATE)
  107.         userbtnmousehandler *m = new userbtnmousehandler(this);
  108.  
  109.     else
  110.         userbtnhandler * u = new userbtnhandler(this);
  111. }
  112.  
  113.  
  114. void XUserButton::GetText(XString * buffer)
  115. {
  116.     text->GetText(buffer);
  117. }
  118.  
  119.  
  120. void XUserButton::SetText(const char *t)
  121. {
  122.     text->SetText(t);
  123. }
  124.  
  125.  
  126. XUserButton :: ~XUserButton()
  127. {
  128.     WinSetWindowULong(winhandle, QWL_USER, 0);
  129.     delete graph;
  130. }
  131.  
  132.  
  133. void XUserButton::Draw(void)
  134. {
  135.     if (graph)
  136.         graph->Draw();
  137. }
  138.  
  139.  
  140. /*@ XUserButton :: IsSelected( void )
  141. @group misc
  142. @remarks Query if the button is selected or not
  143. @returns BOOL selection
  144. */
  145. BOOL XUserButton::IsSelected(void) const
  146. {
  147.     if (!(style & BU_TWOSTATE))
  148.         return XSettingButton::IsSelected();
  149.     else
  150.         return isPressed;
  151. }
  152.  
  153.  
  154. /*@ XUserButton::Toggle(void)
  155. @group misc
  156. @remarks Toggles the button
  157. */
  158. void XUserButton::Toggle(void)
  159. {
  160.     if (!(style & BU_TWOSTATE))
  161.     {
  162.         BOOL res = (XSettingButton::IsSelected() ? FALSE : TRUE);
  163.         XSettingButton::Select(res);
  164.     }
  165.     else
  166.     {
  167.         isPressed = (isPressed ? FALSE : TRUE);
  168.         Invalidate();
  169.     }
  170. }
  171.  
  172.  
  173. /*@ XUserButton :: Select( BOOL sel )
  174. @group misc
  175. @remarks Select te button
  176. @parameters BOOL selection        TRUE=select, FALSE=unselect
  177. */
  178. void XUserButton::Select(BOOL sel)
  179. {
  180.     if (!(style & BU_TWOSTATE))
  181.         XSettingButton::Select(sel);
  182.     else
  183.     {
  184.         isPressed = sel;
  185.         Invalidate();
  186.     }
  187. }
  188.  
  189.  
  190. /*@ XUserButton::GetBitmapPointer()
  191. @group style
  192. @remarks Returns a pointer to one of two used bitmaps.
  193. @parameters    <t '°' c=2>
  194.                 °UCHAR        index        °index of the bitmap:<BR>
  195.                                         0 = the bitmap to display if the button is not pressed<BR>
  196.                                         1 = the bitmap to display if the button is pressed
  197.                 </t>
  198. @returns    XBitmap * bmp            the requested bitmap
  199. */
  200.  
  201.  
  202. /*@ XUserButton::GetGraphPointer()
  203. @group style
  204. @remarks Returns a pointer to the graphic-device of the button.
  205. @returns    XGraphicDevice * dev            the graphic device
  206. */
  207.  
  208.  
  209. /*@ XUserButton::GetTextPointer()
  210. @group style
  211. @remarks Returns a pointer to used text-object of the button.
  212. @returns    XText * text            the text object
  213. */
  214.  
  215.  
  216. /*@ XUserButton::SetBitmap()
  217. @group style
  218. @remarks Set a bitmap to the button. The bitmap is copied so the destructor of the bitmap given in
  219. the argument can be called when this functions returns.
  220. @parameters    <t '°' c=2>
  221.                 °XBitmap * bmp        °the bitmap
  222.                 °UCHAR        index        °index of the bitmap:<BR>
  223.                                         0 = the bitmap to display if the button is not pressed<BR>
  224.                                         1 = the bitmap to display if the button is pressed
  225.                 /t>
  226. */
  227. void XUserButton::SetBitmap(const XBitmap * b, const UCHAR index)
  228. {
  229.     if (index > 1)
  230.         return;
  231.     *bmp[index] = *b;
  232.     XPoint p(1, 1);
  233.  
  234.     bmp[index]->Move(&p);
  235.  
  236.     if (index == 1)
  237.     {
  238.         bmp[1]->Show(FALSE);
  239.         bmp[0]->Show(TRUE);
  240.     }
  241.     Invalidate();
  242. }
  243.  
  244.  
  245. void XUserButton::Setup(void)
  246. {
  247.     XColor colWhite(COL_WHITE);
  248.     XColor colGray(COL_DARKGRAY);
  249.  
  250.     if (isPressed)
  251.     {
  252.         XPoint p;
  253.  
  254.         text->GetPos(&p);
  255.         p.SetX(p.GetX() + 1);
  256.         p.SetY(p.GetY() - 1);
  257.         text->Move(&p);
  258.  
  259.         if (bmp[1]->cx == 0)
  260.         {
  261.             bmp[0]->GetPos(&p);
  262.             p.SetX(p.GetX() + 1);
  263.             p.SetY(p.GetY() - 1);
  264.             bmp[0]->Move(&p);
  265.         }
  266.         else
  267.         {
  268.             bmp[0]->Show(FALSE);
  269.             bmp[1]->Show();
  270.         }
  271.         line1->SetColor(&colGray);
  272.         line2->SetColor(&colGray);
  273.         line3->SetColor(&colWhite);
  274.         line4->SetColor(&colWhite);
  275.     }
  276.     else
  277.     {
  278.         XPoint p;
  279.  
  280.         text->GetPos(&p);
  281.         p.SetX(p.GetX() - 1);
  282.         p.SetY(p.GetY() + 1);
  283.         text->Move(&p);
  284.  
  285.         if (bmp[1]->cx == 0)
  286.         {
  287.             bmp[0]->GetPos(&p);
  288.             p.SetX(p.GetX() - 1);
  289.             p.SetY(p.GetY() + 1);
  290.             bmp[0]->Move(&p);
  291.         }
  292.         else
  293.         {
  294.             bmp[0]->Show();
  295.             bmp[1]->Show(FALSE);
  296.         }
  297.         line1->SetColor(&colWhite);
  298.         line2->SetColor(&colWhite);
  299.         line3->SetColor(&colGray);
  300.         line4->SetColor(&colGray);
  301.     }
  302.     Invalidate();
  303. }
  304.  
  305.  
  306. BOOL userbtnhandler::HandleEvent(ULONG msg, void *mp1, void *)
  307. {
  308.     if (msg == BM_SETHILITE)
  309.     {
  310.         XUserButton *b = (XUserButton *) GetWindow();
  311.  
  312.         b->isPressed = SHORT1FROMMP(mp1);
  313.         b->Setup();
  314.         b->Invalidate();
  315.         return TRUE;
  316.     }
  317.     return FALSE;
  318. }
  319.  
  320.  
  321. BOOL userbtnmousehandler::HandleEvent(XMouseEvent * event)
  322. {
  323.     if (event->GetEventID() == MOU_BTN1UP)
  324.     {
  325.         XUserButton *b = (XUserButton *) GetWindow();
  326.  
  327.         b->isPressed = (b->buffer ? FALSE : TRUE);
  328.         if (b->isPressed != b->buffer)
  329.             b->Setup();
  330.     }
  331.     else if (event->GetEventID() == MOU_BTN1DOWN)
  332.     {
  333.         XUserButton *b = (XUserButton *) GetWindow();
  334.  
  335.         b->buffer = b->isPressed;
  336.         b->isPressed = (b->buffer ? TRUE : FALSE);
  337.         if (b->isPressed != b->buffer)
  338.             b->Setup();
  339.     }
  340.     return FALSE;
  341. }
  342.