home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / WXWIN140.ZIP / SRC / WX_PANEL.CC < prev    next >
C/C++ Source or Header  |  1993-04-18  |  11KB  |  465 lines

  1. /*
  2.  * File:     wx_panel.cc
  3.  * Purpose:  wxPanel class implementation
  4.  *
  5.  *                       wxWindows 1.40
  6.  * Copyright (c) 1993 Artificial Intelligence Applications Institute,
  7.  *                   The University of Edinburgh
  8.  *
  9.  *                     Author: Julian Smart
  10.  *                       Date: 18-4-93
  11.  *
  12.  * Permission to use, copy, modify, and distribute this software and its
  13.  * documentation for any purpose is hereby granted without fee, provided
  14.  * that the above copyright notice, author statement and this permission
  15.  * notice appear in all copies of this software and related documentation.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS,
  18.  * IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
  19.  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  20.  *
  21.  * IN NO EVENT SHALL THE ARTIFICIAL INTELLIGENCE APPLICATIONS INSTITUTE OR THE
  22.  * UNIVERSITY OF EDINBURGH BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR
  23.  * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM
  24.  * LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF
  25.  * DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH
  26.  * THE USE OR PERFORMANCE OF THIS SOFTWARE.
  27.  */
  28.  
  29. #include <windows.h>
  30. #include <iostream.h>
  31.  
  32. #include "common.h"
  33. #include "wx_panel.h"
  34. #include "wx_frame.h"
  35. #include "wx_event.h"
  36. #include "wx_utils.h"
  37. #include "wx_privt.h"
  38.  
  39. #ifdef wx_motif
  40. #include <Xm/Form.h>
  41. #include <Xm/PushB.h>
  42. #include <Xm/Frame.h>
  43. #endif
  44.  
  45. #ifdef wx_xview
  46. #include <xview/panel.h>
  47. extern void wxPanelEventProc(Panel panel, Event *event); // See wx_item.cc
  48. #endif
  49.  
  50. // Constructor
  51. wxPanel::wxPanel(wxFrame *frame, int x, int y, int width, int height, int style)
  52. {
  53. #ifdef wx_msw
  54.   cursor_x = PANEL_LEFT_MARGIN;
  55.   cursor_y = PANEL_TOP_MARGIN;
  56.   max_height = 0;
  57.   max_line_height = 0;
  58.   max_width = 0;
  59.   hspacing = PANEL_HSPACING;
  60.   vspacing = PANEL_VSPACING;
  61. #endif
  62.   new_line = FALSE;
  63.   label_position = wxHORIZONTAL;
  64.  
  65.   if (!frame)
  66.     return;
  67.  
  68.   window_parent = frame;
  69.  
  70. #ifdef wx_motif
  71.   borderWidget = 0;
  72.   hSpacing = PANEL_HSPACING;
  73.   vSpacing = PANEL_VSPACING;
  74.  
  75.   new_line = TRUE;
  76.   firstRowWidget = NULL;
  77.   lastWidget = NULL;
  78.  
  79.   if (style & wxBORDER)
  80.   {
  81.     borderWidget = XtVaCreateManagedWidget("main_window",
  82.                     xmFrameWidgetClass,      frame->workArea,
  83.                     XmNshadowType,           XmSHADOW_IN,
  84.                     NULL);
  85.   }
  86.  
  87.   panelWidget = XtVaCreateManagedWidget("panel",
  88.                   xmFormWidgetClass, borderWidget ? borderWidget : frame->workArea,
  89.                   NULL);
  90.  
  91.   handle = (char *)panelWidget;
  92.  
  93.   wxWidgetHashTable->Put((long)panelWidget, this);
  94.  
  95.   XtOverrideTranslations(panelWidget,
  96.               XtParseTranslationTable("<Configure>: resize()"));
  97.  
  98.   SetSize(x, y, width, height);
  99. #endif
  100. #ifdef wx_xview
  101.   int real_y = frame->y_offset;
  102.   if (y > -1)
  103.     real_y = y + frame->y_offset;  // Allow for possible menu bar
  104.  
  105.   Frame x_frame = (Frame)(frame->GetHandle());
  106.   Panel x_panel = (Panel)xv_create(x_frame, PANEL,
  107.                                    PANEL_BACKGROUND_PROC, wxPanelEventProc,
  108.                                    PANEL_ACCEPT_KEYSTROKE, TRUE,
  109.                                    WIN_CLIENT_DATA, (char *)this,
  110.                                    PANEL_LAYOUT, PANEL_HORIZONTAL, XV_SHOW, FALSE,
  111.                                    NULL);
  112.  
  113.   if (x > -1)
  114.     xv_set(x_panel, XV_X, x, NULL);
  115.  
  116.   if (y > -1)
  117.     xv_set(x_panel, XV_Y, real_y, NULL);
  118.  
  119.   // If width = -1, will extend to edge of frame
  120.   xv_set(x_panel, XV_WIDTH, width, NULL);
  121.  
  122.   if (height > -1)
  123.     xv_set(x_panel, XV_HEIGHT, height, NULL);
  124.  
  125.   xv_set(x_panel, XV_SHOW, TRUE, NULL);
  126.  
  127.   handle = (char *)x_panel;
  128. #endif
  129. #ifdef wx_msw
  130.   wxWinType = wxTYPE_XWND;
  131.   wxWnd *cparent = NULL;
  132.   if (frame)
  133.     cparent = (wxWnd *)frame->handle;
  134.  
  135.   DWORD msflags = 0;
  136.   if (style & wxBORDER)
  137.     msflags |= WS_BORDER;
  138.   msflags |= WS_CHILD | WS_VISIBLE;
  139.  
  140.   wxSubWnd *wnd = new wxSubWnd(cparent, "wxPanelClass", this, x, y, width, height, msflags);
  141.  
  142.   handle = (char *)wnd;
  143. #endif
  144.  
  145.   if (frame) frame->AddChild(this);
  146. }
  147.  
  148. wxPanel::~wxPanel(void)
  149. {
  150. #ifdef wx_motif
  151.   if (borderWidget)
  152.     XtDestroyWidget(borderWidget);
  153. #endif
  154. }
  155.  
  156. void wxPanel::SetLabelPosition(int pos)  // wxHORIZONTAL or wxVERTICAL
  157. {
  158.   label_position = pos;
  159. }
  160.  
  161. void wxPanel::SetSize(int x, int y, int w, int h)
  162. {
  163. #ifdef wx_motif
  164.   int real_y = y;
  165.  
  166.   if (x > -1)
  167.     XtVaSetValues(borderWidget ? borderWidget : panelWidget,
  168.                   XmNleftAttachment, XmATTACH_SELF,
  169.                   XmNx, x, 
  170.                   NULL);
  171.   if (y > -1)
  172.     XtVaSetValues(borderWidget ? borderWidget : panelWidget,
  173.                   XmNtopAttachment, XmATTACH_SELF,
  174.                   XmNy, real_y,
  175.                   NULL);
  176.   if (w > -1)
  177.   {
  178.     if (borderWidget)
  179.     {
  180.       XtVaSetValues(borderWidget, XmNrightAttachment, XmATTACH_SELF, XmNwidth, w, NULL);
  181.       XtVaSetValues(panelWidget, XmNwidth, w, NULL);
  182.     }
  183.     else
  184.       XtVaSetValues(panelWidget, XmNrightAttachment, XmATTACH_SELF, XmNwidth, w, NULL);
  185.   }
  186.   if (h > -1)
  187.   {
  188.     if (borderWidget)
  189.     {
  190.       XtVaSetValues(borderWidget, XmNbottomAttachment, XmATTACH_SELF, XmNheight, h, NULL);
  191.       XtVaSetValues(panelWidget, XmNheight, h, NULL);
  192.     }
  193.     else
  194.       XtVaSetValues(panelWidget, XmNbottomAttachment, XmATTACH_SELF, XmNheight, h, NULL);
  195.   }
  196. #endif
  197. #ifdef wx_xview
  198.   int real_y = y;
  199.  
  200.   if (window_parent)
  201.     real_y += ((wxFrame *)window_parent)->y_offset;  // Allow for possible menu bar
  202.  
  203.   Xv_opaque object = (Xv_opaque)handle;
  204.   (void)xv_set(object, XV_X, x, XV_Y, real_y, XV_WIDTH, w, XV_HEIGHT, h, NULL);
  205. #endif
  206. #ifdef wx_msw
  207.   int currentX, currentY;
  208.   GetPosition(¤tX, ¤tY);
  209.   if (x == -1)
  210.     x = currentX;
  211.   if (y == -1)
  212.     y = currentY;
  213.  
  214.   wxWnd *wnd = (wxWnd *)handle;
  215.   if (wnd)
  216.     MoveWindow(wnd->handle, x, y, w, h, TRUE);
  217. #endif
  218.   OnSize(w, h);
  219. }
  220.  
  221. void wxPanel::SetClientSize(int w, int h)
  222. {
  223. #ifdef wx_motif
  224.   if (w > -1)
  225.   {
  226.     if (borderWidget)
  227.     {
  228.       XtVaSetValues(borderWidget, XmNrightAttachment, XmATTACH_SELF, XmNwidth, w, NULL);
  229.       XtVaSetValues(panelWidget, XmNwidth, w, NULL);
  230.     }
  231.     else
  232.       XtVaSetValues(panelWidget, XmNrightAttachment, XmATTACH_SELF, XmNwidth, w, NULL);
  233.   }
  234.   if (h > -1)
  235.   {
  236.     if (borderWidget)
  237.     {
  238.       XtVaSetValues(borderWidget, XmNbottomAttachment, XmATTACH_SELF, XmNheight, h, NULL);
  239.       XtVaSetValues(panelWidget, XmNheight, h, NULL);
  240.     }
  241.     else
  242.       XtVaSetValues(panelWidget, XmNbottomAttachment, XmATTACH_SELF, XmNheight, h, NULL);
  243.   }
  244.   OnSize(w, h);
  245. #endif
  246. #ifdef wx_xview
  247.   wxWindow::SetClientSize(w, h);
  248. #endif
  249. #ifdef wx_msw
  250.   wxWindow::SetClientSize(w, h);
  251. #endif
  252. }
  253.  
  254. void wxPanel::GetPosition(int *x, int *y)
  255. {
  256. #ifdef wx_motif
  257.   Dimension xx, yy;
  258.   XtVaGetValues(borderWidget ? borderWidget : (Widget)handle,
  259.                 XmNx, &xx, XmNy, &yy, NULL);
  260.   *x = xx;
  261.   *y = yy;
  262. #else
  263.   wxWindow::GetPosition(x, y);
  264. #endif
  265. }
  266.  
  267. /*****************************************************************
  268.  * ITEM PLACEMENT FUNCTIONS
  269.  *****************************************************************/
  270.  
  271.  
  272. // Start a new line
  273. void wxPanel::NewLine(void)
  274. {
  275. #ifdef wx_motif
  276.   new_line = TRUE;
  277. #endif
  278. #ifdef wx_xview
  279.   Panel panel = (Panel)handle;
  280.   if (new_line)
  281.   {
  282.       (void) xv_create(panel, PANEL_MESSAGE,
  283.                              PANEL_LAYOUT, PANEL_HORIZONTAL,
  284.                              PANEL_NEXT_ROW, -1, NULL);
  285.   }
  286.   new_line = TRUE;
  287. #endif
  288. #ifdef wx_msw
  289.   cursor_x = PANEL_LEFT_MARGIN;
  290.   if (max_line_height == 0)
  291.   {
  292.     cursor_y += vspacing;
  293.   }
  294.   else
  295.     cursor_y += vspacing + max_line_height;
  296.   max_line_height = 0;
  297. #endif
  298. }
  299.  
  300. void wxPanel::Tab(int pixels)
  301. {
  302. #ifdef wx_motif
  303. #endif
  304. #ifdef wx_xview
  305.   Panel panel = (Panel)handle;
  306.     (void) xv_create(panel, PANEL_MESSAGE,
  307.                            PANEL_LAYOUT, PANEL_HORIZONTAL,
  308.                            XV_WIDTH, pixels,
  309.                            NULL);
  310. #endif
  311. #ifdef wx_msw
  312.   cursor_x += pixels;
  313.   if (cursor_x > max_width)
  314.     max_width = cursor_x;
  315. #endif
  316. }
  317.  
  318. void wxPanel::GetCursor(int *x, int *y)
  319. {
  320. #ifdef wx_motif
  321. #endif
  322. #ifdef wx_xview
  323.   Xv_opaque object = (Xv_opaque)handle;
  324.   *x = (int)xv_get(object, PANEL_ITEM_X);
  325.   *y = (int)xv_get(object, PANEL_ITEM_Y);
  326. #endif
  327. #ifdef wx_msw
  328.   *x = cursor_x;
  329.   *y = cursor_y;
  330. #endif
  331. }
  332.  
  333. // Set/get horizontal spacing
  334. void wxPanel::SetHorizontalSpacing(int sp)
  335. {
  336. #ifdef wx_motif
  337.   hSpacing = sp;
  338. #endif
  339. #ifdef wx_xview
  340.   Xv_opaque object = (Xv_opaque)handle;
  341.   (void)xv_set(object, PANEL_ITEM_X_GAP, sp, NULL);
  342. #endif
  343. #ifdef wx_msw
  344.   hspacing = sp;
  345. #endif
  346. }
  347.  
  348. int wxPanel::GetHorizontalSpacing(void)
  349. {
  350. #ifdef wx_motif
  351.   return hSpacing;
  352. #endif
  353. #ifdef wx_xview
  354.   Xv_opaque object = (Xv_opaque)handle;
  355.   return (int)xv_get(object, PANEL_ITEM_X_GAP);
  356. #endif
  357. #ifdef wx_msw
  358.   return hspacing;
  359. #endif
  360. }
  361.  
  362. // Set/get vertical spacing
  363. void wxPanel::SetVerticalSpacing(int sp)
  364. {
  365. #ifdef wx_motif
  366.   vSpacing = sp;
  367. #endif
  368. #ifdef wx_xview
  369.   Xv_opaque object = (Xv_opaque)handle;
  370.   (void)xv_set(object, PANEL_ITEM_Y_GAP, sp, NULL);
  371. #endif
  372. #ifdef wx_msw
  373.   vspacing = sp;
  374. #endif
  375. }
  376.  
  377. int wxPanel::GetVerticalSpacing(void)
  378. {
  379. #ifdef wx_motif
  380.   return vSpacing;
  381. #endif
  382. #ifdef wx_xview
  383.   Xv_opaque object = (Xv_opaque)handle;
  384.   return (int)xv_get(object, PANEL_ITEM_Y_GAP);
  385. #endif
  386. #ifdef wx_msw
  387.   return vspacing;
  388. #endif
  389. }
  390.  
  391. // Fits the panel around the items
  392. void wxPanel::Fit(void)
  393. {
  394. #ifdef wx_motif
  395.   int maxX = 0;
  396.   int maxY = 0;
  397.   wxNode *node = GetChildren()->First();
  398.   while (node)
  399.   {
  400.     wxWindow *win = (wxWindow *)node->Data();
  401.     int x, y, w, h;
  402.     win->GetPosition(&x, &y);
  403.     win->GetSize(&w, &h);
  404.     if ((x + w) > maxX)
  405.       maxX = x + w;
  406.     if ((y + h) > maxY)
  407.       maxY = y + h;
  408.     node = node->Next();
  409.   }
  410.   SetClientSize(maxX + hSpacing, maxY + vSpacing);
  411. #endif
  412. #ifdef wx_xview
  413.   Xv_opaque object = (Xv_opaque)handle;
  414.   window_fit(object);
  415. #endif
  416. #ifdef wx_msw
  417.   SetClientSize(max_width + PANEL_HSPACING,
  418.                 max_height + PANEL_VSPACING);
  419. #endif
  420. }
  421.  
  422. // Update next cursor position
  423. void wxPanel::AdvanceCursor(wxWindow *item)
  424. {
  425. #ifdef wx_motif
  426. #endif
  427. #ifdef wx_xview
  428. #endif
  429. #ifdef wx_msw
  430.   int width, height;
  431.   int x, y;
  432.   item->GetSize(&width, &height);
  433.   item->GetPosition(&x, &y);
  434.  
  435.   if ((x + width) > max_width)
  436.     max_width = x + width;
  437.   if ((y + height) > max_height)
  438.     max_height = y + height;
  439.   if (height > max_line_height)
  440.     max_line_height = height;
  441.  
  442.   cursor_x = x + width + hspacing;
  443.   cursor_y = y;
  444. #endif
  445. }
  446.  
  447. // If x or y are not specified (i.e. < 0), supply
  448. // values based on left to right, top to bottom layout.
  449. // Internal use only.
  450. void wxPanel::GetValidPosition(int *x, int *y)
  451. {
  452. #ifdef wx_motif
  453. #endif
  454. #ifdef wx_xview
  455. #endif
  456. #ifdef wx_msw
  457.   if (*x < 0 || *y < 0)
  458.   {
  459.     *x = cursor_x;
  460.     *y = cursor_y;
  461.   }
  462. #endif
  463. }
  464.  
  465.