X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d1f4723592a86208a941bd486a9c1f18f43b5f51..acd32ffcdb319f162633c20e0202db3f8542998a:/samples/dnd/dnd.cpp?ds=inline diff --git a/samples/dnd/dnd.cpp b/samples/dnd/dnd.cpp index 7c707d4928..9c2651c34b 100644 --- a/samples/dnd/dnd.cpp +++ b/samples/dnd/dnd.cpp @@ -19,29 +19,22 @@ #include "wx/wx.h" #endif -#include "wx/intl.h" -#include "wx/log.h" - #include "wx/dnd.h" -#include "wx/dirdlg.h" -#include "wx/filedlg.h" +#include "wx/dataobj.h" #include "wx/image.h" #include "wx/clipbrd.h" #include "wx/colordlg.h" -#include "wx/sizer.h" -#include "wx/dataobj.h" - -#if wxUSE_METAFILES - #include "wx/metafile.h" -#endif // wxUSE_METAFILES +#include "wx/metafile.h" +#include "wx/dirctrl.h" #if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__) - #include "mondrian.xpm" - + #include "../sample.xpm" +#if wxUSE_DRAG_AND_DROP #include "dnd_copy.xpm" #include "dnd_move.xpm" #include "dnd_none.xpm" #endif +#endif #if wxUSE_DRAG_AND_DROP @@ -64,7 +57,7 @@ private: class DnDFile : public wxFileDropTarget { public: - DnDFile(wxListBox *pOwner) { m_pOwner = pOwner; } + DnDFile(wxListBox *pOwner = NULL) { m_pOwner = pOwner; } virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames); @@ -121,7 +114,7 @@ public: virtual bool OnInit(); }; -IMPLEMENT_APP(DnDApp); +IMPLEMENT_APP(DnDApp) #if wxUSE_DRAG_AND_DROP || wxUSE_CLIPBOARD @@ -162,7 +155,7 @@ private: DECLARE_EVENT_TABLE() }; -#if wxUSE_METAFILES +#if wxUSE_METAFILE // and the same thing fo metafiles class DnDCanvasMetafile : public wxScrolledWindow @@ -180,7 +173,7 @@ public: Refresh(); } - void OnPaint(wxPaintEvent& event) + void OnPaint(wxPaintEvent&) { wxPaintDC dc(this); @@ -198,7 +191,7 @@ private: DECLARE_EVENT_TABLE() }; -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE // ---------------------------------------------------------------------------- // Define a new frame type for the main frame @@ -207,7 +200,7 @@ private: class DnDFrame : public wxFrame { public: - DnDFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h); + DnDFrame(); virtual ~DnDFrame(); void OnPaint(wxPaintEvent& event); @@ -219,7 +212,9 @@ public: void OnDragMoveAllow(wxCommandEvent& event); void OnNewFrame(wxCommandEvent& event); void OnHelp (wxCommandEvent& event); +#if wxUSE_LOG void OnLogClear(wxCommandEvent& event); +#endif // wxUSE_LOG void OnCopy(wxCommandEvent& event); void OnPaste(wxCommandEvent& event); @@ -227,30 +222,44 @@ public: void OnCopyBitmap(wxCommandEvent& event); void OnPasteBitmap(wxCommandEvent& event); -#if wxUSE_METAFILES +#if wxUSE_METAFILE void OnPasteMetafile(wxCommandEvent& event); -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE void OnCopyFiles(wxCommandEvent& event); + void OnUsePrimary(wxCommandEvent& event); + void OnLeftDown(wxMouseEvent& event); void OnRightDown(wxMouseEvent& event); +#if wxUSE_DRAG_AND_DROP + void OnBeginDrag(wxTreeEvent& event); +#endif // wxUSE_DRAG_AND_DROP + void OnUpdateUIMoveByDefault(wxUpdateUIEvent& event); void OnUpdateUIPasteText(wxUpdateUIEvent& event); void OnUpdateUIPasteBitmap(wxUpdateUIEvent& event); - DECLARE_EVENT_TABLE() - private: +#if wxUSE_DRAG_AND_DROP + // show the result of a dnd operation in the status bar + void LogDragResult(wxDragResult result); +#endif // wxUSE_DRAG_AND_DROP + + // GUI controls wxListBox *m_ctrlFile, *m_ctrlText; + wxGenericDirCtrl *m_ctrlDir; + +#if wxUSE_LOG wxTextCtrl *m_ctrlLog; wxLog *m_pLog, *m_pLogPrev; +#endif // wxUSE_LOG // move the text by default (or copy)? bool m_moveByDefault; @@ -259,7 +268,10 @@ private: bool m_moveAllow; // the text we drag - wxString m_strText; + wxString m_strText; + + + DECLARE_EVENT_TABLE() }; // ---------------------------------------------------------------------------- @@ -339,10 +351,10 @@ protected: struct ShapeDump { - int x, y, // position - w, h, // size - r, g, b, // colour - k; // kind + wxCoord x, y, // position + w, h; // size + int k; // kind + unsigned char r, g, b; // colour }; wxPoint m_pos; @@ -488,9 +500,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; -#if wxUSE_METAFILES +#if wxUSE_METAFILE m_hasMetaFile = false; -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE } virtual ~DnDShapeDataObject() { delete m_shape; } @@ -507,9 +519,9 @@ public: m_shape = (DnDShape *)NULL; m_hasBitmap = false; -#if wxUSE_METAFILES +#if wxUSE_METAFILE m_hasMetaFile = false; -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE return shape; } @@ -531,9 +543,9 @@ public: // but the bitmap format(s) are only supported for output nFormats += m_dobjBitmap.GetFormatCount(dir); -#if wxUSE_METAFILES +#if wxUSE_METAFILE nFormats += m_dobjMetaFile.GetFormatCount(dir); -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE } return nFormats; @@ -548,11 +560,11 @@ public: // under Windows m_dobjBitmap.GetAllFormats(&formats[1], dir); -#if wxUSE_METAFILES +#if wxUSE_METAFILE // don't assume that m_dobjBitmap has only 1 format m_dobjMetaFile.GetAllFormats(&formats[1 + m_dobjBitmap.GetFormatCount(dir)], dir); -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE } } @@ -562,7 +574,7 @@ public: { return m_shape->GetDataSize(); } -#if wxUSE_METAFILES +#if wxUSE_METAFILE else if ( m_dobjMetaFile.IsSupported(format) ) { if ( !m_hasMetaFile ) @@ -570,7 +582,7 @@ public: return m_dobjMetaFile.GetDataSize(format); } -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE else { wxASSERT_MSG( m_dobjBitmap.IsSupported(format), @@ -591,7 +603,7 @@ public: return true; } -#if wxUSE_METAFILES +#if wxUSE_METAFILE else if ( m_dobjMetaFile.IsSupported(format) ) { if ( !m_hasMetaFile ) @@ -599,7 +611,7 @@ public: return m_dobjMetaFile.GetDataHere(format, pBuf); } -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE else { wxASSERT_MSG( m_dobjBitmap.IsSupported(format), @@ -624,9 +636,9 @@ public: // the shape has changed m_hasBitmap = false; -#if wxUSE_METAFILES +#if wxUSE_METAFILE m_hasMetaFile = false; -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE return true; } @@ -634,19 +646,19 @@ public: private: // creates a bitmap and assigns it to m_dobjBitmap (also sets m_hasBitmap) void CreateBitmap() const; -#if wxUSE_METAFILES +#if wxUSE_METAFILE void CreateMetaFile() const; -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE wxDataFormat m_formatShape; // our custom format wxBitmapDataObject m_dobjBitmap; // it handles bitmaps bool m_hasBitmap; // true if m_dobjBitmap has valid bitmap -#if wxUSE_METAFILES +#if wxUSE_METAFILE wxMetaFileDataObject m_dobjMetaFile;// handles metafiles bool m_hasMetaFile; // true if we have valid metafile -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE DnDShape *m_shape; // our data }; @@ -741,9 +753,18 @@ public: // override base class (pure) virtuals virtual wxDragResult OnEnter(wxCoord x, wxCoord y, wxDragResult def) - { m_frame->SetStatusText(_T("Mouse entered the frame")); return OnDragOver(x, y, def); } + { +#if wxUSE_STATUSBAR + m_frame->SetStatusText(_T("Mouse entered the frame")); +#endif // wxUSE_STATUSBAR + return OnDragOver(x, y, def); + } virtual void OnLeave() - { m_frame->SetStatusText(_T("Mouse left the frame")); } + { +#if wxUSE_STATUSBAR + m_frame->SetStatusText(_T("Mouse left the frame")); +#endif // wxUSE_STATUSBAR + } virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def) { if ( !GetData() ) @@ -771,9 +792,9 @@ private: static void ShowBitmap(const wxBitmap& bitmap); -#if wxUSE_METAFILES +#if wxUSE_METAFILE static void ShowMetaFile(const wxMetaFile& metafile); -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE // ---------------------------------------------------------------------------- // IDs for the menu commands @@ -795,6 +816,7 @@ enum Menu_PasteBitmap, Menu_PasteMFile, Menu_CopyFiles, + Menu_UsePrimary, Menu_Shape_New = 500, Menu_Shape_Edit, Menu_Shape_Clear, @@ -811,15 +833,18 @@ BEGIN_EVENT_TABLE(DnDFrame, wxFrame) EVT_MENU(Menu_DragMoveAllow,DnDFrame::OnDragMoveAllow) EVT_MENU(Menu_NewFrame, DnDFrame::OnNewFrame) EVT_MENU(Menu_Help, DnDFrame::OnHelp) +#if wxUSE_LOG EVT_MENU(Menu_Clear, DnDFrame::OnLogClear) +#endif // wxUSE_LOG EVT_MENU(Menu_Copy, DnDFrame::OnCopy) EVT_MENU(Menu_Paste, DnDFrame::OnPaste) EVT_MENU(Menu_CopyBitmap, DnDFrame::OnCopyBitmap) EVT_MENU(Menu_PasteBitmap,DnDFrame::OnPasteBitmap) -#if wxUSE_METAFILES +#if wxUSE_METAFILE EVT_MENU(Menu_PasteMFile, DnDFrame::OnPasteMetafile) -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE EVT_MENU(Menu_CopyFiles, DnDFrame::OnCopyFiles) + EVT_MENU(Menu_UsePrimary, DnDFrame::OnUsePrimary) EVT_UPDATE_UI(Menu_DragMoveDef, DnDFrame::OnUpdateUIMoveByDefault) @@ -860,11 +885,11 @@ BEGIN_EVENT_TABLE(DnDCanvasBitmap, wxScrolledWindow) EVT_PAINT(DnDCanvasBitmap::OnPaint) END_EVENT_TABLE() -#if wxUSE_METAFILES +#if wxUSE_METAFILE BEGIN_EVENT_TABLE(DnDCanvasMetafile, wxScrolledWindow) EVT_PAINT(DnDCanvasMetafile::OnPaint) END_EVENT_TABLE() -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE #endif // wxUSE_DRAG_AND_DROP @@ -875,31 +900,25 @@ END_EVENT_TABLE() // `Main program' equivalent, creating windows and returning main app frame bool DnDApp::OnInit() { + if ( !wxApp::OnInit() ) + return false; + #if wxUSE_DRAG_AND_DROP || wxUSE_CLIPBOARD // switch on trace messages +#if wxUSE_LOG #if defined(__WXGTK__) wxLog::AddTraceMask(_T("clipboard")); #elif defined(__WXMSW__) wxLog::AddTraceMask(wxTRACE_OleCalls); #endif +#endif // wxUSE_LOG #if wxUSE_LIBPNG wxImage::AddHandler( new wxPNGHandler ); #endif - // under X we usually want to use the primary selection by default (which - // is shared with other apps) - wxTheClipboard->UsePrimarySelection(); - // create the main frame window - DnDFrame *frame = new DnDFrame((wxFrame *) NULL, - _T("Drag-and-Drop/Clipboard wxWindows Sample"), - 10, 100, 650, 340); - - // activate it - frame->Show(true); - - SetTopWindow(frame); + new DnDFrame(); return true; #else @@ -910,15 +929,18 @@ bool DnDApp::OnInit() #if wxUSE_DRAG_AND_DROP || wxUSE_CLIPBOARD -DnDFrame::DnDFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h) - : wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h)), - m_strText(_T("wxWindows drag & drop works :-)")) +DnDFrame::DnDFrame() + : wxFrame(NULL, wxID_ANY, _T("Drag-and-Drop/Clipboard wxWidgets Sample"), + wxPoint(10, 100)), + m_strText(_T("wxWidgets drag & drop works :-)")) { // frame icon and status bar - SetIcon(wxICON(mondrian)); + SetIcon(wxICON(sample)); +#if wxUSE_STATUSBAR CreateStatusBar(); +#endif // wxUSE_STATUSBAR // construct menu wxMenu *file_menu = new wxMenu; @@ -930,8 +952,10 @@ DnDFrame::DnDFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h) file_menu->AppendSeparator(); file_menu->Append(Menu_Quit, _T("E&xit\tCtrl-Q")); +#if wxUSE_LOG wxMenu *log_menu = new wxMenu; log_menu->Append(Menu_Clear, _T("Clear\tCtrl-L")); +#endif // wxUSE_LOG wxMenu *help_menu = new wxMenu; help_menu->Append(Menu_Help, _T("&Help...")); @@ -944,59 +968,98 @@ DnDFrame::DnDFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h) clip_menu->AppendSeparator(); 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 +#if wxUSE_METAFILE clip_menu->AppendSeparator(); clip_menu->Append(Menu_PasteMFile, _T("Paste &metafile\tCtrl-M")); -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE clip_menu->AppendSeparator(); clip_menu->Append(Menu_CopyFiles, _T("Copy &files\tCtrl-F")); + clip_menu->AppendSeparator(); + clip_menu->AppendCheckItem(Menu_UsePrimary, _T("Use &primary selection\tCtrl-P")); wxMenuBar *menu_bar = new wxMenuBar; menu_bar->Append(file_menu, _T("&File")); +#if wxUSE_LOG menu_bar->Append(log_menu, _T("&Log")); +#endif // wxUSE_LOG menu_bar->Append(clip_menu, _T("&Clipboard")); menu_bar->Append(help_menu, _T("&Help")); SetMenuBar(menu_bar); - // make a panel with 3 subwindows + // create the child controls + SetBackgroundColour(*wxWHITE); // labels read better on this background + wxString strFile(_T("Drop files here!")), strText(_T("Drop text on me")); m_ctrlFile = new wxListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 1, &strFile, wxLB_HSCROLL | wxLB_ALWAYS_SB ); m_ctrlText = new wxListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 1, &strText, wxLB_HSCROLL | wxLB_ALWAYS_SB ); + m_ctrlDir = new wxGenericDirCtrl(this); - m_ctrlLog = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition, wxDefaultSize, +#if wxUSE_LOG + m_ctrlLog = new wxTextCtrl(this, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY | wxSUNKEN_BORDER ); // redirect log messages to the text window m_pLog = new wxLogTextCtrl(m_ctrlLog); m_pLogPrev = wxLog::SetActiveTarget(m_pLog); +#endif // wxUSE_LOG #if wxUSE_DRAG_AND_DROP // associate drop targets with the controls m_ctrlFile->SetDropTarget(new DnDFile(m_ctrlFile)); m_ctrlText->SetDropTarget(new DnDText(m_ctrlText)); + +#if wxUSE_DRAG_AND_DROP + m_ctrlDir->Connect + ( + wxID_ANY, + wxEVT_COMMAND_TREE_BEGIN_DRAG, + wxTreeEventHandler(DnDFrame::OnBeginDrag), + NULL, + this + ); +#endif // wxUSE_DRAG_AND_DROP + +#if wxUSE_LOG m_ctrlLog->SetDropTarget(new URLDropTarget); +#endif // wxUSE_LOG #endif // wxUSE_DRAG_AND_DROP - wxBoxSizer *m_sizer_top = new wxBoxSizer( wxHORIZONTAL ); - m_sizer_top->Add(m_ctrlFile, 1, wxEXPAND ); - m_sizer_top->Add(m_ctrlText, 1, wxEXPAND ); + wxBoxSizer *sizer_top = new wxBoxSizer( wxHORIZONTAL ); + sizer_top->Add(m_ctrlFile, 1, wxEXPAND ); + sizer_top->Add(m_ctrlText, 1, wxEXPAND ); - wxBoxSizer *m_sizer = new wxBoxSizer( wxVERTICAL ); - m_sizer->Add(m_sizer_top, 1, wxEXPAND ); - m_sizer->Add(m_ctrlLog, 1, wxEXPAND | wxBOTTOM, 50); + wxBoxSizer *sizerDirCtrl = new wxBoxSizer(wxVERTICAL); + sizerDirCtrl->Add(new wxStaticText(this, wxID_ANY, "Drag files from here"), + wxSizerFlags().Centre().Border()); + sizerDirCtrl->Add(m_ctrlDir, wxSizerFlags(1).Expand()); + sizer_top->Add(sizerDirCtrl, 1, wxEXPAND ); - SetSizer( m_sizer ); - m_sizer->SetSizeHints( this ); + // make all columns of reasonable minimal size + for ( unsigned n = 0; n < sizer_top->GetChildren().size(); n++ ) + sizer_top->SetItemMinSize(n, 200, 300); + + wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL ); + sizer->Add(sizer_top, 1, wxEXPAND ); +#if wxUSE_LOG + sizer->Add(m_ctrlLog, 2, wxEXPAND); + sizer->SetItemMinSize(m_ctrlLog, 450, 200); +#endif // wxUSE_LOG + sizer->AddSpacer(50); // copy data by default but allow moving it as well m_moveByDefault = false; m_moveAllow = true; menu_bar->Check(Menu_DragMoveAllow, true); + + // set the correct size and show the frame + SetSizerAndFit(sizer); + Show(); } void DnDFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) @@ -1099,7 +1162,7 @@ void DnDFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) void DnDFrame::OnHelp(wxCommandEvent& /* event */) { wxMessageDialog dialog(this, - _T("This small program demonstrates drag & drop support in wxWindows. The program window\n") + _T("This small program demonstrates drag & drop support in wxWidgets. 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") @@ -1124,25 +1187,46 @@ void DnDFrame::OnHelp(wxCommandEvent& /* event */) dialog.ShowModal(); } +#if wxUSE_LOG void DnDFrame::OnLogClear(wxCommandEvent& /* event */ ) { m_ctrlLog->Clear(); m_ctrlText->Clear(); m_ctrlFile->Clear(); } +#endif // wxUSE_LOG + +#if wxUSE_DRAG_AND_DROP + +void DnDFrame::LogDragResult(wxDragResult result) +{ +#if wxUSE_STATUSBAR + const wxChar *pc; + switch ( result ) + { + 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(_T("Drag result: ")) + pc); +#else + wxUnusedVar(result); +#endif // wxUSE_STATUSBAR +} + +#endif // wxUSE_DRAG_AND_DROP void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) ) { #if wxUSE_DRAG_AND_DROP - if ( !m_strText.IsEmpty() ) + if ( !m_strText.empty() ) { // start drag operation wxTextDataObject textData(m_strText); -/* - wxFileDataObject textData; - textData.AddFile( "/file1.txt" ); - textData.AddFile( "/file2.txt" ); -*/ wxDropSource source(textData, this, wxDROP_ICON(dnd_copy), wxDROP_ICON(dnd_move), @@ -1154,18 +1238,7 @@ void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) ) else if ( m_moveAllow ) flags |= wxDrag_AllowMove; - const wxChar *pc; - switch ( source.DoDragDrop(flags) ) - { - 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(_T("Drag result: ")) + pc); + LogDragResult(source.DoDragDrop(flags)); } #endif // wxUSE_DRAG_AND_DROP } @@ -1183,12 +1256,38 @@ void DnDFrame::OnRightDown(wxMouseEvent &event ) DnDFrame::~DnDFrame() { +#if wxUSE_LOG if ( m_pLog != NULL ) { if ( wxLog::SetActiveTarget(m_pLogPrev) == m_pLog ) delete m_pLog; } +#endif // wxUSE_LOG } +void DnDFrame::OnUsePrimary(wxCommandEvent& event) +{ + const bool usePrimary = event.IsChecked(); + wxTheClipboard->UsePrimarySelection(usePrimary); + + wxLogStatus(_T("Now using %s selection"), usePrimary ? _T("primary") + : _T("clipboard")); +} + +#if wxUSE_DRAG_AND_DROP + +void DnDFrame::OnBeginDrag(wxTreeEvent& WXUNUSED(event)) +{ + wxFileDataObject data; + data.AddFile(m_ctrlDir->GetPath()); + + wxDropSource dragSource(this); + dragSource.SetData(data); + + LogDragResult(dragSource.DoDragDrop()); +} + +#endif // wxUSE_DRAG_AND_DROP + // --------------------------------------------------------------------------- // bitmap clipboard // --------------------------------------------------------------------------- @@ -1197,9 +1296,9 @@ void DnDFrame::OnCopyBitmap(wxCommandEvent& WXUNUSED(event)) { // PNG support is not always compiled in under Windows, so use BMP there #if wxUSE_LIBPNG - wxFileDialog dialog(this, _T("Open a PNG file"), _T(""), _T(""), _T("PNG files (*.png)|*.png"), 0); + wxFileDialog dialog(this, _T("Open a PNG file"), wxEmptyString, wxEmptyString, _T("PNG files (*.png)|*.png"), 0); #else - wxFileDialog dialog(this, _T("Open a BMP file"), _T(""), _T(""), _T("BMP files (*.bmp)|*.bmp"), 0); + wxFileDialog dialog(this, _T("Open a BMP file"), wxEmptyString, wxEmptyString, _T("BMP files (*.bmp)|*.bmp"), 0); #endif if (dialog.ShowModal() != wxID_OK) @@ -1208,7 +1307,7 @@ void DnDFrame::OnCopyBitmap(wxCommandEvent& WXUNUSED(event)) return; } - if (dialog.GetPath().IsEmpty()) + if (dialog.GetPath().empty()) { wxLogMessage( _T("Returned empty string.") ); return; @@ -1296,7 +1395,7 @@ void DnDFrame::OnPasteBitmap(wxCommandEvent& WXUNUSED(event)) wxTheClipboard->Close(); } -#if wxUSE_METAFILES +#if wxUSE_METAFILE void DnDFrame::OnPasteMetafile(wxCommandEvent& WXUNUSED(event)) { @@ -1332,7 +1431,7 @@ void DnDFrame::OnPasteMetafile(wxCommandEvent& WXUNUSED(event)) wxTheClipboard->Close(); } -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE // ---------------------------------------------------------------------------- // file clipboard @@ -1341,7 +1440,7 @@ void DnDFrame::OnPasteMetafile(wxCommandEvent& WXUNUSED(event)) void DnDFrame::OnCopyFiles(wxCommandEvent& WXUNUSED(event)) { #ifdef __WXMSW__ - wxFileDialog dialog(this, _T("Select a file to copy"), _T(""), _T(""), + wxFileDialog dialog(this, _T("Select a file to copy"), wxEmptyString, wxEmptyString, _T("All files (*.*)|*.*"), 0); wxArrayString filenames; @@ -1373,7 +1472,7 @@ void DnDFrame::OnCopyFiles(wxCommandEvent& WXUNUSED(event)) else { wxLogStatus(this, wxT("%d file%s copied to the clipboard"), - count, count == 1 ? wxT("") : wxT("s")); + count, count == 1 ? wxEmptyString : wxEmptyString); } } } @@ -1460,9 +1559,12 @@ bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames) size_t nFiles = filenames.GetCount(); wxString str; 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]); + + if (m_pOwner != NULL) + { + m_pOwner->Append(str); + for ( size_t n = 0; n < nFiles; n++ ) + m_pOwner->Append(filenames[n]); } return true; @@ -1475,7 +1577,7 @@ 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 ) + wxDEFAULT_DIALOG_STYLE | wxRAISED_BORDER | wxRESIZE_BORDER ) { m_shape = shape; wxBoxSizer* topSizer = new wxBoxSizer( wxVERTICAL ); @@ -1536,8 +1638,7 @@ DnDShapeDialog::DnDShapeDialog(wxFrame *parent, DnDShape *shape) buttonSizer->Add( bt, 0, wxALL, 2 ); topSizer->Add( buttonSizer, 0, wxALL|wxALIGN_RIGHT, 2 ); - SetSizer( topSizer ); - topSizer->Fit( this ); + SetSizerAndFit( topSizer ); } DnDShape *DnDShapeDialog::GetShape() const @@ -1603,7 +1704,7 @@ void DnDShapeDialog::OnColour(wxCommandEvent& WXUNUSED(event)) data.SetChooseFull(true); for (int i = 0; i < 16; i++) { - wxColour colour(i*16, i*16, i*16); + wxColour colour((unsigned char)(i*16), (unsigned char)(i*16), (unsigned char)(i*16)); data.SetCustomColour(i, colour); } @@ -1621,10 +1722,11 @@ void DnDShapeDialog::OnColour(wxCommandEvent& WXUNUSED(event)) DnDShapeFrame *DnDShapeFrame::ms_lastDropTarget = NULL; DnDShapeFrame::DnDShapeFrame(wxFrame *parent) - : wxFrame(parent, wxID_ANY, _T("Shape Frame"), - wxDefaultPosition, wxSize(250, 150)) + : wxFrame(parent, wxID_ANY, _T("Shape Frame")) { +#if wxUSE_STATUSBAR CreateStatusBar(); +#endif // wxUSE_STATUSBAR wxMenu *menuShape = new wxMenu; menuShape->Append(Menu_Shape_New, _T("&New default shape\tCtrl-S")); @@ -1642,7 +1744,9 @@ DnDShapeFrame::DnDShapeFrame(wxFrame *parent) SetMenuBar(menubar); +#if wxUSE_STATUSBAR SetStatusText(_T("Press Ctrl-S to create a new shape")); +#endif // wxUSE_STATUSBAR SetDropTarget(new DnDShapeDropTarget(this)); @@ -1684,11 +1788,13 @@ void DnDShapeFrame::OnDrag(wxMouseEvent& event) { default: case wxDragError: - wxLogError(wxT("An error occured during drag and drop operation")); + wxLogError(wxT("An error occurred during drag and drop operation")); break; case wxDragNone: +#if wxUSE_STATUSBAR SetStatusText(_T("Nothing happened")); +#endif // wxUSE_STATUSBAR break; case wxDragCopy: @@ -1705,13 +1811,17 @@ void DnDShapeFrame::OnDrag(wxMouseEvent& event) break; case wxDragCancel: +#if wxUSE_STATUSBAR SetStatusText(_T("Drag and drop operation cancelled")); +#endif // wxUSE_STATUSBAR break; } if ( pc ) { +#if wxUSE_STATUSBAR SetStatusText(wxString(_T("Shape successfully ")) + pc); +#endif // wxUSE_STATUSBAR } //else: status text already set } @@ -1722,9 +1832,11 @@ void DnDShapeFrame::OnDrop(wxCoord x, wxCoord y, DnDShape *shape) wxPoint pt(x, y); +#if wxUSE_STATUSBAR wxString s; s.Printf(wxT("Shape dropped at (%d, %d)"), pt.x, pt.y); SetStatusText(s); +#endif // wxUSE_STATUSBAR shape->Move(pt); SetShape(shape); @@ -1737,10 +1849,12 @@ void DnDShapeFrame::OnEditShape(wxCommandEvent& WXUNUSED(event)) { SetShape(dlg.GetShape()); +#if wxUSE_STATUSBAR if ( m_shape ) { SetStatusText(_T("You can now drag the shape to another frame")); } +#endif // wxUSE_STATUSBAR } } @@ -1748,7 +1862,9 @@ void DnDShapeFrame::OnNewShape(wxCommandEvent& WXUNUSED(event)) { SetShape(new DnDEllipticShape(wxPoint(10, 10), wxSize(80, 60), *wxRED)); +#if wxUSE_STATUSBAR SetStatusText(_T("You can now drag the shape to another frame")); +#endif // wxUSE_STATUSBAR } void DnDShapeFrame::OnClearShape(wxCommandEvent& WXUNUSED(event)) @@ -1851,7 +1967,7 @@ DnDShape *DnDShape::New(const void *buf) // DnDShapeDataObject // ---------------------------------------------------------------------------- -#if wxUSE_METAFILES +#if wxUSE_METAFILE void DnDShapeDataObject::CreateMetaFile() const { @@ -1871,7 +1987,7 @@ void DnDShapeDataObject::CreateMetaFile() const delete mf; } -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE void DnDShapeDataObject::CreateBitmap() const { @@ -1901,19 +2017,23 @@ void DnDShapeDataObject::CreateBitmap() const static void ShowBitmap(const wxBitmap& bitmap) { wxFrame *frame = new wxFrame(NULL, wxID_ANY, _T("Bitmap view")); +#if wxUSE_STATUSBAR frame->CreateStatusBar(); +#endif // wxUSE_STATUSBAR DnDCanvasBitmap *canvas = new DnDCanvasBitmap(frame); canvas->SetBitmap(bitmap); int w = bitmap.GetWidth(), h = bitmap.GetHeight(); +#if wxUSE_STATUSBAR frame->SetStatusText(wxString::Format(_T("%dx%d"), w, h)); +#endif // wxUSE_STATUSBAR frame->SetClientSize(w > 100 ? 100 : w, h > 100 ? 100 : h); frame->Show(true); } -#if wxUSE_METAFILES +#if wxUSE_METAFILE static void ShowMetaFile(const wxMetaFile& metafile) { @@ -1930,6 +2050,6 @@ static void ShowMetaFile(const wxMetaFile& metafile) frame->Show(); } -#endif // wxUSE_METAFILES +#endif // wxUSE_METAFILE #endif // wxUSE_DRAG_AND_DROP || wxUSE_CLIPBOARD