]> git.saurik.com Git - wxWidgets.git/commitdiff
Accelerators implemented for wxMotif; some wxComboBox stupidities cured
authorJulian Smart <julian@anthemion.co.uk>
Thu, 12 Nov 1998 22:47:51 +0000 (22:47 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Thu, 12 Nov 1998 22:47:51 +0000 (22:47 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@995 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

21 files changed:
docs/motif/changes.txt
docs/motif/todo.txt
include/wx/generic/helpext.h
include/wx/motif/accel.h
include/wx/motif/app.h
include/wx/motif/combobox.h
include/wx/motif/scrolbar.h
include/wx/motif/window.h
include/wx/stubs/accel.h
include/wx/stubs/combobox.h
src/generic/gridg.cpp
src/motif/accel.cpp
src/motif/app.cpp
src/motif/choice.cpp
src/motif/combobox.cpp
src/motif/dialog.cpp
src/motif/mdi/lib/XsMotifWindow.C
src/motif/scrolbar.cpp
src/motif/textctrl.cpp
src/motif/window.cpp
src/stubs/combobox.cpp

index 561b69716e7b381b5c4aff14fa92c3782b313c46..4ada41c3b984abfbff8f49b75b875b2873b2e308 100644 (file)
@@ -11,3 +11,26 @@ Julian:
 - First go at wxApp, wxWindow, wxDialog, wxPen, wxBrush, wxFont,
   wxColour, wxButton, wxCheckBox, wxTextCtrl, wxStaticText,
   wxMenu, wxMenuItem, wxMenuBar
 - First go at wxApp, wxWindow, wxDialog, wxPen, wxBrush, wxFont,
   wxColour, wxButton, wxCheckBox, wxTextCtrl, wxStaticText,
   wxMenu, wxMenuItem, wxMenuBar
+
+12/11/98
+--------
+
+It's a long time since I updated this file. Previously done:
+
+- wxFrame, wxDialog done.
+- wxScrolledWindow done (but backing pixmap not used at present).
+- wxBitmap done though could be tidied it up at some point.
+- Most basic controls are there, if not rigorously tested.
+- Some MDI support (menus appear on child frames at present).
+- wxNotebook almost done.
+- wxToolBar done (horizontal only, which would be easy to extend
+  to vertical toolbars).
+
+More recently:
+
+- Colour and font changing done (question mark over what happens
+  to scrollbars).
+- Accelerators done (for menu items and buttons). Also event loop
+  tidied up in wxApp so that events are filtered through ProcessXEvent.
+- wxWindow::GetUpdateRegion should now work.
+
index 0aaab0544dfed6b0e3b5373d4ef69b8a0d8b9e10..e717d2aa195488c3375a7bd5159193b6ef07b184 100644 (file)
@@ -1,7 +1,7 @@
 wxMotif TODO
 ------------
 
 wxMotif TODO
 ------------
 
-Updated: 9/11/98
+Updated: 12/11/98
 
          -------------------------------o-------------------------
 
 
          -------------------------------o-------------------------
 
@@ -21,10 +21,10 @@ High Priority
   so maybe have wxSystemSettings value for scrollbar colour, and/or
   ability to set scrollbar colour independently.
 
   so maybe have wxSystemSettings value for scrollbar colour, and/or
   ability to set scrollbar colour independently.
 
-- Make wxDialog OnPaint work.
-
-- Optimize wxWindow OnPaint, clipping the damaged
-  region.
+- Optimize wxWindow OnPaint to avoid flicker, collapsing Expose events
+  as per flicker fix in 1.68. It will be tricky to avoid
+  interfering with non-wxScrolledWindow widgets except by
+  explicitly testing for wxScrolledWindow.
 
 - Implementation of OnEraseBackground. How? Call OnEraseBackground
   just before OnPaint? Will duplicate Xlib's own erase of the background.
 
 - Implementation of OnEraseBackground. How? Call OnEraseBackground
   just before OnPaint? Will duplicate Xlib's own erase of the background.
@@ -35,6 +35,8 @@ High Priority
   painting a tiled bitmap, then a slight flicker might be seen unless
   X can be persuaded not to repaint the window background by default.
 
   painting a tiled bitmap, then a slight flicker might be seen unless
   X can be persuaded not to repaint the window background by default.
 
+- Finish wxNotebook.
+
 - wxSpinButton
 
 - Tidy dialogs such as the colour and font selectors.
 - wxSpinButton
 
 - Tidy dialogs such as the colour and font selectors.
@@ -49,7 +51,7 @@ High Priority
 
 - wxThread (hopefully, similar to wxGTK)
 
 
 - wxThread (hopefully, similar to wxGTK)
 
-- wxAcceleratorTable.
+- wxGrid: scrollbars don't hide; problem with cell selection.
 
 - Miscellaneous events.
 
 
 - Miscellaneous events.
 
@@ -93,10 +95,6 @@ Low Priority
   - add the driver code to src/motif/helphtml.cpp (a frame, toolbar,
     history list).
 
   - add the driver code to src/motif/helphtml.cpp (a frame, toolbar,
     history list).
 
-  Note that a quicker route to a help system may be to use the
-  code in the contrib dir of XmHTML to control a Netscape session --
-  but Netscape can be a colour resource hog.
-
 - Optimize screen refresh for non-native widgets, e.g. wxWindow
   created with Create(), using technique in flicker patch for 1.68
   (see JACS for latest patch).
 - Optimize screen refresh for non-native widgets, e.g. wxWindow
   created with Create(), using technique in flicker patch for 1.68
   (see JACS for latest patch).
index 4b3c52c0b4b661a9648f40773df1f0d49091cf4e..0ee2fa51b43098cdcd9cdd15d569b6612654685d 100644 (file)
@@ -14,6 +14,8 @@
 #   pragma interface "wxexthlp.h"
 #endif
 
 #   pragma interface "wxexthlp.h"
 #endif
 
+#include "wx/helpbase.h"
+
 /// Name for map file.
 #define WXEXTHELP_MAPFILE   "wxhelp.map"
 /// Path separator.
 /// Name for map file.
 #define WXEXTHELP_MAPFILE   "wxhelp.map"
 /// Path separator.
index 3e8da6784a4feb232d1d725f2a4c659d58aa171a..cd08c75f1d671aa33f67dcd31726bfdcb3cedc14 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "wx/object.h"
 #include "wx/string.h"
 
 #include "wx/object.h"
 #include "wx/string.h"
+#include "wx/event.h"
 
 class WXDLLEXPORT wxAcceleratorTable;
 
 
 class WXDLLEXPORT wxAcceleratorTable;
 
@@ -31,11 +32,15 @@ class WXDLLEXPORT wxAcceleratorTable;
 #define wxACCEL_SHIFT   0x04
 
  // Hold no key down
 #define wxACCEL_SHIFT   0x04
 
  // Hold no key down
-#define wxACCEL_NONE    0x00
+#define wxACCEL_NORMAL  0x00
 
 class WXDLLEXPORT wxAcceleratorEntry
 {
 public:
 
 class WXDLLEXPORT wxAcceleratorEntry
 {
 public:
+    wxAcceleratorEntry(const wxAcceleratorEntry& entry)
+    {
+        m_flags = entry.m_flags; m_keyCode = entry.m_keyCode; m_command = entry.m_command;
+    }
     wxAcceleratorEntry(int flags = 0, int keyCode = 0, int cmd = 0)
     {
         m_flags = flags; m_keyCode = keyCode; m_command = cmd;
     wxAcceleratorEntry(int flags = 0, int keyCode = 0, int cmd = 0)
     {
         m_flags = flags; m_keyCode = keyCode; m_command = cmd;
@@ -48,6 +53,15 @@ public:
     inline int GetKeyCode() const { return m_keyCode; }
     inline int GetCommand() const { return m_command; }
 
     inline int GetKeyCode() const { return m_keyCode; }
     inline int GetCommand() const { return m_command; }
 
+    void operator = (const wxAcceleratorEntry& entry)
+    {
+        m_flags = entry.m_flags; m_keyCode = entry.m_keyCode; m_command = entry.m_command;
+    }
+
+    // Implementation use only
+    bool MatchesEvent(const wxKeyEvent& event) const;
+
+public:
     int             m_flags;
     int                            m_keyCode; // ASCII or virtual keycode
     int                            m_command; // Command id to generate
     int             m_flags;
     int                            m_keyCode; // ASCII or virtual keycode
     int                            m_command; // Command id to generate
@@ -72,6 +86,10 @@ public:
     inline bool operator != (const wxAcceleratorTable& accel) { return m_refData != accel.m_refData; }
 
     bool Ok() const;
     inline bool operator != (const wxAcceleratorTable& accel) { return m_refData != accel.m_refData; }
 
     bool Ok() const;
+
+// Implementation only
+    int GetCount() const;
+    wxAcceleratorEntry* GetEntries() const;
 };
 
 WXDLLEXPORT_DATA(extern wxAcceleratorTable) wxNullAcceleratorTable;
 };
 
 WXDLLEXPORT_DATA(extern wxAcceleratorTable) wxNullAcceleratorTable;
index c36e03233d6ec586a7e093e098b7ac368172e8d1..5cbe5267fa9b515d15caaab63070456fc3e40228 100644 (file)
@@ -107,6 +107,14 @@ class WXDLLEXPORT wxApp: public wxEvtHandler
   // Creates a log object
   virtual wxLog* CreateLogTarget();
 
   // Creates a log object
   virtual wxLog* CreateLogTarget();
 
+// Motif implementation.
+
+  // Processes an X event.
+  virtual void ProcessXEvent(WXEvent* event);
+
+  // Returns TRUE if an accelerator has been processed
+  virtual bool CheckForAccelerator(WXEvent* event);
+
 public:
   // Will always be set to the appropriate, main-style values.
   int                   argc;
 public:
   // Will always be set to the appropriate, main-style values.
   int                   argc;
index 0948077c71b93e0551f3dfe426ec34d931059e19..d0ccd9e8840bf2a0bd1859d4d7fe60c14a919b6c 100644 (file)
@@ -28,6 +28,7 @@ class WXDLLEXPORT wxComboBox: public wxChoice
 
  public:
   inline wxComboBox() {}
 
  public:
   inline wxComboBox() {}
+  ~wxComboBox();
 
   inline wxComboBox(wxWindow *parent, wxWindowID id,
            const wxString& value = wxEmptyString,
 
   inline wxComboBox(wxWindow *parent, wxWindowID id,
            const wxString& value = wxEmptyString,
@@ -50,8 +51,20 @@ class WXDLLEXPORT wxComboBox: public wxChoice
            const wxValidator& validator = wxDefaultValidator,
            const wxString& name = wxComboBoxNameStr);
 
            const wxValidator& validator = wxDefaultValidator,
            const wxString& name = wxComboBoxNameStr);
 
-  // List functions: see wxChoice
-  
+  virtual void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
+
+  // List functions
+  virtual void Append(const wxString& item);
+  virtual void Delete(int n);
+  virtual void Clear();
+  virtual int GetSelection() const ;
+  virtual void SetSelection(int n);
+  virtual int FindString(const wxString& s) const;
+  virtual wxString GetString(int n) const ;
+  virtual wxString GetStringSelection() const ;
+  virtual bool SetStringSelection(const wxString& sel);
+  virtual inline int Number() const { return m_noStrings; }
+
   // Text field functions
   virtual wxString GetValue() const ;
   virtual void SetValue(const wxString& value);
   // Text field functions
   virtual wxString GetValue() const ;
   virtual void SetValue(const wxString& value);
@@ -66,10 +79,6 @@ class WXDLLEXPORT wxComboBox: public wxChoice
   virtual long GetLastPosition() const ;
   virtual void Replace(long from, long to, const wxString& value);
   virtual void Remove(long from, long to);
   virtual long GetLastPosition() const ;
   virtual void Replace(long from, long to, const wxString& value);
   virtual void Remove(long from, long to);
-  virtual void SetSelection(int n)
-  {
-    wxChoice::SetSelection(n);
-  }
   virtual void SetSelection(long from, long to);
   virtual void SetEditable(bool editable);
 
   virtual void SetSelection(long from, long to);
   virtual void SetEditable(bool editable);
 
@@ -77,6 +86,8 @@ class WXDLLEXPORT wxComboBox: public wxChoice
   virtual void ChangeFont(bool keepOriginalSize = TRUE);
   virtual void ChangeBackgroundColour();
   virtual void ChangeForegroundColour();
   virtual void ChangeFont(bool keepOriginalSize = TRUE);
   virtual void ChangeBackgroundColour();
   virtual void ChangeForegroundColour();
+  WXWidget GetTopWidget() const { return m_mainWidget; }
+  WXWidget GetMainWidget() const { return m_mainWidget; }
 };
 
 #endif
 };
 
 #endif
index 63bc35f17dca54234ae5b6f3ae0214a8624c8377..e7881e617ded7b2ea1a1a62f5d384c120d941d91 100644 (file)
@@ -66,7 +66,7 @@ protected:
     int m_viewSize;
     int m_objectSize;
 
     int m_viewSize;
     int m_objectSize;
 
-DECLARE_EVENT_TABLE()
+// DECLARE_EVENT_TABLE()
 };
 
 #endif
 };
 
 #endif
