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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * control.cxx
  3.  *
  4.  * Control interactor classes.
  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: control.cxx,v $
  30.  * Revision 1.55  1999/11/23 05:24:32  robertj
  31.  * Moved function from platform independent to platform dependent files.
  32.  *
  33.  * Revision 1.54  1999/11/23 05:08:47  craigs
  34.  * Moved PTextButton::DefaultDimensions to platform dependent code
  35.  *
  36.  * Revision 1.53  1999/11/16 06:51:41  robertj
  37.  * Created PCustomListBox to allow motif native code PStringListBox implementation
  38.  *
  39.  * Revision 1.52  1999/11/16 05:23:22  craigs
  40.  * Changed for creation of PCustomListBox class
  41.  *
  42.  * Revision 1.51  1999/09/05 14:39:22  robertj
  43.  * GNU 2.95 compatibility
  44.  *
  45.  * Revision 1.50  1999/08/07 07:13:23  robertj
  46.  * Fixed problems with "balloon help" text popup.
  47.  *
  48.  * Revision 1.49  1998/09/23 06:29:37  robertj
  49.  * Added open source copyright license.
  50.  *
  51.  * Revision 1.48  1998/09/14 12:41:52  robertj
  52.  * Added tab stops to string output in list box.
  53.  *
  54.  * Revision 1.47  1998/02/24 23:07:27  robertj
  55.  * Fixed background colour for static text (another constructor) on simple dialogs
  56.  *
  57.  * Revision 1.46  1998/02/06 04:00:16  robertj
  58.  * Fixed colour of controls, again!
  59.  *
  60.  * Revision 1.45  1996/11/04 03:39:56  robertj
  61.  * Fixed default dimensions of check box and radio button.
  62.  *
  63.  * Revision 1.44  1996/04/30 12:33:50  robertj
  64.  * Changed "inPixels" boolean to enum for three coordinate systems.
  65.  *
  66.  * Revision 1.43  1995/11/09 12:20:34  robertj
  67.  * Added static (filled) rectange control.
  68.  *
  69.  * Revision 1.42  1995/10/14 15:08:24  robertj
  70.  * Added addition of colection as strings to box.
  71.  *
  72.  * Revision 1.41  1995/08/12 22:33:12  robertj
  73.  * Moved OnEndInput() function to platform dependent code.
  74.  *
  75.  * Revision 1.40  1995/06/17 00:46:42  robertj
  76.  * Added missing constructor for PTextButton.
  77.  *
  78.  * Revision 1.39  1995/06/04 12:40:18  robertj
  79.  * Removed non-portable function ltoa.
  80.  *
  81.  * Revision 1.38  1995/04/25 11:29:19  robertj
  82.  * Fixed Borland compiler warnings.
  83.  *
  84.  * Revision 1.37  1995/04/02 09:27:29  robertj
  85.  * Added "balloon" help.
  86.  *
  87.  * Revision 1.36  1995/02/19 04:19:20  robertj
  88.  * Added dynamically linked command processing.
  89.  *
  90.  * Revision 1.35  1995/02/05  00:50:42  robertj
  91.  * Had to change variable name "small" for MSVC 2.0
  92.  * Added notification of end input.
  93.  *
  94.  * Revision 1.34  1995/01/27  11:13:18  robertj
  95.  * Changed alignment mask from enum to int.
  96.  * Changed state of checkbox from CheckValue to BOOL.
  97.  *
  98.  * Revision 1.33  1995/01/18  10:58:15  robertj
  99.  * No need for constructors of images.
  100.  *
  101.  * Revision 1.32  1995/01/18  09:02:23  robertj
  102.  * Added separate image icon for enabled and disabled button.
  103.  *
  104.  * Revision 1.31  1995/01/06  10:43:56  robertj
  105.  * Changed PRealFont usage from pointer to reference.
  106.  *
  107.  * Revision 1.30  1995/01/01  01:06:18  robertj
  108.  * Incorrect position of text in list boxes
  109.  *
  110.  * Revision 1.29  1994/12/21  11:58:24  robertj
  111.  * Documentation and variable normalisation.
  112.  *
  113.  * Revision 1.28  1994/12/14  11:17:15  robertj
  114.  * Changed PDIMENSION to be unsigned causing untold number of changes.
  115.  *
  116.  * Revision 1.27  1994/12/05  11:27:16  robertj
  117.  * Changed 3 way check box constructor to be similar to other constructors.
  118.  *
  119.  * Revision 1.26  1994/11/19  00:01:04  robertj
  120.  * Added notifier & value to main PControl constructor
  121.  *
  122.  * Revision 1.25  1994/10/30  11:47:11  robertj
  123.  * Changed mechanism for doing notification callback functions.
  124.  *
  125.  * Revision 1.24  1994/08/21  23:43:02  robertj
  126.  * Added undef of new for Unix build system.
  127.  *
  128.  * Revision 1.23  1994/07/27  05:58:07  robertj
  129.  * Synchronisation.
  130.  *
  131.  * Revision 1.22  1994/07/02  03:03:49  robertj
  132.  * Fixed bug in list box construction.
  133.  *
  134.  * Revision 1.21  1994/06/25  11:55:15  robertj
  135.  * Unix version synchronisation.
  136.  *
  137.  * Revision 1.20  1994/04/20  12:17:44  robertj
  138.  * assert changes
  139.  *
  140.  * Revision 1.19  1994/04/11  14:09:03  robertj
  141.  * Fixed bug in static icon, not being set on windows platforms.
  142.  *
  143.  * Revision 1.18  1994/04/03  08:34:18  robertj
  144.  * Added help and focus functionality.
  145.  *
  146.  * Revision 1.17  1994/04/01  14:01:49  robertj
  147.  * Added PControl level DefaultDimensions.
  148.  * Moved PStringListBox constructor to  platform specific sections.
  149.  *
  150.  * Revision 1.16  1994/03/07  07:47:00  robertj
  151.  * Major upgrade
  152.  *
  153.  * Revision 1.15  1994/01/15  02:53:45  robertj
  154.  * Moved control constructors to common code and added platform dependent Construct() function.
  155.  *
  156.  * Revision 1.14  1993/12/31  06:53:48  robertj
  157.  * Added PImgIcon class.
  158.  *
  159.  * Revision 1.13  1993/12/16  06:21:00  robertj
  160.  * Cannot do triadic conditionals with objects in GCC.
  161.  *
  162.  * Revision 1.12  1993/12/16  06:20:57  robertj
  163.  * Changes to callback function definition due to GCC.
  164.  *
  165.  * Revision 1.11  1993/12/15  21:10:10  robertj
  166.  * Changed group in radio buttons to use containers reference system.
  167.  * Added optional deletion of objects in a list box.
  168.  *
  169.  * Revision 1.10  1993/12/04  05:23:06  robertj
  170.  * Moved code from pwlib.inl
  171.  *
  172.  * Revision 1.9  1993/12/01  16:09:05  robertj
  173.  * Windows NT port.
  174.  *
  175.  * Revision 1.8  1993/11/20  17:26:28  robertj
  176.  * Change of PImage to PPixels in picture buttons.
  177.  *
  178.  * Revision 1.7  1993/09/29  03:06:30  robertj
  179.  * Moved PListBox contructor to platform specific modules.
  180.  * Removed cursor setting for PComboBoxes
  181.  *
  182.  * Revision 1.6  1993/09/27  16:35:25  robertj
  183.  * Removed special constructor for dialog resource loading.
  184.  * Fixed standard string list item draw function colour setting.
  185.  * Fixed graying of standard push buttons.
  186.  *
  187.  * Revision 1.5  1993/08/31  03:38:02  robertj
  188.  * Added #if protection for platforms that haven't implemented everything yet.
  189.  *
  190.  * Revision 1.4  1993/08/24  00:27:59  robertj
  191.  * Rearranged push button classes and reimplemented text/image buttons.
  192.  *
  193.  * Revision 1.3  1993/08/21  17:09:50  robertj
  194.  * Fixed cursor setting in text editing controls
  195.  *
  196.  * Revision 1.2  1993/08/21  01:50:33  robertj
  197.  * Made Clone() function optional, default will assert if called.
  198.  *
  199.  * Revision 1.1  1993/08/21  01:07:35  robertj
  200.  * Initial revision
  201.  *
  202.  */
  203. #include <pwlib.h>
  204. #include <ctype.h>
  205. #define new PNEW
  206. //////////////////////////////////////////////////////////////////////////////
  207. // PControl
  208. #if defined (_PCONTROL)
  209. void PControl::DefaultDimensions()
  210. {
  211. }
  212. void PControl::TransferValue(int)
  213. {
  214. }
  215. void PControl::UpdateMyCommandSources()
  216. {
  217.   if (notifyForStateUpdate && !callback.IsNULL())
  218.     callback(*this, NotifyEnable);
  219. }
  220. PBalloon * PControl::OnBalloonHelp()
  221. {
  222.   if (balloonHelpText.IsEmpty())
  223.     return parent->OnBalloonHelp();
  224.   return new PBalloon(this, balloonHelpText);
  225. }
  226. #endif
  227. //////////////////////////////////////////////////////////////////////////////
  228. // PStaticText
  229. #if defined (_PSTATICTEXT)
  230. PStaticText::PStaticText(PInteractor * parent, int align)
  231.   : PNamedControl(parent)
  232. {
  233.   alignment = align;
  234.   foregroundColour = parent->GetForegroundColour();
  235.   backgroundColour = parent->GetBackgroundColour();
  236. }
  237. PStaticText::PStaticText(PInteractor * parent, const PString & str, int align)
  238.   : PNamedControl(parent)
  239. {
  240.   alignment = align;
  241.   foregroundColour = parent->GetForegroundColour();
  242.   backgroundColour = parent->GetBackgroundColour();
  243.   SetName(str);
  244.   DefaultDimensions();
  245. }
  246. void PStaticText::DefaultDimensions()
  247. {
  248.   PDrawCanvas canvas(this);
  249.   PDim dim = canvas.MeasureString(GetName());
  250.   dim += PDim(1,1);
  251.   PDIMENSION maxX = owner->GetScreenRect().Width()*4/5;
  252.   if (dim.Width() > maxX)
  253.     dim.SetWidth(maxX);
  254.   SetDimensions(dim, LocalCoords);
  255. }
  256. #endif
  257. //////////////////////////////////////////////////////////////////////////////
  258. // PStaticBox
  259. #if defined (_PSTATICBOX)
  260. PStaticBox::PStaticBox(PInteractor * parent)
  261.   : PNamedControl(parent)
  262. {
  263.   foregroundColour = parent->GetForegroundColour();
  264.   backgroundColour = parent->GetBackgroundColour();
  265. }
  266. PStaticBox::PStaticBox(PInteractor * parent, const PString & str)
  267.   : PNamedControl(parent, str, PNotifier(), NULL)
  268. {
  269.   foregroundColour = parent->GetForegroundColour();
  270.   backgroundColour = parent->GetBackgroundColour();
  271. }
  272. #endif
  273. //////////////////////////////////////////////////////////////////////////////
  274. // PStaticIcon
  275. #if defined (_PSTATICICON)
  276. PStaticIcon::PStaticIcon(PInteractor * parent, const PIcon & icn)
  277.   : PControl(parent, PNotifier(), NULL), icon(icn)
  278. {
  279.   SetIcon(icon);
  280.   DefaultDimensions();
  281.   foregroundColour = parent->GetForegroundColour();
  282.   backgroundColour = parent->GetBackgroundColour();
  283. }
  284. void PStaticIcon::DefaultDimensions()
  285. {
  286.   SetDimensions(icon.GetDimensions(), PixelCoords);
  287. }
  288. #endif
  289. //////////////////////////////////////////////////////////////////////////////
  290. // PStaticRect
  291. #if defined (_PSTATICRECT)
  292. PStaticRect::PStaticRect(PInteractor * parent)
  293.   : PControl(parent, PNotifier(), NULL)
  294. {
  295.   SetBackgroundColour(owner->GetWindowFgColour());
  296. }
  297. PStaticRect::PStaticRect(PInteractor * parent, const PColour & colour)
  298.   : PControl(parent, PNotifier(), NULL)
  299. {
  300.   SetBackgroundColour(colour);
  301. }
  302. PStaticRect::PStaticRect(PInteractorLayout * parent,
  303.                 PRESOURCE_ID ctlID, const PNotifier & notify, void * valuePtr)
  304.   : PControl(parent, ctlID, notify, valuePtr)
  305. {
  306. }
  307. #endif
  308. //////////////////////////////////////////////////////////////////////////////
  309. // PEditBox
  310. #if defined(_PEDITBOX)
  311. BOOL PEditBox::OnEndInput()
  312. {
  313.   parent->OnControlNotify(*this, PEditBox::EndEdit);
  314.   return TRUE;
  315. }
  316. void PEditBox::TransferValue(int option)
  317. {
  318.   if (valuePointer != NULL)
  319.     if (option == NotifyUpdate)
  320.       SetText(*(PString *)valuePointer);
  321.     else
  322.       *(PString *)valuePointer = GetText();
  323. }
  324. #endif
  325. //////////////////////////////////////////////////////////////////////////////
  326. // PNumberEditBox
  327. #if defined(_PNUMBEREDITBOX)
  328. PNumberEditBox::PNumberEditBox(PInteractor * parent)
  329.   : PEditBox(parent)
  330. {
  331.   nudgeUp = new NudgeButton(this, TRUE);
  332.   nudgeUp->SetNotifier(PCREATE_NOTIFIER(Nudged));
  333.   nudgeDown = new NudgeButton(this, FALSE);
  334.   nudgeDown->SetNotifier(PCREATE_NOTIFIER(Nudged));
  335. }
  336. void PNumberEditBox::Nudged(NudgeButton & control, INT)
  337. {
  338.   if (&control == nudgeUp)
  339.     AddNudge();
  340.   else
  341.     SubtractNudge();
  342. }
  343. PNumberEditBox::NudgeButton::NudgeButton(PNumberEditBox * parent, BOOL isUp)
  344.   : PPushButton(parent),
  345.     up(isUp)
  346. {
  347. }
  348. void PNumberEditBox::NudgeButton::OnDrawFace(PCanvas & canvas,
  349.                                        const PRect & rect, BOOL hasFocus, BOOL)
  350. {
  351.   if (up) {
  352.     canvas.SetCurrentPosition(rect.Left(), rect.Bottom());
  353.     canvas.DrawLine((rect.Left() + rect.Right())/2, rect.Top());
  354.     canvas.DrawLine(rect.Right(), rect.Bottom());
  355.     canvas.DrawLine(rect.Left(), rect.Bottom());
  356.   }
  357.   else {
  358.     canvas.SetCurrentPosition(rect.Left(), rect.Top());
  359.     canvas.DrawLine((rect.Left() + rect.Right())/2, rect.Bottom());
  360.     canvas.DrawLine(rect.Right(), rect.Top());
  361.     canvas.DrawLine(rect.Left(), rect.Top());
  362.   }
  363.   if (hasFocus)
  364.     canvas.DrawFocusRect(rect);
  365. }
  366. #endif
  367. //////////////////////////////////////////////////////////////////////////////
  368. // PIntegerEditBox
  369. #if defined(_PINTEGEREDITBOX)
  370. PIntegerEditBox::PIntegerEditBox(PInteractor * parent,
  371.                           long min, long max, long val, long ndg, BYTE numBase)
  372.   : PNumberEditBox(parent)
  373. {
  374.   SetMinimum(min);
  375.   SetMaximum(max);
  376.   SetNudge(ndg);
  377.   SetBase(numBase);
  378.   SetValue(val);
  379. }
  380. BOOL PIntegerEditBox::OnEndInput()
  381. {
  382.   parent->OnControlNotify(*this, PEditBox::EndEdit);
  383.   long val = GetValue();
  384.   if (val < minimum || val > maximum) {
  385.     PSound::Beep();
  386.     return FALSE;
  387.   }
  388.   return TRUE;
  389. }
  390. void PIntegerEditBox::OnKeyInput(const PString & str)
  391. {
  392.   char c = (char)toupper(str[0]);
  393.   char maxletter = '@';
  394.   char maxdigit = (char)(base+'0'-1);
  395.   if (maxdigit > '9') {
  396.     maxdigit = '9';
  397.     maxletter = (char)(base-10+'A'-1);
  398.   }
  399.   if (iscntrl(c) || c == '-' || c == '+' ||
  400.                   (c >= '0' && c <= maxdigit) || (c >= '0' && c <= maxletter))
  401.     PNumberEditBox::OnKeyInput(str);
  402. }
  403. void PIntegerEditBox::TransferValue(int option)
  404. {
  405.   if (valuePointer != NULL)
  406.     if (option == NotifyUpdate)
  407.       SetValue(*(long *)valuePointer);
  408.     else if (option == EndEdit)
  409.       *(long *)valuePointer = GetValue();
  410. }
  411. void PIntegerEditBox::AddNudge()
  412. {
  413.   SetValue(GetValue()+nudge);
  414. }
  415. void PIntegerEditBox::SubtractNudge()
  416. {
  417.   SetValue(GetValue()-nudge);
  418. }
  419. void PIntegerEditBox::SetValue(long val)
  420. {
  421.   if (val < minimum)
  422.     val = minimum;
  423.   else if (val > maximum)
  424.     val = maximum;
  425.   PString str(PString::Signed, val, base);
  426.   SetText(str);
  427. }
  428. long PIntegerEditBox::GetValue() const
  429. {
  430.   return GetText().AsInteger(base);
  431. }
  432. void PIntegerEditBox::SetNudge(long val)
  433. {
  434.   PAssert(val > 0, PInvalidParameter);
  435.   nudge = val;
  436. }
  437. void PIntegerEditBox::SetBase(BYTE val)
  438. {
  439.   PAssert(val >= 2 && val <= 36, PInvalidParameter);
  440.   base = val;
  441. }
  442. #endif
  443. //////////////////////////////////////////////////////////////////////////////
  444. // PFloatEditBox
  445. #if defined(_PFLOATEDITBOX)
  446. PFloatEditBox::PFloatEditBox(PInteractor * parent,
  447.                  double min, double max, double val, double ndg, unsigned decs)
  448.   : PNumberEditBox(parent)
  449. {
  450.   SetMinimum(min);
  451.   SetMaximum(max);
  452.   SetNudge(ndg);
  453.   SetDecimals(decs);
  454.   SetValue(val);
  455. }
  456. BOOL PFloatEditBox::OnEndInput()
  457. {
  458.   parent->OnControlNotify(*this, PEditBox::EndEdit);
  459.   double val = GetValue();
  460.   if (val < minimum || val > maximum) {
  461.     PSound::Beep();
  462.     return FALSE;
  463.   }
  464.   return TRUE;
  465. }
  466. void PFloatEditBox::OnKeyInput(const PString & str)
  467. {
  468.   char c = str[0];
  469.   if (iscntrl(c) || isdigit(c) ||
  470.                         c == '-' || c == '+' || c == '.' || toupper(c) == 'E')
  471.     PNumberEditBox::OnKeyInput(str);
  472. }
  473. void PFloatEditBox::AddNudge()
  474. {
  475.   SetValue(GetValue()+nudge);
  476. }
  477. void PFloatEditBox::SubtractNudge()
  478. {
  479.   SetValue(GetValue()-nudge);
  480. }
  481. void PFloatEditBox::SetValue(double val)
  482. {
  483.   if (val < minimum)
  484.     val = minimum;
  485.   else if (val > maximum)
  486.     val = maximum;
  487.   SetText(psprintf(psprintf("%%0.%dg", decimals), (double)val));
  488. }
  489. double PFloatEditBox::GetValue() const
  490. {
  491.   return GetText().AsReal();
  492. }
  493. void PFloatEditBox::TransferValue(int option)
  494. {
  495.   if (valuePointer != NULL)
  496.     if (option == NotifyUpdate)
  497.       SetValue(*(double *)valuePointer);
  498.     else if (option == EndEdit)
  499.       *(double *)valuePointer = GetValue();
  500. }
  501. #endif
  502. //////////////////////////////////////////////////////////////////////////////
  503. // PPushButton
  504. #if defined(_PPUSHBUTTON)
  505. PPushButton::PPushButton(PInteractor * parent, ButtonType deflt)
  506.   : PNamedControl(parent),
  507.     defaultButton(deflt == DefaultButton)
  508. {
  509.   Construct();
  510. }
  511. PPushButton::PPushButton(PInteractor * parent,
  512.               const PString & name, ButtonType deflt, const PNotifier & notify)
  513.   : PNamedControl(parent, name, notify, NULL),
  514.     defaultButton(deflt == DefaultButton)
  515. {
  516.   Construct();
  517. }
  518. PRect PPushButton::DrawButtonSurround(PCanvas & canvas, BOOL isSelected)
  519. {
  520.   canvas.SetMappingRect(canvas.GetViewportRect());
  521.   PRect bounds = canvas.GetDrawingBounds();
  522.   canvas.SetPenFgColour(owner->GetButtonFgColour());
  523.   canvas.SetFillFgColour(owner->GetButtonBkColour());
  524.   canvas.DrawRoundRect(bounds, 2, 2);
  525.   PDim border = owner->GetBorderSize();
  526.   PDim border2 = border * 2;
  527.   bounds.Inflate(-(PORDINATE)border.Width(), -(PORDINATE)border.Height());
  528.   if (defaultButton) {
  529.     canvas.DrawRect(bounds);
  530.     bounds.Inflate(-(PORDINATE)border.Width(), -(PORDINATE)border.Height());
  531.   }
  532.   canvas.SetPenFgColour(owner->GetButtonShadowColour());
  533.   if (!isSelected) {
  534.     canvas.SetPenWidth(border.Height());
  535.     canvas.DrawLine(
  536.               bounds.Left(),                 bounds.Bottom()-border.Height(),
  537.               bounds.Right()-border.Width(), bounds.Bottom()-border.Height());
  538.     canvas.DrawLine(
  539.               bounds.Left()+border.Width(),  bounds.Bottom()-border2.Height(),
  540.               bounds.Right()-border.Width(), bounds.Bottom()-border2.Height());
  541.     canvas.SetPenWidth(border.Width());
  542.     canvas.DrawLine(
  543.               bounds.Right()-border.Width(),  bounds.Top(),
  544.               bounds.Right()-border.Width(),  bounds.Bottom());
  545.     canvas.DrawLine(
  546.               bounds.Right()-border2.Width(), bounds.Top()+border.Height(),
  547.               bounds.Right()-border2.Width(), bounds.Bottom());
  548.     canvas.SetPenFgColour(owner->GetButtonLightingColour());
  549.   }
  550.   canvas.SetCurrentPosition(bounds.Left(), bounds.Bottom()-border2.Height());
  551.   canvas.SetPenWidth(border.Width());
  552.   canvas.DrawLine(bounds.Left(), bounds.Top());
  553.   canvas.SetPenWidth(border.Height());
  554.   canvas.DrawLine(bounds.Right()-border.Width(), bounds.Top());
  555.   bounds.Inflate(-(PORDINATE)border.Width()*3, -(PORDINATE)border.Height()*3);
  556.   if (isSelected)
  557.     bounds.Offset(border.Width(), border.Height());
  558.   if (IsEnabled())
  559.     canvas.SetTextFgColour(owner->GetButtonFgColour());
  560.   else
  561.     canvas.SetTextFgColour(owner->GetGrayTextColour());
  562.   canvas.SetTextBkColour(owner->GetButtonBkColour());
  563.   return bounds;
  564. }
  565. #endif
  566. //////////////////////////////////////////////////////////////////////////////
  567. // PTextButton
  568. #if defined(_PTEXTBUTTON)
  569.                                      
  570. PTextButton::PTextButton(PInteractor * parent,
  571.                                        const PString & name, ButtonType deflt)
  572.   : PPushButton(parent, name, deflt, PNotifier())
  573. {
  574.   Construct();
  575.   DefaultDimensions();
  576. }
  577. PTextButton::PTextButton(PInteractor * parent,
  578.            const PString & name, const PNotifier & notify, ButtonType deflt)
  579.   : PPushButton(parent, name, deflt, notify)
  580. {
  581.   Construct();
  582.   DefaultDimensions();
  583. }
  584. void PTextButton::OnDrawFace(PCanvas & canvas,
  585.                                       const PRect & rect, BOOL hasFocus, BOOL)
  586. {
  587.   canvas.DrawString(rect, GetName(), PCanvas::Centred|PCanvas::CentreVertical);
  588.   if (hasFocus) {
  589.     PDim dim = canvas.MeasureString(GetName()) + owner->GetBorderSize()*2;
  590.     PRect r(rect.Left()+(rect.Width()-dim.Width())/2,
  591.             rect.Top()+(rect.Height()-dim.Height())/2,
  592.             dim.Width(), dim.Height());
  593.     canvas.DrawFocusRect(r);
  594.   }
  595. }
  596. #endif
  597. //////////////////////////////////////////////////////////////////////////////
  598. // PImageButton
  599. #if defined(_PIMAGEBUTTON)
  600. PImageButton::PImageButton(PInteractor * parent, ButtonType deflt)
  601.   : PPushButton(parent, deflt)
  602. {
  603.   Construct();
  604.   DefaultDimensions();
  605. }
  606. PImageButton::PImageButton(PInteractor *parent,
  607.                                        const PImgIcon & img, ButtonType deflt)
  608.   : PPushButton(parent, "", deflt, PNotifier()),
  609.     enabledImage(img),
  610.     disabledImage(img)
  611. {
  612.   Construct();
  613.   DefaultDimensions();
  614. }
  615. PImageButton::PImageButton(PInteractor *parent,
  616.               const PImgIcon & img, const PNotifier & notify, ButtonType deflt)
  617.   : PPushButton(parent, "", deflt, notify),
  618.     enabledImage(img),
  619.     disabledImage(img)
  620. {
  621.   Construct();
  622.   DefaultDimensions();
  623. }
  624. PImageButton::PImageButton(PInteractor *parent,
  625.                            const PImgIcon & enabImg,
  626.                            const PImgIcon & disabImg,
  627.                            ButtonType deflt)
  628.   : PPushButton(parent, "", deflt, PNotifier()),
  629.     enabledImage(enabImg),
  630.     disabledImage(disabImg)
  631. {
  632.   Construct();
  633.   DefaultDimensions();
  634. }
  635. PImageButton::PImageButton(PInteractor *parent,
  636.                            const PImgIcon & enabImg,
  637.                            const PImgIcon & disabImg,
  638.                            const PNotifier & notify,
  639.                            ButtonType deflt)
  640.   : PPushButton(parent, "", deflt, notify),
  641.     enabledImage(enabImg),
  642.     disabledImage(disabImg)
  643. {
  644.   Construct();
  645.   DefaultDimensions();
  646. }
  647. void PImageButton::DefaultDimensions()
  648. {
  649.   PDim edim = enabledImage.GetDimensions();
  650.   PDim ddim = disabledImage.GetDimensions();
  651.   PDim dim(PMAX(edim.Width(),ddim.Width()), PMAX(edim.Height(),ddim.Height()));
  652.   SetDimensions(dim+owner->GetBorderSize()*9, PixelCoords);
  653. }
  654. void PImageButton::OnDrawFace(PCanvas & canvas,
  655.                                        const PRect & rect, BOOL hasFocus, BOOL)
  656. {
  657.   canvas.SetFillFgColour(owner->GetButtonFgColour());
  658.   canvas.SetFillBkColour(owner->GetButtonBkColour());
  659.   PImgIcon & image = IsEnabled() ? enabledImage : disabledImage;
  660.   PPoint pos = rect.Origin() + (rect.Dimensions() - image.GetDimensions())/2;
  661.   canvas.DrawImgIcon(pos, image);
  662.   if (hasFocus)
  663.     canvas.DrawFocusRect(rect);
  664. }
  665. #endif
  666. //////////////////////////////////////////////////////////////////////////////
  667. // PCheck3WayBox
  668. #if defined(_PCHECK3WAYBOX)
  669. PCheck3WayBox::PCheck3WayBox(PInteractor * parent, CheckValues)
  670.   : PNamedControl(parent)
  671. {
  672.   Construct();
  673. }
  674. PCheck3WayBox::PCheck3WayBox(PInteractor * parent,
  675.                                       const PString & name, CheckValues value)
  676.   : PNamedControl(parent)
  677. {
  678.   Construct();
  679.   SetName(name);
  680.   SetValue(value);
  681.   DefaultDimensions();
  682. }
  683. PCheck3WayBox::PCheck3WayBox(PInteractor * parent,
  684.              const PString & name, const PNotifier & notify, CheckValues value)
  685.   : PNamedControl(parent)
  686. {
  687.   Construct();
  688.   SetName(name);
  689.   SetValue(value);
  690.   SetNotifier(notify);
  691.   DefaultDimensions();
  692. }
  693. void PCheck3WayBox::DefaultDimensions()
  694. {
  695.   PDrawCanvas canvas(this);
  696.   PDim dim = canvas.MeasureString(GetName());
  697.   dim.AddWidth(16); // Allow 4 font width left of text
  698.   dim.AddHeight(4); // Allow 1/4 font height above and below text
  699.   SetDimensions(dim, LocalCoords);
  700. }
  701. void PCheck3WayBox::TransferValue(int option)
  702. {
  703.   if (valuePointer != NULL)
  704.     if (option == NotifyUpdate)
  705.       SetValue(*(CheckValues *)valuePointer);
  706.     else
  707.       *(CheckValues *)valuePointer = GetValue();
  708. }
  709. #endif
  710. //////////////////////////////////////////////////////////////////////////////
  711. // PCheckBox
  712. #if defined(_PCHECKBOX)
  713. PCheckBox::PCheckBox(PInteractor * parent, BOOL value)
  714.   : PCheck3WayBox(parent)
  715. {
  716.   SetValue(value);
  717. }
  718. PCheckBox::PCheckBox(PInteractor * parent, const PString & name, BOOL value)
  719.   : PCheck3WayBox(parent)
  720. {
  721.   SetName(name);
  722.   SetValue(value);
  723.   DefaultDimensions();
  724. }
  725. PCheckBox::PCheckBox(PInteractor * parent,
  726.                                 const PString & name, const PNotifier & notify)
  727.   : PCheck3WayBox(parent)
  728. {
  729.   SetName(name);
  730.   SetNotifier(notify);
  731.   DefaultDimensions();
  732. }
  733. void PCheckBox::TransferValue(int option)
  734. {
  735.   if (valuePointer != NULL)
  736.     if (option == NotifyUpdate)
  737.       SetValue(*(BOOL *)valuePointer);
  738.     else
  739.       *(BOOL *)valuePointer = GetValue();
  740. }
  741. #endif
  742. //////////////////////////////////////////////////////////////////////////////
  743. // PRadioButton
  744. #if defined(_PRADIOBUTTON)
  745. PRadioButton::PRadioButton(PInteractor * parent)
  746.   : PNamedControl(parent)
  747. {
  748.   group.DisallowDeleteObjects();
  749.   group.Append(this);
  750.   Construct();
  751. }
  752. PRadioButton::PRadioButton(PInteractor * parent, const PString & name)
  753.   : PNamedControl(parent)
  754. {
  755.   group.DisallowDeleteObjects();
  756.   group.Append(this);
  757.   Construct();
  758.   SetName(name);
  759.   DefaultDimensions();
  760. }
  761. PRadioButton::PRadioButton(PInteractor * parent,
  762.                            const PString & name, const PNotifier & notify)
  763.   : PNamedControl(parent)
  764. {
  765.   group.DisallowDeleteObjects();
  766.   group.Append(this);
  767.   Construct();
  768.   SetName(name);
  769.   SetNotifier(notify);
  770.   DefaultDimensions();
  771. }
  772. PRadioButton::PRadioButton(PInteractor * parent,
  773.                              const PString & name, PRadioButton & groupButton)
  774.   : PNamedControl(parent)
  775. {
  776.   Construct();
  777.   AddToGroup(groupButton);
  778.   SetName(name);
  779.   DefaultDimensions();
  780. }
  781. PRadioButton::PRadioButton(PInteractor * parent, const PString & name,
  782.                           const PNotifier & notify, PRadioButton & groupButton)
  783.   : PNamedControl(parent)
  784. {
  785.   Construct();
  786.   AddToGroup(groupButton);
  787.   SetName(name);
  788.   SetNotifier(notify);
  789.   DefaultDimensions();
  790. }
  791. void PRadioButton::AddToGroup(PRadioButton & groupButton)
  792. {
  793.   group = groupButton.group;
  794.   group.Append(this);
  795. }
  796. void PRadioButton::DefaultDimensions()
  797. {
  798.   PDrawCanvas canvas(this);
  799.   PDim dim = canvas.MeasureString(GetName());
  800.   dim.AddWidth(16); // Allow 4 font width left of text
  801.   dim.AddHeight(4); // Allow 1/4 font height above and below text
  802.   SetDimensions(dim, LocalCoords); // Allow 1/4 font height above and below text
  803. }
  804. void PRadioButton::TransferValue(int option)
  805. {
  806.   if (option == NotifyUpdate) {
  807.     if (valuePointer != NULL)
  808.       SetValue(*(PINDEX *)valuePointer);
  809.   }
  810.   else {
  811.     for (PINDEX i = 0; i < group.GetSize(); i++)
  812.       if (group[i].valuePointer != NULL)
  813.         *(PINDEX *)group[i].valuePointer = GetValue();
  814.   }
  815. }
  816. #endif
  817. //////////////////////////////////////////////////////////////////////////////
  818. // PChoiceBox
  819. #if defined(_PCHOICEBOX)
  820. PChoiceBox::PChoiceBox(PInteractor * parent, StringSorting sorted)
  821.   : PControl(parent, PNotifier(), NULL)
  822. {
  823.   sort = sorted == Sorted;
  824.   Construct();
  825. }
  826. PChoiceBox::PChoiceBox(PInteractor * parent,
  827.                                 const PNotifier & notify, StringSorting sorted)
  828.   : PControl(parent, notify, NULL)
  829. {
  830.   sort = sorted == Sorted;
  831.   Construct();
  832. }
  833. void PChoiceBox::AddStrings(const PCollection & objects)
  834. {
  835.   PINDEX last = objects.GetSize() - 1;
  836.   for (PINDEX i = 0; i <= last; i++) {
  837.     PObject & obj = *objects.GetAt(i);
  838.     if (obj.IsDescendant(PString::Class()))
  839.       AddString((PString &)obj);
  840.     else {
  841.       PStringStream str;
  842.       str << obj;
  843.       AddString(str);
  844.     }
  845.   }
  846. }
  847. void PChoiceBox::TransferValue(int option)
  848. {
  849.   if (valuePointer != NULL)
  850.     if (option == NotifyUpdate)
  851.       SetSelection(*(PINDEX *)valuePointer);
  852.     else
  853.       *(PINDEX *)valuePointer = GetSelection();
  854. }
  855. #endif
  856. //////////////////////////////////////////////////////////////////////////////
  857. // PListBox
  858. #if defined(_PLISTBOX)
  859. PListBox::PListBox(PInteractor * parent,
  860.                    StringSorting sorted,
  861.                    SelectType select,
  862.                    PDIMENSION columnWidth,
  863.                    BOOL deleteObj)
  864.   : PControl(parent, PNotifier(), NULL)
  865. {
  866.   sort = sorted == Sorted;
  867.   multi = select == MultiSelect;
  868.   width = columnWidth;
  869.   deleteObjects = deleteObj;
  870.   Construct();
  871. }
  872. PListBox::PListBox(PInteractor * parent,
  873.                    const PNotifier & notify,
  874.                    StringSorting sorted,
  875.                    SelectType select,
  876.                    PDIMENSION columnWidth,
  877.                    BOOL deleteObj)
  878.   : PControl(parent, notify, NULL)
  879. {
  880.   sort = sorted == Sorted;
  881.   multi = select == MultiSelect;
  882.   width = columnWidth;
  883.   deleteObjects = deleteObj;
  884.   Construct();
  885. }
  886. void PListBox::TransferValue(int option)
  887. {
  888.   if (valuePointer != NULL)
  889.     if (option == NotifyUpdate)
  890.       SetSelection(*(PINDEX *)valuePointer);
  891.     else
  892.       *(PINDEX *)valuePointer = GetSelection();
  893. }
  894. #endif
  895. //////////////////////////////////////////////////////////////////////////////
  896. // PStringListBox
  897. #if defined(_PSTRINGLISTBOX)
  898. void PStringListBox::AddStrings(const PCollection & objects, BOOL update)
  899. {
  900.   PINDEX last = objects.GetSize() - 1;
  901.   for (PINDEX i = 0; i <= last; i++) {
  902.     PObject & obj = *objects.GetAt(i);
  903.     if (obj.IsDescendant(PString::Class()))
  904.       AddString((PString &)obj, update && i < last);
  905.     else {
  906.       PStringStream str;
  907.       str << obj;
  908.       AddString(str, update && i < last);
  909.     }
  910.   }
  911. }
  912. void PStringListBox::SetString(const PString & str, PINDEX index, BOOL update)
  913. {
  914.   DeleteString(index, FALSE);
  915.   InsertString(str, index, update);
  916. }
  917. #endif
  918. //////////////////////////////////////////////////////////////////////////////
  919. // PCustomListBox
  920. #if defined(_PCUSTOMLISTBOX)
  921. void PCustomListBox::AddEntries(const PCollection & objects, BOOL update)
  922. {
  923.   PINDEX last = objects.GetSize() - 1;
  924.   for (PINDEX i = 0; i <= last; i++)
  925.     AddEntry(objects.GetAt(i), update && i < last);
  926. }
  927. PDim PCustomListBox::OnMeasureEntry(PINDEX, PObject &, PCanvas & canvas)
  928. {
  929.   return PDim(GetDimensions(LocalCoords).Width(),
  930.               canvas.FromPointsY(canvas.GetFont().GetHeight())+1);
  931. }
  932. #endif
  933. //////////////////////////////////////////////////////////////////////////////
  934. // PComboBox
  935. #if defined(_PCOMBOBOX)
  936. PComboBox::PComboBox(PInteractor * parent, StringSorting sorted)
  937.   : PControl(parent, PNotifier(), NULL)
  938. {
  939.   sort = sorted == Sorted;
  940.   Construct();
  941. }
  942. PComboBox::PComboBox(PInteractor * parent,
  943.                                 const PNotifier & notify, StringSorting sorted)
  944.   : PControl(parent, notify, NULL)
  945. {
  946.   sort = sorted == Sorted;
  947.   Construct();
  948. }
  949. void PComboBox::AddStrings(const PCollection & objects)
  950. {
  951.   PINDEX last = objects.GetSize() - 1;
  952.   for (PINDEX i = 0; i <= last; i++) {
  953.     PObject & obj = *objects.GetAt(i);
  954.     if (obj.IsDescendant(PString::Class()))
  955.       AddString((PString &)obj);
  956.     else {
  957.       PStringStream str;
  958.       str << obj;
  959.       AddString(str);
  960.     }
  961.   }
  962. }
  963. void PComboBox::TransferValue(int option)
  964. {
  965.   if (valuePointer != NULL)
  966.     if (option == NotifyUpdate)
  967.       SetText(*(PString *)valuePointer);
  968.     else if (option == NewSelection)
  969.       *(PString *)valuePointer = GetString(GetCurrent());
  970.     else if (option == EditChange)
  971.       *(PString *)valuePointer = GetText();
  972. }
  973. #endif
  974. //////////////////////////////////////////////////////////////////////////////
  975. // PScrollBar
  976. #if defined(_PSCROLLBAR)
  977. PScrollBar::PScrollBar(PInteractor * parent,
  978.               PSCROLLBAR_VALUE max, PSCROLLBAR_VALUE min, PSCROLLBAR_VALUE val,
  979.               PSCROLLBAR_VALUE sml, PSCROLLBAR_VALUE lge)
  980.   : PControl(parent, PNotifier(), NULL)
  981. {
  982.   maximum = max;
  983.   minimum = min;
  984.   value = val;
  985.   smallNudge = sml;
  986.   largeNudge = lge;
  987.   Construct();
  988. }
  989. PScrollBar::PScrollBar(PInteractor * parent, const PNotifier & notify,
  990.               PSCROLLBAR_VALUE max, PSCROLLBAR_VALUE min, PSCROLLBAR_VALUE val,
  991.               PSCROLLBAR_VALUE sml, PSCROLLBAR_VALUE lge)
  992.   : PControl(parent, notify, NULL)
  993. {
  994.   maximum = max;
  995.   minimum = min;
  996.   value = val;
  997.   smallNudge = sml;
  998.   largeNudge = lge;
  999.   Construct();
  1000. }
  1001. void PScrollBar::TransferValue(int option)
  1002. {
  1003.   if (valuePointer != NULL)
  1004.     if (option == NotifyUpdate)
  1005.       SetValue(*(PSCROLLBAR_VALUE *)valuePointer);
  1006.     else
  1007.       *(PSCROLLBAR_VALUE *)valuePointer = GetValue();
  1008. }
  1009. #endif
  1010. //////////////////////////////////////////////////////////////////////////////
  1011. // PHorizontalScrollBar
  1012. #if defined(_PHORIZONTALSCROLLBAR)
  1013. PHorizontalScrollBar::PHorizontalScrollBar(PInteractor * parent,
  1014.               PSCROLLBAR_VALUE max, PSCROLLBAR_VALUE min, PSCROLLBAR_VALUE val,
  1015.               PSCROLLBAR_VALUE sml, PSCROLLBAR_VALUE lge)
  1016.   : PScrollBar(parent, max, min, val, sml, lge)
  1017. {
  1018. }
  1019. PHorizontalScrollBar::PHorizontalScrollBar(PInteractor * parent,
  1020.               const PNotifier & notify,
  1021.               PSCROLLBAR_VALUE max, PSCROLLBAR_VALUE min, PSCROLLBAR_VALUE val,
  1022.               PSCROLLBAR_VALUE sml, PSCROLLBAR_VALUE lge)
  1023.   : PScrollBar(parent, notify, max, min, val, sml, lge)
  1024. {
  1025. }
  1026. #endif
  1027. //////////////////////////////////////////////////////////////////////////////
  1028. // PVerticalScrollBar
  1029. #if defined(_PVERTICALSCROLLBAR)
  1030. PVerticalScrollBar::PVerticalScrollBar(PInteractor * parent,
  1031.               PSCROLLBAR_VALUE max, PSCROLLBAR_VALUE min, PSCROLLBAR_VALUE val,
  1032.               PSCROLLBAR_VALUE sml, PSCROLLBAR_VALUE lge)
  1033.   : PScrollBar(parent, max, min, val, sml, lge)
  1034. {
  1035. }
  1036. PVerticalScrollBar::PVerticalScrollBar(PInteractor * parent,
  1037.               const PNotifier & notify,
  1038.               PSCROLLBAR_VALUE max, PSCROLLBAR_VALUE min, PSCROLLBAR_VALUE val,
  1039.               PSCROLLBAR_VALUE sml, PSCROLLBAR_VALUE lge)
  1040.   : PScrollBar(parent, notify, max, min, val, sml, lge)
  1041. {
  1042. }
  1043. #endif
  1044. #undef new
  1045. // End Of File ///////////////////////////////////////////////////////////////