home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c083 / 11.ddi / OWLSRC.PAK / GADGET.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-02  |  7.2 KB  |  327 lines

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