index 6f72b727427ad83769a46a5310ec0e71a912038a..06f9f56d99a16f82fe7d0dfb191636189d24d57b 100644 (file)
@@ -539,6 +539,20 @@ public:
   // Generates a paint event
   virtual void DoPaint();
 
   // Generates a paint event
   virtual void DoPaint();
 
+  // How to implement accelerators. If we find a key event,
+  // translate to wxWindows wxKeyEvent form. Find a widget for the window.
+  // Now find a wxWindow for the widget. If there isn't one, go up the widget hierarchy
+  // trying to find one. Once one is found, call ProcessAccelerator for the
+  // window. If it returns TRUE (processed the event), skip the X event,
+  // otherwise carry on up the wxWindows window hierarchy calling ProcessAccelerator.
+  // If all return FALSE, process the X event as normal.
+  // Eventually we can implement OnCharHook the same way, but concentrate on accelerators
+  // for now.
+  // ProcessAccelerator must look at the current accelerator table, and try to find
+  // what menu id or window (beneath it) has this ID. Then construct an appropriate command
+  // event and send it.
+  virtual bool ProcessAccelerator(wxKeyEvent& event);
+
   ////////////////////////////////////////////////////////////////////////
   //// PROTECTED DATA
 protected:
   ////////////////////////////////////////////////////////////////////////
   //// PROTECTED DATA
 protected:
