home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / owlsrc.pak / GADGET.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-24  |  7.3 KB  |  334 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // (C) Copyright 1992, 1994 by Borland International, All Rights Reserved
  4. //
  5. //   Implementation of class TGadget and class TSeperatorGadget.
  6. //----------------------------------------------------------------------------
  7. #include <owl/owlpch.h>
  8. #include <owl/gadget.h>
  9. #include <owl/gadgetwi.h>
  10.  
  11. TSeparatorGadget::TSeparatorGadget(int size)
  12. {
  13.   ShrinkWrapWidth = ShrinkWrapHeight = false;
  14.   SetEnabled(false);
  15.   Bounds.right = size * GetSystemMetrics(SM_CXBORDER);
  16.   Bounds.bottom = size * GetSystemMetrics(SM_CYBORDER);
  17. }
  18.  
  19. void
  20. TSeparatorGadget::Inserted()
  21. {
  22.   BorderStyle = None;  // prohibit our style from being changed
  23. }
  24.  
  25. TGadget::TGadget(int id, TBorderStyle borderStyle)
  26. {
  27.   Window = 0;
  28.   Bounds = TRect(0, 0, 0, 0);
  29.   Enabled = true;
  30.   TrackMouse = false;
  31.   Clip = false;
  32.   WideAsPossible = false;
  33.   ShrinkWrapWidth = ShrinkWrapHeight = true;
  34.   Next = 0;
  35.   Id = id;
  36.  
  37.   SetBorderStyle(borderStyle);
  38. }
  39.  
  40. TGadget::~TGadget()
  41. {
  42.   //    If we're in a window, remove ourselves.
  43.   //
  44.   if (Window)
  45.     Window->Remove(*this);
  46. }
  47.  
  48. void
  49. TGadget::CommandEnable()
  50. {
  51. }
  52.  
  53. void
  54. TGadget::SysColorChange()
  55. {
  56. }
  57.  
  58. void
  59. TGadget::SetShrinkWrap(bool shrinkWrapWidth, bool shrinkWrapHeight)
  60. {
  61.   ShrinkWrapWidth = shrinkWrapWidth;
  62.   ShrinkWrapHeight = shrinkWrapHeight;
  63. }
  64.  
  65. void
  66. TGadget::SetSize(TSize& size)
  67. {
  68.   Bounds.right = Bounds.left + size.cx;
  69.   Bounds.bottom = Bounds.top + size.cy;
  70.  
  71.   if (Window)
  72.     Window->GadgetChangedSize(*this);
  73. }
  74.  
  75. void
  76. TGadget::SetEnabled(bool enabled)
  77. {
  78.   if (Enabled != enabled) {
  79.     Enabled = enabled;
  80.     Invalidate(false);
  81.   }
  82. }
  83.  
  84. void
  85. TGadget::SetBounds(TRect& rect)
  86. {
  87.   Bounds = rect;
  88. }
  89.  
  90. void
  91. TGadget::SetBorders(TBorders& borders)
  92. {
  93.   Borders = borders;
  94.  
  95.   if (Window)
  96.     Window->GadgetChangedSize(*this);
  97. }
  98.  
  99. void
  100. TGadget::SetMargins(TMargins& margins)
  101. {
  102.   Margins = margins;
  103.  
  104.   if (Window)
  105.     Window->GadgetChangedSize(*this);
  106. }
  107.  
  108. void
  109. TGadget::SetBorderStyle(TBorderStyle borderStyle)
  110. {
  111.   int  edgeThickness;
  112.  
  113.   BorderStyle = borderStyle;
  114.  
  115.   switch (BorderStyle) {
  116.     default:
  117.     case None:
  118.       edgeThickness = 0;
  119.       break;
  120.  
  121.     case Plain:
  122.     case Raised:
  123.     case Recessed:
  124.       edgeThickness = 1;
  125.       break;
  126.  
  127.     case Embossed:
  128.       edgeThickness = 3;
  129.       break;
  130.   }
  131.  
  132.   Borders.Left = Borders.Top = Borders.Right = Borders.Bottom = edgeThickness;
  133.  
  134.   if (Window)
  135.     Window->GadgetChangedSize(*this);
  136. }
  137.  
  138. bool
  139. TGadget::PtIn(TPoint& point)
  140. {
  141.   return point.x >= 0 && point.y >= 0 &&
  142.          point.x < Bounds.Width() && point.y < Bounds.Height();
  143. }
  144.  
  145. void
  146. TGadget::Inserted()
  147. {
  148. }
  149.  
  150. void
  151. TGadget::Removed()
  152. {
  153. }
  154.  
  155. void
  156. TGadget::InvalidateRect(const TRect& rect, bool erase)
  157. {
  158.   if (Window && Window->HWindow) {
  159.     TRect  updateRect(rect.left + Bounds.left, rect.top + Bounds.top,
  160.                       rect.right + Bounds.left, rect.bottom + Bounds.top);
  161.  
  162.     Window->InvalidateRect(updateRect, erase);
  163.   }
  164. }
  165.  
  166. void
  167. TGadget::Invalidate(bool erase)
  168. {
  169.   InvalidateRect(TRect(0, 0, Bounds.Width(), Bounds.Height()), erase);
  170. }
  171.  
  172. //
  173. // cause owning window to paint now if possible
  174. //
  175. void
  176. TGadget::Update()
  177. {
  178.   if (Window && Window->HWindow)
  179.     Window->UpdateWindow();
  180. }
  181.  
  182. void
  183. TGadget::PaintBorder(TDC& dc)
  184. {
  185.   if (BorderStyle != None) {
  186.     int  xB = GetSystemMetrics(SM_CXBORDER);
  187.     int  yB = GetSystemMetrics(SM_CYBORDER);
  188.  
  189.     if (BorderStyle == Plain)
  190.       dc.OWLFastWindowFrame(TBrush(GetSysColor(COLOR_WINDOWFRAME)),
  191.                             TRect(0, 0, Bounds.Width(), Bounds.Height()),
  192.                             xB, yB);
  193.  
  194.     else {
  195.       TBrush  highlight(GetSysColor(COLOR_BTNHIGHLIGHT));
  196.       TBrush  shadow(GetSysColor(COLOR_BTNSHADOW));
  197.  
  198.       switch (BorderStyle) {
  199.         case Raised:
  200.           dc.SelectObject(highlight);
  201.           dc.PatBlt(0, 0, Bounds.Width()-xB, yB, PATCOPY);
  202.           dc.PatBlt(0, 0, xB, Bounds.Height()-yB, PATCOPY);
  203.           dc.SelectObject(shadow);
  204.           dc.PatBlt(1, Bounds.Height()-yB, Bounds.Width()-xB, yB, PATCOPY);
  205.           dc.PatBlt(Bounds.Width()-xB, yB, xB, Bounds.Height()-yB, PATCOPY);
  206.           break;
  207.  
  208.         case Recessed:
  209.           dc.SelectObject(shadow);
  210.           dc.PatBlt(0, 0, Bounds.Width()-xB, yB, PATCOPY);
  211.           dc.PatBlt(0, 0, xB, Bounds.Height()-yB, PATCOPY);
  212.           dc.SelectObject(highlight);
  213.           dc.PatBlt(xB, Bounds.Height()-yB, Bounds.Width()-xB, yB, PATCOPY);
  214.           dc.PatBlt(Bounds.Width()-xB, yB, xB, Bounds.Height()-yB, PATCOPY);
  215.           break;
  216.  
  217.         case Embossed:
  218.           dc.SelectObject(highlight);
  219.           dc.PatBlt(0, 0, Bounds.Width()-xB, yB, PATCOPY);
  220.           dc.PatBlt(0, 0, xB, Bounds.Height()-yB, PATCOPY);
  221.           dc.PatBlt(3*xB, Bounds.Height()-3*yB, Bounds.Width()-5*xB, yB, PATCOPY);
  222.           dc.PatBlt(Bounds.Width()-3*xB, 3*yB, xB, Bounds.Height()-5*xB, PATCOPY);
  223.           dc.SelectObject(shadow);
  224.           dc.PatBlt(2*xB, 2*yB, Bounds.Width()-5*xB, yB, PATCOPY);
  225.           dc.PatBlt(2*xB, 2*yB, xB, Bounds.Height()-5*yB, PATCOPY);
  226.           dc.PatBlt(xB, Bounds.Height()-yB, Bounds.Width()-2*xB, yB, PATCOPY);
  227.           dc.PatBlt(Bounds.Width()-xB, yB, xB, Bounds.Height()-yB, PATCOPY);
  228.           break;
  229.       }
  230.     }
  231.     dc.RestoreBrush();
  232.   }
  233. }
  234.  
  235. void
  236. TGadget::Paint(TDC& dc)
  237. {
  238.   PaintBorder(dc);
  239. }
  240.  
  241. //
  242. //
  243. //
  244. void
  245. TGadget::GetDesiredSize(TSize& size)
  246. {
  247.   int  left, right, top, bottom;
  248.  
  249.   GetOuterSizes(left, right, top, bottom);
  250.  
  251.   size.cx = ShrinkWrapWidth ? left+right : Bounds.Width();
  252.   size.cy = ShrinkWrapHeight ? top+bottom : Bounds.Height();
  253. }
  254.  
  255. //
  256. // Gets the four total outer sizes which consists of the margins plus the 
  257. // borders.
  258. //
  259. void
  260. TGadget::GetOuterSizes(int& left, int& right, int& top, int& bottom)
  261. {
  262.   if (Window) {
  263.     int  xBorder = GetSystemMetrics(SM_CXBORDER);
  264.     int  yBorder = GetSystemMetrics(SM_CYBORDER);
  265.  
  266.     Window->GetMargins(Margins, left, right, top, bottom);
  267.     left += Borders.Left * xBorder;
  268.     right += Borders.Right * xBorder;
  269.     top += Borders.Top * yBorder;
  270.     bottom += Borders.Bottom * yBorder;
  271.   }
  272. }
  273.  
  274. //
  275. // Gets the inner working rectangle. Which is, by default, the Bounds minus
  276. // each of the outer sizes
  277. //
  278. void
  279. TGadget::GetInnerRect(TRect& innerRect)
  280. {
  281.   int  left, right, top, bottom;
  282.   GetOuterSizes(left, right, top, bottom);
  283.  
  284.   innerRect.left = left;
  285.   innerRect.right = Bounds.Width() - right;
  286.   innerRect.top = top;
  287.   innerRect.bottom = Bounds.Height() - bottom;
  288. }
  289.  
  290. //
  291. // Mouse response functions
  292. //
  293.  
  294. //
  295. // mouse is moving over this gadget. called by gadget window only if this
  296. // gadget has captured the mouse
  297. //
  298. void
  299. TGadget::MouseMove(uint /*modKeys*/, TPoint&)
  300. {
  301. }
  302.  
  303. //
  304. // mouse is entering this gadget. called by gadget window if no other gadget
  305. // has capture
  306. //
  307. void
  308. TGadget::MouseEnter(uint /*modKeys*/, TPoint&)
  309. {
  310. }
  311.  
  312. //
  313. // mouse is leaving this gadget. called by gadget window if no other gadget
  314. // has capture
  315. //
  316. void
  317. TGadget::MouseLeave(uint /*modKeys*/, TPoint&)
  318. {
  319. }
  320.  
  321. void
  322. TGadget::LButtonDown(uint /*modKeys*/, TPoint&)
  323. {
  324.   if (TrackMouse)
  325.     Window->GadgetSetCapture(*this);
  326. }
  327.  
  328. void
  329. TGadget::LButtonUp(uint /*modKeys*/, TPoint&)
  330. {
  331.   if (TrackMouse)
  332.     Window->GadgetReleaseCapture(*this);
  333. }
  334.