// inherit colour and font settings from the parent window
void InheritAttributes();
+
+ // initialize the common fields of wxCommandEvent
+ void InitCommandEvent(wxCommandEvent& event) const;
};
// ----------------------------------------------------------------------------
const wxString& GetFileName() const { return m_filename; }
+ // copy the metafile to the clipboard: the width and height parameters are
+ // for backwards compatibility (with wxMetaFile) only, they are ignored by
+ // this method
+ bool SetClipboard(int width = 0, int height = 0);
+
// implementation
WXHANDLE GetHENHMETAFILE() const { return m_hMF; }
void SetHENHMETAFILE(WXHANDLE hMF) { Free(); m_hMF = hMF; }
#if wxUSE_DRAG_AND_DROP
// notice that we want to support both CF_METAFILEPICT and CF_ENHMETAFILE and
-// so we derive from and not from wxDataObjectSimple
+// so we derive from wxDataObject and not from wxDataObjectSimple
class WXDLLEXPORT wxEnhMetaFileDataObject : public wxDataObject
{
public:
#define GetHmenu() ((HMENU)GetHMenu())
#define GetHmenuOf(menu) ((HMENU)menu->GetHMenu())
+#define GetHcursor() ((HCURSOR)GetHCURSOR())
+#define GetHcursorOf(cursor) ((HCURSOR)(cursor).GetHCURSOR())
+
// ---------------------------------------------------------------------------
// global data
// ---------------------------------------------------------------------------
#if wxUSE_GUI
+// cursor stuff
+extern HCURSOR wxGetCurrentBusyCursor(); // from msw/utils.cpp
+extern const wxCursor *wxGetGlobalCursor(); // from msw/cursor.cpp
+
WXDLLEXPORT wxWindow* wxFindWinFromHandle(WXHWND hWnd);
WXDLLEXPORT void wxGetCharSize(WXHWND wnd, int *x, int *y, const wxFont *the_font);
void wxControlBase::Command(wxCommandEvent& event)
{
- (void)ProcessEvent(event);
+ (void)GetEventHandler()->ProcessEvent(event);
}
+
+void wxControlBase::InitCommandEvent(wxCommandEvent& event) const
+{
+ event.SetEventObject((wxControlBase *)this); // const_cast
+
+ // event.SetId(GetId()); -- this is usuall done in the event ctor
+
+ switch ( m_clientDataType )
+ {
+ case ClientData_Void:
+ event.SetClientData(GetClientData());
+ break;
+
+ case ClientData_Object:
+ event.SetClientObject(GetClientObject());
+ break;
+
+ case ClientData_None:
+ // nothing to do
+ ;
+ }
+}
+
extern wxList *wxWinHandleList;
extern wxList WXDLLEXPORT wxPendingDelete;
extern void wxSetKeyboardHook(bool doIt);
-extern wxCursor *g_globalCursor;
MSG s_currentMsg;
wxApp *wxTheApp = NULL;
Ctl3dAutoSubclass(wxhInstance);
#endif
- g_globalCursor = new wxCursor;
-
// VZ: these icons are not in wx.rc anyhow (but should they?)!
#if 0
wxSTD_FRAME_ICON = LoadIcon(wxhInstance, wxT("wxSTD_FRAME"));
// wxDefaultResourceTable->ClearTable();
#endif
- // Indicate that the cursor can be freed, so that cursor won't be deleted
- // by deleting the bitmap list before g_globalCursor goes out of scope
- // (double deletion of the cursor).
- wxSetCursor(wxNullCursor);
- delete g_globalCursor;
- g_globalCursor = NULL;
-
wxDeleteStockObjects();
// Destroy all GDI lists, etc.
// wxWin macros
// ----------------------------------------------------------------------------
- IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxCursorBase)
+IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxCursorBase)
+
+// ----------------------------------------------------------------------------
+// globals
+// ----------------------------------------------------------------------------
+
+// Current cursor, in order to hang on to cursor handle when setting the cursor
+// globally
+static wxCursor *gs_globalCursor = NULL;
+
+// ----------------------------------------------------------------------------
+// private classes
+// ----------------------------------------------------------------------------
+
+class wxCursorModule : public wxModule
+{
+public:
+ virtual bool OnInit()
+ {
+ gs_globalCursor = new wxCursor;
+
+ return TRUE;
+ }
+
+ virtual void OnExit()
+ {
+ delete gs_globalCursor;
+ gs_globalCursor = (wxCursor *)NULL;
+ }
+};
+
+// ============================================================================
+// implementation
+// ============================================================================
// ----------------------------------------------------------------------------
// wxCursorRefData
// Global cursor setting
// ----------------------------------------------------------------------------
-void wxSetCursor(const wxCursor& cursor)
+const wxCursor *wxGetGlobalCursor()
{
- extern wxCursor *g_globalCursor;
+ return gs_globalCursor;
+}
- if ( cursor.Ok() && cursor.GetHCURSOR() )
+void wxSetCursor(const wxCursor& cursor)
+{
+ if ( cursor.Ok() )
{
- ::SetCursor((HCURSOR) cursor.GetHCURSOR());
+ ::SetCursor(GetHcursorOf(cursor));
- if ( g_globalCursor )
- (*g_globalCursor) = cursor;
+ if ( gs_globalCursor )
+ *gs_globalCursor = cursor;
}
}
// List of windows pending deletion
wxList WXDLLEXPORT wxPendingDelete;
-// Current cursor, in order to hang on to
-// cursor handle when setting the cursor globally
-wxCursor *g_globalCursor = NULL;
-
-// Message Strings for Internationalization
-char **wx_msg_str = (char**)NULL;
-
// Custom OS version, as optionally placed in wx.ini/.wxrc
// Currently this can be Win95, Windows, Win32s, WinNT.
// For some systems, you can't tell until run-time what services you
case WM_SETCURSOR:
// we want to override the busy cursor for modal dialogs:
// typically, wxBeginBusyCursor() is called and then a modal dialog
- // is shown, but the modal dialog shouldn't have this cursor
+ // is shown, but the modal dialog shouldn't have hourglass cursor
if ( wxIsBusy() )
{
- rc = TRUE;
+ // set our cursor for all windows (but see below)
+ wxCursor cursor = m_cursor;
+ if ( !cursor.Ok() )
+ cursor = wxCURSOR_ARROW;
+ ::SetCursor(GetHcursorOf(cursor));
+
+ // in any case, stop here and don't let wxWindow process this
+ // message (it would set the busy cursor)
processed = TRUE;
+
+ // but return FALSE to tell the child window (if the event
+ // comes from one of them and not from ourselves) that it can
+ // set its own cursor if it has one: thus, standard controls
+ // (e.g. text ctrl) still have correct cursors in a dialog
+ // invoked while wxIsBusy()
+ rc = FALSE;
}
+ break;
}
if ( !processed )
#endif //WX_PRECOMP
#include "wx/metafile.h"
+#include "wx/clipbrd.h"
#include "wx/msw/private.h"
return size;
}
+bool wxEnhMetaFile::SetClipboard(int WXUNUSED(width), int WXUNUSED(height))
+{
+ wxCHECK_MSG( m_hMF, FALSE, _T("can't copy invalid metafile to clipboard") );
+
+ return wxTheClipboard->AddData(new wxEnhMetaFileDataObject(*this));
+}
+
// ----------------------------------------------------------------------------
// wxEnhMetaFileDC
// ----------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
-// Name: textctrl.cpp
+// Name: msw/textctrl.cpp
// Purpose: wxTextCtrl
// Author: Julian Smart
// Modified by:
if ( !(m_windowStyle & wxTE_MULTILINE) )
{
wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
- event.SetEventObject( this );
+ InitCommandEvent(event);
if ( GetEventHandler()->ProcessEvent(event) )
return;
}
case EN_CHANGE:
{
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
- event.SetEventObject( this );
- event.SetString( GetValue() );
- ProcessCommand( event );
+ InitCommandEvent(event);
+ event.SetString(GetValue());
+ ProcessCommand(event);
}
break;
// standard handlers for standard edit menu events
// ----------------------------------------------------------------------------
-void wxTextCtrl::OnCut(wxCommandEvent& event)
+void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
{
Cut();
}
-void wxTextCtrl::OnCopy(wxCommandEvent& event)
+void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event))
{
Copy();
}
-void wxTextCtrl::OnPaste(wxCommandEvent& event)
+void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event))
{
Paste();
}
-void wxTextCtrl::OnUndo(wxCommandEvent& event)
+void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event))
{
Undo();
}
-void wxTextCtrl::OnRedo(wxCommandEvent& event)
+void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event))
{
Redo();
}
// helper functions for showing a "busy" cursor
// ---------------------------------------------------------------------------
-HCURSOR gs_wxBusyCursor = 0; // new, busy cursor
-HCURSOR gs_wxBusyCursorOld = 0; // old cursor
+static HCURSOR gs_wxBusyCursor = 0; // new, busy cursor
+static HCURSOR gs_wxBusyCursorOld = 0; // old cursor
static int gs_wxBusyCursorCount = 0;
+extern HCURSOR wxGetCurrentBusyCursor()
+{
+ return gs_wxBusyCursor;
+}
+
// Set the cursor to the busy cursor for all windows
void wxBeginBusyCursor(wxCursor *cursor)
{
::GetWindowRect(hWnd, &rect);
if ( ::PtInRect(&rect, point) && !wxIsBusy() )
- ::SetCursor((HCURSOR)m_cursor.GetHCURSOR());
+ ::SetCursor(GetHcursorOf(m_cursor));
return TRUE;
}
short nHitTest,
int WXUNUSED(mouseMsg))
{
- // don't set cursor for other windows, only for this one: this prevents
- // children of this window from getting the same cursor as the parent has
- // (don't forget that this message is propagated by default up the window
- // parent-child hierarchy)
- if ( GetHWND() == hWnd )
- {
- // don't set cursor when the mouse is not in the client part
- if ( nHitTest == HTCLIENT || nHitTest == HTERROR )
- {
- HCURSOR hcursor = 0;
- if ( wxIsBusy() )
- {
- // from msw\utils.cpp
- extern HCURSOR gs_wxBusyCursor;
-
- hcursor = gs_wxBusyCursor;
- }
- else
- {
- wxCursor *cursor = NULL;
-
- if ( m_cursor.Ok() )
- {
- cursor = &m_cursor;
- }
- else
- {
- // from msw\data.cpp
- extern wxCursor *g_globalCursor;
+ // the logic is as follows:
+ // 1. if we have the cursor set it unless wxIsBusy()
+ // 2. if we're a top level window, set some cursor anyhow
+ // 3. if wxIsBusy(), set the busy cursor, otherwise the global one
- if ( g_globalCursor && g_globalCursor->Ok() )
- cursor = g_globalCursor;
- }
-
- if ( cursor )
- hcursor = (HCURSOR)cursor->GetHCURSOR();
- }
+ HCURSOR hcursor = 0;
+ bool isBusy = wxIsBusy();
+ if ( m_cursor.Ok() )
+ {
+ hcursor = GetHcursorOf(m_cursor);
+ }
- if ( hcursor )
+ if ( !GetParent() )
+ {
+ if ( isBusy )
+ {
+ hcursor = wxGetCurrentBusyCursor();
+ }
+ else if ( !hcursor )
+ {
+ const wxCursor *cursor = wxGetGlobalCursor();
+ if ( cursor && cursor->Ok() )
{
- ::SetCursor(hcursor);
-
- return TRUE;
+ hcursor = GetHcursorOf(*cursor);
}
}
}
- return FALSE;
+ if ( hcursor )
+ {
+ ::SetCursor(hcursor);
+
+ // cursor set, stop here
+ return TRUE;
+ }
+ else
+ {
+ // pass up the window chain
+ return FALSE;
+ }
}
// ---------------------------------------------------------------------------