index 10e43ef5e879c064b9eb7227a0e7a7d252b75236..ec397374835d2a01e44a58b6de0028662215963b 100644 (file)
@@ -31,7 +31,7 @@ class WXDLLEXPORT wxAcceleratorTable;
 #define wxACCEL_SHIFT   0x04
 
  // Hold no key down
 #define wxACCEL_SHIFT   0x04
 
  // Hold no key down
-#define wxACCEL_NONE    0x00
+#define wxACCEL_NORMAL  0x00
 
 class WXDLLEXPORT wxAcceleratorEntry
 {
 
 class WXDLLEXPORT wxAcceleratorEntry
 {
index 86895e561c60f2890ebdd77ba9d1cd6e9f9f8ca5..07054af74e7bbd327c86a1bb7e00823299003930 100644 (file)
@@ -50,7 +50,17 @@ class WXDLLEXPORT wxComboBox: public wxChoice
            const wxValidator& validator = wxDefaultValidator,
            const wxString& name = wxComboBoxNameStr);
 
            const wxValidator& validator = wxDefaultValidator,
            const wxString& name = wxComboBoxNameStr);
 
-  // List functions: see wxChoice
+  // List functions
+  virtual void Append(const wxString& item);
+  virtual void Delete(int n);
+  virtual void Clear();
+  virtual int GetSelection() const ;
+  virtual void SetSelection(int n);
+  virtual int FindString(const wxString& s) const;
+  virtual wxString GetString(int n) const ;
+  virtual wxString GetStringSelection() const ;
+  virtual bool SetStringSelection(const wxString& sel);
+  virtual inline int Number() const { return m_noStrings; }
   
   // Text field functions
   virtual wxString GetValue() const ;
   
   // Text field functions
   virtual wxString GetValue() const ;
@@ -66,10 +76,6 @@ class WXDLLEXPORT wxComboBox: public wxChoice
   virtual long GetLastPosition() const ;
   virtual void Replace(long from, long to, const wxString& value);
   virtual void Remove(long from, long to);
   virtual long GetLastPosition() const ;
   virtual void Replace(long from, long to, const wxString& value);
   virtual void Remove(long from, long to);
-  virtual void SetSelection(int n)
-  {
-    wxChoice::SetSelection(n);
-  }
   virtual void SetSelection(long from, long to);
   virtual void SetEditable(bool editable);
 };
   virtual void SetSelection(long from, long to);
   virtual void SetEditable(bool editable);
 };
index 4b639f1e51ef29cbed4cddcd4eee7d6bdbcbdda1..24554d313377b720eb820d0d6dfd5709f2027405 100644 (file)
 IMPLEMENT_DYNAMIC_CLASS(wxGenericGrid, wxPanel)
 
 BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel)
 IMPLEMENT_DYNAMIC_CLASS(wxGenericGrid, wxPanel)
 
 BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel)
-       EVT_SIZE(wxGenericGrid::OnSize)
-       EVT_PAINT(wxGenericGrid::OnPaint)
-       EVT_ERASE_BACKGROUND(wxGenericGrid::OnEraseBackground)
-       EVT_MOUSE_EVENTS(wxGenericGrid::OnMouseEvent)
+    EVT_SIZE(wxGenericGrid::OnSize)
+    EVT_PAINT(wxGenericGrid::OnPaint)
+    EVT_ERASE_BACKGROUND(wxGenericGrid::OnEraseBackground)
+    EVT_MOUSE_EVENTS(wxGenericGrid::OnMouseEvent)
     EVT_TEXT(wxGRID_TEXT_CTRL, wxGenericGrid::OnText)
     EVT_COMMAND_SCROLL(wxGRID_HSCROLL, wxGenericGrid::OnGridScroll)
     EVT_COMMAND_SCROLL(wxGRID_VSCROLL, wxGenericGrid::OnGridScroll)
     EVT_TEXT(wxGRID_TEXT_CTRL, wxGenericGrid::OnText)
     EVT_COMMAND_SCROLL(wxGRID_HSCROLL, wxGenericGrid::OnGridScroll)
     EVT_COMMAND_SCROLL(wxGRID_VSCROLL, wxGenericGrid::OnGridScroll)
@@ -898,15 +898,6 @@ void wxGenericGrid::AdjustScrollbars(void)
   int cw, ch;
   GetClientSize(&cw, &ch);
   
   int cw, ch;
   GetClientSize(&cw, &ch);
   
-  // To calculate the number of steps for each scrollbar,
-  // we need to see how much will fit onto the canvas
-  // at the present size. So:
-  // 1) Find the *last* row r1 such that when it's at the top of the
-  //    window, all the remaining rows are visible.
-  // 2) There should therefore be r1 - 1 steps in the scrollbar.
-  // Similarly with columns.
-
-  // IGNORE THE ABOVE, it's crap.
   // We find the view size by seeing how many rows/cols fit on
   // the current view.
   // BUT... this means that the scrollbar should be adjusted every time
   // We find the view size by seeing how many rows/cols fit on
   // the current view.
   // BUT... this means that the scrollbar should be adjusted every time
