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

  1. /*
  2.  * File:     wx_dialg.cc
  3.  * Purpose:  wxDialogBox and miscellaneous dialog functions
  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. #include <stdio.h>
  32. #include "common.h"
  33. #include "wx_dialg.h"
  34. #include "wx_utils.h"
  35. #include "wx_frame.h"
  36. #include "wx_privt.h"
  37. #include "wx_main.h"
  38.  
  39. #define wxDIALOG_DEFAULT_X 300
  40. #define wxDIALOG_DEFAULT_Y 300
  41.  
  42. #ifdef wx_motif
  43. #include <Xm/Label.h>
  44. #include <Xm/Text.h>
  45. #include <Xm/FileSB.h>
  46. #include <Xm/RowColumn.h>
  47. char *wxMotifFileSelector(char *message,
  48.                      char *default_path, char *default_filename, 
  49.                      char *default_extension, char *wildcard, int flags,
  50.                      wxFrame *parent, int x, int y);
  51. #endif
  52.  
  53. #ifdef wx_xview
  54. char *wxXFileSelector(wxFrame *parent, char *path, char *file, char *message, int flags,
  55.   char *wild_card);
  56. #endif
  57.  
  58. #ifdef wx_xview
  59. #include <dirent.h>
  60. #include <unistd.h>
  61. #include <xview/panel.h>
  62. extern "C" int xv_window_loop(Frame);
  63. extern "C" int xv_window_return(int);
  64. extern void wxPanelEventProc(Panel panel, Event *event); // See wx_item.cc
  65. #endif
  66.  
  67. #ifdef wx_msw
  68. #include <commdlg.h>
  69.  
  70. char *wxmswFileSelector(char *message,
  71.                      char *default_path, char *default_filename, 
  72.                      char *default_extension, char *wildcard, int flags,
  73.                      wxFrame *parent, int x, int y);
  74.  
  75. // Lists to keep track of windows, so we can disable/enable them
  76. // for modal dialogs
  77. wxList wxModalDialogs;
  78. wxList wxModelessWindows;  // Frames and modeless dialogs
  79.  
  80. class wxDialogWnd : public wxSubWnd
  81. {
  82. public:
  83.   wxDialogWnd(wxWnd *parent, wxWindow *wx_win,
  84.               int x, int y, int width, int height,
  85.               char *dialog_template);
  86.  
  87.   // Handlers
  88.   LONG DefWindowProc(UINT nMsg, UINT wParam, LONG lParam);
  89.   BOOL ProcessMessage(MSG* pMsg);
  90.   BOOL OnEraseBkgnd(HDC pDC);
  91.   BOOL OnClose(void);
  92. };
  93.  
  94. wxDialogWnd::wxDialogWnd(wxWnd *parent, wxWindow *wx_win,
  95.               int x, int y, int width, int height,
  96.               char *dialog_template):
  97.   wxSubWnd(parent, NULL, wx_win, x, y, width, height, 0, dialog_template)
  98. {
  99. }
  100.  
  101. LONG wxDialogWnd::DefWindowProc(UINT nMsg, UINT wParam, LONG lParam)
  102. {
  103.   return ::DefWindowProc(handle, nMsg, wParam, lParam);
  104. }
  105.  
  106. BOOL wxDialogWnd::ProcessMessage(MSG* pMsg)
  107. {
  108.   return ::IsDialogMessage(handle, pMsg);
  109. }
  110.  
  111. BOOL wxDialogWnd::OnClose(void)
  112. {
  113.   if (wx_window)
  114.   {
  115.     if (wx_window->OnClose())
  116.     {
  117.       ((wxDialogBox *)wx_window)->Show(FALSE);
  118.       delete wx_window;
  119.       return TRUE;
  120.     } else return FALSE;
  121.   }
  122.   return FALSE;
  123. }
  124.  
  125.  
  126. BOOL wxDialogWnd::OnEraseBkgnd(HDC pDC)
  127. {
  128.   if (background_brush)
  129.   {
  130.     RECT rect;
  131.     GetClientRect(handle, &rect);
  132.     int mode = SetMapMode(pDC, MM_TEXT);
  133.     FillRect(pDC, &rect, background_brush);
  134.     SetMapMode(pDC, mode);
  135.     return TRUE;
  136.   }
  137.   else return FALSE;
  138. }
  139.  
  140. #endif
  141.  
  142.  
  143.  
  144. // Dialog box - like panel but doesn't need a frame, and is modal or
  145. // non-modal
  146.  
  147. wxDialogBox::wxDialogBox(wxFrame *Parent, char *Title, Bool Modal, 
  148.                          int x, int y, int width, int height):wxPanel(NULL)
  149. {
  150.   if (Parent) Parent->AddChild(this);
  151.   window_parent = Parent;
  152.  
  153.   if (x < 0) x = wxDIALOG_DEFAULT_X;
  154.   if (y < 0) y = wxDIALOG_DEFAULT_Y;
  155.  
  156. #ifdef wx_motif
  157.   borderWidget = 0;
  158.   wxType = 1;
  159.   hSpacing = PANEL_HSPACING;
  160.   vSpacing = PANEL_VSPACING;
  161.  
  162.   int real_y = y;
  163.  
  164.   new_line = TRUE;
  165.   firstRowWidget = NULL;
  166.   lastWidget = NULL;
  167.  
  168.   dialogShell = XtAppCreateShell(NULL, "Shell", 
  169.          topLevelShellWidgetClass, XtDisplay(wxTheApp->topLevel), NULL, 0);
  170.  
  171.   panelWidget = XtVaCreateManagedWidget("panel",
  172.                   xmFormWidgetClass, dialogShell,
  173.                   XmNx, 0,
  174.                   XmNy, 0,
  175.                   NULL);
  176.  
  177.   if (Title)
  178.     XtVaSetValues(dialogShell, 
  179.                   XmNtitle, Title,
  180.                   NULL);
  181.  
  182.   XtVaSetValues(dialogShell, 
  183.                  XmNallowShellResize, True,
  184.                  XmNdeleteResponse, XmDO_NOTHING,
  185.                  XmNmappedWhenManaged, False,
  186.                  NULL);
  187.  
  188.   /*
  189.    * CAN ANYONE explain why the border of a dialog box is messed up by widgets,
  190.    * to the bottom and right of the box? Why does the form allow this to happen?
  191.    * This attempt below doesn't work, it obliterates the bottom and right
  192.    * borders, but at least it looks more consistent than mouse-bites.
  193.    *
  194.    */
  195.   // Put a rowcolumn to the right and along the bottom as a border
  196.   XtVaCreateManagedWidget("rowcol",
  197.                   xmRowColumnWidgetClass, panelWidget,
  198.                   XmNorientation, XmVERTICAL,
  199.                   XmNtopAttachment,        XmATTACH_FORM,
  200.                   XmNbottomAttachment,     XmATTACH_FORM,
  201.                   XmNrightAttachment,      XmATTACH_FORM,
  202.                   XmNwidth, 2,
  203.                   NULL);
  204.   XtVaCreateManagedWidget("rowcol",
  205.                   xmRowColumnWidgetClass, panelWidget,
  206.                   XmNorientation, XmHORIZONTAL,
  207.                   XmNleftAttachment,        XmATTACH_FORM,
  208.                   XmNbottomAttachment,     XmATTACH_FORM,
  209.                   XmNrightAttachment,      XmATTACH_FORM,
  210.                   XmNheight, 2,
  211.                   NULL);
  212.  
  213.  
  214.   wxWidgetHashTable->Put((long)panelWidget, this);
  215.  
  216.   XtOverrideTranslations(panelWidget,
  217.               XtParseTranslationTable("<Configure>: resize()"));
  218.  
  219.   if (x > -1)
  220.     XtVaSetValues(panelWidget, XmNx, x, 
  221.                   NULL);
  222.   if (y > -1)
  223.     XtVaSetValues(panelWidget, XmNy, real_y,
  224.                   NULL);
  225.   if (width > -1)
  226.     XtVaSetValues(panelWidget, XmNwidth, width, NULL);
  227.   if (height > -1)
  228.     XtVaSetValues(panelWidget, XmNheight, height, NULL);
  229.  
  230.   XtRealizeWidget(dialogShell);
  231.   handle = (char *)panelWidget;
  232. #endif
  233. #ifdef wx_xview
  234.   Frame parent;
  235.   if (Parent == (wxFrame *)NULL)
  236.     {
  237.       parent = (Frame)NULL;
  238.     }
  239.   else
  240.     {
  241.       parent = (Frame)(Parent->GetHandle());
  242.     };
  243.   frame = (Frame) xv_create(parent, FRAME, FRAME_LABEL, Title,
  244.                   XV_X, x, XV_Y, y,
  245.                               WIN_CLIENT_DATA, (char *)this,
  246.                               NULL);
  247.  
  248.   Panel x_panel = (Panel)xv_create(frame, PANEL,
  249.                                    PANEL_BACKGROUND_PROC, wxPanelEventProc,
  250.                                    PANEL_ACCEPT_KEYSTROKE, TRUE,
  251.                                    WIN_CLIENT_DATA, (char *)this,
  252.                                    NULL);
  253.  
  254.   if (width > -1)
  255.   {
  256.     xv_set(frame, XV_WIDTH, width, NULL);
  257.     xv_set(x_panel, XV_WIDTH, width, NULL);
  258.   }
  259.  
  260.   if (height > -1)
  261.   {
  262.     xv_set(frame, XV_HEIGHT, height, NULL);
  263.     xv_set(x_panel, XV_HEIGHT, height, NULL);
  264.   }
  265.  
  266.   handle = (char *)x_panel;
  267. #endif
  268. #ifdef wx_msw
  269.   wxWinType = wxTYPE_XWND;
  270.   wxWnd *cparent = NULL;
  271.   if (Parent)
  272.     cparent = (wxWnd *)Parent->handle;
  273.  
  274.   if (width < 0)
  275.     width = 500;
  276.   if (height < 0)
  277.     height = 500;
  278.  
  279.   wxDialogWnd *wnd = new wxDialogWnd(cparent, this,
  280.                                       x, y, width, height,
  281.                                       "wxDummyDialog");
  282.  
  283.   handle = (char *)wnd;
  284.   SetWindowText(wnd->handle, Title);
  285.  
  286.   if (!Modal)
  287.     wxModelessWindows.Append(this);
  288. #endif
  289.  
  290.   modal = Modal;
  291.  
  292. }
  293.  
  294. wxDialogBox::~wxDialogBox()
  295. {
  296. #ifdef wx_motif
  297.   modal_showing = FALSE;
  298. //  XtUnmapWidget(dialogShell);
  299. #endif
  300. #ifdef wx_xview
  301.  xv_destroy_safe(frame);
  302. #endif
  303. #ifdef wx_msw
  304.   wxWnd *wnd = (wxWnd *)handle;
  305.   modal_showing = FALSE;
  306.   ShowWindow(wnd->handle, SW_HIDE);
  307.   if (!modal)
  308.     wxModelessWindows.DeleteObject(this);
  309. #endif
  310. }
  311.  
  312. #ifdef wx_motif
  313. void wxWindow::PostDestroyChildren(void)
  314. {
  315.   if (wxType == 1)
  316.   {
  317.     wxDialogBox *box = (wxDialogBox *)this;
  318.     XtDestroyWidget(box->dialogShell);
  319.  
  320.     // Now process all events, because otherwise
  321.     // this might remain on the screen
  322.     XSync(XtDisplay(wxTheApp->topLevel), FALSE);
  323.     XEvent event;
  324.     while (XtAppPending(wxTheApp->appContext))
  325.     {
  326.       XFlush(XtDisplay(wxTheApp->topLevel));
  327.       XtAppNextEvent(wxTheApp->appContext, &event);
  328.       XtDispatchEvent(&event);
  329.     }
  330.   }
  331. }
  332. #endif
  333.  
  334. void wxDialogBox::Fit(void)
  335. {
  336. #ifdef wx_motif
  337. #endif
  338. #ifdef wx_xview
  339.   Panel panel = (Panel)handle;
  340.   window_fit(panel);
  341.   window_fit(frame);
  342. #endif
  343. #ifdef wx_msw
  344.   wxPanel::Fit();
  345. #endif
  346. }
  347.  
  348. void wxDialogBox::Centre(int direction)
  349. {
  350.   int display_width, display_height, width, height, x, y;
  351.   wxDisplaySize(&display_width, &display_height);
  352.  
  353.   GetSize(&width, &height);
  354.   GetPosition(&x, &y);
  355.  
  356.   if (direction == wxBOTH || direction == wxHORIZONTAL)
  357.     x = (int)((display_width - width)/2);
  358.   if (direction == wxBOTH || direction == wxVERTICAL)
  359.     y = (int)((display_height - height)/2);
  360.  
  361.   SetSize(x, y, width, height);
  362. }
  363.  
  364. void wxDialogBox::Iconize(Bool iconize)
  365. {
  366. #ifdef wx_motif
  367.   XtVaSetValues(dialogShell, XmNiconic, iconize, NULL);
  368. #endif
  369. #ifdef wx_xview
  370.   xv_set(frame, FRAME_CLOSED, iconize, NULL);
  371. #endif
  372. #ifdef wx_msw
  373.   // Windows dialog boxes can't be iconized
  374. #endif
  375. }
  376.  
  377. Bool wxDialogBox::Iconized(void)
  378. {
  379. #ifdef wx_motif
  380.   Bool iconic;
  381.   XtVaGetValues(dialogShell, XmNiconic, &iconic, NULL);
  382.   return iconic;
  383. #endif
  384. #ifdef wx_xview
  385.   return xv_get(frame, FRAME_CLOSED);
  386. #endif
  387. #ifdef wx_msw
  388.   return FALSE;
  389. #endif
  390. }
  391.  
  392. void wxDialogBox::SetSize(int x, int y, int width, int height)
  393. {
  394. #ifdef wx_motif
  395.   if (x > -1)
  396.     XtVaSetValues(dialogShell, XmNx, x, NULL);
  397.   if (y > -1)
  398.     XtVaSetValues(dialogShell, XmNy, y, NULL);
  399.   if (width > -1)
  400.     XtVaSetValues((Widget)handle, XmNwidth, width, NULL);
  401.   if (height > -1)
  402.     XtVaSetValues((Widget)handle, XmNheight, height, NULL);
  403.   OnSize(width, height);
  404. #endif
  405. #ifdef wx_xview
  406.   (void)xv_set(frame, XV_X, x, XV_Y, y, XV_WIDTH, width, XV_HEIGHT, height, NULL);
  407.   OnSize(width, height);
  408. #endif
  409. #ifdef wx_msw
  410.   wxWindow::SetSize(x, y, width, height);
  411. #endif
  412. }
  413.  
  414. void wxDialogBox::SetClientSize(int width, int height)
  415. {
  416. #ifdef wx_motif
  417.   if (width > -1)
  418.     XtVaSetValues((Widget)handle, XmNwidth, width, NULL);
  419.   if (height > -1)
  420.     XtVaSetValues((Widget)handle, XmNheight, height, NULL);
  421.   OnSize(width, height);
  422. #endif
  423. #ifdef wx_xview
  424.   (void)xv_set(frame, XV_WIDTH, width, XV_HEIGHT, height, NULL);
  425. #endif
  426. #ifdef wx_msw
  427.   wxWnd *wnd = (wxWnd *)handle;
  428.   RECT rect;
  429.   GetClientRect(wnd->handle, &rect);
  430.  
  431.   RECT rect2;
  432.   GetWindowRect(wnd->handle, &rect2);
  433.  
  434.   // Find the difference between the entire window (title bar and all)
  435.   // and the client area; add this to the new client size to move the
  436.   // window
  437.   int actual_width = rect2.right - rect2.left - rect.right + width;
  438.   int actual_height = rect2.bottom - rect2.top - rect.bottom + height;
  439.  
  440.   MoveWindow(wnd->handle, rect2.left, rect2.top, actual_width, actual_height, TRUE);
  441.   OnSize(actual_width, actual_height);
  442. #endif
  443. }
  444.  
  445. void wxDialogBox::GetPosition(int *x, int *y)
  446. {
  447. #ifdef wx_motif
  448.   Dimension xx, yy;
  449.   XtVaGetValues(dialogShell, XmNx, &xx, XmNy, &yy, NULL);
  450.   *x = xx; *y = yy;
  451. #endif
  452. #ifdef wx_xview
  453.   *x = (int)xv_get(frame, XV_X);
  454.   *y = (int)xv_get(frame, XV_Y);
  455. #endif
  456. #ifdef wx_msw
  457.   wxWindow::GetPosition(x, y);
  458. #endif
  459. }
  460.  
  461. void wxDialogBox::Show(Bool show)
  462. {
  463. #ifdef wx_motif
  464.   if (show)
  465.   {
  466.     XtMapWidget(dialogShell);
  467.     XRaiseWindow(XtDisplay(dialogShell), XtWindow(dialogShell));
  468.     if (modal)
  469.     {
  470.       modal_showing = TRUE;
  471.       XtAddGrab(dialogShell, TRUE, FALSE);
  472.       XEvent event;
  473.       while (modal_showing || XtAppPending(wxTheApp->appContext))
  474.       {
  475.         XtAppNextEvent(wxTheApp->appContext, &event);
  476.         XtDispatchEvent(&event);
  477.       }
  478.     }
  479.   }
  480.   else
  481.   {
  482.     if (modal_showing)
  483.       XtRemoveGrab(dialogShell);
  484.  
  485.     XtUnmapWidget(dialogShell);
  486.     modal_showing = FALSE;
  487.   }
  488. #endif
  489. #ifdef wx_xview
  490.   if (show)
  491.     {
  492.       xv_set(frame, XV_SHOW, TRUE, NULL);
  493.  
  494.       if (modal)
  495.       {
  496.         xv_set(frame, WIN_GRAB_ALL_INPUT, FALSE, NULL);
  497.         xv_window_loop(frame);
  498.        }
  499.     }
  500.   else
  501.     {
  502.      xv_set(frame, WIN_GRAB_ALL_INPUT, FALSE, NULL);
  503.  
  504.      xv_set(frame, XV_SHOW, FALSE, NULL);
  505.      if (modal)
  506.      {
  507.        xv_window_return(0);
  508.      }
  509.     }
  510. #endif
  511. #ifdef wx_msw
  512.   wxWnd *dialog = (wxWnd *)handle;
  513.   if (modal)
  514.   {
  515.     if (show)
  516.     {
  517.       EnableWindow(dialog->handle, TRUE);
  518.       ShowWindow(dialog->handle, SW_SHOW);
  519.       BringWindowToTop(dialog->handle);
  520.       modal_showing = TRUE;
  521.  
  522.       wxNode *node = wxModalDialogs.First();
  523.       while (node)
  524.       {
  525.         wxDialogBox *box = (wxDialogBox *)node->Data();
  526.         wxWnd *the_dialog = (wxWnd *)box->handle;
  527.         if (box != this)
  528.           EnableWindow(the_dialog->handle, FALSE);
  529.         node = node->Next();
  530.       }
  531.       node = wxModelessWindows.First();
  532.       while (node)
  533.       {
  534.         wxWindow *win = (wxWindow *)node->Data();
  535.         wxWnd *wnd = (wxWnd *)win->handle;
  536.         EnableWindow(wnd->handle, FALSE);
  537.         node = node->Next();
  538.       }
  539.  
  540.       wxModalDialogs.Append(this);
  541.  
  542.       MSG msg;
  543.       while (modal_showing && GetMessage(&msg, NULL, 0, 0))
  544.       {
  545.         if (!IsDialogMessage(dialog->handle, &msg))
  546.         {
  547.           TranslateMessage(&msg);
  548.           DispatchMessage(&msg);
  549.         }
  550.       }
  551.     }
  552.     else
  553.     {
  554.       wxModalDialogs.DeleteObject(this);
  555.  
  556.       wxNode *first = wxModalDialogs.First();
  557.  
  558.       // If there's still a modal dialog active, we
  559.       // enable it, else we enable all modeless windows
  560.  
  561.       if (first)
  562.       {
  563.         wxDialogBox *box = (wxDialogBox *)first->Data();
  564.         wxWnd *the_dialog = (wxWnd *)box->handle;
  565.         EnableWindow(the_dialog->handle, TRUE);
  566.         BringWindowToTop(dialog->handle);
  567.       }
  568.       else
  569.       {
  570.         wxNode *node = wxModelessWindows.First();
  571.         while (node)
  572.         {
  573.           wxWindow *win = (wxWindow *)node->Data();
  574.           wxWnd *wnd = (wxWnd *)win->handle;
  575.           EnableWindow(wnd->handle, TRUE);
  576.           node = node->Next();
  577.         }
  578.       }
  579.       ShowWindow(dialog->handle, SW_HIDE);
  580.       modal_showing = FALSE;
  581.     }
  582.   }
  583.   else
  584.   {
  585.     if (show)
  586.     {
  587.       ShowWindow(dialog->handle, SW_SHOW);
  588.       BringWindowToTop(dialog->handle);
  589.     }
  590.     else
  591.     {
  592.       ShowWindow(dialog->handle, SW_HIDE);
  593.     }
  594.   }
  595. #endif
  596. }
  597.  
  598. /*
  599.  * Common dialogs code
  600.  *
  601.  */
  602.  
  603. int wxDialogButtonPressed = 0;
  604.  
  605. void wxDialogOkButton(wxButton& but, wxEvent& event)
  606. {
  607.   wxDialogBox *dialog = (wxDialogBox *)but.GetParent();
  608.   wxDialogButtonPressed = wxOK;
  609.   dialog->Show(FALSE);
  610. }
  611.  
  612. void wxDialogCancelButton(wxButton& but, wxEvent& event)
  613. {
  614.   wxDialogBox *dialog = (wxDialogBox *)but.GetParent();
  615.   wxDialogButtonPressed = wxCANCEL;
  616.   dialog->Show(FALSE);
  617. }
  618.  
  619. void wxDialogYesButton(wxButton& but, wxEvent& event)
  620. {
  621.   wxDialogBox *dialog = (wxDialogBox *)but.GetParent();
  622.   wxDialogButtonPressed = wxYES;
  623.   dialog->Show(FALSE);
  624. }
  625.  
  626. void wxDialogNoButton(wxButton& but, wxEvent& event)
  627. {
  628.   wxDialogBox *dialog = (wxDialogBox *)but.GetParent();
  629.   wxDialogButtonPressed = wxNO;
  630.   dialog->Show(FALSE);
  631. }
  632.  
  633. // Return NULL if cancel pressed
  634. char *wxGetTextFromUser(char *message, char *caption, char *default_value,
  635.                         wxFrame *parent, int x, int y)
  636. {
  637.   if (x < 0) x = wxDIALOG_DEFAULT_X;
  638.   if (y < 0) y = wxDIALOG_DEFAULT_Y;
  639.  
  640.   wxDialogBox dialog(parent, caption, TRUE, x, y, 500, 160);
  641.   dialog.SetClientSize(320, 160);
  642.  
  643.   (void)new wxMessage(&dialog, message);
  644.   dialog.NewLine();
  645.  
  646.   wxText text(&dialog, NULL, NULL, default_value, -1, -1, 320);
  647.   dialog.NewLine();
  648.  
  649.   wxButton *ok = new wxButton(&dialog, (wxFunction)&wxDialogOkButton, "OK");
  650.   (void)new wxButton(&dialog, (wxFunction)&wxDialogCancelButton, "Cancel");
  651.  
  652.   wxDialogButtonPressed = 0;
  653.  
  654.   ok->SetDefault();
  655.   text.SetFocus();
  656.  
  657.   dialog.Fit();
  658.   dialog.Centre();
  659.   dialog.Show(TRUE);
  660.  
  661.   if (wxDialogButtonPressed == wxOK)
  662.     return text.GetValue();
  663.   else
  664.     return NULL;
  665. }
  666.  
  667. #define wxCHOICE_HEIGHT 150
  668. #define wxCHOICE_WIDTH 200
  669.  
  670. char *wxGetSingleChoice(char *message, char *caption, int n, char *choices[],
  671.                         wxFrame *parent, int x, int y)
  672. {
  673.   if (x < 0) x = wxDIALOG_DEFAULT_X;
  674.   if (y < 0) y = wxDIALOG_DEFAULT_Y;
  675.  
  676.   // Really want to centre on screen
  677.   wxDialogBox dialog(parent, caption, TRUE, x, y, 300, 250);
  678.   dialog.SetClientSize(300, 250);
  679.   (void)new wxMessage(&dialog, message);
  680.   dialog.NewLine();
  681.  
  682.   wxListBox listbox(&dialog, NULL, NULL, wxSINGLE,
  683.                      -1, -1, wxCHOICE_WIDTH, wxCHOICE_HEIGHT, n, choices);
  684.  
  685.   dialog.NewLine();
  686.   wxButton *ok = new wxButton(&dialog, (wxFunction)&wxDialogOkButton, "OK");
  687.   (void)new wxButton(&dialog, (wxFunction)&wxDialogCancelButton, "Cancel");
  688.   ok->SetDefault();
  689.  
  690.   wxDialogButtonPressed = 0;
  691.   dialog.Fit();
  692.   dialog.Centre();
  693.   dialog.Show(TRUE);
  694.   if (wxDialogButtonPressed == wxOK)
  695.   {
  696.     return listbox.String(listbox.GetSelection());
  697.   }
  698.   else
  699.     return NULL;
  700. }
  701.  
  702. int wxGetSingleChoiceIndex(char *message, char *caption, int n, char *choices[],
  703.                            wxFrame *parent, int x, int y)
  704. {
  705.   // Really want to centre on screen
  706.   if (x < 0) x = wxDIALOG_DEFAULT_X;
  707.   if (y < 0) y = wxDIALOG_DEFAULT_Y;
  708.  
  709.  
  710.   wxDialogBox dialog(parent, caption, TRUE, x, y, 300, 250);
  711.   dialog.SetClientSize(300, 250);
  712.   (void)new wxMessage(&dialog, message);
  713.   dialog.NewLine();
  714.  
  715.   wxListBox listbox(&dialog, NULL, NULL, wxSINGLE,
  716.                      -1, -1, wxCHOICE_WIDTH, wxCHOICE_HEIGHT, n, choices);
  717.   dialog.NewLine();
  718.  
  719.   wxButton *ok = new wxButton(&dialog, (wxFunction)&wxDialogOkButton, "OK");
  720.   (void)new wxButton(&dialog, (wxFunction)&wxDialogCancelButton, "Cancel");
  721.   ok->SetDefault();
  722.  
  723.   wxDialogButtonPressed = 0;
  724.   dialog.Fit();
  725.   dialog.Centre();
  726.   dialog.Show(TRUE);
  727.   if (wxDialogButtonPressed == wxOK)
  728.   {
  729.     return listbox.GetSelection();
  730.   }
  731.   else
  732.     return -1;
  733. }
  734.  
  735. char *wxGetSingleChoiceData(char *message, char *caption, int n,
  736.                             char *choices[], char *client_data[],
  737.                             wxFrame *parent, int x, int y)
  738. {
  739.   // Really want to centre on screen
  740.   if (x < 0) x = wxDIALOG_DEFAULT_X;
  741.   if (y < 0) y = wxDIALOG_DEFAULT_Y;
  742.  
  743.   wxDialogBox dialog(parent, caption, TRUE, x, y, 300, 250);
  744.   dialog.SetClientSize(300, 250);
  745.   (void)new wxMessage(&dialog, message);
  746.   dialog.NewLine();
  747.  
  748.   wxListBox listbox(&dialog, NULL, NULL, wxSINGLE, -1, -1,
  749.                      wxCHOICE_WIDTH, wxCHOICE_HEIGHT);
  750.   int i;
  751.   for (i = 0; i < n; i++)
  752.     listbox.Append(choices[i], client_data[i]);
  753.  
  754.   dialog.NewLine();
  755.  
  756.   wxButton *ok = new wxButton(&dialog, (wxFunction)&wxDialogOkButton, "OK");
  757.   (void)new wxButton(&dialog, (wxFunction)&wxDialogCancelButton, "Cancel");
  758.   ok->SetDefault();
  759.  
  760.   wxDialogButtonPressed = 0;
  761.   dialog.Fit();
  762.   dialog.Centre();
  763.   dialog.Show(TRUE);
  764.   if (wxDialogButtonPressed == wxOK)
  765.   {
  766.     int sel = listbox.GetSelection();
  767.     return listbox.GetClientData(sel);
  768.   }
  769.   else
  770.     return NULL;
  771. }
  772.  
  773. // Pop up a message box
  774. int wxMessageBox(char *message, char *caption, int type,
  775.                  wxFrame *parent, int x, int y)
  776. {
  777.   wxDialogBox dialog(parent, caption, TRUE, x, y, 500, 500);
  778.  
  779.   // Format and centre the message
  780.   wxList messageList;
  781.   char *copyMessage = copystring(message);
  782.   int i = 0;
  783.   int len = strlen(copyMessage);
  784.   char *currentMessage = copyMessage;
  785.   while (i < len)
  786.   {
  787.     while ((i < len) && (copyMessage[i] != '\n')) i ++;
  788.     if (i < len) copyMessage[i] = 0;
  789.     wxMessage *mess = new wxMessage(&dialog, currentMessage);
  790.     messageList.Append(mess);
  791.     dialog.NewLine();
  792.  
  793.     currentMessage = copyMessage + i + 1;
  794.   }
  795.   delete copyMessage;
  796.   dialog.NewLine();
  797.  
  798.   wxButton *ok = NULL;
  799.   wxButton *cancel = NULL;
  800.   wxButton *yes = NULL;
  801.   wxButton *no = NULL;
  802.  
  803.   if (type & wxYES_NO)
  804.   {
  805.     yes = new wxButton(&dialog, (wxFunction)&wxDialogYesButton, "Yes");
  806.     no = new wxButton(&dialog, (wxFunction)&wxDialogNoButton, "No");
  807.   }
  808.  
  809.   if (type & wxOK)
  810.   {
  811.     ok = new wxButton(&dialog, (wxFunction)&wxDialogOkButton, "OK");
  812.   }
  813.  
  814.   if (type & wxCANCEL)
  815.   {
  816.     cancel = new wxButton(&dialog, (wxFunction)&wxDialogCancelButton, "Cancel");
  817.   }
  818.  
  819.   dialog.Fit();
  820.  
  821.   // Do the message centering
  822.   wxNode *node = messageList.First();
  823.   while (node)
  824.   {
  825.     wxMessage *mess = (wxMessage *)node->Data();
  826.     mess->Centre();
  827.     node = node->Next();
  828.   }
  829.   if (ok && !cancel && !yes && !no)
  830.     ok->Centre();
  831.  
  832.   if ((x < 0) || (y < 0))
  833.     dialog.Centre();
  834.  
  835.   if (ok)
  836.     ok->SetDefault();
  837.   else if (yes)
  838.     yes->SetDefault();
  839.  
  840.   wxDialogButtonPressed = 0;
  841.   dialog.Show(TRUE);
  842.  
  843.   if (ok)
  844.     delete ok;
  845.   if (cancel)
  846.     delete cancel;
  847.   if (yes)
  848.     delete yes;
  849.   if (no)
  850.     delete no;
  851.  
  852.   return wxDialogButtonPressed;
  853. }
  854.  
  855. char *wxFileSelector(char *message,
  856.                      char *default_path, char *default_filename, 
  857.                      char *default_extension, char *wildcard, int flags,
  858.                      wxFrame *parent, int x, int y)
  859. {
  860.   if (x < 0) x = wxDIALOG_DEFAULT_X;
  861.   if (y < 0) y = wxDIALOG_DEFAULT_Y;
  862. #ifdef wx_motif
  863.   return wxMotifFileSelector(message, default_path, default_filename, 
  864.                      default_extension, wildcard, flags,
  865.                      parent, x, y);
  866. #endif
  867. #ifdef wx_msw
  868.   return wxmswFileSelector(message, default_path, default_filename,
  869.                   default_extension, wildcard, flags, parent, x, y);
  870. #endif
  871. #ifdef wx_xview
  872.   char buf[400];
  873.   if (!default_path)
  874.     default_path = getcwd(buf, 400);
  875.   if (!default_filename)
  876.     default_filename = "";
  877.  
  878.   return wxXFileSelector(parent, default_path, default_filename, message, flags, wildcard);
  879. #endif
  880. }
  881.  
  882. #ifdef wx_xview
  883. void wxReadDir(wxListBox *filebox, wxListBox *dirbox, char *path, char *filename, DIR *dirp)
  884. {
  885.   filebox->Show(FALSE);
  886.   filebox->Clear();
  887.   dirbox->Show(FALSE);
  888.   dirbox->Clear();
  889.   struct dirent *dir;
  890.  
  891.   dirbox->Append("..");
  892.  
  893.   DIR *dirstream = NULL;
  894.   if ((dir=readdir(dirp))==NULL)
  895.   {
  896.     printf("There has been an error in opening the directory\n");
  897.     return;
  898.   }
  899.  
  900.   char buf[400];
  901.  
  902.   // Skip the first directory (.)
  903.  
  904.   wxStringList files;
  905.   wxStringList dirs;
  906.  
  907.   while((dir=readdir(dirp))!=NULL)
  908.   {
  909.     strcpy(buf, path);
  910.     int len = strlen(buf);
  911.  
  912.     if (buf[len - 1] != '/')
  913.       strcat(buf, "/");
  914.  
  915.     strcat(buf, dir->d_name);
  916.     if (dirstream = opendir(buf))
  917.     {
  918.       closedir(dirstream);
  919.  
  920.       if (dir->d_name[0] != '.')
  921.         dirs.Add(dir->d_name);
  922.     }
  923.     else if (!wxIsWild(filename) || wxMatchWild(filename, dir->d_name))
  924.       files.Add(dir->d_name);
  925.  
  926.   }
  927.   files.Sort();
  928.   dirs.Sort();
  929.  
  930.   wxNode *node = files.First();
  931.   while (node)
  932.   {
  933.     char *s = (char *)node->Data();
  934.     filebox->Append(s);
  935.     delete s;
  936.     delete node;
  937.     node = files.First();
  938.   }
  939.  
  940.   node = dirs.First();
  941.   while (node)
  942.   {
  943.     char *s = (char *)node->Data();
  944.     dirbox->Append(s);
  945.     delete s;
  946.     delete node;
  947.     node = dirs.First();
  948.   }
  949.  
  950.   filebox->Show(TRUE);
  951.   dirbox->Show(TRUE);
  952. }
  953.  
  954. class wxXFileSelDialog: public wxDialogBox
  955. {
  956.  public:
  957.   char *wild_card;
  958.   wxText *name_item;
  959.   wxText *path_item;
  960.   wxListBox *list_item;
  961.   wxListBox *file_item;
  962.   wxListBox *dir_item;
  963.   wxXFileSelDialog(wxFrame *frame, char *title, Bool modal = FALSE,
  964.               int x = -1, int y = -1, int
  965.               width = -1, int height = -1);
  966. };
  967.  
  968. wxXFileSelDialog::wxXFileSelDialog(wxFrame *frame, char *title, Bool modal,
  969.               int x, int y, int width, int height):
  970.   wxDialogBox(frame, title, modal, x, y, width, height)
  971. {
  972. }
  973.  
  974. void wxXFileSelPath(wxText& text, wxEvent& event)
  975. {
  976. }
  977.  
  978. void wxStripOneDir(char *dir)
  979. {
  980.   int len = strlen(dir);
  981.   if (len > 1)
  982.   {
  983.     int i = len - 1;
  984.     char ch = 0;
  985.     while (ch != '/' && i > 0)
  986.     {
  987.       ch = dir[i];
  988.       i --;
  989.     }
  990.     i ++;
  991.     if (i == 0)
  992.       i ++;
  993.     dir[i] = 0;
  994.   }
  995. }
  996.  
  997.  
  998. void wxXFileSelDirList(wxListBox& listbox, wxEvent& event)
  999. {
  1000.   char *name = copystring(listbox.GetStringSelection());
  1001.   wxXFileSelDialog *dialog = (wxXFileSelDialog *)listbox.GetParent();
  1002.  
  1003.   char *path = copystring(dialog->path_item->GetValue());
  1004.   char buf[500];
  1005.   strcpy(buf, path);
  1006.  
  1007.   int len = strlen(buf);
  1008.  
  1009.   if (strcmp(name, "..") == 0)
  1010.   {
  1011.     wxStripOneDir(buf);
  1012.   }
  1013.   else
  1014.   {
  1015.     if (buf[len - 1] != '/')
  1016.       strcat(buf, "/");
  1017.     strcat(buf, name);
  1018.   }
  1019.  
  1020.   DIR *dirstream = NULL;
  1021.   if (dirstream = opendir(buf))
  1022.   {
  1023.     dialog->path_item->SetValue(buf);
  1024.     wxReadDir(dialog->file_item, &listbox, buf, dialog->name_item->GetValue(), dirstream);
  1025.     closedir(dirstream);
  1026.   }
  1027.   else dialog->name_item->SetValue(name);
  1028. }
  1029.  
  1030. void wxXFileSelFileList(wxListBox& listbox, wxEvent& event)
  1031. {
  1032.   char *name = copystring(listbox.GetStringSelection());
  1033.   wxXFileSelDialog *dialog = (wxXFileSelDialog *)listbox.GetParent();
  1034.  
  1035.   dialog->name_item->SetValue(name);
  1036. }
  1037.  
  1038. int wxXFileSelResponse = 0;
  1039. char *wxXFileSelAnswer = NULL;
  1040.  
  1041. void wxXFileSelOK(wxButton& ok, wxEvent& event)
  1042. {
  1043.   wxXFileSelDialog *dialog = (wxXFileSelDialog *)ok.GetParent();
  1044.   char *nameval = dialog->name_item->GetValue();
  1045.   char *pathval = dialog->path_item->GetValue();
  1046.   if (wxIsWild(nameval))
  1047.   {
  1048.     DIR *dirstream = NULL;
  1049.     if (dirstream = opendir(pathval))
  1050.     {
  1051.       wxReadDir(dialog->file_item, dialog->dir_item, pathval, nameval, dirstream);
  1052.       closedir(dirstream);
  1053.     }
  1054.     return;
  1055.   }
  1056.  
  1057.   char *name = copystring(nameval);
  1058.   char *path = copystring(pathval);
  1059.  
  1060.   char buf[400];
  1061.   strcpy(buf, path);
  1062.   int len = strlen(buf);
  1063.   if (buf[len - 1] != '/')
  1064.     strcat(buf, "/");
  1065.   strcat(buf, name);
  1066.  
  1067.   delete name;
  1068.   delete path;
  1069.  
  1070.   if (wxXFileSelAnswer)
  1071.     delete wxXFileSelAnswer;
  1072.  
  1073.   wxXFileSelAnswer = copystring(buf);  
  1074.  
  1075.   dialog->Show(FALSE);
  1076.   delete dialog;
  1077.  
  1078.   wxXFileSelResponse = 1;
  1079. }
  1080.  
  1081. void wxXFileSelCancel(wxButton& cancel, wxEvent& event)
  1082. {
  1083.   wxXFileSelDialog *dialog = (wxXFileSelDialog *)cancel.GetParent();
  1084.   wxXFileSelResponse = 0;
  1085.   dialog->Show(FALSE);
  1086.   delete dialog;
  1087. }
  1088.  
  1089. char *wxXFileSelector(wxFrame *parent, char *path, char *file, char *message, int flags, char *wild_card)
  1090. {
  1091.   wxXFileSelResponse = 0;
  1092.   DIR *dirstream;
  1093.   if (!path)
  1094.   {
  1095.     char buf[400];
  1096.     path = getcwd(buf, 400);
  1097.   }
  1098.   if (!file)
  1099.     file = "";
  1100.  
  1101.   if ((dirstream=opendir(path))!=NULL)
  1102.   {
  1103.     wxXFileSelDialog *dialog = new wxXFileSelDialog(parent, "File selector", TRUE, 150, 150, 800, 800);
  1104.  
  1105.     (void)new wxMessage(dialog, message);
  1106.     dialog->NewLine();
  1107.     wxText *name_text = new wxText(dialog, (wxFunction)NULL, "Name", file, -1, -1, 300, -1);
  1108.     dialog->NewLine();
  1109.     wxText *path_text = new wxText(dialog, (wxFunction)wxXFileSelPath, "Path", path, -1, -1, 350, -1);
  1110.     dialog->NewLine();
  1111.     wxListBox *filebox = new wxListBox(dialog, (wxFunction)wxXFileSelFileList, "Files", wxSINGLE,
  1112.                                        4, 80, 200, 300);
  1113.     wxListBox *dirbox = new wxListBox(dialog, (wxFunction)wxXFileSelDirList, "Directories", wxSINGLE,
  1114.                                       -1, -1, 200, 300);
  1115.     dialog->NewLine();
  1116.  
  1117.     (void)new wxButton(dialog, (wxFunction)wxXFileSelOK, "OK");
  1118.     (void)new wxButton(dialog, (wxFunction)wxXFileSelCancel, "Cancel");
  1119.  
  1120.     dialog->path_item = path_text;
  1121.     dialog->name_item = name_text;
  1122.     dialog->dir_item = dirbox;
  1123.     dialog->file_item = filebox;
  1124.     dialog->wild_card = wild_card;
  1125.  
  1126.     dialog->Fit();
  1127.  
  1128.     char *initial_name = file;
  1129.     if (((initial_name == NULL) || (strcmp(initial_name, "") == 0)) &&
  1130.         wild_card)
  1131.     {
  1132.       initial_name = wild_card;
  1133.       dialog->name_item->SetValue(initial_name);
  1134.     }
  1135.  
  1136.     wxReadDir(filebox, dirbox, path, initial_name, dirstream);
  1137.     dialog->Show(TRUE);
  1138.  
  1139.     if (wxXFileSelResponse == 0)
  1140.       return NULL;
  1141.     else
  1142.     {
  1143.       if ((flags & wxOVERWRITE_PROMPT) && FileExists(wxXFileSelAnswer))
  1144.       {
  1145.         char buf[200];
  1146.         sprintf(buf, "Overwrite existing file %s?", wxXFileSelAnswer);
  1147.         int ans = wxMessageBox(buf, "Warning", wxYES_NO);
  1148.         if (ans == wxYES)
  1149.           return copystring(wxXFileSelAnswer);
  1150.         else return NULL;
  1151.       } else return copystring(wxXFileSelAnswer);
  1152.     }
  1153.   }
  1154.   else return NULL;
  1155. }
  1156. #endif
  1157.  
  1158. #ifdef wx_msw
  1159. char *wxmswFileSelector(char *message,
  1160.                      char *default_path, char *default_filename, 
  1161.                      char *default_extension, char *wildcard, int flags,
  1162.                      wxFrame *parent, int x, int y)
  1163. {
  1164.   wxWnd *wnd = NULL;
  1165.   HWND hwnd = NULL;
  1166.   if (parent)
  1167.   {
  1168.     wnd = (wxWnd *)parent->handle;
  1169.     hwnd = wnd->handle;
  1170.   }
  1171.   char file_buffer[400];
  1172.  
  1173.   if (default_filename)
  1174.     strcpy(file_buffer, default_filename);
  1175.   else file_buffer[0] = 0;
  1176.  
  1177.   char title_buffer[50];
  1178.   title_buffer[0] = 0;
  1179.  
  1180.   char filter_buffer[200];
  1181.  
  1182.   if (!wildcard)
  1183.     wildcard = "*.*";
  1184.  
  1185.   if (wildcard)
  1186.   {
  1187.     sprintf(filter_buffer, "Files (%s)", wildcard);
  1188.     int len1 = strlen(filter_buffer);
  1189.     int len2 = strlen(wildcard);
  1190.  
  1191.     filter_buffer[len1] = 0;
  1192.     int i;
  1193.     for (i = 0; i < len2; i++)
  1194.       filter_buffer[len1 + 1 + i] = wildcard[i];
  1195.     filter_buffer[len1 + 1 + len2] = 0;
  1196.     filter_buffer[len1 + 2 + len2] = 0;
  1197.   }
  1198.  
  1199.   OPENFILENAME of;
  1200.   memset(&of, 0, sizeof(OPENFILENAME));
  1201.  
  1202.   of.lStructSize = sizeof(OPENFILENAME);
  1203.   of.hwndOwner = hwnd;
  1204.  
  1205.   if (wildcard)
  1206.   {
  1207.     of.lpstrFilter = (LPSTR)filter_buffer;
  1208.     of.nFilterIndex = 1L;
  1209.   }
  1210.   else
  1211.   {
  1212.     of.lpstrFilter = NULL;
  1213.     of.nFilterIndex = 0L;
  1214.   }
  1215.   of.lpstrCustomFilter = NULL;
  1216.   of.nMaxCustFilter = 0L;
  1217.   of.lpstrFile = file_buffer;
  1218.   of.nMaxFile = 400;
  1219.   of.lpstrFileTitle = title_buffer;
  1220.   of.nMaxFileTitle = 50;
  1221.   of.lpstrInitialDir = default_path;
  1222.   of.lpstrTitle = message;
  1223.   of.nFileOffset = 0;
  1224.   of.nFileExtension = 0;
  1225.   of.lpstrDefExt = default_extension;
  1226.  
  1227.   int msw_flags = 0;
  1228.  
  1229.   if (flags & wxOVERWRITE_PROMPT)
  1230.     msw_flags |= OFN_OVERWRITEPROMPT;
  1231.   if (flags & wxHIDE_READONLY)
  1232.     msw_flags |= OFN_HIDEREADONLY;
  1233.   of.Flags = msw_flags;
  1234.  
  1235.   Bool success;
  1236.   if (flags & wxSAVE)
  1237.     success = GetSaveFileName(&of);
  1238.   else
  1239.     success = GetOpenFileName(&of);
  1240.  
  1241.   DWORD error = CommDlgExtendedError();
  1242.   if (success)
  1243.     return copystring(file_buffer);
  1244.   else
  1245.     return NULL;
  1246. }
  1247.  
  1248. #endif
  1249.  
  1250. #ifdef wx_motif
  1251. char *wxFileSelectorAnswer = NULL;
  1252. Bool wxFileSelectorReturned = FALSE;
  1253.  
  1254. void wxFileSelCancel(Widget fs, XtPointer client_data, XmFileSelectionBoxCallbackStruct *cbs)
  1255. {
  1256.   wxFileSelectorAnswer = NULL;
  1257.   wxFileSelectorReturned = TRUE;
  1258. }
  1259.  
  1260. void wxFileSelOk(Widget fs, XtPointer client_data, XmFileSelectionBoxCallbackStruct *cbs)
  1261. {
  1262.   char *filename;
  1263.   if (!XmStringGetLtoR(cbs->value, XmSTRING_DEFAULT_CHARSET, &filename))
  1264.   {
  1265.     wxFileSelectorAnswer = NULL;
  1266.     wxFileSelectorReturned = TRUE;
  1267.   }
  1268.   else
  1269.   {
  1270.     wxFileSelectorAnswer = copystring(filename);
  1271.     XtFree(filename);
  1272.     wxFileSelectorReturned = TRUE;
  1273.   }
  1274. }
  1275.  
  1276. char *wxMotifFileSelector(char *message,
  1277.                      char *default_path, char *default_filename, 
  1278.                      char *default_extension, char *wildcard, int flags,
  1279.                      wxFrame *parent, int x, int y)
  1280. {
  1281.   Widget parentWidget;
  1282.   if (parent)
  1283.     parentWidget = parent->frameShell;
  1284.   else
  1285.     parentWidget = wxTheApp->wx_frame->frameShell;
  1286.  
  1287.   Widget fileSel = XmCreateFileSelectionDialog(parentWidget, "file_selector", NULL, 0);
  1288.   XtUnmanageChild(XmFileSelectionBoxGetChild(fileSel, XmDIALOG_HELP_BUTTON));
  1289.  
  1290.   Widget shell = XtParent(fileSel);
  1291.  
  1292.   if (message)
  1293.     XtVaSetValues(shell, XmNtitle, message, NULL);
  1294.  
  1295.   char *entirePath = NULL;
  1296.  
  1297.   if (default_path && default_filename)
  1298.   {
  1299.     sprintf(wxBuffer, "%s/%s", default_path, default_filename);
  1300.     entirePath = copystring(wxBuffer);
  1301.   }
  1302.   else if (default_path && !default_filename)
  1303.   {
  1304.     sprintf(wxBuffer, "%s/", default_path);
  1305.     entirePath = copystring(wxBuffer);
  1306.   }
  1307.   else if ((!default_path) && default_filename)
  1308.   {
  1309.     sprintf(wxBuffer, "%s", default_filename);
  1310.     entirePath = copystring(wxBuffer);
  1311.   }
  1312.  
  1313.   if (entirePath)
  1314.   {
  1315.     Widget selectionWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_TEXT);
  1316.     XmTextSetString(selectionWidget, entirePath);
  1317.     delete entirePath;
  1318.   }
  1319.  
  1320.   if (wildcard)
  1321.   {
  1322.     Widget filterWidget = XmFileSelectionBoxGetChild(fileSel, XmDIALOG_FILTER_TEXT);
  1323.     XmTextSetString(filterWidget, wildcard);
  1324.   }
  1325.  
  1326.   XtAddCallback(fileSel, XmNcancelCallback, wxFileSelCancel, NULL);
  1327.   XtAddCallback(fileSel, XmNokCallback, wxFileSelOk, NULL);
  1328.   XtManageChild(fileSel);
  1329.  
  1330.   if (wxFileSelectorAnswer)
  1331.     delete wxFileSelectorAnswer;
  1332.  
  1333.   wxFileSelectorAnswer = NULL;
  1334.   wxFileSelectorReturned = FALSE;
  1335.  
  1336.   XtAddGrab(XtParent(fileSel), TRUE, FALSE);
  1337.   XEvent event;
  1338.   while (!wxFileSelectorReturned)
  1339.   {
  1340.     XtAppNextEvent(wxTheApp->appContext, &event);
  1341.     XtDispatchEvent(&event);
  1342.   }
  1343.   XtRemoveGrab(XtParent(fileSel));
  1344.  
  1345.   XtDestroyWidget(fileSel);
  1346.  
  1347.   return wxFileSelectorAnswer;
  1348. }
  1349. #endif
  1350.