splitter.cxx
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:7k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * splitter.cxx
  3.  *
  4.  * Splitter interactor class.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: splitter.cxx,v $
  30.  * Revision 1.9  1998/12/20 09:14:46  robertj
  31.  * Added pragma implementation for GNU compiler.
  32.  *
  33.  * Revision 1.8  1998/11/30 04:52:19  robertj
  34.  * New directory structure
  35.  *
  36.  * Revision 1.7  1998/09/23 06:29:58  robertj
  37.  * Added open source copyright license.
  38.  *
  39.  * Revision 1.6  1996/04/30 12:34:03  robertj
  40.  * Changed "inPixels" boolean to enum for three coordinate systems.
  41.  *
  42.  * Revision 1.5  1995/12/10 11:43:12  robertj
  43.  * Fixed automatic operator translation incompatibility amongst compilers.
  44.  *
  45.  * Revision 1.4  1995/07/02 01:21:00  robertj
  46.  * Removed OnDoubleClick() and added BOOL to OnMouseDown() for double click.
  47.  *
  48.  * Revision 1.3  1995/06/04 12:46:10  robertj
  49.  * Added function to set splitter split by percentage.
  50.  *
  51.  * Revision 1.2  1995/03/22 13:53:55  robertj
  52.  * Fixed integer overflow problem in 16 bit windows.
  53.  *
  54.  * Revision 1.1  1994/10/23  03:36:53  robertj
  55.  * Initial revision
  56.  *
  57.  */
  58. #ifdef __GNUC__
  59. #pragma implementation "splitter.h"
  60. #endif
  61. #include <pwlib.h>
  62. #include <pwclib/splitter.h>
  63. #define new PNEW
  64. //////////////////////////////////////////////////////////////////////////////
  65. // PSplitter
  66. PSplitter::PSplitter(PInteractor * parent)
  67.   : PInteractor(parent),
  68.     splitBar(owner->GetTitledBorderSize())
  69. {
  70.   trackCanvas = NULL;
  71. }
  72. void PSplitter::OnMouseMove(PKeyCode, const PPoint & where)
  73. {
  74.   if (trackCanvas != NULL) {
  75.     trackCanvas->DrawRect(splitBar);
  76.     TrackSplitter(where);
  77.     trackCanvas->DrawRect(splitBar);
  78.   }
  79. }
  80. void PSplitter::OnMouseDown(PKeyCode, const PPoint &, BOOL)
  81. {
  82.   if (trackCanvas != NULL) {
  83.     ReleaseMouse();
  84.     delete trackCanvas;
  85.   }
  86.   GrabMouse();
  87.   trackCanvas = new PDrawCanvas(this, TRUE, TRUE);
  88.   trackCanvas->SetPenMode(PCanvas::InvertDst);
  89.   trackCanvas->SetFillMode(PCanvas::InvertDst);
  90.   trackCanvas->DrawRect(splitBar);
  91. }
  92. void PSplitter::OnMouseUp(PKeyCode button, const PPoint & where)
  93. {
  94.   if (trackCanvas != NULL) {
  95.     OnMouseMove(button, where);
  96.     ReleaseMouse();
  97.     delete trackCanvas;
  98.     trackCanvas = NULL;
  99.     SetDimensions(GetDimensions(PixelCoords), PixelCoords);
  100.   }
  101. }
  102. void PSplitter::OnRedraw(PCanvas & canvas)
  103. {
  104.   canvas.SetMappingRect(canvas.GetViewportRect());
  105.   canvas.SetFillFgColour(GetBorderColour());
  106.   canvas.DrawRect(splitBar);
  107. }
  108. void PSplitter::AdjustChildInteractors(PDIMENSION width1, PDIMENSION height1,
  109.            PORDINATE  x2, PORDINATE  y2, PDIMENSION width2, PDIMENSION height2)
  110. {
  111.   PINDEX num = GetNumChildren();
  112.   if (num >= 1) {
  113.     if (num >= 2) {
  114.       PRect rect(0, 0, width1, height1);
  115.       children[num-2].AutoAdjustBounds(rect);
  116.     }
  117.     PRect rect(x2, y2, width2, height2);
  118.     children[num-1].AutoAdjustBounds(rect);
  119.   }
  120. }
  121. //////////////////////////////////////////////////////////////////////////////
  122. // PVerticalSplitter
  123. PVerticalSplitter::PVerticalSplitter(PInteractor * parent)
  124.   : PSplitter(parent)
  125. {
  126.   SetCursor(PCursor(PSTD_ID_CURSOR_LEFTRIGHT));
  127.   SetDimensions(parent->GetDimensions(PixelCoords), PixelCoords);
  128. }
  129. void PVerticalSplitter::SetPercent(PDIMENSION percent)
  130. {
  131.   PAssert(percent < 100, PInvalidParameter);
  132.   PDim dim = GetDimensions(PixelCoords);
  133.   splitBar.SetX(dim.Width()*percent/100);
  134.   AdjustChildInteractors(splitBar.Left(), dim.Height(),
  135.                          splitBar.Right(), 0,
  136.                          dim.Width()-splitBar.Right(), dim.Height());
  137. }
  138. void PVerticalSplitter::_SetDimensions(PDIMENSION width, PDIMENSION height,
  139.                                        CoordinateSystem coords)
  140. {
  141.   PDim oldDim = GetDimensions(PixelCoords);
  142.   PSplitter::_SetDimensions(width, height, coords);
  143.   PDim newDim = GetDimensions(PixelCoords);
  144.   if (oldDim.Width() > 0)
  145.     splitBar.SetX((PORDINATE)(splitBar.X()*(long)newDim.Width()/oldDim.Width()));
  146.   else
  147.     splitBar.SetX((newDim.Width()-splitBar.Width())/2);
  148.   splitBar.SetHeight(newDim.Height());
  149.   AdjustChildInteractors(splitBar.Left(), newDim.Height(),
  150.                          splitBar.Right(), 0,
  151.                          newDim.Width()-splitBar.Right(), newDim.Height());
  152. }
  153. void PVerticalSplitter::TrackSplitter(const PPoint & where)
  154. {
  155.   PDIMENSION winWidth = GetDimensions(PixelCoords).Width();
  156.   PDIMENSION barWidth = splitBar.Width();
  157.   if (where.X() + barWidth > winWidth)
  158.     splitBar.SetX(winWidth - barWidth);
  159.   else if (where.X() < 0)
  160.     splitBar.SetX(0);
  161.   else
  162.     splitBar.SetX(where.X());
  163. }
  164. //////////////////////////////////////////////////////////////////////////////
  165. // PHorizontalSplitter
  166. PHorizontalSplitter::PHorizontalSplitter(PInteractor * parent)
  167.   : PSplitter(parent)
  168. {
  169.   SetCursor(PCursor(PSTD_ID_CURSOR_UPDOWN));
  170.   SetDimensions(parent->GetDimensions(PixelCoords), PixelCoords);
  171. }
  172. void PHorizontalSplitter::SetPercent(PDIMENSION percent)
  173. {
  174.   PAssert(percent < 100, PInvalidParameter);
  175.   PDim dim = GetDimensions(PixelCoords);
  176.   splitBar.SetY(dim.Height()*percent/100);
  177.   AdjustChildInteractors(dim.Width(), splitBar.Top(),
  178.                          0, splitBar.Bottom(),
  179.                          dim.Width(), dim.Height()-splitBar.Bottom());
  180. }
  181. void PHorizontalSplitter::_SetDimensions(PDIMENSION width, PDIMENSION height,
  182.                                          CoordinateSystem coords)
  183. {
  184.   PDim oldDim = GetDimensions(PixelCoords);
  185.   PSplitter::_SetDimensions(width, height, coords);
  186.   PDim newDim = GetDimensions(PixelCoords);
  187.   if (oldDim.Height() > 0)
  188.     splitBar.SetY((PORDINATE)(splitBar.Y()*(long)newDim.Height()/oldDim.Height()));
  189.   else
  190.     splitBar.SetY((newDim.Height()-splitBar.Height())/2);
  191.   splitBar.SetWidth(newDim.Width());
  192.   AdjustChildInteractors(splitBar.Width(), splitBar.Top(),
  193.                          0, splitBar.Bottom(),
  194.                          splitBar.Width(), newDim.Height()-splitBar.Bottom());
  195. }
  196. void PHorizontalSplitter::TrackSplitter(const PPoint & where)
  197. {
  198.   PDIMENSION winHeight = GetDimensions(PixelCoords).Height();
  199.   PDIMENSION barHeight = splitBar.Height();
  200.   if (where.Y() + barHeight > winHeight)
  201.     splitBar.SetY(winHeight - barHeight);
  202.   else if (where.Y() < 0)
  203.     splitBar.SetY(0);
  204.   else
  205.     splitBar.SetY(where.Y());
  206. }
  207. #undef new
  208. // End Of File ///////////////////////////////////////////////////////////////