@@ -933,10 +924,6 @@ void wxGenericGrid::AdjustScrollbars(void)
   {
     noHorizSteps = 0;
     int widthCount = 0;
   {
     noHorizSteps = 0;
     int widthCount = 0;
-/*
-    if (GetLabelSize(wxVERTICAL) > 0)
-      noHorizSteps ++;
-*/
 
     int i;
        int nx = 0;
 
     int i;
        int nx = 0;
@@ -960,10 +947,6 @@ void wxGenericGrid::AdjustScrollbars(void)
   {
     noVertSteps = 0;
     int heightCount = 0;
   {
     noVertSteps = 0;
     int heightCount = 0;
-/*
-    if (GetLabelSize(wxHORIZONTAL) > 0)
-      noVertSteps ++;
-*/
 
     int i;
        int ny = 0;
 
     int i;
        int ny = 0;
@@ -989,20 +972,20 @@ void wxGenericGrid::AdjustScrollbars(void)
   }
   else
   {
   }
   else
   {
-       if ( m_hScrollBar )
-       m_hScrollBar->Show(TRUE);
+      if ( m_hScrollBar )
+          m_hScrollBar->Show(TRUE);
   }
 
   if (m_totalGridHeight + horizScrollBarHeight <= ch)
   {
   }
 
   if (m_totalGridHeight + horizScrollBarHeight <= ch)
   {
-       if ( m_vScrollBar )
-       m_vScrollBar->Show(FALSE);
-    SetScrollPosY(0);
+      if ( m_vScrollBar )
+          m_vScrollBar->Show(FALSE);
+      SetScrollPosY(0);
   }
   else
   {
   }
   else
   {
-       if ( m_vScrollBar )
-       m_vScrollBar->Show(TRUE);
+      if ( m_vScrollBar )
+          m_vScrollBar->Show(TRUE);
   }
 
   UpdateDimensions(); // Necessary in case m_scrollPosX/Y changed
   }
 
   UpdateDimensions(); // Necessary in case m_scrollPosX/Y changed
@@ -1017,12 +1000,7 @@ void wxGenericGrid::AdjustScrollbars(void)
   if (m_hScrollBar)
   {
     int nCols = GetCols();
   if (m_hScrollBar)
   {
     int nCols = GetCols();
-/*
-    m_hScrollBar->SetPageSize(wxMax(noHorizSteps, 1));
-    m_hScrollBar->SetViewLength(wxMax(noHorizSteps, 1));
-    m_hScrollBar->SetObjectLength(nCols);
-*/
-    m_hScrollBar->SetScrollbar(m_hScrollBar->GetPosition(), wxMax(noHorizSteps, 1), nCols, wxMax(noHorizSteps, 1));
+    m_hScrollBar->SetScrollbar(m_hScrollBar->GetPosition(), wxMax(noHorizSteps, 1), (noHorizSteps == 0) ? 1 : nCols, wxMax(noHorizSteps, 1));
 
     m_hScrollBar->SetSize(m_leftOfSheet, ch - m_scrollWidth -2,
       cw - vertScrollBarWidth - m_leftOfSheet, m_scrollWidth);
 
     m_hScrollBar->SetSize(m_leftOfSheet, ch - m_scrollWidth -2,
       cw - vertScrollBarWidth - m_leftOfSheet, m_scrollWidth);
@@ -1031,13 +1009,8 @@ void wxGenericGrid::AdjustScrollbars(void)
   if (m_vScrollBar)
   {
     int nRows = GetRows();
   if (m_vScrollBar)
   {
     int nRows = GetRows();
-/*
-    m_vScrollBar->SetPageSize(wxMax(noVertSteps, 1));
-    m_vScrollBar->SetViewLength(wxMax(noVertSteps, 1));
-    m_vScrollBar->SetObjectLength(nRows);
-*/
 
 
-    m_vScrollBar->SetScrollbar(m_vScrollBar->GetPosition(), wxMax(noVertSteps, 1), nRows, wxMax(noVertSteps, 1));
+    m_vScrollBar->SetScrollbar(m_vScrollBar->GetPosition(), wxMax(noVertSteps, 1), (noVertSteps == 0) ? 1 : nRows, wxMax(noVertSteps, 1));
     m_vScrollBar->SetSize(cw - m_scrollWidth, m_topOfSheet,
        m_scrollWidth, ch - m_topOfSheet - horizScrollBarHeight);
   }
     m_vScrollBar->SetSize(cw - m_scrollWidth, m_topOfSheet,
        m_scrollWidth, ch - m_topOfSheet - horizScrollBarHeight);
   }
@@ -2444,6 +2417,7 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
   }
 
   win->UpdateDimensions();
   }
 
   win->UpdateDimensions();
+
   win->SetCurrentRect(win->GetCursorRow(), win->GetCursorColumn());
 
   // Because rows and columns can be arbitrary sizes,
   win->SetCurrentRect(win->GetCursorRow(), win->GetCursorColumn());
 
   // Because rows and columns can be arbitrary sizes,
index 463102260b288ccb1962b9a7c582c04d851d1fc3..ca8624f3e7089e4343ad479c612b53f659706e69 100644 (file)
@@ -16,6 +16,8 @@
 #include "wx/setup.h"
 #include "wx/accel.h"
 #include "wx/string.h"
 #include "wx/setup.h"
 #include "wx/accel.h"
 #include "wx/string.h"
+#include "wx/utils.h"
+#include <ctype.h>
 
 #if !USE_SHARED_LIBRARIES
 IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject)
 
 #if !USE_SHARED_LIBRARIES
 IMPLEMENT_DYNAMIC_CLASS(wxAcceleratorTable, wxObject)
@@ -28,66 +30,89 @@ public:
     wxAcceleratorRefData();
     ~wxAcceleratorRefData();
 
     wxAcceleratorRefData();
     ~wxAcceleratorRefData();
 
-/* TODO: implementation
-    inline HACCEL GetHACCEL() const { return m_hAccel; }
-protected:
-    HACCEL      m_hAccel;
-*/
+public:
+    int m_count;
+    wxAcceleratorEntry* m_entries;
 };
 
 #define M_ACCELDATA ((wxAcceleratorRefData *)m_refData)
 
 wxAcceleratorRefData::wxAcceleratorRefData()
 {
 };
 
 #define M_ACCELDATA ((wxAcceleratorRefData *)m_refData)
 
 wxAcceleratorRefData::wxAcceleratorRefData()
 {
-    // TODO
-/*
-    HACCEL      m_hAccel;
-*/
+    m_count = 0;
+    m_entries = (wxAcceleratorEntry*) NULL;
 }
 
 wxAcceleratorRefData::~wxAcceleratorRefData()
 {
 }
 
 wxAcceleratorRefData::~wxAcceleratorRefData()
 {
-/*
-  if (m_hAccel)
-  {
-    DestroyAcceleratorTable((HACCEL) m_hAccel);
-  }
-  m_hAccel = 0 ;
-*/
+    delete[] m_entries;
+    m_entries = (wxAcceleratorEntry*) NULL;
+    m_count = 0;
 }
 
 wxAcceleratorTable::wxAcceleratorTable()
 {
 }
 
 wxAcceleratorTable::wxAcceleratorTable()
 {
-  m_refData = NULL;
+    m_refData = (wxAcceleratorRefData*) NULL;
 }
 
 wxAcceleratorTable::~wxAcceleratorTable()
 {
 }
 
 wxAcceleratorTable::~wxAcceleratorTable()
 {
+    // Data deleted in ~wxObject
 }
 
 // Load from .rc resource
 wxAcceleratorTable::wxAcceleratorTable(const wxString& resource)
 {
     m_refData = new wxAcceleratorRefData;
 }
 
 // Load from .rc resource
 wxAcceleratorTable::wxAcceleratorTable(const wxString& resource)
 {
     m_refData = new wxAcceleratorRefData;
-
-/* TODO: load acelerator from resource, if appropriate for your platform
-    M_ACCELDATA->m_hAccel = hAccel;
-    M_ACCELDATA->m_ok = (hAccel != 0);
-*/
 }
 
 // Create from an array
 wxAcceleratorTable::wxAcceleratorTable(int n, wxAcceleratorEntry entries[])
 {
 }
 
 // Create from an array
 wxAcceleratorTable::wxAcceleratorTable(int n, wxAcceleratorEntry entries[])
 {
-    m_refData = new wxAcceleratorRefData;
+    wxAcceleratorRefData* data = new wxAcceleratorRefData;
+    m_refData = data;
+
+    data->m_count = n;
+    data->m_entries = new wxAcceleratorEntry[n];
+    int i;
+    for (i = 0; i < n; i++)
+        data->m_entries[i] = entries[i];
 
 
-/* TODO: create table from entries
- */
 }
 
 bool wxAcceleratorTable::Ok() const
 {
 }
 
 bool wxAcceleratorTable::Ok() const
 {
-    // TODO
-    return FALSE;
+    return (m_refData != (wxAcceleratorRefData*) NULL);
+}
+
+int wxAcceleratorTable::GetCount() const
+{
+    return M_ACCELDATA->m_count;
+}
+
+wxAcceleratorEntry* wxAcceleratorTable::GetEntries() const
+{
+    return M_ACCELDATA->m_entries;
+}
+
+// Implementation use only
+bool wxAcceleratorEntry::MatchesEvent(const wxKeyEvent& event) const
+{
+    bool eventAltDown = event.AltDown();
+    bool eventCtrlDown = event.ControlDown();
+    bool eventShiftDown = event.ShiftDown();
+    int  eventKeyCode = event.KeyCode();
+
+    bool accAltDown = ((GetFlags() & wxACCEL_ALT) == wxACCEL_ALT);
+    bool accCtrlDown = ((GetFlags() & wxACCEL_CTRL) == wxACCEL_CTRL);
+    bool accShiftDown = ((GetFlags() & wxACCEL_SHIFT) == wxACCEL_SHIFT);
+    int  accKeyCode = GetKeyCode();
+    int  accKeyCode2 = GetKeyCode();
+    if (isascii(accKeyCode2))
+      accKeyCode2 = wxToLower(accKeyCode2);
+
+    return ((eventAltDown == accAltDown) && (eventCtrlDown == accCtrlDown) &&
+            (eventShiftDown == accShiftDown) &&
+              ((eventKeyCode == accKeyCode || eventKeyCode == accKeyCode2))) ;
 }
 
 }
 
