]> git.saurik.com Git - wxWidgets.git/commitdiff
Menu/toolbar event handling now tries the window with the focus first.
authorJulian Smart <julian@anthemion.co.uk>
Wed, 7 Apr 1999 21:33:22 +0000 (21:33 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Wed, 7 Apr 1999 21:33:22 +0000 (21:33 +0000)
wxTextCtrl processes cut, copy, paste, undo, redo commands and UI updates
automatically.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2069 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

38 files changed:
docs/latex/wx/menu.tex
docs/latex/wx/tevent.tex
docs/latex/wx/text.tex
docs/latex/wx/toolbar.tex
docs/latex/wx/ttoolbar.tex
include/wx/event.h
include/wx/gtk/frame.h
include/wx/gtk/textctrl.h
include/wx/gtk1/frame.h
include/wx/gtk1/textctrl.h
include/wx/mac/frame.h
include/wx/motif/frame.h
include/wx/motif/textctrl.h
include/wx/msw/frame.h
include/wx/msw/textctrl.h
include/wx/stubs/frame.h
include/wx/stubs/textctrl.h
src/common/event.cpp
src/common/framecmn.cpp
src/common/tbarbase.cpp
src/gtk.inc
src/gtk/frame.cpp
src/gtk/tbargtk.cpp
src/gtk/textctrl.cpp
src/gtk1/frame.cpp
src/gtk1/tbargtk.cpp
src/gtk1/textctrl.cpp
src/mac/carbon/frame.cpp
src/mac/frame.cpp
src/motif.inc
src/motif/frame.cpp
src/motif/makefile.unx
src/motif/textctrl.cpp
src/msw/frame.cpp
src/msw/makefile.vc
src/msw/textctrl.cpp
src/stubs/frame.cpp
src/stubs/textctrl.cpp

index cf8c61dcc8d285657c51ef8a6c1a8960626ba218..ebaf7fb1a4cfc03600b920b9ccc6c75b6e003667 100644 (file)
@@ -383,7 +383,15 @@ A menu bar is a series of menus accessible from the top of a frame.
 \wxheading{Event handling}
 
 To respond to a menu selection, provide a handler for EVT\_MENU, in the frame
-that contains the menu bar.
+that contains the menu bar. If you have a toolbar which uses the same identifiers
+as your EVT\_MENU entries, events from the toolbar will also be processed by your
+EVT\_MENU event handlers.
+
+Note that menu commands (and UI update events for menus) are first sent to
+the focus window within the frame. If no window within the frame has the focus,
+then the events are sent directly to the frame. This allows command and UI update
+handling to be processed by specific windows and controls, and not necessarily
+by the application frame.
 
 \wxheading{See also}
 
index 6434617135f84cf6b9b9c0954067c141b1be7e85..9ba0aee01868c481a58c1d9cab69d718794c6a71 100644 (file)
@@ -134,7 +134,9 @@ recursively applied to the parent window's event handler. If this returns TRUE,
 
 Note that your application may wish to override ProcessEvent to redirect processing of
 events. This is done in the document/view framework, for example, to allow event handlers
-to be defined in the document or view.
+to be defined in the document or view. To test for command events (which will probably
+be the only events you wish to redirect), you may use wxEvent::IsCommandEvent for
+efficiency, instead of using the slower run-time type system.
 
 As mentioned above, only command events are recursively applied to the parents event
 handler. As this quite often causes confusion for users, here is a list of system
@@ -164,7 +166,21 @@ In some cases, it might be desired by the programmer to get a certain number
 of system events in a parent window, for example all key events sent to, but not
 used by, the native controls in a dialog. In this case, a special event handler
 will have to be written that will override ProcessEvent() in order to pass
-all events (or any selection of them) to the parent window. See next section.
+all events (or any selection of them) to the parent window.
+
+\subsection{Redirection of command events to the window with the focus}
+
+The usual upward search through the window hierarchy for command event
+handlers does not always meet an application's requirements. Say you have two
+wxTextCtrl windows in a frame, plus a toolbar with Cut, Copy and Paste
+buttons. To avoid the need to define event handlers in the frame
+and redirect them explicitly to the window with the focus, command events
+are sent to the window with the focus first, for
+menu and toolbar command and UI update events only. This means that
+each window can handle its own commands and UI updates independently. In
+fact wxTextCtrl can handle Cut, Copy, Paste, Undo and Redo commands and UI update
+requests, so no extra coding is required to support them in your menus and
+toolbars.
 
 \subsection{Pluggable event handlers}
 
index 54395fae08920458349d244fc80597b2fec56cf9..d15cf7908ae5e558ef4ae055af3e4b4134416d3d 100644 (file)
@@ -52,6 +52,10 @@ wxTextCtrl header file.
 
 \wxheading{Event handling}
 
+The following commands are processed by default event handlers in wxTextCtrl: wxID\_CUT, wxID\_COPY,
+wxID\_PASTE, wxID\_UNDO, wxID\_REDO. The associated UI update events are also processed
+automatically, when the control has the focus.
+
 To process input from a text control, use these event handler macros to direct input to member
 functions that take a \helpref{wxCommandEvent}{wxcommandevent} argument.
 
index 07242ae6bf03049a7f90e56e0af20e036858dba6..e2ac77604134008c54b182586d64b86aae751955 100644 (file)
@@ -62,6 +62,13 @@ window is passed and the tool id is retrieved from the wxCommandEvent.
 This is because the id may be -1 when the mouse moves off a tool, and -1 is not
 allowed as an identifier in the event system.
 
+Note that tool commands (and UI update events for tools) are first sent to
+the focus window within the frame that contains the toolbar. If no window within the frame has the focus,
+then the events are sent directly to the toolbar (and up the hierarchy to the
+frame, depending on where the application has put its event handlers). This allows command and UI update
+handling to be processed by specific windows and controls, and not necessarily
+by the application frame.
+
 \twocolwidtha{7cm}
 \begin{twocollist}\itemsep=0pt
 \twocolitem{{\bf EVT\_TOOL(id, func)}}{Process a wxEVT\_COMMAND\_TOOL\_CLICKED event
index 2401877bca489437a5311b5384032cd66402c947..258e4c2416286fa8fe141e48fcfac313c8ba51b2 100644 (file)
@@ -13,8 +13,7 @@ Instead of supplying one toolbar class with a number
 of different implementations depending on platform, wxWindows separates
 out the classes. This is because there are a number of different toolbar
 styles that you may wish to use simultaneously, and also, future
-toolbar implementations will emerge (for example, using the
-new-style Windows `coolbar' as seen in Microsoft applications) which
+toolbar implementations will emerge which
 cannot all be shoe-horned into the one class.
 
 For each platform, the symbol {\bf wxToolBar} is defined to be one of the
@@ -26,7 +25,7 @@ The following is a summary of the toolbar classes and their differences.
 \item {\bf wxToolBarBase.} This is a base class with pure virtual functions,
 and should not be used directly.
 \item {\bf wxToolBarSimple.} A simple toolbar class written entirely with generic wxWindows
-functionality. A simply 3D effect for buttons is possible, but it is not consistent
+functionality. A simple 3D effect for buttons is possible, but it is not consistent
 with the Windows look and feel. This toolbar can scroll, and you can have arbitrary
 numbers of rows and columns.
 \item {\bf wxToolBarMSW.} This class implements an old-style Windows toolbar, only on
@@ -39,7 +38,8 @@ CreateTools must be called after the tools have been added.
 No absolute positioning is supported but you can specify the number
 of rows, and add tool separators with {\bf AddSeparator}.
 Tooltips are supported. {\bf OnRightClick} is not supported. This is the default wxToolBar
-on Windows 95, Windows NT 4 and above.
+on Windows 95, Windows NT 4 and above. With the style wxTB\_FLAT, the flat toolbar
+look is used, with a border that is highlit when the cursor moves over the buttons.
 \end{itemize}
 
 A toolbar might appear as a single row of images under
@@ -61,8 +61,6 @@ as the demo shows, before adding tools to the button bar. Don't supply more than
 one bitmap for each tool, because the toolbar generates all three images (normal,
 depressed and checked) from the single bitmap you give it.
 
-To intercept
-
 \subsection{Using the toolbar library}
 
 Include {\tt "wx/toolbar.h"}, or if using a class directly, one of:
@@ -74,7 +72,9 @@ Include {\tt "wx/toolbar.h"}, or if using a class directly, one of:
 \end{itemize}
 
 Example of toolbar use are given in the sample program ``toolbar''. The
-source is given below.
+source is given below. In fact it's out of date because recommended
+practise is to use event handlers (using EVT\_MENU or EVT\_TOOL) instead of
+overriding OnLeftClick.
 
 {\small
 \begin{verbatim}
index 24a0d2b4f1a5ae1d78fbb6ddb0875866717d7113..d06b724aa8456616af44f81a7ba29ed99ad17891 100644 (file)
@@ -1427,5 +1427,13 @@ const wxEventTableEntry theClass::sm_eventTableEntries[] = { \
 #define EVT_UPDATE_UI(id, func) \
  { wxEVT_UPDATE_UI, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxUpdateUIEventFunction) & func, (wxObject *) NULL },\
 
+/*
+ * Helper functions
+ */
+
+// Find a window with the focus, that is also a descendant of the given window.
+// This is used to determine the window to initially send commands to.
+wxWindow* wxFindFocusDescendant(wxWindow* ancestor);
+
 #endif
         // _WX_EVENTH__
index de86ad8e1a0fb8029dd60fe2516b294394e05679..490d00170f6ac8f88c0b2784cd4cabf29f30eaa5 100644 (file)
@@ -105,7 +105,7 @@ public:
     virtual void GtkOnSize( int x, int y, int width, int height );
     virtual wxPoint GetClientAreaOrigin() const;
     void DoMenuUpdates();
-    void DoMenuUpdates(wxMenu* menu);
+    void DoMenuUpdates(wxMenu* menu, wxWindow* focusWin);
     virtual void OnInternalIdle();
 
     wxMenuBar    *m_frameMenuBar;
index 2512ce42c1bc6df0bfbb298e8fbc85682216f31e..31946009a31dc51176e956664e3a87eb0115d61d 100644 (file)
@@ -118,6 +118,18 @@ class wxTextCtrl: public wxControl
 
     void OnChar( wxKeyEvent &event );
 
+    void OnCut(wxCommandEvent& event);
+    void OnCopy(wxCommandEvent& event);
+    void OnPaste(wxCommandEvent& event);
+    void OnUndo(wxCommandEvent& event);
+    void OnRedo(wxCommandEvent& event);
+
+    void OnUpdateCut(wxUpdateUIEvent& event);
+    void OnUpdateCopy(wxUpdateUIEvent& event);
+    void OnUpdatePaste(wxUpdateUIEvent& event);
+    void OnUpdateUndo(wxUpdateUIEvent& event);
+    void OnUpdateRedo(wxUpdateUIEvent& event);
+
 #ifndef NO_TEXT_WINDOW_STREAM
     int overflow(int i);
     int sync();
index de86ad8e1a0fb8029dd60fe2516b294394e05679..490d00170f6ac8f88c0b2784cd4cabf29f30eaa5 100644 (file)
@@ -105,7 +105,7 @@ public:
     virtual void GtkOnSize( int x, int y, int width, int height );
     virtual wxPoint GetClientAreaOrigin() const;
     void DoMenuUpdates();
-    void DoMenuUpdates(wxMenu* menu);
+    void DoMenuUpdates(wxMenu* menu, wxWindow* focusWin);
     virtual void OnInternalIdle();
 
     wxMenuBar    *m_frameMenuBar;
index 2512ce42c1bc6df0bfbb298e8fbc85682216f31e..31946009a31dc51176e956664e3a87eb0115d61d 100644 (file)
@@ -118,6 +118,18 @@ class wxTextCtrl: public wxControl
 
     void OnChar( wxKeyEvent &event );
 
+    void OnCut(wxCommandEvent& event);
+    void OnCopy(wxCommandEvent& event);
+    void OnPaste(wxCommandEvent& event);
+    void OnUndo(wxCommandEvent& event);
+    void OnRedo(wxCommandEvent& event);
+
+    void OnUpdateCut(wxUpdateUIEvent& event);
+    void OnUpdateCopy(wxUpdateUIEvent& event);
+    void OnUpdatePaste(wxUpdateUIEvent& event);
+    void OnUpdateUndo(wxUpdateUIEvent& event);
+    void OnUpdateRedo(wxUpdateUIEvent& event);
+
 #ifndef NO_TEXT_WINDOW_STREAM
     int overflow(int i);
     int sync();
index c2b5eb39a82ef30b03ac5d37a6b49d1f02ff3612..64ec0d6cd19dc4e6ee01918b2c0433ccd350197e 100644 (file)
@@ -136,7 +136,7 @@ public:
 
   // Query app for menu item updates (called from OnIdle)
   void DoMenuUpdates();
-  void DoMenuUpdates(wxMenu* menu);
+  void DoMenuUpdates(wxMenu* menu, wxWindow* focusWin);
 
   // Checks if there is a toolbar, and returns the first free client position
   virtual wxPoint GetClientAreaOrigin() const;
index 4c9372f4d91224c24f9ca837dcbc8f93a8432966..28b68bcdb9d85861ac62efd23610ec5e5ca0a8bf 100644 (file)
@@ -145,7 +145,7 @@ public:
 
     // Query app for menu item updates (called from OnIdle)
     void DoMenuUpdates();
-    void DoMenuUpdates(wxMenu* menu);
+    void DoMenuUpdates(wxMenu* menu, wxWindow* focusWin);
 
     // Checks if there is a toolbar, and returns the first free client position
     virtual wxPoint GetClientAreaOrigin() const;
index 6622976caf5707bc28e75e79fdb8c135b6f43205..2466ff73764fdc4501cf1b2175cbd136158e65ce 100644 (file)
@@ -16,8 +16,8 @@
     #pragma interface "textctrl.h"
 #endif
 
-#include "wx/ioswrap.h"
 #include "wx/control.h"
+#include "wx/ioswrap.h"
 
 // TODO Some platforms/compilers don't like inheritance from streambuf.
 #if (defined(__BORLANDC__) && !defined(__WIN32__)) || defined(__MWERKS__)
@@ -133,6 +133,18 @@ public:
     void OnChar(wxKeyEvent& event);
     //  void OnEraseBackground(wxEraseEvent& event);
 
+    void OnCut(wxCommandEvent& event);
+    void OnCopy(wxCommandEvent& event);
+    void OnPaste(wxCommandEvent& event);
+    void OnUndo(wxCommandEvent& event);
+    void OnRedo(wxCommandEvent& event);
+
+    void OnUpdateCut(wxUpdateUIEvent& event);
+    void OnUpdateCopy(wxUpdateUIEvent& event);
+    void OnUpdatePaste(wxUpdateUIEvent& event);
+    void OnUpdateUndo(wxUpdateUIEvent& event);
+    void OnUpdateRedo(wxUpdateUIEvent& event);
+
     virtual void Command(wxCommandEvent& event);
 
     // implementation from here to the end
index a0e3ae67fcb2ce68a5d9be6fe12f36a79daad8b3..51fe39e5ae93d0819d33c6b7976c7aff3ae71799 100644 (file)
@@ -153,7 +153,7 @@ public:
 
     // Query app for menu item updates (called from OnIdle)
     void DoMenuUpdates();
-    void DoMenuUpdates(wxMenu* menu);
+    void DoMenuUpdates(wxMenu* menu, wxWindow* focusWin);
 
     WXHMENU GetWinMenu() const ;
 
index 142ee8ba4985e6b9c7c052af2b75a90666ba04d8..fd5a835584673a9f5d0597a2fac1a1519429a48c 100644 (file)
@@ -154,6 +154,18 @@ public:
     void OnChar(wxKeyEvent& event); // Process 'enter' if required
     void OnEraseBackground(wxEraseEvent& event);
 
+    void OnCut(wxCommandEvent& event);
+    void OnCopy(wxCommandEvent& event);
+    void OnPaste(wxCommandEvent& event);
+    void OnUndo(wxCommandEvent& event);
+    void OnRedo(wxCommandEvent& event);
+
+    void OnUpdateCut(wxUpdateUIEvent& event);
+    void OnUpdateCopy(wxUpdateUIEvent& event);
+    void OnUpdatePaste(wxUpdateUIEvent& event);
+    void OnUpdateUndo(wxUpdateUIEvent& event);
+    void OnUpdateRedo(wxUpdateUIEvent& event);
+
     // Implementation
     // --------------
     virtual void Command(wxCommandEvent& event);
index c2b5eb39a82ef30b03ac5d37a6b49d1f02ff3612..64ec0d6cd19dc4e6ee01918b2c0433ccd350197e 100644 (file)
@@ -136,7 +136,7 @@ public:
 
   // Query app for menu item updates (called from OnIdle)
   void DoMenuUpdates();
-  void DoMenuUpdates(wxMenu* menu);
+  void DoMenuUpdates(wxMenu* menu, wxWindow* focusWin);
 
   // Checks if there is a toolbar, and returns the first free client position
   virtual wxPoint GetClientAreaOrigin() const;
index 0834e1a43bfe6828ac54b2d2bae085e911005a30..09c11e063e5cd3c58a90c39678b7dfdccef175f6 100644 (file)
@@ -141,7 +141,18 @@ public:
   void OnDropFiles(wxDropFilesEvent& event);
 //  void OnChar(wxKeyEvent& event); // Process 'enter' if required
 //  void OnEraseBackground(wxEraseEvent& event);
-  
+  void OnCut(wxCommandEvent& event);
+  void OnCopy(wxCommandEvent& event);
+  void OnPaste(wxCommandEvent& event);
+  void OnUndo(wxCommandEvent& event);
+  void OnRedo(wxCommandEvent& event);
+
+  void OnUpdateCut(wxUpdateUIEvent& event);
+  void OnUpdateCopy(wxUpdateUIEvent& event);
+  void OnUpdatePaste(wxUpdateUIEvent& event);
+  void OnUpdateUndo(wxUpdateUIEvent& event);
+  void OnUpdateRedo(wxUpdateUIEvent& event);
+
   // Implementation
   // --------------
   virtual void Command(wxCommandEvent& event);
index 07c9462cfffaf6f434fb5afc447a037a77f04a1c..c64449a3a58c8d2b0ec5f1af2ffe2f08726fb22d 100644 (file)
@@ -555,3 +555,26 @@ bool wxEvtHandler::OnClose()
 }
 #endif // WXWIN_COMPATIBILITY
 
+// Find a window with the focus, that is also a descendant of the given window.
+// This is used to determine the window to initially send commands to.
+wxWindow* wxFindFocusDescendant(wxWindow* ancestor)
+{
+    // Process events starting with the window with the focus, if any.
+    wxWindow* focusWin = wxWindow::FindFocus();
+    wxWindow* win = focusWin;
+
+    // Check if this is a descendant of this frame.
+    // If not, win will be set to NULL.
+    while (win)
+    {
+        if (win == ancestor)
+            break;
+        else
+            win = win->GetParent();
+    }
+    if (win == (wxWindow*) NULL)
+        focusWin = (wxWindow*) NULL;
+
+    return focusWin;
+}
+
index aa326ecdf824fa0fd520683cb666e5c1be377484..163b00a160bcd53898ace9095e5e70f9d6f7af60 100644 (file)
@@ -30,16 +30,21 @@ void wxFrame::OnIdle(wxIdleEvent& WXUNUSED(event) )
 void wxFrame::DoMenuUpdates()
 {
   wxMenuBar* bar = GetMenuBar();
+
+  // Process events starting with the window with the focus, if any.
+  wxWindow* focusWin = wxFindFocusDescendant(this);
+
   if ( bar != NULL ) {
     int nCount = bar->GetMenuCount();
     for (int n = 0; n < nCount; n++)
-      DoMenuUpdates(bar->GetMenu(n));
+      DoMenuUpdates(bar->GetMenu(n), focusWin);
   }
 }
 
 // update a menu and all submenus recursively
-void wxFrame::DoMenuUpdates(wxMenu* menu)
+void wxFrame::DoMenuUpdates(wxMenu* menu, wxWindow* focusWin)
 {
+  wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
   wxNode* node = menu->GetItems().First();
   while (node)
   {
@@ -50,7 +55,7 @@ void wxFrame::DoMenuUpdates(wxMenu* menu)
       wxUpdateUIEvent event(id);
       event.SetEventObject( this );
 
-      if (GetEventHandler()->ProcessEvent(event))
+      if (evtHandler->ProcessEvent(event))
       {
         if (event.GetSetText())
           menu->SetLabel(id, event.GetText());
@@ -61,7 +66,7 @@ void wxFrame::DoMenuUpdates(wxMenu* menu)
       }
 
       if (item->GetSubMenu())
-        DoMenuUpdates(item->GetSubMenu());
+        DoMenuUpdates(item->GetSubMenu(), focusWin);
     }
     node = node->Next();
   }
index 218ecbea4f59e3ab2271ab7fb6844192ff4bac6a..77034f80a42b2f67c67577b7818e4750f988903b 100644 (file)
@@ -24,6 +24,8 @@
 #include "wx/wx.h"
 #endif
 
+#include "wx/frame.h"
+
 // For ::UpdateWindow
 #ifdef __WXMSW__
 #include <windows.h>
@@ -147,6 +149,29 @@ bool wxToolBarBase::OnLeftClick(int toolIndex, bool toggleDown)
     event.SetEventObject(this);
     event.SetExtraLong((long) toggleDown);
 
+    // First try sending the command to a window that has the focus, within a frame that
+    // also contains this toolbar.
+    wxFrame* frame = (wxFrame*) NULL;
+    wxWindow* win = this;
+    wxWindow* focusWin = (wxWindow*) NULL;
+
+    while (win)
+    {
+        if (win->IsKindOf(CLASSINFO(wxFrame)))
+        {
+            frame = (wxFrame*) win;
+            break;
+        }
+        else
+            win = win->GetParent();
+    }
+    if (frame)
+        focusWin = wxFindFocusDescendant(frame);
+
+    if (focusWin && focusWin->GetEventHandler()->ProcessEvent(event))
+        return TRUE;
+
+    // Send events to this toolbar instead (and thence up the window hierarchy)
     GetEventHandler()->ProcessEvent(event);
 
     return TRUE;
@@ -732,6 +757,28 @@ void wxToolBarBase::OnIdle(wxIdleEvent& event)
 // Do the toolbar button updates (check for EVT_UPDATE_UI handlers)
 void wxToolBarBase::DoToolbarUpdates()
 {
+    // First try sending the command to a window that has the focus, within a frame that
+    // also contains this toolbar.
+    wxFrame* frame = (wxFrame*) NULL;
+    wxWindow* win = this;
+    wxWindow* focusWin = (wxWindow*) NULL;
+
+    while (win)
+    {
+        if (win->IsKindOf(CLASSINFO(wxFrame)))
+        {
+            frame = (wxFrame*) win;
+            break;
+        }
+        else
+            win = win->GetParent();
+    }
+    if (frame)
+        focusWin = wxFindFocusDescendant(frame);
+
+
+    wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler() ;
+
     wxNode* node = GetTools().First();
     while (node)
     {
@@ -740,7 +787,7 @@ void wxToolBarBase::DoToolbarUpdates()
         wxUpdateUIEvent event(tool->m_index);
         event.SetEventObject(this);
 
-        if (GetEventHandler()->ProcessEvent(event))
+        if (evtHandler->ProcessEvent(event))
         {
             if (event.GetSetEnabled())
                 EnableTool(tool->m_index, event.GetEnabled());
index 240068c9b549d752d0691d4d46afd08a4d7d07e6..c6e4cbd1d9ab0f5bb30eb1e9c258239d79bc83cd 100644 (file)
@@ -28,6 +28,7 @@ LIB_CPP_SRC=\
  common/image.cpp \
  common/imagjpeg.cpp \
  common/imagpng.cpp \
+ common/imaggif.cpp \
  common/ipcbase.cpp \
  common/layout.cpp \
  common/list.cpp \
index 84899e1e489099cdb61e61836efd7e70704a18bf..a21759384760a106f2a00800b56e3a3dab034aae 100644 (file)
@@ -654,7 +654,13 @@ void wxFrame::Command( int id )
     {
         bar->Check(id,!bar->Checked(id)) ;
     }
-    GetEventHandler()->ProcessEvent(commandEvent);
+
+    // Process events starting with the window with the focus, if any.
+    wxWindow* focusWin = wxFindFocusDescendant(this);
+
+    wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
+
+    evtHandler->ProcessEvent(commandEvent);
 }
 
 void wxFrame::SetStatusText(const wxString& text, int number)
index 78e4e339ac8bffd99ebcf34d6f5a5c62221049de..3523a06f3ba1a8b391124a36878f304cbb7cbbf3 100644 (file)
@@ -12,6 +12,7 @@
 #endif
 
 #include "wx/toolbar.h"
+#include "wx/frame.h"
 
 #include "glib.h"
 #include "gdk/gdk.h"
@@ -168,6 +169,28 @@ bool wxToolBar::OnLeftClick( int toolIndex, bool toggleDown )
     event.SetInt( toolIndex );
     event.SetExtraLong((long) toggleDown);
 
+    // First try sending the command to a window that has the focus, within a frame that
+    // also contains this toolbar.
+    wxFrame* frame = (wxFrame*) NULL;
+    wxWindow* win = this;
+    wxWindow* focusWin = (wxWindow*) NULL;
+
+    while (win)
+    {
+        if (win->IsKindOf(CLASSINFO(wxFrame)))
+        {
+            frame = (wxFrame*) win;
+            break;
+        }
+        else
+            win = win->GetParent();
+    }
+    if (frame)
+        focusWin = wxFindFocusDescendant(frame);
+
+    if (focusWin && focusWin->GetEventHandler()->ProcessEvent(event))
+        return TRUE;
+
     GetEventHandler()->ProcessEvent(event);
 
     return TRUE;
index 4da56a23e5cadb20ca2770c2fe5aad4fa35b2c48..5fd1f455a198de10eaaabd5b16d0b84ef6b30c01 100644 (file)
@@ -65,6 +65,18 @@ IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl,wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
     EVT_CHAR(wxTextCtrl::OnChar)
+
+    EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
+    EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy)
+    EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste)
+    EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo)
+    EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo)
+
+    EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut)
+    EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy)
+    EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste)
+    EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo)
+    EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
 END_EVENT_TABLE()
 
 #ifndef NO_TEXT_WINDOW_STREAM
@@ -931,3 +943,52 @@ void wxTextCtrl::ApplyWidgetStyle()
     }
 }
 
+void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
+{
+    Cut();
+}
+
+void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event))
+{
+    Copy();
+}
+
+void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event))
+{
+    Paste();
+}
+
+void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event))
+{
+    Undo();
+}
+
+void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event))
+{
+    Redo();
+}
+
+void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent& event)
+{
+    event.Enable( CanCut() );
+}
+
+void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent& event)
+{
+    event.Enable( CanCopy() );
+}
+
+void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent& event)
+{
+    event.Enable( CanPaste() );
+}
+
+void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent& event)
+{
+    event.Enable( CanUndo() );
+}
+
+void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
+{
+    event.Enable( CanRedo() );
+}
index 84899e1e489099cdb61e61836efd7e70704a18bf..a21759384760a106f2a00800b56e3a3dab034aae 100644 (file)
@@ -654,7 +654,13 @@ void wxFrame::Command( int id )
     {
         bar->Check(id,!bar->Checked(id)) ;
     }
-    GetEventHandler()->ProcessEvent(commandEvent);
+
+    // Process events starting with the window with the focus, if any.
+    wxWindow* focusWin = wxFindFocusDescendant(this);
+
+    wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
+
+    evtHandler->ProcessEvent(commandEvent);
 }
 
 void wxFrame::SetStatusText(const wxString& text, int number)
index 78e4e339ac8bffd99ebcf34d6f5a5c62221049de..3523a06f3ba1a8b391124a36878f304cbb7cbbf3 100644 (file)
@@ -12,6 +12,7 @@
 #endif
 
 #include "wx/toolbar.h"
+#include "wx/frame.h"
 
 #include "glib.h"
 #include "gdk/gdk.h"
@@ -168,6 +169,28 @@ bool wxToolBar::OnLeftClick( int toolIndex, bool toggleDown )
     event.SetInt( toolIndex );
     event.SetExtraLong((long) toggleDown);
 
+    // First try sending the command to a window that has the focus, within a frame that
+    // also contains this toolbar.
+    wxFrame* frame = (wxFrame*) NULL;
+    wxWindow* win = this;
+    wxWindow* focusWin = (wxWindow*) NULL;
+
+    while (win)
+    {
+        if (win->IsKindOf(CLASSINFO(wxFrame)))
+        {
+            frame = (wxFrame*) win;
+            break;
+        }
+        else
+            win = win->GetParent();
+    }
+    if (frame)
+        focusWin = wxFindFocusDescendant(frame);
+
+    if (focusWin && focusWin->GetEventHandler()->ProcessEvent(event))
+        return TRUE;
+
     GetEventHandler()->ProcessEvent(event);
 
     return TRUE;
index 4da56a23e5cadb20ca2770c2fe5aad4fa35b2c48..5fd1f455a198de10eaaabd5b16d0b84ef6b30c01 100644 (file)
@@ -65,6 +65,18 @@ IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl,wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
     EVT_CHAR(wxTextCtrl::OnChar)
+
+    EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
+    EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy)
+    EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste)
+    EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo)
+    EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo)
+
+    EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut)
+    EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy)
+    EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste)
+    EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo)
+    EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
 END_EVENT_TABLE()
 
 #ifndef NO_TEXT_WINDOW_STREAM
@@ -931,3 +943,52 @@ void wxTextCtrl::ApplyWidgetStyle()
     }
 }
 
+void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
+{
+    Cut();
+}
+
+void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event))
+{
+    Copy();
+}
+
+void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event))
+{
+    Paste();
+}
+
+void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event))
+{
+    Undo();
+}
+
+void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event))
+{
+    Redo();
+}
+
+void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent& event)
+{
+    event.Enable( CanCut() );
+}
+
+void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent& event)
+{
+    event.Enable( CanCopy() );
+}
+
+void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent& event)
+{
+    event.Enable( CanPaste() );
+}
+
+void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent& event)
+{
+    event.Enable( CanUndo() );
+}
+
+void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
+{
+    event.Enable( CanRedo() );
+}
index b370f7b10848343e1cb0f1cc60c026184c61c17d..55f1e3b72c132d90555fbc6622ae329c906f76f5 100644 (file)
@@ -450,7 +450,12 @@ void wxFrame::ProcessCommand(int id)
   }
 */
 
-  GetEventHandler()->ProcessEvent(commandEvent);
+  // Process events starting with the window with the focus, if any.
+  wxWindow* focusWin = wxFindFocusDescendant(this);
+
+  wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
+
+  evtHandler->ProcessEvent(commandEvent);
 }
 
 // Checks if there is a toolbar, and returns the first free client position
index b370f7b10848343e1cb0f1cc60c026184c61c17d..55f1e3b72c132d90555fbc6622ae329c906f76f5 100644 (file)
@@ -450,7 +450,12 @@ void wxFrame::ProcessCommand(int id)
   }
 */
 
-  GetEventHandler()->ProcessEvent(commandEvent);
+  // Process events starting with the window with the focus, if any.
+  wxWindow* focusWin = wxFindFocusDescendant(this);
+
+  wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
+
+  evtHandler->ProcessEvent(commandEvent);
 }
 
 // Checks if there is a toolbar, and returns the first free client position
index 56b9f3e56fc6af78f4195d4e385496737f89aca2..0d26fbe0d8f5fa05741acf5cbc65e3524e45edea 100644 (file)
@@ -27,6 +27,7 @@ LIB_CPP_SRC=\
  common/image.cpp \
  common/imagjpeg.cpp \
  common/imagpng.cpp \
+ common/imaggif.cpp \
  common/intl.cpp \
  common/ipcbase.cpp \
  common/layout.cpp \
index 264204fb1bf57243ba366fd4e72d659d5c8c05fb..2e3f2f78a1f7481cd68f9068c43a5a1a81bea4e7 100644 (file)
@@ -869,7 +869,12 @@ void wxFrame::ProcessCommand(int id)
   }
 */
 
-  GetEventHandler()->ProcessEvent(commandEvent);
+  // Process events starting with the window with the focus, if any.
+  wxWindow* focusWin = wxFindFocusDescendant(this);
+
+  wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
+
+  evtHandler->ProcessEvent(commandEvent);
 }
 
 // Checks if there is a toolbar, and returns the first free client position
index e8c8ab75322b814c758e67ff38726623679148ae..182f91062cf55c3141550d4b204e85e198570d5f 100644 (file)
@@ -33,6 +33,7 @@ LIB_CPP_SRC=\
  ../common/image.cpp \
  ../common/imagjpeg.cpp \
  ../common/imagpng.cpp \
+ ../common/imaggif.cpp \
  ../common/layout.cpp \
  ../common/list.cpp \
  ../common/log.cpp \
index a9ae3f9b0a363033184875fc5719e7dd3a5df77a..d697c836623e316f59f6a172e5a4c542275cd0cd 100644 (file)
@@ -57,6 +57,19 @@ static void wxTextWindowActivateProc(Widget w, XtPointer clientData, XmAnyCallba
     BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
         EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
         EVT_CHAR(wxTextCtrl::OnChar)
+
+    EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
+    EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy)
+    EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste)
+    EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo)
+    EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo)
+
+    EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut)
+    EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy)
+    EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste)
+    EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo)
+    EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
+
     END_EVENT_TABLE()
 #endif
 
@@ -995,3 +1008,52 @@ static void wxTextWindowActivateProc(Widget w, XtPointer clientData,
     tw->ProcessCommand(event);
 }
 
+void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
+{
+    Cut();
+}
+
+void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event))
+{
+    Copy();
+}
+
+void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event))
+{
+    Paste();
+}
+
+void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event))
+{
+    Undo();
+}
+
+void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event))
+{
+    Redo();
+}
+
+void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent& event)
+{
+    event.Enable( CanCut() );
+}
+
+void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent& event)
+{
+    event.Enable( CanCopy() );
+}
+
+void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent& event)
+{
+    event.Enable( CanPaste() );
+}
+
+void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent& event)
+{
+    event.Enable( CanUndo() );
+}
+
+void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
+{
+    event.Enable( CanRedo() );
+}
index 0099a3178784cc56db12363844b49e2234293692..4cfcc231d62617c3ed3db05836b17f4dbe97fbdc 100644 (file)
@@ -916,7 +916,12 @@ void wxFrame::ProcessCommand(int id)
   {
     bar->Check(id,!bar->Checked(id)) ;
   }
-  GetEventHandler()->ProcessEvent(commandEvent);
+
+  // Process events starting with the window with the focus, if any.
+  wxWindow* focusWin = wxFindFocusDescendant(this);
+
+  wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
+  evtHandler->ProcessEvent(commandEvent);
 }
 
 // Checks if there is a toolbar, and returns the first free client position
index 1f2ccebc1b6b432b05b99ed69bed11be5f15e189..1d685d63149a808ba0f572eae8f63475fef495d5 100644 (file)
@@ -114,6 +114,7 @@ COMMONOBJS = \
   ..\common\$D\image.obj \
   ..\common\$D\imagjpeg.obj \
   ..\common\$D\imagpng.obj \
+  ..\common\$D\imaggif.obj \
   ..\common\$D\intl.obj \
   ..\common\$D\ipcbase.obj \
   ..\common\$D\helpbase.obj \
index 2642a90de4ce474234585cb93fc6cda1cf3616a9..630fc2717603b28c7cd70c6d3a0e35cbdf5954e6 100644 (file)
 #endif
 
 #if !USE_SHARED_LIBRARY
+
 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
   EVT_CHAR(wxTextCtrl::OnChar)
   EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
   EVT_ERASE_BACKGROUND(wxTextCtrl::OnEraseBackground)
+
+  EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
+  EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy)
+  EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste)
+  EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo)
+  EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo)
+
+  EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut)
+  EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy)
+  EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste)
+  EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo)
+  EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
 END_EVENT_TABLE()
+
 #endif // USE_SHARED_LIBRARY
 
 // Text item
@@ -363,20 +377,29 @@ void wxTextCtrl::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 // Clipboard operations
 void wxTextCtrl::Copy()
 {
-  HWND hWnd = (HWND) GetHWND();
-  SendMessage(hWnd, WM_COPY, 0, 0L);
+    if (CanCopy())
+    {
+        HWND hWnd = (HWND) GetHWND();
+        SendMessage(hWnd, WM_COPY, 0, 0L);
+    }
 }
 
 void wxTextCtrl::Cut()
 {
-  HWND hWnd = (HWND) GetHWND();
-  SendMessage(hWnd, WM_CUT, 0, 0L);
+    if (CanCut())
+    {
+        HWND hWnd = (HWND) GetHWND();
+        SendMessage(hWnd, WM_CUT, 0, 0L);
+    }
 }
 
 void wxTextCtrl::Paste()
 {
-  HWND hWnd = (HWND) GetHWND();
-  SendMessage(hWnd, WM_PASTE, 0, 0L);
+    if (CanPaste())
+    {
+        HWND hWnd = (HWND) GetHWND();
+        SendMessage(hWnd, WM_PASTE, 0, 0L);
+    }
 }
 
 void wxTextCtrl::SetEditable(bool editable)
@@ -1235,3 +1258,53 @@ bool wxTextCtrl::MSWNotify(WXWPARAM wParam, WXLPARAM lParam)
 #endif
 #endif
 
+void wxTextCtrl::OnCut(wxCommandEvent& event)
+{
+    Cut();
+}
+
+void wxTextCtrl::OnCopy(wxCommandEvent& event)
+{
+    Copy();
+}
+
+void wxTextCtrl::OnPaste(wxCommandEvent& event)
+{
+    Paste();
+}
+
+void wxTextCtrl::OnUndo(wxCommandEvent& event)
+{
+    Undo();
+}
+
+void wxTextCtrl::OnRedo(wxCommandEvent& event)
+{
+    Redo();
+}
+
+void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent& event)
+{
+    event.Enable( CanCut() );
+}
+
+void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent& event)
+{
+    event.Enable( CanCopy() );
+}
+
+void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent& event)
+{
+    event.Enable( CanPaste() );
+}
+
+void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent& event)
+{
+    event.Enable( CanUndo() );
+}
+
+void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
+{
+    event.Enable( CanRedo() );
+}
+
index c0b6d6b932a25f7cd85e4c628f3ba4de886bee6e..48ff977bdadc75d5ba9fbfb25a25efe40bac4422 100644 (file)
@@ -451,7 +451,12 @@ void wxFrame::ProcessCommand(int id)
   }
 */
 
-  GetEventHandler()->ProcessEvent(commandEvent);
+  // Process events starting with the window with the focus, if any.
+  wxWindow* focusWin = wxFindFocusDescendant(this);
+
+  wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
+
+  evtHandler->ProcessEvent(commandEvent);
 }
 
 // Checks if there is a toolbar, and returns the first free client position
index a43a38acc97c13df0c17439ce3902020413b8975..720e6082be0ddc57b38b5d63999634d7d0435d1c 100644 (file)
@@ -35,6 +35,17 @@ IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
        EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
+    EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
+    EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy)
+    EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste)
+    EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo)
+    EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo)
+
+    EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut)
+    EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy)
+    EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste)
+    EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo)
+    EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
 END_EVENT_TABLE()
 #endif
 
@@ -496,3 +507,52 @@ wxTextCtrl& wxTextCtrl::operator<<(const char c)
     return *this;
 }
 
+void wxTextCtrl::OnCut(wxCommandEvent& event)
+{
+    Cut();
+}
+
+void wxTextCtrl::OnCopy(wxCommandEvent& event)
+{
+    Copy();
+}
+
+void wxTextCtrl::OnPaste(wxCommandEvent& event)
+{
+    Paste();
+}
+
+void wxTextCtrl::OnUndo(wxCommandEvent& event)
+{
+    Undo();
+}
+
+void wxTextCtrl::OnRedo(wxCommandEvent& event)
+{
+    Redo();
+}
+
+void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent& event)
+{
+    event.Enable( CanCut() );
+}
+
+void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent& event)
+{
+    event.Enable( CanCopy() );
+}
+
+void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent& event)
+{
+    event.Enable( CanPaste() );
+}
+
+void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent& event)
+{
+    event.Enable( CanUndo() );
+}
+
+void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
+{
+    event.Enable( CanRedo() );
+}