X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5a1c877f57de295ba12f75e1da6f98f033f7257c..5c0ccabf0249189e99d837acb2265cdb666ce092:/samples/dnd/dnd.cpp diff --git a/samples/dnd/dnd.cpp b/samples/dnd/dnd.cpp index 4a2985894b..f2c9da7f78 100644 --- a/samples/dnd/dnd.cpp +++ b/samples/dnd/dnd.cpp @@ -19,16 +19,6 @@ #include "wx/wx.h" #endif -#if !wxUSE_DRAG_AND_DROP - #error This sample requires drag and drop support in the library -#endif - -// under Windows we also support data transfer of metafiles as an extra bonus, -// but they're not available under other platforms -#ifdef __WINDOWS__ - #define USE_METAFILES -#endif // Windows - #include "wx/intl.h" #include "wx/log.h" @@ -38,16 +28,22 @@ #include "wx/image.h" #include "wx/clipbrd.h" #include "wx/colordlg.h" -#include "wx/resource.h" +#include "wx/sizer.h" -#ifdef USE_METAFILES +#if wxUSE_METAFILES #include "wx/metafile.h" -#endif // Windows +#endif // wxUSE_METAFILES -#if defined(__WXGTK__) || defined(__WXMOTIF__) +#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__) #include "mondrian.xpm" + + #include "dnd_copy.xpm" + #include "dnd_move.xpm" + #include "dnd_none.xpm" #endif +#if wxUSE_DRAG_AND_DROP + // ---------------------------------------------------------------------------- // Derive two simple classes which just put in the listbox the strings (text or // file names) we drop on them @@ -76,6 +72,44 @@ private: wxListBox *m_pOwner; }; +// ---------------------------------------------------------------------------- +// Define a custom dtop target accepting URLs +// ---------------------------------------------------------------------------- + +class URLDropTarget : public wxDropTarget +{ +public: + URLDropTarget() { SetDataObject(new wxURLDataObject); } + + void OnDropURL(wxCoord x, wxCoord y, const wxString& text) + { + // of course, a real program would do something more useful here... + wxMessageBox(text, _T("wxDnD sample: got URL"), + wxICON_INFORMATION | wxOK); + } + + // URLs can't be moved, only copied + virtual wxDragResult OnDragOver(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), + wxDragResult def) + { + return wxDragLink; // At least IE 5.x needs wxDragLink, the + // other browsers on MSW seem okay with it too. + } + + // translate this to calls to OnDropURL() just for convenience + virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def) + { + if ( !GetData() ) + return wxDragNone; + + OnDropURL(x, y, ((wxURLDataObject *)m_dataObject)->GetURL()); + + return def; + } +}; + +#endif // wxUSE_DRAG_AND_DROP + // ---------------------------------------------------------------------------- // Define a new application type // ---------------------------------------------------------------------------- @@ -88,6 +122,83 @@ public: IMPLEMENT_APP(DnDApp); +#if wxUSE_DRAG_AND_DROP + +// ---------------------------------------------------------------------------- +// Define canvas class to show a bitmap +// ---------------------------------------------------------------------------- + +class DnDCanvasBitmap : public wxScrolledWindow +{ +public: + DnDCanvasBitmap(wxWindow *parent) : wxScrolledWindow(parent) { } + + void SetBitmap(const wxBitmap& bitmap) + { + m_bitmap = bitmap; + + SetScrollbars(10, 10, + m_bitmap.GetWidth() / 10, m_bitmap.GetHeight() / 10); + + Refresh(); + } + + void OnPaint(wxPaintEvent& event) + { + wxPaintDC dc(this); + + if ( m_bitmap.Ok() ) + { + PrepareDC(dc); + + dc.DrawBitmap(m_bitmap, 0, 0); + } + } + +private: + wxBitmap m_bitmap; + + DECLARE_EVENT_TABLE() +}; + +#if wxUSE_METAFILES + +// and the same thing fo metafiles +class DnDCanvasMetafile : public wxScrolledWindow +{ +public: + DnDCanvasMetafile(wxWindow *parent) : wxScrolledWindow(parent) { } + + void SetMetafile(const wxMetafile& metafile) + { + m_metafile = metafile; + + SetScrollbars(10, 10, + m_metafile.GetWidth() / 10, m_metafile.GetHeight() / 10); + + Refresh(); + } + + void OnPaint(wxPaintEvent& event) + { + wxPaintDC dc(this); + + if ( m_metafile.Ok() ) + { + PrepareDC(dc); + + m_metafile.Play(&dc); + } + } + +private: + wxMetafile m_metafile; + + DECLARE_EVENT_TABLE() +}; + +#endif // wxUSE_METAFILES + // ---------------------------------------------------------------------------- // Define a new frame type for the main frame // ---------------------------------------------------------------------------- @@ -95,13 +206,16 @@ IMPLEMENT_APP(DnDApp); class DnDFrame : public wxFrame { public: - DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h); - ~DnDFrame(); + DnDFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h); + virtual ~DnDFrame(); void OnPaint(wxPaintEvent& event); - void OnQuit (wxCommandEvent& event); + void OnSize(wxSizeEvent& event); + void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); - void OnDrag (wxCommandEvent& event); + void OnDrag(wxCommandEvent& event); + void OnDragMoveByDefault(wxCommandEvent& event); + void OnDragMoveAllow(wxCommandEvent& event); void OnNewFrame(wxCommandEvent& event); void OnHelp (wxCommandEvent& event); void OnLogClear(wxCommandEvent& event); @@ -112,21 +226,24 @@ public: void OnCopyBitmap(wxCommandEvent& event); void OnPasteBitmap(wxCommandEvent& event); -#ifdef USE_METAFILES +#if wxUSE_METAFILES void OnPasteMetafile(wxCommandEvent& event); -#endif // USE_METAFILES +#endif // wxUSE_METAFILES void OnCopyFiles(wxCommandEvent& event); void OnLeftDown(wxMouseEvent& event); void OnRightDown(wxMouseEvent& event); + void OnUpdateUIMoveByDefault(wxUpdateUIEvent& event); + void OnUpdateUIPasteText(wxUpdateUIEvent& event); void OnUpdateUIPasteBitmap(wxUpdateUIEvent& event); DECLARE_EVENT_TABLE() private: + // GUI controls wxListBox *m_ctrlFile, *m_ctrlText; wxTextCtrl *m_ctrlLog; @@ -134,8 +251,14 @@ private: wxLog *m_pLog, *m_pLogPrev; + // move the text by default (or copy)? + bool m_moveByDefault; + + // allow moving the text at all? + bool m_moveAllow; + + // the text we drag wxString m_strText; - wxBitmap m_bitmap; }; // ---------------------------------------------------------------------------- @@ -207,8 +330,9 @@ public: } protected: + //get a point 1 up and 1 left, otherwise the mid-point of a triangle is on the line wxPoint GetCentre() const - { return wxPoint(m_pos.x + m_size.x / 2, m_pos.y + m_size.y / 2); } + { return wxPoint(m_pos.x + m_size.x / 2 - 1, m_pos.y + m_size.y / 2 - 1); } struct ShapeDump { @@ -231,12 +355,12 @@ public: const wxColour& col) : DnDShape(pos, size, col) { - wxLogMessage("DnDTriangularShape is being created"); + wxLogMessage(wxT("DnDTriangularShape is being created")); } virtual ~DnDTriangularShape() { - wxLogMessage("DnDTriangularShape is being deleted"); + wxLogMessage(wxT("DnDTriangularShape is being deleted")); } virtual Kind GetKind() const { return Triangle; } @@ -254,9 +378,9 @@ public: dc.DrawLine(p2, p3); dc.DrawLine(p3, p1); -#ifdef __WXMSW__ + //works in multicolor modes; on GTK (at least) will fail in 16-bit color + dc.SetBrush(wxBrush(m_col, wxSOLID)); dc.FloodFill(GetCentre(), m_col, wxFLOOD_BORDER); -#endif } }; @@ -268,12 +392,12 @@ public: const wxColour& col) : DnDShape(pos, size, col) { - wxLogMessage("DnDRectangularShape is being created"); + wxLogMessage(wxT("DnDRectangularShape is being created")); } virtual ~DnDRectangularShape() { - wxLogMessage("DnDRectangularShape is being deleted"); + wxLogMessage(wxT("DnDRectangularShape is being deleted")); } virtual Kind GetKind() const { return Rectangle; } @@ -291,9 +415,8 @@ public: dc.DrawLine(p3, p4); dc.DrawLine(p4, p1); -#ifdef __WXMSW__ + dc.SetBrush(wxBrush(m_col, wxSOLID)); dc.FloodFill(GetCentre(), m_col, wxFLOOD_BORDER); -#endif } }; @@ -305,12 +428,12 @@ public: const wxColour& col) : DnDShape(pos, size, col) { - wxLogMessage("DnDEllipticShape is being created"); + wxLogMessage(wxT("DnDEllipticShape is being created")); } virtual ~DnDEllipticShape() { - wxLogMessage("DnDEllipticShape is being deleted"); + wxLogMessage(wxT("DnDEllipticShape is being deleted")); } virtual Kind GetKind() const { return Ellipse; } @@ -320,9 +443,8 @@ public: dc.DrawEllipse(m_pos, m_size); -#ifdef __WXMSW__ + dc.SetBrush(wxBrush(m_col, wxSOLID)); dc.FloodFill(GetCentre(), m_col, wxFLOOD_BORDER); -#endif } }; @@ -330,7 +452,7 @@ public: // A wxDataObject specialisation for the application-specific data // ---------------------------------------------------------------------------- -static const char *shapeFormatId = "wxShape"; +static const wxChar *shapeFormatId = wxT("wxShape"); class DnDShapeDataObject : public wxDataObject { @@ -363,9 +485,9 @@ public: // we don't draw the shape to a bitmap until it's really needed (i.e. // we're asked to do so) m_hasBitmap = FALSE; -#ifdef USE_METAFILES +#if wxUSE_METAFILES m_hasMetaFile = FALSE; -#endif // Windows +#endif // wxUSE_METAFILES } virtual ~DnDShapeDataObject() { delete m_shape; } @@ -382,9 +504,9 @@ public: m_shape = (DnDShape *)NULL; m_hasBitmap = FALSE; -#ifdef USE_METAFILES +#if wxUSE_METAFILES m_hasMetaFile = FALSE; -#endif // Windows +#endif // wxUSE_METAFILES return shape; } @@ -406,9 +528,9 @@ public: // but the bitmap format(s) are only supported for output nFormats += m_dobjBitmap.GetFormatCount(dir); -#ifdef USE_METAFILES +#if wxUSE_METAFILES nFormats += m_dobjMetaFile.GetFormatCount(dir); -#endif // Windows +#endif // wxUSE_METAFILES } return nFormats; @@ -423,11 +545,11 @@ public: // under Windows m_dobjBitmap.GetAllFormats(&formats[1], dir); -#ifdef USE_METAFILES +#if wxUSE_METAFILES // don't assume that m_dobjBitmap has only 1 format m_dobjMetaFile.GetAllFormats(&formats[1 + m_dobjBitmap.GetFormatCount(dir)], dir); -#endif // Windows +#endif // wxUSE_METAFILES } } @@ -437,17 +559,20 @@ public: { return m_shape->GetDataSize(); } -#ifdef USE_METAFILES - else if ( format == wxDF_METAFILE ) +#if wxUSE_METAFILES + else if ( m_dobjMetaFile.IsSupported(format) ) { if ( !m_hasMetaFile ) CreateMetaFile(); - return m_dobjMetaFile.GetDataSize(); + return m_dobjMetaFile.GetDataSize(format); } -#endif // Windows +#endif // wxUSE_METAFILES else { + wxASSERT_MSG( m_dobjBitmap.IsSupported(format), + wxT("unexpected format") ); + if ( !m_hasBitmap ) CreateBitmap(); @@ -463,17 +588,20 @@ public: return TRUE; } -#ifdef USE_METAFILES - else if ( format == wxDF_METAFILE ) +#if wxUSE_METAFILES + else if ( m_dobjMetaFile.IsSupported(format) ) { if ( !m_hasMetaFile ) CreateMetaFile(); - return m_dobjMetaFile.GetDataHere(pBuf); + return m_dobjMetaFile.GetDataHere(format, pBuf); } -#endif // Windows +#endif // wxUSE_METAFILES else { + wxASSERT_MSG( m_dobjBitmap.IsSupported(format), + wxT("unexpected format") ); + if ( !m_hasBitmap ) CreateBitmap(); @@ -484,7 +612,8 @@ public: virtual bool SetData(const wxDataFormat& format, size_t len, const void *buf) { - wxCHECK_MSG( format == m_formatShape, FALSE, "unsupported format" ); + wxCHECK_MSG( format == m_formatShape, FALSE, + wxT( "unsupported format") ); delete m_shape; m_shape = DnDShape::New(buf); @@ -492,9 +621,9 @@ public: // the shape has changed m_hasBitmap = FALSE; -#ifdef USE_METAFILES +#if wxUSE_METAFILES m_hasMetaFile = FALSE; -#endif // Windows +#endif // wxUSE_METAFILES return TRUE; } @@ -502,19 +631,19 @@ public: private: // creates a bitmap and assigns it to m_dobjBitmap (also sets m_hasBitmap) void CreateBitmap() const; -#ifdef USE_METAFILES +#if wxUSE_METAFILES void CreateMetaFile() const; -#endif // Windows +#endif // wxUSE_METAFILES wxDataFormat m_formatShape; // our custom format wxBitmapDataObject m_dobjBitmap; // it handles bitmaps bool m_hasBitmap; // true if m_dobjBitmap has valid bitmap -#ifdef USE_METAFILES +#if wxUSE_METAFILES wxMetaFileDataObject m_dobjMetaFile;// handles metafiles bool m_hasMetaFile; // true if we have valid metafile -#endif // Windows +#endif // wxUSE_METAFILES DnDShape *m_shape; // our data }; @@ -566,6 +695,10 @@ public: ~DnDShapeFrame(); void SetShape(DnDShape *shape); + virtual bool SetShape(const wxRegion ®ion) + { + return wxFrame::SetShape( region ); + } // callbacks void OnNewShape(wxCommandEvent& event); @@ -605,14 +738,14 @@ public: // override base class (pure) virtuals virtual wxDragResult OnEnter(wxCoord x, wxCoord y, wxDragResult def) - { m_frame->SetStatusText("Mouse entered the frame"); return OnDragOver(x, y, def); } + { m_frame->SetStatusText(_T("Mouse entered the frame")); return OnDragOver(x, y, def); } virtual void OnLeave() - { m_frame->SetStatusText("Mouse left the frame"); } + { m_frame->SetStatusText(_T("Mouse left the frame")); } virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def) { if ( !GetData() ) { - wxLogError("Failed to get drag and drop data"); + wxLogError(wxT("Failed to get drag and drop data")); return wxDragNone; } @@ -627,6 +760,16 @@ private: DnDShapeFrame *m_frame; }; +// ---------------------------------------------------------------------------- +// functions prototypes +// ---------------------------------------------------------------------------- + +static void ShowBitmap(const wxBitmap& bitmap); + +#if wxUSE_METAFILES +static void ShowMetaFile(const wxMetaFile& metafile); +#endif // wxUSE_METAFILES + // ---------------------------------------------------------------------------- // IDs for the menu commands // ---------------------------------------------------------------------------- @@ -635,6 +778,8 @@ enum { Menu_Quit = 1, Menu_Drag, + Menu_DragMoveDef, + Menu_DragMoveAllow, Menu_NewFrame, Menu_About = 101, Menu_Help, @@ -657,6 +802,8 @@ BEGIN_EVENT_TABLE(DnDFrame, wxFrame) EVT_MENU(Menu_Quit, DnDFrame::OnQuit) EVT_MENU(Menu_About, DnDFrame::OnAbout) EVT_MENU(Menu_Drag, DnDFrame::OnDrag) + EVT_MENU(Menu_DragMoveDef, DnDFrame::OnDragMoveByDefault) + EVT_MENU(Menu_DragMoveAllow,DnDFrame::OnDragMoveAllow) EVT_MENU(Menu_NewFrame, DnDFrame::OnNewFrame) EVT_MENU(Menu_Help, DnDFrame::OnHelp) EVT_MENU(Menu_Clear, DnDFrame::OnLogClear) @@ -664,17 +811,20 @@ BEGIN_EVENT_TABLE(DnDFrame, wxFrame) EVT_MENU(Menu_Paste, DnDFrame::OnPaste) EVT_MENU(Menu_CopyBitmap, DnDFrame::OnCopyBitmap) EVT_MENU(Menu_PasteBitmap,DnDFrame::OnPasteBitmap) -#ifdef USE_METAFILES +#if wxUSE_METAFILES EVT_MENU(Menu_PasteMFile, DnDFrame::OnPasteMetafile) -#endif // USE_METAFILES +#endif // wxUSE_METAFILES EVT_MENU(Menu_CopyFiles, DnDFrame::OnCopyFiles) + EVT_UPDATE_UI(Menu_DragMoveDef, DnDFrame::OnUpdateUIMoveByDefault) + EVT_UPDATE_UI(Menu_Paste, DnDFrame::OnUpdateUIPasteText) EVT_UPDATE_UI(Menu_PasteBitmap, DnDFrame::OnUpdateUIPasteBitmap) EVT_LEFT_DOWN( DnDFrame::OnLeftDown) EVT_RIGHT_DOWN( DnDFrame::OnRightDown) EVT_PAINT( DnDFrame::OnPaint) + EVT_SIZE( DnDFrame::OnSize) END_EVENT_TABLE() BEGIN_EVENT_TABLE(DnDShapeFrame, wxFrame) @@ -697,6 +847,18 @@ BEGIN_EVENT_TABLE(DnDShapeDialog, wxDialog) EVT_BUTTON(Button_Colour, DnDShapeDialog::OnColour) END_EVENT_TABLE() +BEGIN_EVENT_TABLE(DnDCanvasBitmap, wxScrolledWindow) + EVT_PAINT(DnDCanvasBitmap::OnPaint) +END_EVENT_TABLE() + +#if wxUSE_METAFILES +BEGIN_EVENT_TABLE(DnDCanvasMetafile, wxScrolledWindow) + EVT_PAINT(DnDCanvasMetafile::OnPaint) +END_EVENT_TABLE() +#endif // wxUSE_METAFILES + +#endif // wxUSE_DRAG_AND_DROP + // ============================================================================ // implementation // ============================================================================ @@ -704,25 +866,7 @@ END_EVENT_TABLE() // `Main program' equivalent, creating windows and returning main app frame bool DnDApp::OnInit() { - // load our ressources - wxPathList pathList; - pathList.Add("."); -#ifdef __WXMSW__ - pathList.Add("./Debug"); - pathList.Add("./Release"); -#endif // wxMSW - - wxString path = pathList.FindValidPath("dnd.wxr"); - if ( !path ) - { - wxLogError("Can't find the resource file dnd.wxr in the current " - "directory, aborting."); - - return FALSE; - } - - wxDefaultResourceTable->ParseResourceFile(path); - +#if wxUSE_DRAG_AND_DROP // switch on trace messages #if defined(__WXGTK__) wxLog::AddTraceMask(_T("clipboard")); @@ -740,7 +884,7 @@ bool DnDApp::OnInit() // create the main frame window DnDFrame *frame = new DnDFrame((wxFrame *) NULL, - "Drag-and-Drop/Clipboard wxWindows Sample", + _T("Drag-and-Drop/Clipboard wxWindows Sample"), 10, 100, 650, 340); // activate it @@ -749,11 +893,17 @@ bool DnDApp::OnInit() SetTopWindow(frame); return TRUE; +#else + wxMessageBox( _T("This sample has to be compiled with wxUSE_DRAG_AND_DROP"), _T("Building error"), wxOK); + return FALSE; +#endif // wxUSE_DRAG_AND_DROP } -DnDFrame::DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h) +#if wxUSE_DRAG_AND_DROP + +DnDFrame::DnDFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h) : wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h)), - m_strText("wxWindows drag & drop works :-)") + m_strText(_T("wxWindows drag & drop works :-)")) { // frame icon and status bar @@ -763,38 +913,40 @@ DnDFrame::DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h) // construct menu wxMenu *file_menu = new wxMenu; - file_menu->Append(Menu_Drag, "&Test drag..."); + file_menu->Append(Menu_Drag, _T("&Test drag...")); + file_menu->AppendCheckItem(Menu_DragMoveDef, _T("&Move by default")); + file_menu->AppendCheckItem(Menu_DragMoveAllow, _T("&Allow moving")); file_menu->AppendSeparator(); - file_menu->Append(Menu_NewFrame, "&New frame\tCtrl-N"); + file_menu->Append(Menu_NewFrame, _T("&New frame\tCtrl-N")); file_menu->AppendSeparator(); - file_menu->Append(Menu_Quit, "E&xit"); + file_menu->Append(Menu_Quit, _T("E&xit\tCtrl-Q")); wxMenu *log_menu = new wxMenu; - log_menu->Append(Menu_Clear, "Clear\tCtrl-L"); + log_menu->Append(Menu_Clear, _T("Clear\tCtrl-L")); wxMenu *help_menu = new wxMenu; - help_menu->Append(Menu_Help, "&Help..."); + help_menu->Append(Menu_Help, _T("&Help...")); help_menu->AppendSeparator(); - help_menu->Append(Menu_About, "&About"); + help_menu->Append(Menu_About, _T("&About")); wxMenu *clip_menu = new wxMenu; - clip_menu->Append(Menu_Copy, "&Copy text\tCtrl+C"); - clip_menu->Append(Menu_Paste, "&Paste text\tCtrl+V"); + clip_menu->Append(Menu_Copy, _T("&Copy text\tCtrl-C")); + clip_menu->Append(Menu_Paste, _T("&Paste text\tCtrl-V")); clip_menu->AppendSeparator(); - clip_menu->Append(Menu_CopyBitmap, "Copy &bitmap\tAlt+C"); - clip_menu->Append(Menu_PasteBitmap, "Paste b&itmap\tAlt+V"); -#ifdef USE_METAFILES + clip_menu->Append(Menu_CopyBitmap, _T("Copy &bitmap\tCtrl-Shift-C")); + clip_menu->Append(Menu_PasteBitmap, _T("Paste b&itmap\tCtrl-Shift-V")); +#if wxUSE_METAFILES clip_menu->AppendSeparator(); - clip_menu->Append(Menu_PasteMFile, "Paste &metafile\tCtrl-M"); -#endif // USE_METAFILES + clip_menu->Append(Menu_PasteMFile, _T("Paste &metafile\tCtrl-M")); +#endif // wxUSE_METAFILES clip_menu->AppendSeparator(); - clip_menu->Append(Menu_CopyFiles, "Copy &files\tCtrl+F"); + clip_menu->Append(Menu_CopyFiles, _T("Copy &files\tCtrl-F")); wxMenuBar *menu_bar = new wxMenuBar; - menu_bar->Append(file_menu, "&File"); - menu_bar->Append(log_menu, "&Log"); - menu_bar->Append(clip_menu, "&Clipboard"); - menu_bar->Append(help_menu, "&Help"); + menu_bar->Append(file_menu, _T("&File")); + menu_bar->Append(log_menu, _T("&Log")); + menu_bar->Append(clip_menu, _T("&Clipboard")); + menu_bar->Append(help_menu, _T("&Help")); SetMenuBar(menu_bar); @@ -802,14 +954,14 @@ DnDFrame::DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h) wxPoint pos(0, 0); wxSize size(400, 200); - wxString strFile("Drop files here!"), strText("Drop text on me"); + wxString strFile(_T("Drop files here!")), strText(_T("Drop text on me")); m_ctrlFile = new wxListBox(this, -1, pos, size, 1, &strFile, wxLB_HSCROLL | wxLB_ALWAYS_SB ); m_ctrlText = new wxListBox(this, -1, pos, size, 1, &strText, wxLB_HSCROLL | wxLB_ALWAYS_SB ); - m_ctrlLog = new wxTextCtrl(this, -1, "", pos, size, + m_ctrlLog = new wxTextCtrl(this, -1, _T(""), pos, size, wxTE_MULTILINE | wxTE_READONLY | wxSUNKEN_BORDER ); @@ -817,9 +969,10 @@ DnDFrame::DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h) m_pLog = new wxLogTextCtrl(m_ctrlLog); m_pLogPrev = wxLog::SetActiveTarget(m_pLog); - // associate drop targets with 2 text controls + // associate drop targets with the controls m_ctrlFile->SetDropTarget(new DnDFile(m_ctrlFile)); m_ctrlText->SetDropTarget(new DnDText(m_ctrlText)); + m_ctrlLog->SetDropTarget(new URLDropTarget); wxLayoutConstraints *c; @@ -848,6 +1001,11 @@ DnDFrame::DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h) m_ctrlLog->SetConstraints(c); SetAutoLayout(TRUE); + + // copy data by default but allow moving it as well + m_moveByDefault = FALSE; + m_moveAllow = TRUE; + menu_bar->Check(Menu_DragMoveAllow, TRUE); } void DnDFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) @@ -855,6 +1013,13 @@ void DnDFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) Close(TRUE); } +void DnDFrame::OnSize(wxSizeEvent& event) +{ + Refresh(); + + event.Skip(); +} + void DnDFrame::OnPaint(wxPaintEvent& WXUNUSED(event)) { int w = 0; @@ -862,16 +1027,15 @@ void DnDFrame::OnPaint(wxPaintEvent& WXUNUSED(event)) GetClientSize( &w, &h ); wxPaintDC dc(this); - dc.SetFont( wxFont( 24, wxDECORATIVE, wxNORMAL, wxNORMAL, FALSE, "charter" ) ); - dc.DrawText( "Drag text from here!", 20, h-50 ); + // dc.Clear(); -- this kills wxGTK + dc.SetFont( wxFont( 24, wxDECORATIVE, wxNORMAL, wxNORMAL, FALSE, _T("charter") ) ); + dc.DrawText( _T("Drag text from here!"), 100, h-50 ); +} - if ( m_bitmap.Ok() ) - { - // 4/5 is 80% taken by other windows, 20 is arbitrary margin - dc.DrawBitmap(m_bitmap, - w - m_bitmap.GetWidth() - 20, - (4*h)/5 + 20); - } +void DnDFrame::OnUpdateUIMoveByDefault(wxUpdateUIEvent& event) +{ + // only can move by default if moving is allowed at all + event.Enable(m_moveAllow); } void DnDFrame::OnUpdateUIPasteText(wxUpdateUIEvent& event) @@ -900,29 +1064,39 @@ void DnDFrame::OnNewFrame(wxCommandEvent& WXUNUSED(event)) { (new DnDShapeFrame(this))->Show(TRUE); - wxLogStatus(this, "Double click the new frame to select a shape for it"); + wxLogStatus(this, wxT("Double click the new frame to select a shape for it")); } void DnDFrame::OnDrag(wxCommandEvent& WXUNUSED(event)) { wxString strText = wxGetTextFromUser ( - "After you enter text in this dialog, press any mouse\n" - "button in the bottom (empty) part of the frame and \n" - "drag it anywhere - you will be in fact dragging the\n" - "text object containing this text", - "Please enter some text", m_strText, this + _T("After you enter text in this dialog, press any mouse\n") + _T("button in the bottom (empty) part of the frame and \n") + _T("drag it anywhere - you will be in fact dragging the\n") + _T("text object containing this text"), + _T("Please enter some text"), m_strText, this ); m_strText = strText; } +void DnDFrame::OnDragMoveByDefault(wxCommandEvent& event) +{ + m_moveByDefault = event.IsChecked(); +} + +void DnDFrame::OnDragMoveAllow(wxCommandEvent& event) +{ + m_moveAllow = event.IsChecked(); +} + void DnDFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { - wxMessageBox("Drag-&-Drop Demo\n" - "Please see \"Help|Help...\" for details\n" - "Copyright (c) 1998 Vadim Zeitlin", - "About wxDnD", + wxMessageBox(_T("Drag-&-Drop Demo\n") + _T("Please see \"Help|Help...\" for details\n") + _T("Copyright (c) 1998 Vadim Zeitlin"), + _T("About wxDnD"), wxICON_INFORMATION | wxOK, this); } @@ -930,27 +1104,27 @@ void DnDFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) void DnDFrame::OnHelp(wxCommandEvent& /* event */) { wxMessageDialog dialog(this, - "This small program demonstrates drag & drop support in wxWindows. The program window\n" - "consists of 3 parts: the bottom pane is for debug messages, so that you can see what's\n" - "going on inside. The top part is split into 2 listboxes, the left one accepts files\n" - "and the right one accepts text.\n" - "\n" - "To test wxDropTarget: open wordpad (write.exe), select some text in it and drag it to\n" - "the right listbox (you'll notice the usual visual feedback, i.e. the cursor will change).\n" - "Also, try dragging some files (you can select several at once) from Windows Explorer (or \n" - "File Manager) to the left pane. Hold down Ctrl/Shift keys when you drop text (doesn't \n" - "work with files) and see what changes.\n" - "\n" - "To test wxDropSource: just press any mouse button on the empty zone of the window and drag\n" - "it to wordpad or any other droptarget accepting text (and of course you can just drag it\n" - "to the right pane). Due to a lot of trace messages, the cursor might take some time to \n" - "change, don't release the mouse button until it does. You can change the string being\n" - "dragged in in \"File|Test drag...\" dialog.\n" - "\n" - "\n" - "Please send all questions/bug reports/suggestions &c to \n" - "Vadim Zeitlin ", - "wxDnD Help"); + _T("This small program demonstrates drag & drop support in wxWindows. The program window\n") + _T("consists of 3 parts: the bottom pane is for debug messages, so that you can see what's\n") + _T("going on inside. The top part is split into 2 listboxes, the left one accepts files\n") + _T("and the right one accepts text.\n") + _T("\n") + _T("To test wxDropTarget: open wordpad (write.exe), select some text in it and drag it to\n") + _T("the right listbox (you'll notice the usual visual feedback, i.e. the cursor will change).\n") + _T("Also, try dragging some files (you can select several at once) from Windows Explorer (or \n") + _T("File Manager) to the left pane. Hold down Ctrl/Shift keys when you drop text (doesn't \n") + _T("work with files) and see what changes.\n") + _T("\n") + _T("To test wxDropSource: just press any mouse button on the empty zone of the window and drag\n") + _T("it to wordpad or any other droptarget accepting text (and of course you can just drag it\n") + _T("to the right pane). Due to a lot of trace messages, the cursor might take some time to \n") + _T("change, don't release the mouse button until it does. You can change the string being\n") + _T("dragged in in \"File|Test drag...\" dialog.\n") + _T("\n") + _T("\n") + _T("Please send all questions/bug reports/suggestions &c to \n") + _T("Vadim Zeitlin "), + _T("wxDnD Help")); dialog.ShowModal(); } @@ -973,38 +1147,39 @@ void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) ) textData.AddFile( "/file1.txt" ); textData.AddFile( "/file2.txt" ); */ - wxDropSource source(textData, this - -#ifdef __WXMSW__ - ,wxCURSOR_PENCIL, // for copy - wxCURSOR_SPRAYCAN, // for move - wxCURSOR_QUESTION_ARROW // for nothing -#endif - ); - - const char *pc; - - switch ( source.DoDragDrop(TRUE) ) + wxDropSource source(textData, this, + wxDROP_ICON(dnd_copy), + wxDROP_ICON(dnd_move), + wxDROP_ICON(dnd_none)); + + int flags = 0; + if ( m_moveByDefault ) + flags |= wxDrag_DefaultMove; + else if ( m_moveAllow ) + flags |= wxDrag_AllowMove; + + const wxChar *pc; + switch ( source.DoDragDrop(flags) ) { - case wxDragError: pc = "Error!"; break; - case wxDragNone: pc = "Nothing"; break; - case wxDragCopy: pc = "Copied"; break; - case wxDragMove: pc = "Moved"; break; - case wxDragCancel: pc = "Cancelled"; break; - default: pc = "Huh?"; break; + case wxDragError: pc = _T("Error!"); break; + case wxDragNone: pc = _T("Nothing"); break; + case wxDragCopy: pc = _T("Copied"); break; + case wxDragMove: pc = _T("Moved"); break; + case wxDragCancel: pc = _T("Cancelled"); break; + default: pc = _T("Huh?"); break; } - SetStatusText(wxString("Drag result: ") + pc); + SetStatusText(wxString(_T("Drag result: ")) + pc); } } void DnDFrame::OnRightDown(wxMouseEvent &event ) { - wxMenu menu("Dnd sample menu"); + wxMenu menu(_T("Dnd sample menu")); - menu.Append(Menu_Drag, "&Test drag..."); + menu.Append(Menu_Drag, _T("&Test drag...")); menu.AppendSeparator(); - menu.Append(Menu_About, "&About"); + menu.Append(Menu_About, _T("&About")); PopupMenu( &menu, event.GetX(), event.GetY() ); } @@ -1024,10 +1199,10 @@ DnDFrame::~DnDFrame() void DnDFrame::OnCopyBitmap(wxCommandEvent& WXUNUSED(event)) { // PNG support is not always compiled in under Windows, so use BMP there -#ifdef __WXMSW__ - wxFileDialog dialog(this, "Open a BMP file", "", "", "BMP files (*.bmp)|*.bmp", 0); +#if wxUSE_LIBPNG + wxFileDialog dialog(this, _T("Open a PNG file"), _T(""), _T(""), _T("PNG files (*.png)|*.png"), 0); #else - wxFileDialog dialog(this, "Open a PNG file", "", "", "PNG files (*.png)|*.png", 0); + wxFileDialog dialog(this, _T("Open a BMP file"), _T(""), _T(""), _T("BMP files (*.bmp)|*.bmp"), 0); #endif if (dialog.ShowModal() != wxID_OK) @@ -1050,10 +1225,10 @@ void DnDFrame::OnCopyBitmap(wxCommandEvent& WXUNUSED(event)) wxImage image; image.LoadFile( dialog.GetPath(), -#ifdef __WXMSW__ - wxBITMAP_TYPE_BMP -#else +#if wxUSE_LIBPNG wxBITMAP_TYPE_PNG +#else + wxBITMAP_TYPE_BMP #endif ); if (!image.Ok()) @@ -1065,7 +1240,7 @@ void DnDFrame::OnCopyBitmap(wxCommandEvent& WXUNUSED(event)) wxLogStatus( _T("Decoding image file...") ); wxYield(); - wxBitmap bitmap( image.ConvertToBitmap() ); + wxBitmap bitmap( image ); if ( !wxTheClipboard->Open() ) { @@ -1114,15 +1289,17 @@ void DnDFrame::OnPasteBitmap(wxCommandEvent& WXUNUSED(event)) } else { - wxLogMessage(_T("Bitmap pasted from the clipboard") ); - m_bitmap = data.GetBitmap(); - Refresh(); + const wxBitmap& bmp = data.GetBitmap(); + + wxLogMessage(_T("Bitmap %dx%d pasted from the clipboard"), + bmp.GetWidth(), bmp.GetHeight()); + ShowBitmap(bmp); } wxTheClipboard->Close(); } -#ifdef USE_METAFILES +#if wxUSE_METAFILES void DnDFrame::OnPasteMetafile(wxCommandEvent& WXUNUSED(event)) { @@ -1146,16 +1323,19 @@ void DnDFrame::OnPasteMetafile(wxCommandEvent& WXUNUSED(event)) } else { - wxLogMessage(_T("Metafile pasted from the clipboard")); + const wxMetaFile& mf = data.GetMetafile(); - // TODO: show it somewhere + wxLogMessage(_T("Metafile %dx%d pasted from the clipboard"), + mf.GetWidth(), mf.GetHeight()); + + ShowMetaFile(mf); } } wxTheClipboard->Close(); } -#endif // USE_METAFILES +#endif // wxUSE_METAFILES // ---------------------------------------------------------------------------- // file clipboard @@ -1164,8 +1344,8 @@ void DnDFrame::OnPasteMetafile(wxCommandEvent& WXUNUSED(event)) void DnDFrame::OnCopyFiles(wxCommandEvent& WXUNUSED(event)) { #ifdef __WXMSW__ - wxFileDialog dialog(this, "Select a file to copy", "", "", - "All files (*.*)|*.*", 0); + wxFileDialog dialog(this, _T("Select a file to copy"), _T(""), _T(""), + _T("All files (*.*)|*.*"), 0); wxArrayString filenames; while ( dialog.ShowModal() == wxID_OK ) @@ -1185,27 +1365,27 @@ void DnDFrame::OnCopyFiles(wxCommandEvent& WXUNUSED(event)) wxClipboardLocker locker; if ( !locker ) { - wxLogError("Can't open clipboard"); + wxLogError(wxT("Can't open clipboard")); } else { if ( !wxTheClipboard->AddData(dobj) ) { - wxLogError("Can't copy file(s) to the clipboard"); + wxLogError(wxT("Can't copy file(s) to the clipboard")); } else { - wxLogStatus(this, "%d file%s copied to the clipboard", - count, count == 1 ? "" : "s"); + wxLogStatus(this, wxT("%d file%s copied to the clipboard"), + count, count == 1 ? wxT("") : wxT("s")); } } } else { - wxLogStatus(this, "Aborted"); + wxLogStatus(this, wxT("Aborted")); } #else // !MSW - wxLogError("Sorry, not implemented"); + wxLogError(wxT("Sorry, not implemented")); #endif // MSW/!MSW } @@ -1280,7 +1460,7 @@ bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames) { size_t nFiles = filenames.GetCount(); wxString str; - str.Printf( _T("%d files dropped"), nFiles); + str.Printf( _T("%d files dropped"), (int)nFiles); m_pOwner->Append(str); for ( size_t n = 0; n < nFiles; n++ ) { m_pOwner->Append(filenames[n]); @@ -1294,17 +1474,72 @@ bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames) // ---------------------------------------------------------------------------- DnDShapeDialog::DnDShapeDialog(wxFrame *parent, DnDShape *shape) + :wxDialog( parent, 6001, wxT("Choose Shape"), wxPoint( 10, 10 ), + wxSize( 40, 40 ), + wxRAISED_BORDER|wxCAPTION|wxTHICK_FRAME|wxSYSTEM_MENU ) { m_shape = shape; - - LoadFromResource(parent, "dialogShape"); - - m_textX = (wxTextCtrl *)wxFindWindowByName("textX", this); - m_textY = (wxTextCtrl *)wxFindWindowByName("textY", this); - m_textW = (wxTextCtrl *)wxFindWindowByName("textW", this); - m_textH = (wxTextCtrl *)wxFindWindowByName("textH", this); - - m_radio = (wxRadioBox *)wxFindWindowByName("radio", this); + wxBoxSizer* topSizer = new wxBoxSizer( wxVERTICAL ); + + // radio box + wxBoxSizer* shapesSizer = new wxBoxSizer( wxHORIZONTAL ); + const wxString choices[] = { wxT("None"), wxT("Triangle"), + wxT("Rectangle"), wxT("Ellipse") }; + + m_radio = new wxRadioBox( this, -1, wxT("&Shape"), + wxDefaultPosition, wxDefaultSize, 4, choices, 4, + wxRA_SPECIFY_COLS ); + shapesSizer->Add( m_radio, 0, wxGROW|wxALL, 5 ); + topSizer->Add( shapesSizer, 0, wxALL, 2 ); + + // attributes + wxStaticBox* box = new wxStaticBox( this, -1, wxT("&Attributes") ); + wxStaticBoxSizer* attrSizer = new wxStaticBoxSizer( box, wxHORIZONTAL ); + wxFlexGridSizer* xywhSizer = new wxFlexGridSizer( 4, 2 ); + + wxStaticText* st; + + st = new wxStaticText( this, -1, wxT("Position &X:") ); + m_textX = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, + wxSize( 30, 20 ) ); + xywhSizer->Add( st, 1, wxGROW|wxALL, 2 ); + xywhSizer->Add( m_textX, 1, wxGROW|wxALL, 2 ); + + st = new wxStaticText( this, -1, wxT("Size &width:") ); + m_textW = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, + wxSize( 30, 20 ) ); + xywhSizer->Add( st, 1, wxGROW|wxALL, 2 ); + xywhSizer->Add( m_textW, 1, wxGROW|wxALL, 2 ); + + st = new wxStaticText( this, -1, wxT("&Y:") ); + m_textY = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, + wxSize( 30, 20 ) ); + xywhSizer->Add( st, 1, wxALL|wxALIGN_RIGHT, 2 ); + xywhSizer->Add( m_textY, 1, wxGROW|wxALL, 2 ); + + st = new wxStaticText( this, -1, wxT("&height:") ); + m_textH = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, + wxSize( 30, 20 ) ); + xywhSizer->Add( st, 1, wxALL|wxALIGN_RIGHT, 2 ); + xywhSizer->Add( m_textH, 1, wxGROW|wxALL, 2 ); + + wxButton* col = new wxButton( this, Button_Colour, wxT("&Colour...") ); + attrSizer->Add( xywhSizer, 1, wxGROW ); + attrSizer->Add( col, 0, wxALL|wxALIGN_CENTRE_VERTICAL, 2 ); + topSizer->Add( attrSizer, 0, wxGROW|wxALL, 5 ); + + // buttons + wxBoxSizer* buttonSizer = new wxBoxSizer( wxHORIZONTAL ); + wxButton* bt; + bt = new wxButton( this, wxID_OK, wxT("Ok") ); + buttonSizer->Add( bt, 0, wxALL, 2 ); + bt = new wxButton( this, wxID_CANCEL, wxT("Cancel") ); + buttonSizer->Add( bt, 0, wxALL, 2 ); + topSizer->Add( buttonSizer, 0, wxALL|wxALIGN_RIGHT, 2 ); + + SetAutoLayout( TRUE ); + SetSizer( topSizer ); + topSizer->Fit( this ); } DnDShape *DnDShapeDialog::GetShape() const @@ -1348,15 +1583,15 @@ bool DnDShapeDialog::TransferDataFromWindow() { m_shapeKind = (DnDShape::Kind)m_radio->GetSelection(); - m_pos.x = atoi(m_textX->GetValue()); - m_pos.y = atoi(m_textY->GetValue()); - m_size.x = atoi(m_textW->GetValue()); - m_size.y = atoi(m_textH->GetValue()); + m_pos.x = wxAtoi(m_textX->GetValue()); + m_pos.y = wxAtoi(m_textY->GetValue()); + m_size.x = wxAtoi(m_textW->GetValue()); + m_size.y = wxAtoi(m_textH->GetValue()); if ( !m_pos.x || !m_pos.y || !m_size.x || !m_size.y ) { - wxMessageBox("All sizes and positions should be non null!", - "Invalid shape", wxICON_HAND | wxOK, this); + wxMessageBox(_T("All sizes and positions should be non null!"), + _T("Invalid shape"), wxICON_HAND | wxOK, this); return FALSE; } @@ -1388,45 +1623,45 @@ void DnDShapeDialog::OnColour(wxCommandEvent& WXUNUSED(event)) DnDShapeFrame *DnDShapeFrame::ms_lastDropTarget = NULL; DnDShapeFrame::DnDShapeFrame(wxFrame *parent) - : wxFrame(parent, -1, "Shape Frame", + : wxFrame(parent, -1, _T("Shape Frame"), wxDefaultPosition, wxSize(250, 150)) { CreateStatusBar(); wxMenu *menuShape = new wxMenu; - menuShape->Append(Menu_Shape_New, "&New default shape\tCtrl-S"); - menuShape->Append(Menu_Shape_Edit, "&Edit shape\tCtrl-E"); + menuShape->Append(Menu_Shape_New, _T("&New default shape\tCtrl-S")); + menuShape->Append(Menu_Shape_Edit, _T("&Edit shape\tCtrl-E")); menuShape->AppendSeparator(); - menuShape->Append(Menu_Shape_Clear, "&Clear shape\tCtrl-L"); + menuShape->Append(Menu_Shape_Clear, _T("&Clear shape\tCtrl-L")); wxMenu *menuClipboard = new wxMenu; - menuClipboard->Append(Menu_ShapeClipboard_Copy, "&Copy\tCtrl-C"); - menuClipboard->Append(Menu_ShapeClipboard_Paste, "&Paste\tCtrl-V"); + menuClipboard->Append(Menu_ShapeClipboard_Copy, _T("&Copy\tCtrl-C")); + menuClipboard->Append(Menu_ShapeClipboard_Paste, _T("&Paste\tCtrl-V")); wxMenuBar *menubar = new wxMenuBar; - menubar->Append(menuShape, "&Shape"); - menubar->Append(menuClipboard, "&Clipboard"); + menubar->Append(menuShape, _T("&Shape")); + menubar->Append(menuClipboard, _T("&Clipboard")); SetMenuBar(menubar); - SetStatusText("Press Ctrl-S to create a new shape"); + SetStatusText(_T("Press Ctrl-S to create a new shape")); SetDropTarget(new DnDShapeDropTarget(this)); m_shape = NULL; - + SetBackgroundColour(*wxWHITE); } DnDShapeFrame::~DnDShapeFrame() { - if (m_shape) + if (m_shape) delete m_shape; } void DnDShapeFrame::SetShape(DnDShape *shape) { - if (m_shape) + if (m_shape) delete m_shape; m_shape = shape; Refresh(); @@ -1446,24 +1681,24 @@ void DnDShapeFrame::OnDrag(wxMouseEvent& event) DnDShapeDataObject shapeData(m_shape); wxDropSource source(shapeData, this); - const char *pc = NULL; + const wxChar *pc = NULL; switch ( source.DoDragDrop(TRUE) ) { default: case wxDragError: - wxLogError("An error occured during drag and drop operation"); + wxLogError(wxT("An error occured during drag and drop operation")); break; case wxDragNone: - SetStatusText("Nothing happened"); + SetStatusText(_T("Nothing happened")); break; case wxDragCopy: - pc = "copied"; + pc = _T("copied"); break; case wxDragMove: - pc = "moved"; + pc = _T("moved"); if ( ms_lastDropTarget != this ) { // don't delete the shape if we dropped it on ourselves! @@ -1472,13 +1707,13 @@ void DnDShapeFrame::OnDrag(wxMouseEvent& event) break; case wxDragCancel: - SetStatusText("Drag and drop operation cancelled"); + SetStatusText(_T("Drag and drop operation cancelled")); break; } if ( pc ) { - SetStatusText(wxString("Shape successfully ") + pc); + SetStatusText(wxString(_T("Shape successfully ")) + pc); } //else: status text already set } @@ -1490,14 +1725,14 @@ void DnDShapeFrame::OnDrop(wxCoord x, wxCoord y, DnDShape *shape) wxPoint pt(x, y); wxString s; - s.Printf("Shape dropped at (%ld, %ld)", pt.x, pt.y); + s.Printf(wxT("Shape dropped at (%d, %d)"), pt.x, pt.y); SetStatusText(s); shape->Move(pt); SetShape(shape); } -void DnDShapeFrame::OnEditShape(wxCommandEvent& event) +void DnDShapeFrame::OnEditShape(wxCommandEvent& WXUNUSED(event)) { DnDShapeDialog dlg(this, m_shape); if ( dlg.ShowModal() == wxID_OK ) @@ -1506,62 +1741,45 @@ void DnDShapeFrame::OnEditShape(wxCommandEvent& event) if ( m_shape ) { - SetStatusText("You can now drag the shape to another frame"); + SetStatusText(_T("You can now drag the shape to another frame")); } } } -void DnDShapeFrame::OnNewShape(wxCommandEvent& event) +void DnDShapeFrame::OnNewShape(wxCommandEvent& WXUNUSED(event)) { SetShape(new DnDEllipticShape(wxPoint(10, 10), wxSize(80, 60), *wxRED)); - SetStatusText("You can now drag the shape to another frame"); + SetStatusText(_T("You can now drag the shape to another frame")); } -void DnDShapeFrame::OnClearShape(wxCommandEvent& event) +void DnDShapeFrame::OnClearShape(wxCommandEvent& WXUNUSED(event)) { SetShape(NULL); } -void DnDShapeFrame::OnCopyShape(wxCommandEvent& event) +void DnDShapeFrame::OnCopyShape(wxCommandEvent& WXUNUSED(event)) { if ( m_shape ) { -#if 1 wxClipboardLocker clipLocker; if ( !clipLocker ) { - wxLogError("Can't open the clipboard"); + wxLogError(wxT("Can't open the clipboard")); return; } wxTheClipboard->AddData(new DnDShapeDataObject(m_shape)); -#else - // VZ: temp test code, will remove - wxOpenClipboard(); - - wxMetaFileDC dcMF; - - m_shape->Draw(dcMF); - - wxMetafile *mf = dcMF.Close(); - - wxPoint pos = m_shape->GetPosition(); - wxSize size = m_shape->GetSize(); - wxSetClipboardData(wxDF_METAFILE, mf, pos.x + size.x, pos.y + size.y); - - wxCloseClipboard(); -#endif } } -void DnDShapeFrame::OnPasteShape(wxCommandEvent& event) +void DnDShapeFrame::OnPasteShape(wxCommandEvent& WXUNUSED(event)) { wxClipboardLocker clipLocker; if ( !clipLocker ) { - wxLogError("Can't open the clipboard"); + wxLogError(wxT("Can't open the clipboard")); return; } @@ -1573,7 +1791,7 @@ void DnDShapeFrame::OnPasteShape(wxCommandEvent& event) } else { - wxLogStatus("No shape on the clipboard"); + wxLogStatus(wxT("No shape on the clipboard")); } } @@ -1626,7 +1844,7 @@ DnDShape *DnDShape::New(const void *buf) wxColour(dump.r, dump.g, dump.b)); default: - wxFAIL_MSG("invalid shape!"); + wxFAIL_MSG(wxT("invalid shape!")); return NULL; } } @@ -1635,27 +1853,27 @@ DnDShape *DnDShape::New(const void *buf) // DnDShapeDataObject // ---------------------------------------------------------------------------- -#ifdef USE_METAFILES +#if wxUSE_METAFILES void DnDShapeDataObject::CreateMetaFile() const { - wxMetaFileDC dcMF; + wxPoint pos = m_shape->GetPosition(); + wxSize size = m_shape->GetSize(); + + wxMetaFileDC dcMF(wxEmptyString, pos.x + size.x, pos.y + size.y); m_shape->Draw(dcMF); wxMetafile *mf = dcMF.Close(); - wxPoint pos = m_shape->GetPosition(); - wxSize size = m_shape->GetSize(); - mf->SetWidth(pos.x + size.x); - mf->SetHeight(pos.y + size.y); - DnDShapeDataObject *self = (DnDShapeDataObject *)this; // const_cast self->m_dobjMetaFile.SetMetafile(*mf); self->m_hasMetaFile = TRUE; + + delete mf; } -#endif // Windows +#endif // wxUSE_METAFILES void DnDShapeDataObject::CreateBitmap() const { @@ -1666,7 +1884,7 @@ void DnDShapeDataObject::CreateBitmap() const wxBitmap bitmap(x, y); wxMemoryDC dc; dc.SelectObject(bitmap); - dc.SetBrush(wxBrush("white", wxSOLID)); + dc.SetBrush(wxBrush(wxT("white"), wxSOLID)); dc.Clear(); m_shape->Draw(dc); dc.SelectObject(wxNullBitmap); @@ -1676,3 +1894,42 @@ void DnDShapeDataObject::CreateBitmap() const self->m_hasBitmap = TRUE; } +// ---------------------------------------------------------------------------- +// global functions +// ---------------------------------------------------------------------------- + +static void ShowBitmap(const wxBitmap& bitmap) +{ + wxFrame *frame = new wxFrame(NULL, -1, _T("Bitmap view")); + frame->CreateStatusBar(); + DnDCanvasBitmap *canvas = new DnDCanvasBitmap(frame); + canvas->SetBitmap(bitmap); + + int w = bitmap.GetWidth(), + h = bitmap.GetHeight(); + frame->SetStatusText(wxString::Format(_T("%dx%d"), w, h)); + + frame->SetClientSize(w > 100 ? 100 : w, h > 100 ? 100 : h); + frame->Show(TRUE); +} + +#if wxUSE_METAFILES + +static void ShowMetaFile(const wxMetaFile& metafile) +{ + wxFrame *frame = new wxFrame(NULL, -1, _T("Metafile view")); + frame->CreateStatusBar(); + DnDCanvasMetafile *canvas = new DnDCanvasMetafile(frame); + canvas->SetMetafile(metafile); + + wxSize size = metafile.GetSize(); + frame->SetStatusText(wxString::Format(_T("%dx%d"), size.x, size.y)); + + frame->SetClientSize(size.x > 100 ? 100 : size.x, + size.y > 100 ? 100 : size.y); + frame->Show(); +} + +#endif // wxUSE_METAFILES + +#endif // wxUSE_DRAG_AND_DROP