index bd0acfb2d8b88833a83beba83b11cae00c139a4e..8c006f4e9a97a6bb9f72bb9227ebe739482a6ea5 100644 (file)
@@ -281,34 +281,53 @@ int wxApp::MainLoop()
     while (m_keepGoing)
     {
       XtAppNextEvent( (XtAppContext) wxTheApp->GetAppContext(), &event);
     while (m_keepGoing)
     {
       XtAppNextEvent( (XtAppContext) wxTheApp->GetAppContext(), &event);
-      if(event.type == PropertyNotify)
-      {
-        HandlePropertyChange((WXEvent*) &event);
-      } else
-      {
-        // Terry Gitnick <terryg@scientech.com> - 1/21/98
-         /* if resize event, don't resize until the last resize event for this
-            window is recieved. Prevents flicker as windows are resized. */
-        if (event.type == ResizeRequest)
-        {
-           Display *disp = XtDisplay((Widget) wxTheApp->GetTopLevelWidget());
-           Window win = event.xany.window;
-           XEvent report;
+
+      ProcessXEvent((WXEvent*) & event);
+      ProcessIdle();
+    }
+
+    return 0;
+}
+
+// Processes an X event.
+void wxApp::ProcessXEvent(WXEvent* _event)
+{
+    XEvent* event = (XEvent*) _event;
+
+    if (CheckForAccelerator(_event))
+    {
+        // Do nothing! We intercepted and processed the event as an accelerator.
+        return;
+    }
+    else if (event->type == PropertyNotify)
+    {
+        HandlePropertyChange(_event);
+        return;
+    }
+    else if (event->type == ResizeRequest)
+    {
+        /* Terry Gitnick <terryg@scientech.com> - 1/21/98
+         * If resize event, don't resize until the last resize event for this
+         * window is recieved. Prevents flicker as windows are resized.
+         */
+
+        Display *disp = XtDisplay((Widget) wxTheApp->GetTopLevelWidget());
+        Window win = event->xany.window;
+        XEvent report;
  
  
-           //  to avoid flicker
-           report = event;
-           while( XCheckTypedWindowEvent (disp, win, ResizeRequest, &report));
-        }
+        //  to avoid flicker
+        report = * event;
+        while( XCheckTypedWindowEvent (disp, win, ResizeRequest, &report));
+
         // TODO: when implementing refresh optimization, we can use
         // XtAddExposureToRegion to expand the window's paint region.
 
         // TODO: when implementing refresh optimization, we can use
         // XtAddExposureToRegion to expand the window's paint region.
 
-        XtDispatchEvent(&event);
-
-       ProcessIdle();
-      }
+        XtDispatchEvent(event);
+    }
+    else
+    {
+        XtDispatchEvent(event);
     }
     }
-
-    return 0;
 }
 
 // Returns TRUE if more time is needed.
 }
 
 // Returns TRUE if more time is needed.
@@ -330,13 +349,20 @@ void wxApp::ExitMainLoop()
 bool wxApp::Pending()
 {
     XFlush(XtDisplay( (Widget) wxTheApp->GetTopLevelWidget() ));
 bool wxApp::Pending()
 {
     XFlush(XtDisplay( (Widget) wxTheApp->GetTopLevelWidget() ));
-    return (XtAppPending( (XtAppContext) wxTheApp->GetAppContext() ) != 0) ;
+
+    // Fix by Doug from STI, to prevent a stall if non-X event
+    // is found.
+    return ((XtAppPending( (XtAppContext) GetAppContext() ) & XtIMXEvent) != 0) ;
 }
 
 // Dispatch a message.
 void wxApp::Dispatch()
 {
 }
 
 // Dispatch a message.
 void wxApp::Dispatch()
 {
-    XtAppProcessEvent( (XtAppContext) wxTheApp->GetAppContext(), XtIMAll);
+//    XtAppProcessEvent( (XtAppContext) wxTheApp->GetAppContext(), XtIMAll);
+
+    XEvent event;
+    XtAppNextEvent((XtAppContext) GetAppContext(), &event);
+    ProcessXEvent((WXEvent*) & event);
 }
 
 // This should be redefined in a derived class for
 }
 
 // This should be redefined in a derived class for
@@ -496,6 +522,41 @@ WXColormap wxApp::GetMainColormap(WXDisplay* display)
     return (WXColormap) c;
 }
 
     return (WXColormap) c;
 }
 
+// Returns TRUE if an accelerator has been processed
+bool wxApp::CheckForAccelerator(WXEvent* event)
+{
+    XEvent* xEvent = (XEvent*) event;
+    if (xEvent->xany.type == KeyPress)
+    {
+        // Find a wxWindow for this window
+        // TODO: should get display for the window, not the current display
+        Widget widget = XtWindowToWidget((Display*) wxGetDisplay(), xEvent->xany.window);
+        wxWindow* win = NULL;
+
+        // Find the first wxWindow that corresponds to this event window
+        while (widget && !(win = wxGetWindowFromTable(widget)))
+            widget = XtParent(widget);
+
+        if (!widget || !win)
+            return FALSE;
+
+        wxKeyEvent keyEvent(wxEVT_CHAR);
+        wxTranslateKeyEvent(keyEvent, win, (Widget) 0, xEvent);
+
+        // Now we have a wxKeyEvent and we have a wxWindow.
+        // Go up the hierarchy until we find a matching accelerator,
+        // or we get to the top.
+        while (win)
+        {
+            if (win->ProcessAccelerator(keyEvent))
+                return TRUE;
+            win = win->GetParent();
+        }
+        return FALSE;
+    }
+    return FALSE;
+}
+
 void wxExit()
 {
     int retValue = 0;
 void wxExit()
 {
     int retValue = 0;
index a70bef64bfe99e52e998b66fb369956c491dff02..566dc1ea491b55f2d7723c78464c3bb728e22d0b 100644 (file)
@@ -145,14 +145,17 @@ wxChoice::~wxChoice()
     if (m_widgetList)
         delete[] m_widgetList;
 
     if (m_widgetList)
         delete[] m_widgetList;
 
-    DetachWidget(GetMainWidget()); // Removes event handlers
+    if (GetMainWidget())
+    {
+        DetachWidget(GetMainWidget()); // Removes event handlers
 
 
-    XtDestroyWidget((Widget) m_formWidget);
-    m_formWidget = (WXWidget) 0;
+        XtDestroyWidget((Widget) m_formWidget);
+        m_formWidget = (WXWidget) 0;
 
 
-    // Presumably the other widgets have been deleted now, via the form
-    m_mainWidget = (WXWidget) 0;
-    m_buttonWidget = (WXWidget) 0;
+        // Presumably the other widgets have been deleted now, via the form
+        m_mainWidget = (WXWidget) 0;
+        m_buttonWidget = (WXWidget) 0;
+    }
 }
 
 void wxChoice::Append(const wxString& item)
 }
 
 void wxChoice::Append(const wxString& item)
index 8361a2b1023975b3729ac728efb7ec1dccb96eac..4537779eb6f7dd173508ac3c03b81a76c0cda144 100644 (file)
@@ -94,6 +94,19 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
     return TRUE;
 }
 
     return TRUE;
 }
 
+wxComboBox::~wxComboBox()
+{
+    DetachWidget((Widget) m_mainWidget); // Removes event handlers
+    XtDestroyWidget((Widget) m_mainWidget);
+    m_mainWidget = (WXWidget) 0;
+}
+
+void wxComboBox::SetSize(int x, int y, int width, int height, int sizeFlags)
+{
+    // Necessary so it doesn't call wxChoice::SetSize
+    wxWindow::SetSize(x, y, width, height, sizeFlags);
+}
+
 wxString wxComboBox::GetValue() const
 {
     char *s = XmComboBoxGetString ((Widget) m_mainWidget);
 wxString wxComboBox::GetValue() const
 {
     char *s = XmComboBoxGetString ((Widget) m_mainWidget);
@@ -115,6 +128,97 @@ void wxComboBox::SetValue(const wxString& value)
     m_inSetValue = FALSE;
 }
 
     m_inSetValue = FALSE;
 }
 
+void wxComboBox::Append(const wxString& item)
+{
+    XmString str = XmStringCreateLtoR((char*) (const char*) item, XmSTRING_DEFAULT_CHARSET);
+    XmComboBoxAddItem((Widget) m_mainWidget, str, 0);
+    m_stringList.Add(item);
+    XmStringFree(str);
+    m_noStrings ++;
+}
+
+void wxComboBox::Delete(int n)
+{
+    XmComboBoxDeletePos((Widget) m_mainWidget, n-1);
+    wxNode *node = m_stringList.Nth(n);
+    if (node)
+    {
+      delete[] (char *)node->Data();
+      delete node;
+    }
+    m_noStrings--;
+}
+
+void wxComboBox::Clear()
+{
+    XmComboBoxDeleteAllItems((Widget) m_mainWidget);
+    m_stringList.Clear();
+}
+
+void wxComboBox::SetSelection (int n)
+{
+    XmComboBoxSelectPos((Widget) m_mainWidget, n+1, False);
+}
+
+int wxComboBox::GetSelection (void) const
+{
+  int sel = XmComboBoxGetSelectedPos((Widget) m_mainWidget);
+  if (sel == 0)
+    return -1;
+  else
+    return sel - 1;
+}
+
+wxString wxComboBox::GetString(int n) const
+{
+    wxNode *node = m_stringList.Nth (n);
+    if (node)
+      return wxString((char *) node->Data ());
+    else
+      return wxEmptyString;
+}
+
+wxString wxComboBox::GetStringSelection() const
+{
+    int sel = GetSelection();
+    if (sel == -1)
+        return wxEmptyString;
+    else
+        return GetString(sel);
+}
+
+bool wxComboBox::SetStringSelection(const wxString& sel)
+{
+    int n = FindString(sel);
+    if (n == -1)
+        return FALSE;
+    else
+    {
+        SetSelection(n);
+        return TRUE;
+    }
+}
+
+int wxComboBox::FindString(const wxString& s) const
+{
+  int *pos_list = NULL;
+  int count = 0;
+  XmString text = XmStringCreateSimple ((char*) (const char*) s);
+  bool found = (XmComboBoxGetMatchPos((Widget) m_mainWidget,
+   text, &pos_list, &count) != 0);
+
+  XmStringFree(text);
+
+  if (found && count > 0)
+  {
+    int pos = pos_list[0] - 1;
+    free(pos_list);
+    return pos;
+  }
+
+  return -1;
+}
+
 // Clipboard operations
 void wxComboBox::Copy()
 {
 // Clipboard operations
 void wxComboBox::Copy()
 {
index 4afc7bf1c0966e5dbbd11d313b62011ac62b34aa..b76fe887a8f6c4d5f205118be5a83a26476833f6 100644 (file)
@@ -480,7 +480,10 @@ int wxDialog::ShowModal()
     // Loop until we signal that the dialog should be closed
     while ((wxModalShowingStack.Number() > 0) && (bool)wxModalShowingStack.First()->Data())
     {
     // Loop until we signal that the dialog should be closed
     while ((wxModalShowingStack.Number() > 0) && (bool)wxModalShowingStack.First()->Data())
     {
-        XtAppProcessEvent((XtAppContext) wxTheApp->GetAppContext(), XtIMAll);
+//        XtAppProcessEvent((XtAppContext) wxTheApp->GetAppContext(), XtIMAll);
+
+        XtAppNextEvent((XtAppContext) wxTheApp->GetAppContext(), &event);
+        wxTheApp->ProcessXEvent((WXEvent*) &event);
     }
 
     // Remove modal dialog flag from stack
     }
 
     // Remove modal dialog flag from stack
@@ -494,7 +497,8 @@ int wxDialog::ShowModal()
     {
         XFlush(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()));
         XtAppNextEvent((XtAppContext) wxTheApp->GetAppContext(), &event);
     {
         XFlush(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()));
         XtAppNextEvent((XtAppContext) wxTheApp->GetAppContext(), &event);
-        XtDispatchEvent(&event);
+
+        wxTheApp->ProcessXEvent((WXEvent*) &event);
     }
 
     // TODO: is it safe to call this, if the dialog may have been deleted
     }
 
     // TODO: is it safe to call this, if the dialog may have been deleted
index a3b895fc1aa8dfafd9ad4d4ddfd6db965d7f492c..7f9e45a4a0406e1cbed81cf346ea27340347a284 100644 (file)
@@ -375,6 +375,9 @@ void _XsMotifCorner::_expose (XEvent*)
 {
    Dimension   w, h;
 
 {
    Dimension   w, h;
 
+   if (_topShadowGC == 0) // JACS
+     return;
+
 // Get the size of the corner
 
    XtVaGetValues (_base, XmNwidth, &w, XmNheight, &h, NULL);
 // Get the size of the corner
 
    XtVaGetValues (_base, XmNwidth, &w, XmNheight, &h, NULL);
@@ -612,6 +615,8 @@ const char *_XsMotifSide::className ( ) const
 
 void _XsMotifSide::_expose (XEvent *event)
 {
 
 void _XsMotifSide::_expose (XEvent *event)
 {
+   if (_topShadowGC == 0) // JACS
+     return;
 
 // Clear out the window first
 
 
 // Clear out the window first
 
@@ -847,6 +852,9 @@ const char *_XsMotifButton::className ( ) const
 
 void _XsMotifButton::_expose (XEvent *event)
 {
 
 void _XsMotifButton::_expose (XEvent *event)
 {
+   if (_topShadowGC == 0) // JACS
+     return;
+
    Dimension   w, h;
 
 // Get the size of the button
    Dimension   w, h;
 
 // Get the size of the button
@@ -1152,6 +1160,8 @@ void _XsMotifTitle::_redraw ( )
 
 void _XsMotifTitle::_expose (XEvent *event)
 {
 
 void _XsMotifTitle::_expose (XEvent *event)
 {
+   if (_topShadowGC == 0) // JACS
+     return;
 
 // Clear out the window first
 
 
 // Clear out the window first
 
@@ -1646,6 +1656,9 @@ void _XsMotifIcon::_input (XEvent *event)
 
 void _XsMotifIcon::_expose (XEvent *)
 {
 
 void _XsMotifIcon::_expose (XEvent *)
 {
+   if (_topShadowGC == 0) // JACS
+     return;
+
    Dimension   iconHeight;
    Dimension   iconWidth;
 
    Dimension   iconHeight;
    Dimension   iconWidth;
 
index 0f19d1e20f6e001310bebdba468c64238dd7a41c..52ef32cc554021ffec4bc62730d65d956568bd37 100644 (file)
@@ -22,7 +22,7 @@
 
 #include <wx/motif/private.h>
 
 
 #include <wx/motif/private.h>
 
-void wxScrollBarCallback(Widget widget, XtPointer clientData,
+static void wxScrollBarCallback(Widget widget, XtPointer clientData,
                         XmScaleCallbackStruct *cbs);
 
 #if !USE_SHARED_LIBRARY
                         XmScaleCallbackStruct *cbs);
 
 #if !USE_SHARED_LIBRARY
@@ -167,7 +167,7 @@ void wxScrollBar::ChangeForegroundColour()
     // TODO
 }
 
     // TODO
 }
 
-void wxScrollBarCallback(Widget widget, XtPointer clientData,
+static void wxScrollBarCallback(Widget widget, XtPointer clientData,
                         XmScaleCallbackStruct *cbs)
 {
     wxScrollBar *scrollBar = (wxScrollBar *)clientData;
                         XmScaleCallbackStruct *cbs)
 {
     wxScrollBar *scrollBar = (wxScrollBar *)clientData;
index 3d7c94d2e4f17c380391758d8849c032d7e2863e..b28bdf9ef51fa28190c64ecb75098d4434ba6ab1 100644 (file)
@@ -181,7 +181,9 @@ wxString wxTextCtrl::GetValue() const
 
 void wxTextCtrl::SetValue(const wxString& value)
 {
 
 void wxTextCtrl::SetValue(const wxString& value)
 {
-    wxASSERT_MSG( (!value.IsNull()), "Must not pass a null string to wxTextCtrl::SetValue." ) ;
+  // This assert is wrong -- means that you can't set an empty
+  // string (IsNull == IsEmpty).
+  //    wxASSERT_MSG( (!value.IsNull()), "Must not pass a null string to wxTextCtrl::SetValue." ) ;
     m_inSetValue = TRUE;
 
     XmTextSetString ((Widget) m_mainWidget, (char*) (const char*) value);
     m_inSetValue = TRUE;
 
     XmTextSetString ((Widget) m_mainWidget, (char*) (const char*) value);
index dad35a5234344fd5b9fe71a96e0414ba633e24ec..dc47a226d6a8d78db4a1020e03e8cd4188417782 100644 (file)
@@ -52,7 +52,7 @@ void wxCanvasRepaintProc (Widget, XtPointer, XmDrawingAreaCallbackStruct * cbs);
 void wxCanvasInputEvent (Widget drawingArea, XtPointer data, XmDrawingAreaCallbackStruct * cbs);
 void wxCanvasMotionEvent (Widget, XButtonEvent * event);
 void wxCanvasEnterLeave (Widget drawingArea, XtPointer clientData, XCrossingEvent * event);
 void wxCanvasInputEvent (Widget drawingArea, XtPointer data, XmDrawingAreaCallbackStruct * cbs);
 void wxCanvasMotionEvent (Widget, XButtonEvent * event);
 void wxCanvasEnterLeave (Widget drawingArea, XtPointer clientData, XCrossingEvent * event);
-void wxScrollBarCallback(Widget widget, XtPointer clientData,
+static void wxScrollBarCallback(Widget widget, XtPointer clientData,
                         XmScaleCallbackStruct *cbs);
 void wxPanelItemEventHandler (Widget    wid,
                               XtPointer client_data,
                         XmScaleCallbackStruct *cbs);
 void wxPanelItemEventHandler (Widget    wid,
                               XtPointer client_data,
@@ -2735,7 +2735,7 @@ void wxPanelItemEventHandler (Widget    wid,
   *continueToDispatch = True;
 }
 
   *continueToDispatch = True;
 }
 
-void wxScrollBarCallback(Widget scrollbar, XtPointer clientData,
+static void wxScrollBarCallback(Widget scrollbar, XtPointer clientData,
                         XmScaleCallbackStruct *cbs)
 {
     Widget scrolledWindow = XtParent (scrollbar);
                         XmScaleCallbackStruct *cbs)
 {
     Widget scrolledWindow = XtParent (scrollbar);
@@ -3111,3 +3111,72 @@ void wxWindow::ClearUpdateRects()
     }
     m_updateRects.Clear();
 }
     }
     m_updateRects.Clear();
 }
+
+bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
+{
+    if (!m_acceleratorTable.Ok())
+        return FALSE;
+
+    int count = m_acceleratorTable.GetCount();
+    wxAcceleratorEntry* entries = m_acceleratorTable.GetEntries();
+    int i;
+    for (i = 0; i < count; i++)
+    {
+        wxAcceleratorEntry* entry = & (entries[i]);
+        if (entry->MatchesEvent(event))
+        {
+            // Bingo, we have a match. Now find a control
+            // that matches the entry command id.
+
+            // Need to go up to the top of the window hierarchy,
+            // since it might be e.g. a menu item
+            wxWindow* parent = this;
+            while (parent && !parent->IsKindOf(CLASSINFO(wxFrame)) && !parent->IsKindOf(CLASSINFO(wxDialog)))
+                parent = parent->GetParent();
+
+            if (!parent)
+                return FALSE;
+
+            if (parent->IsKindOf(CLASSINFO(wxFrame)))
+            {
+                // Try for a menu command
+                wxFrame* frame = (wxFrame*) parent;
+                if (frame->GetMenuBar())
+                {
+                    wxMenuItem* item = frame->GetMenuBar()->FindItemForId(entry->GetCommand());
+                    if (item)
+                    {
+                        wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, entry->GetCommand());
+                        commandEvent.SetEventObject(frame);
+
+                        // If ProcessEvent returns TRUE (it was handled), then
+                        // the calling code will skip the event handling.
+                        return frame->GetEventHandler()->ProcessEvent(commandEvent);
+                    }
+                }
+            }
+
+            // Find a child matching the command id
+            wxWindow* child = parent->FindWindow(entry->GetCommand());
+
+            // No such child
+            if (!child)
+                return FALSE;
+
+            // Now we process those kinds of windows that we can.
+            // For now, only buttons.
+            if (child->IsKindOf(CLASSINFO(wxButton)))
+            {
+                wxCommandEvent commandEvent (wxEVT_COMMAND_BUTTON_CLICKED, child->GetId());
+                commandEvent.SetEventObject(child);
+                return child->GetEventHandler()->ProcessEvent(commandEvent);
+            }
+
+            return FALSE;
+        } // matches event
+    }// for
+
+    // We didn't match the key event against an accelerator.
+    return FALSE;
+}
+
index f1bbccaeb0f0f3b0b0faec3b7ae8e815ba9f460d..0be841bad4dabe1a3db99195f50a26b7b2419441 100644 (file)
@@ -114,3 +114,52 @@ void wxComboBox::SetSelection(long from, long to)
     // TODO
 }
 
     // TODO
 }
 
+void wxComboBox::Append(const wxString& item)
+{
+    // TODO
+}
+
+void wxComboBox::Delete(int n)
+{
+    // TODO
+}
+
+void wxComboBox::Clear()
+{
+    // TODO
+}
+
+int wxComboBox::GetSelection() const
+{
+    // TODO
+    return -1;
+}
+
+void wxComboBox::SetSelection(int n)
+{
+    // TODO
+}
+
+int wxComboBox::FindString(const wxString& s) const
+{
+    // TODO
+    return -1;
+}
+
+wxString wxComboBox::GetString(int n) const
+{
+    // TODO
+    return wxString("");
+}
+
+wxString wxComboBox::GetStringSelection() const
+{
+    // TODO
+    return wxString("");
+}
+
+bool wxComboBox::SetStringSelection(const wxString& sel)
+{
+    // TODO
+    return FALSE;
+}