X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/501d2dd13e12ece3898e447753d7d46eb990a25e..bd0f3ca69710e9648fc1f1b16ddb9602f5c4800b:/samples/dnd/dnd.cpp diff --git a/samples/dnd/dnd.cpp b/samples/dnd/dnd.cpp index 91c6cc0d2e..7987e5fab0 100644 --- a/samples/dnd/dnd.cpp +++ b/samples/dnd/dnd.cpp @@ -19,48 +19,24 @@ #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 - -#define USE_RESOURCES 0 -#if !wxUSE_RESOURCES -#undef USE_RESOURCES -#define USE_RESOURCES 0 -#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" -#if USE_RESOURCES - #include "wx/resource.h" -#else - #include "wx/sizer.h" -#endif - -#ifdef USE_METAFILES - #include "wx/metafile.h" -#endif // Windows - -#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__) - #include "mondrian.xpm" +#include "wx/metafile.h" +#include "wx/dirctrl.h" +#ifndef wxHAS_IMAGES_IN_RESOURCES + #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 // ---------------------------------------------------------------------------- // Derive two simple classes which just put in the listbox the strings (text or @@ -74,16 +50,6 @@ public: virtual bool OnDropText(wxCoord x, wxCoord y, const wxString& text); - // uncomment this if you want to always force Move to be the default - // action, even under wxGTK where it is normally Copy -#if 0 - wxDragResult OnDragOver(wxCoord x, wxCoord y, wxDragResult def) - { - wxDragResult res = wxTextDropTarget::OnDragOver(x, y, def); - return res == wxDragNone ? wxDragNone : wxDragMove; - } -#endif // 0 - private: wxListBox *m_pOwner; }; @@ -91,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); @@ -109,16 +75,16 @@ class URLDropTarget : public wxDropTarget public: URLDropTarget() { SetDataObject(new wxURLDataObject); } - void OnDropURL(wxCoord x, wxCoord y, const wxString& text) + void OnDropURL(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), const wxString& text) { // of course, a real program would do something more useful here... - wxMessageBox(text, _T("wxDnD sample: got URL"), + wxMessageBox(text, wxT("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) + wxDragResult WXUNUSED(def)) { return wxDragLink; // At least IE 5.x needs wxDragLink, the // other browsers on MSW seem okay with it too. @@ -136,6 +102,8 @@ public: } }; +#endif // wxUSE_DRAG_AND_DROP + // ---------------------------------------------------------------------------- // Define a new application type // ---------------------------------------------------------------------------- @@ -146,7 +114,9 @@ public: virtual bool OnInit(); }; -IMPLEMENT_APP(DnDApp); +IMPLEMENT_APP(DnDApp) + +#if wxUSE_DRAG_AND_DROP || wxUSE_CLIPBOARD // ---------------------------------------------------------------------------- // Define canvas class to show a bitmap @@ -167,11 +137,11 @@ public: Refresh(); } - void OnPaint(wxPaintEvent& event) + void OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); - if ( m_bitmap.Ok() ) + if ( m_bitmap.IsOk() ) { PrepareDC(dc); @@ -185,7 +155,7 @@ private: DECLARE_EVENT_TABLE() }; -#ifdef USE_METAFILES +#if wxUSE_METAFILE // and the same thing fo metafiles class DnDCanvasMetafile : public wxScrolledWindow @@ -203,11 +173,11 @@ public: Refresh(); } - void OnPaint(wxPaintEvent& event) + void OnPaint(wxPaintEvent&) { wxPaintDC dc(this); - if ( m_metafile.Ok() ) + if ( m_metafile.IsOk() ) { PrepareDC(dc); @@ -221,7 +191,7 @@ private: DECLARE_EVENT_TABLE() }; -#endif // USE_METAFILES +#endif // wxUSE_METAFILE // ---------------------------------------------------------------------------- // Define a new frame type for the main frame @@ -230,17 +200,21 @@ private: class DnDFrame : public wxFrame { public: - DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h); - ~DnDFrame(); + DnDFrame(); + virtual ~DnDFrame(); void OnPaint(wxPaintEvent& event); void OnSize(wxSizeEvent& event); - void OnQuit (wxCommandEvent& 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); +#if wxUSE_LOG void OnLogClear(wxCommandEvent& event); +#endif // wxUSE_LOG void OnCopy(wxCommandEvent& event); void OnPaste(wxCommandEvent& event); @@ -248,29 +222,57 @@ public: void OnCopyBitmap(wxCommandEvent& event); void OnPasteBitmap(wxCommandEvent& event); -#ifdef USE_METAFILES +#if wxUSE_METAFILE void OnPasteMetafile(wxCommandEvent& event); -#endif // USE_METAFILES +#endif // wxUSE_METAFILE void OnCopyFiles(wxCommandEvent& event); + void OnCopyURL(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; + + // allow moving the text at all? + bool m_moveAllow; - wxString m_strText; + // the text we drag + wxString m_strText; + + + DECLARE_EVENT_TABLE() }; // ---------------------------------------------------------------------------- @@ -279,6 +281,8 @@ private: // shapes, each one with its own colour and position // ---------------------------------------------------------------------------- +#if wxUSE_DRAG_AND_DROP + class DnDShape { public: @@ -338,20 +342,20 @@ public: virtual void Draw(wxDC& dc) { - dc.SetPen(wxPen(m_col, 1, wxSOLID)); + dc.SetPen(wxPen(m_col)); } 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 - 1, m_pos.y + m_size.y / 2 - 1); } - + 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; @@ -391,7 +395,7 @@ public: dc.DrawLine(p3, p1); //works in multicolor modes; on GTK (at least) will fail in 16-bit color - dc.SetBrush(wxBrush(m_col, wxSOLID)); + dc.SetBrush(wxBrush(m_col)); dc.FloodFill(GetCentre(), m_col, wxFLOOD_BORDER); } }; @@ -427,7 +431,7 @@ public: dc.DrawLine(p3, p4); dc.DrawLine(p4, p1); - dc.SetBrush(wxBrush(m_col, wxSOLID)); + dc.SetBrush(wxBrush(m_col)); dc.FloodFill(GetCentre(), m_col, wxFLOOD_BORDER); } }; @@ -455,7 +459,7 @@ public: dc.DrawEllipse(m_pos, m_size); - dc.SetBrush(wxBrush(m_col, wxSOLID)); + dc.SetBrush(wxBrush(m_col)); dc.FloodFill(GetCentre(), m_col, wxFLOOD_BORDER); } }; @@ -496,10 +500,10 @@ 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 - m_hasMetaFile = FALSE; -#endif // Windows + m_hasBitmap = false; +#if wxUSE_METAFILE + m_hasMetaFile = false; +#endif // wxUSE_METAFILE } virtual ~DnDShapeDataObject() { delete m_shape; } @@ -515,10 +519,10 @@ public: DnDShape *shape = m_shape; m_shape = (DnDShape *)NULL; - m_hasBitmap = FALSE; -#ifdef USE_METAFILES - m_hasMetaFile = FALSE; -#endif // Windows + m_hasBitmap = false; +#if wxUSE_METAFILE + m_hasMetaFile = false; +#endif // wxUSE_METAFILE return shape; } @@ -540,9 +544,9 @@ public: // but the bitmap format(s) are only supported for output nFormats += m_dobjBitmap.GetFormatCount(dir); -#ifdef USE_METAFILES +#if wxUSE_METAFILE nFormats += m_dobjMetaFile.GetFormatCount(dir); -#endif // Windows +#endif // wxUSE_METAFILE } return nFormats; @@ -557,11 +561,11 @@ public: // under Windows m_dobjBitmap.GetAllFormats(&formats[1], dir); -#ifdef USE_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 // Windows +#endif // wxUSE_METAFILE } } @@ -571,7 +575,7 @@ public: { return m_shape->GetDataSize(); } -#ifdef USE_METAFILES +#if wxUSE_METAFILE else if ( m_dobjMetaFile.IsSupported(format) ) { if ( !m_hasMetaFile ) @@ -579,7 +583,7 @@ public: return m_dobjMetaFile.GetDataSize(format); } -#endif // Windows +#endif // wxUSE_METAFILE else { wxASSERT_MSG( m_dobjBitmap.IsSupported(format), @@ -598,9 +602,9 @@ public: { m_shape->GetDataHere(pBuf); - return TRUE; + return true; } -#ifdef USE_METAFILES +#if wxUSE_METAFILE else if ( m_dobjMetaFile.IsSupported(format) ) { if ( !m_hasMetaFile ) @@ -608,7 +612,7 @@ public: return m_dobjMetaFile.GetDataHere(format, pBuf); } -#endif // Windows +#endif // wxUSE_METAFILE else { wxASSERT_MSG( m_dobjBitmap.IsSupported(format), @@ -622,40 +626,40 @@ public: } virtual bool SetData(const wxDataFormat& format, - size_t len, const void *buf) + size_t WXUNUSED(len), const void *buf) { - wxCHECK_MSG( format == m_formatShape, FALSE, + wxCHECK_MSG( format == m_formatShape, false, wxT( "unsupported format") ); delete m_shape; m_shape = DnDShape::New(buf); // the shape has changed - m_hasBitmap = FALSE; + m_hasBitmap = false; -#ifdef USE_METAFILES - m_hasMetaFile = FALSE; -#endif // Windows +#if wxUSE_METAFILE + m_hasMetaFile = false; +#endif // wxUSE_METAFILE - return TRUE; + return true; } private: // creates a bitmap and assigns it to m_dobjBitmap (also sets m_hasBitmap) void CreateBitmap() const; -#ifdef USE_METAFILES +#if wxUSE_METAFILE void CreateMetaFile() const; -#endif // Windows +#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 -#ifdef USE_METAFILES +#if wxUSE_METAFILE wxMetaFileDataObject m_dobjMetaFile;// handles metafiles bool m_hasMetaFile; // true if we have valid metafile -#endif // Windows +#endif // wxUSE_METAFILE DnDShape *m_shape; // our data }; @@ -707,6 +711,10 @@ public: ~DnDShapeFrame(); void SetShape(DnDShape *shape); + virtual bool SetShape(const wxRegion ®ion) + { + return wxFrame::SetShape( region ); + } // callbacks void OnNewShape(wxCommandEvent& event); @@ -746,9 +754,18 @@ 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); } + { +#if wxUSE_STATUSBAR + m_frame->SetStatusText(wxT("Mouse entered the frame")); +#endif // wxUSE_STATUSBAR + return OnDragOver(x, y, def); + } virtual void OnLeave() - { m_frame->SetStatusText("Mouse left the frame"); } + { +#if wxUSE_STATUSBAR + m_frame->SetStatusText(wxT("Mouse left the frame")); +#endif // wxUSE_STATUSBAR + } virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def) { if ( !GetData() ) @@ -768,15 +785,17 @@ private: DnDShapeFrame *m_frame; }; +#endif // wxUSE_DRAG_AND_DROP + // ---------------------------------------------------------------------------- // functions prototypes // ---------------------------------------------------------------------------- static void ShowBitmap(const wxBitmap& bitmap); -#ifdef USE_METAFILES +#if wxUSE_METAFILE static void ShowMetaFile(const wxMetaFile& metafile); -#endif // USE_METAFILES +#endif // wxUSE_METAFILE // ---------------------------------------------------------------------------- // IDs for the menu commands @@ -786,6 +805,8 @@ enum { Menu_Quit = 1, Menu_Drag, + Menu_DragMoveDef, + Menu_DragMoveAllow, Menu_NewFrame, Menu_About = 101, Menu_Help, @@ -796,6 +817,8 @@ enum Menu_PasteBitmap, Menu_PasteMFile, Menu_CopyFiles, + Menu_CopyURL, + Menu_UsePrimary, Menu_Shape_New = 500, Menu_Shape_Edit, Menu_Shape_Clear, @@ -808,17 +831,25 @@ 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) +#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) -#ifdef USE_METAFILES +#if wxUSE_METAFILE EVT_MENU(Menu_PasteMFile, DnDFrame::OnPasteMetafile) -#endif // USE_METAFILES +#endif // wxUSE_METAFILE EVT_MENU(Menu_CopyFiles, DnDFrame::OnCopyFiles) + EVT_MENU(Menu_CopyURL, DnDFrame::OnCopyURL) + EVT_MENU(Menu_UsePrimary, DnDFrame::OnUsePrimary) + + EVT_UPDATE_UI(Menu_DragMoveDef, DnDFrame::OnUpdateUIMoveByDefault) EVT_UPDATE_UI(Menu_Paste, DnDFrame::OnUpdateUIPasteText) EVT_UPDATE_UI(Menu_PasteBitmap, DnDFrame::OnUpdateUIPasteBitmap) @@ -829,6 +860,8 @@ BEGIN_EVENT_TABLE(DnDFrame, wxFrame) EVT_SIZE( DnDFrame::OnSize) END_EVENT_TABLE() +#if wxUSE_DRAG_AND_DROP + BEGIN_EVENT_TABLE(DnDShapeFrame, wxFrame) EVT_MENU(Menu_Shape_New, DnDShapeFrame::OnNewShape) EVT_MENU(Menu_Shape_Edit, DnDShapeFrame::OnEditShape) @@ -849,15 +882,19 @@ BEGIN_EVENT_TABLE(DnDShapeDialog, wxDialog) EVT_BUTTON(Button_Colour, DnDShapeDialog::OnColour) END_EVENT_TABLE() +#endif // wxUSE_DRAG_AND_DROP + BEGIN_EVENT_TABLE(DnDCanvasBitmap, wxScrolledWindow) EVT_PAINT(DnDCanvasBitmap::OnPaint) END_EVENT_TABLE() -#ifdef USE_METAFILES +#if wxUSE_METAFILE BEGIN_EVENT_TABLE(DnDCanvasMetafile, wxScrolledWindow) EVT_PAINT(DnDCanvasMetafile::OnPaint) END_EVENT_TABLE() -#endif // USE_METAFILES +#endif // wxUSE_METAFILE + +#endif // wxUSE_DRAG_AND_DROP // ============================================================================ // implementation @@ -866,158 +903,172 @@ END_EVENT_TABLE() // `Main program' equivalent, creating windows and returning main app frame bool DnDApp::OnInit() { -#if USE_RESOURCES - // 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(wxT("Can't find the resource file dnd.wxr in the current ") - wxT("directory, aborting.")); - - return FALSE; - } - - wxDefaultResourceTable->ParseResourceFile(path); -#endif + 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")); + wxLog::AddTraceMask(wxT("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, - "Drag-and-Drop/Clipboard wxWindows Sample", - 10, 100, 650, 340); - - // activate it - frame->Show(TRUE); + new DnDFrame(); - SetTopWindow(frame); - - return TRUE; + return true; +#else + wxMessageBox( wxT("This sample has to be compiled with wxUSE_DRAG_AND_DROP"), wxT("Building error"), wxOK); + return false; +#endif // wxUSE_DRAG_AND_DROP } -DnDFrame::DnDFrame(wxFrame *frame, char *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 :-)") +#if wxUSE_DRAG_AND_DROP || wxUSE_CLIPBOARD + +DnDFrame::DnDFrame() + : wxFrame(NULL, wxID_ANY, wxT("Drag-and-Drop/Clipboard wxWidgets Sample"), + wxPoint(10, 100)), + m_strText(wxT("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; - file_menu->Append(Menu_Drag, "&Test drag..."); + file_menu->Append(Menu_Drag, wxT("&Test drag...")); + file_menu->AppendCheckItem(Menu_DragMoveDef, wxT("&Move by default")); + file_menu->AppendCheckItem(Menu_DragMoveAllow, wxT("&Allow moving")); file_menu->AppendSeparator(); - file_menu->Append(Menu_NewFrame, "&New frame\tCtrl-N"); + file_menu->Append(Menu_NewFrame, wxT("&New frame\tCtrl-N")); file_menu->AppendSeparator(); - file_menu->Append(Menu_Quit, "E&xit\tCtrl-Q"); + file_menu->Append(Menu_Quit, wxT("E&xit\tCtrl-Q")); +#if wxUSE_LOG wxMenu *log_menu = new wxMenu; - log_menu->Append(Menu_Clear, "Clear\tCtrl-L"); + log_menu->Append(Menu_Clear, wxT("Clear\tCtrl-L")); +#endif // wxUSE_LOG wxMenu *help_menu = new wxMenu; - help_menu->Append(Menu_Help, "&Help..."); + help_menu->Append(Menu_Help, wxT("&Help...")); help_menu->AppendSeparator(); - help_menu->Append(Menu_About, "&About"); + help_menu->Append(Menu_About, wxT("&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, wxT("&Copy text\tCtrl-C")); + clip_menu->Append(Menu_Paste, wxT("&Paste text\tCtrl-V")); + clip_menu->AppendSeparator(); + clip_menu->Append(Menu_CopyBitmap, wxT("Copy &bitmap\tCtrl-Shift-C")); + clip_menu->Append(Menu_PasteBitmap, wxT("Paste b&itmap\tCtrl-Shift-V")); +#if wxUSE_METAFILE clip_menu->AppendSeparator(); - clip_menu->Append(Menu_CopyBitmap, "Copy &bitmap\tCtrl-Shift-C"); - clip_menu->Append(Menu_PasteBitmap, "Paste b&itmap\tCtrl-Shift-V"); -#ifdef USE_METAFILES + clip_menu->Append(Menu_PasteMFile, wxT("Paste &metafile\tCtrl-M")); +#endif // wxUSE_METAFILE clip_menu->AppendSeparator(); - clip_menu->Append(Menu_PasteMFile, "Paste &metafile\tCtrl-M"); -#endif // USE_METAFILES + clip_menu->Append(Menu_CopyFiles, wxT("Copy &files\tCtrl-F")); + clip_menu->Append(Menu_CopyURL, wxT("Copy &URL\tCtrl-U")); clip_menu->AppendSeparator(); - clip_menu->Append(Menu_CopyFiles, "Copy &files\tCtrl-F"); + clip_menu->AppendCheckItem(Menu_UsePrimary, wxT("Use &primary selection\tCtrl-P")); 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, wxT("&File")); +#if wxUSE_LOG + menu_bar->Append(log_menu, wxT("&Log")); +#endif // wxUSE_LOG + menu_bar->Append(clip_menu, wxT("&Clipboard")); + menu_bar->Append(help_menu, wxT("&Help")); SetMenuBar(menu_bar); - // make a panel with 3 subwindows - wxPoint pos(0, 0); - wxSize size(400, 200); + // create the child controls + SetBackgroundColour(*wxWHITE); // labels read better on this background - wxString strFile("Drop files here!"), strText("Drop text on me"); + wxString strFile(wxT("Drop files here!")), strText(wxT("Drop text on me")); - m_ctrlFile = new wxListBox(this, -1, pos, size, 1, &strFile, + m_ctrlFile = new wxListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 1, &strFile, wxLB_HSCROLL | wxLB_ALWAYS_SB ); - m_ctrlText = new wxListBox(this, -1, pos, size, 1, &strText, + 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, -1, "", pos, size, +#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)); - m_ctrlLog->SetDropTarget(new URLDropTarget); - wxLayoutConstraints *c; - - // Top-left listbox - c = new wxLayoutConstraints; - c->left.SameAs(this, wxLeft); - c->top.SameAs(this, wxTop); - c->right.PercentOf(this, wxRight, 50); - c->height.PercentOf(this, wxHeight, 30); - m_ctrlFile->SetConstraints(c); - - // Top-right listbox - c = new wxLayoutConstraints; - c->left.SameAs (m_ctrlFile, wxRight); - c->top.SameAs (this, wxTop); - c->right.SameAs (this, wxRight); - c->height.PercentOf(this, wxHeight, 30); - m_ctrlText->SetConstraints(c); - - // Lower text control - c = new wxLayoutConstraints; - c->left.SameAs (this, wxLeft); - c->right.SameAs (this, wxRight); - c->height.PercentOf(this, wxHeight, 50); - c->top.SameAs(m_ctrlText, wxBottom); - m_ctrlLog->SetConstraints(c); - - SetAutoLayout(TRUE); +#if wxUSE_DRAG_AND_DROP + m_ctrlDir->Connect + ( + wxID_ANY, + wxEVT_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 *sizer_top = new wxBoxSizer( wxHORIZONTAL ); + sizer_top->Add(m_ctrlFile, 1, wxEXPAND ); + sizer_top->Add(m_ctrlText, 1, wxEXPAND ); + + 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 ); + + // 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)) { - Close(TRUE); + Close(true); } void DnDFrame::OnSize(wxSizeEvent& event) @@ -1035,8 +1086,14 @@ void DnDFrame::OnPaint(wxPaintEvent& WXUNUSED(event)) wxPaintDC dc(this); // dc.Clear(); -- this kills wxGTK - dc.SetFont( wxFont( 24, wxDECORATIVE, wxNORMAL, wxNORMAL, FALSE, "charter" ) ); - dc.DrawText( "Drag text from here!", 100, h-50 ); + dc.SetFont( wxFont( 24, wxDECORATIVE, wxNORMAL, wxNORMAL, false, wxT("charter") ) ); + dc.DrawText( wxT("Drag text from here!"), 100, h-50 ); +} + +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) @@ -1063,31 +1120,45 @@ void DnDFrame::OnUpdateUIPasteBitmap(wxUpdateUIEvent& event) void DnDFrame::OnNewFrame(wxCommandEvent& WXUNUSED(event)) { - (new DnDShapeFrame(this))->Show(TRUE); +#if wxUSE_DRAG_AND_DROP + (new DnDShapeFrame(this))->Show(true); wxLogStatus(this, wxT("Double click the new frame to select a shape for it")); +#endif // wxUSE_DRAG_AND_DROP } void DnDFrame::OnDrag(wxCommandEvent& WXUNUSED(event)) { +#if wxUSE_DRAG_AND_DROP 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 + wxT("After you enter text in this dialog, press any mouse\n") + wxT("button in the bottom (empty) part of the frame and \n") + wxT("drag it anywhere - you will be in fact dragging the\n") + wxT("text object containing this text"), + wxT("Please enter some text"), m_strText, this ); m_strText = strText; +#endif // wxUSE_DRAG_AND_DROP +} + +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(wxT("Drag-&-Drop Demo\n") + wxT("Please see \"Help|Help...\" for details\n") + wxT("Copyright (c) 1998 Vadim Zeitlin"), + wxT("About wxDnD"), wxICON_INFORMATION | wxOK, this); } @@ -1095,89 +1166,132 @@ 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"); + wxT("This small program demonstrates drag & drop support in wxWidgets. The program window\n") + wxT("consists of 3 parts: the bottom pane is for debug messages, so that you can see what's\n") + wxT("going on inside. The top part is split into 2 listboxes, the left one accepts files\n") + wxT("and the right one accepts text.\n") + wxT("\n") + wxT("To test wxDropTarget: open wordpad (write.exe), select some text in it and drag it to\n") + wxT("the right listbox (you'll notice the usual visual feedback, i.e. the cursor will change).\n") + wxT("Also, try dragging some files (you can select several at once) from Windows Explorer (or \n") + wxT("File Manager) to the left pane. Hold down Ctrl/Shift keys when you drop text (doesn't \n") + wxT("work with files) and see what changes.\n") + wxT("\n") + wxT("To test wxDropSource: just press any mouse button on the empty zone of the window and drag\n") + wxT("it to wordpad or any other droptarget accepting text (and of course you can just drag it\n") + wxT("to the right pane). Due to a lot of trace messages, the cursor might take some time to \n") + wxT("change, don't release the mouse button until it does. You can change the string being\n") + wxT("dragged in \"File|Test drag...\" dialog.\n") + wxT("\n") + wxT("\n") + wxT("Please send all questions/bug reports/suggestions &c to \n") + wxT("Vadim Zeitlin "), + wxT("wxDnD Help")); 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 = wxT("Error!"); break; + case wxDragNone: pc = wxT("Nothing"); break; + case wxDragCopy: pc = wxT("Copied"); break; + case wxDragMove: pc = wxT("Moved"); break; + case wxDragCancel: pc = wxT("Cancelled"); break; + default: pc = wxT("Huh?"); break; + } + + SetStatusText(wxString(wxT("Drag result: ")) + pc); +#else + wxUnusedVar(result); +#endif // wxUSE_STATUSBAR +} + +#endif // wxUSE_DRAG_AND_DROP void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) ) { - if ( !m_strText.IsEmpty() ) +#if wxUSE_DRAG_AND_DROP + 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), wxDROP_ICON(dnd_none)); - const char *pc; + int flags = 0; + if ( m_moveByDefault ) + flags |= wxDrag_DefaultMove; + else if ( m_moveAllow ) + flags |= wxDrag_AllowMove; - switch ( source.DoDragDrop(TRUE) ) - { - 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; - } - - SetStatusText(wxString("Drag result: ") + pc); + LogDragResult(source.DoDragDrop(flags)); } +#endif // wxUSE_DRAG_AND_DROP } void DnDFrame::OnRightDown(wxMouseEvent &event ) { - wxMenu menu("Dnd sample menu"); + wxMenu menu(wxT("Dnd sample menu")); - menu.Append(Menu_Drag, "&Test drag..."); + menu.Append(Menu_Drag, wxT("&Test drag...")); menu.AppendSeparator(); - menu.Append(Menu_About, "&About"); + menu.Append(Menu_About, wxT("&About")); PopupMenu( &menu, event.GetX(), event.GetY() ); } 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(wxT("Now using %s selection"), usePrimary ? wxT("primary") + : wxT("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 // --------------------------------------------------------------------------- @@ -1185,67 +1299,67 @@ 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, wxT("Open a PNG file"), wxEmptyString, wxEmptyString, wxT("PNG files (*.png)|*.png"), 0); #else - wxFileDialog dialog(this, "Open a PNG file", "", "", "PNG files (*.png)|*.png", 0); + wxFileDialog dialog(this, wxT("Open a BMP file"), wxEmptyString, wxEmptyString, wxT("BMP files (*.bmp)|*.bmp"), 0); #endif if (dialog.ShowModal() != wxID_OK) { - wxLogMessage( _T("Aborted file open") ); + wxLogMessage( wxT("Aborted file open") ); return; } - if (dialog.GetPath().IsEmpty()) + if (dialog.GetPath().empty()) { - wxLogMessage( _T("Returned empty string.") ); + wxLogMessage( wxT("Returned empty string.") ); return; } if (!wxFileExists(dialog.GetPath())) { - wxLogMessage( _T("File doesn't exist.") ); + wxLogMessage( wxT("File doesn't exist.") ); return; } 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()) + if (!image.IsOk()) { - wxLogError( _T("Invalid image file...") ); + wxLogError( wxT("Invalid image file...") ); return; } - wxLogStatus( _T("Decoding image file...") ); + wxLogStatus( wxT("Decoding image file...") ); wxYield(); wxBitmap bitmap( image ); if ( !wxTheClipboard->Open() ) { - wxLogError(_T("Can't open clipboard.")); + wxLogError(wxT("Can't open clipboard.")); return; } - wxLogMessage( _T("Creating wxBitmapDataObject...") ); + wxLogMessage( wxT("Creating wxBitmapDataObject...") ); wxYield(); if ( !wxTheClipboard->AddData(new wxBitmapDataObject(bitmap)) ) { - wxLogError(_T("Can't copy image to the clipboard.")); + wxLogError(wxT("Can't copy image to the clipboard.")); } else { - wxLogMessage(_T("Image has been put on the clipboard.") ); - wxLogMessage(_T("You can paste it now and look at it.") ); + wxLogMessage(wxT("Image has been put on the clipboard.") ); + wxLogMessage(wxT("You can paste it now and look at it.") ); } wxTheClipboard->Close(); @@ -1255,14 +1369,14 @@ void DnDFrame::OnPasteBitmap(wxCommandEvent& WXUNUSED(event)) { if ( !wxTheClipboard->Open() ) { - wxLogError(_T("Can't open clipboard.")); + wxLogError(wxT("Can't open clipboard.")); return; } if ( !wxTheClipboard->IsSupported(wxDF_BITMAP) ) { - wxLogWarning(_T("No bitmap on clipboard")); + wxLogWarning(wxT("No bitmap on clipboard")); wxTheClipboard->Close(); return; @@ -1271,13 +1385,13 @@ void DnDFrame::OnPasteBitmap(wxCommandEvent& WXUNUSED(event)) wxBitmapDataObject data; if ( !wxTheClipboard->GetData(data) ) { - wxLogError(_T("Can't paste bitmap from the clipboard")); + wxLogError(wxT("Can't paste bitmap from the clipboard")); } else { const wxBitmap& bmp = data.GetBitmap(); - wxLogMessage(_T("Bitmap %dx%d pasted from the clipboard"), + wxLogMessage(wxT("Bitmap %dx%d pasted from the clipboard"), bmp.GetWidth(), bmp.GetHeight()); ShowBitmap(bmp); } @@ -1285,33 +1399,33 @@ void DnDFrame::OnPasteBitmap(wxCommandEvent& WXUNUSED(event)) wxTheClipboard->Close(); } -#ifdef USE_METAFILES +#if wxUSE_METAFILE void DnDFrame::OnPasteMetafile(wxCommandEvent& WXUNUSED(event)) { if ( !wxTheClipboard->Open() ) { - wxLogError(_T("Can't open clipboard.")); + wxLogError(wxT("Can't open clipboard.")); return; } if ( !wxTheClipboard->IsSupported(wxDF_METAFILE) ) { - wxLogWarning(_T("No metafile on clipboard")); + wxLogWarning(wxT("No metafile on clipboard")); } else { wxMetaFileDataObject data; if ( !wxTheClipboard->GetData(data) ) { - wxLogError(_T("Can't paste metafile from the clipboard")); + wxLogError(wxT("Can't paste metafile from the clipboard")); } else { const wxMetaFile& mf = data.GetMetafile(); - wxLogMessage(_T("Metafile %dx%d pasted from the clipboard"), + wxLogMessage(wxT("Metafile %dx%d pasted from the clipboard"), mf.GetWidth(), mf.GetHeight()); ShowMetaFile(mf); @@ -1321,7 +1435,7 @@ void DnDFrame::OnPasteMetafile(wxCommandEvent& WXUNUSED(event)) wxTheClipboard->Close(); } -#endif // USE_METAFILES +#endif // wxUSE_METAFILE // ---------------------------------------------------------------------------- // file clipboard @@ -1330,8 +1444,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, wxT("Select a file to copy"), wxEmptyString, wxEmptyString, + wxT("All files (*.*)|*.*"), 0); wxArrayString filenames; while ( dialog.ShowModal() == wxID_OK ) @@ -1362,7 +1476,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); } } } @@ -1375,6 +1489,27 @@ void DnDFrame::OnCopyFiles(wxCommandEvent& WXUNUSED(event)) #endif // MSW/!MSW } +void DnDFrame::OnCopyURL(wxCommandEvent& WXUNUSED(event)) +{ + // Just hard code it for now, we could ask the user but the point here is + // to test copying URLs, it doesn't really matter what it is. + const wxString url("http://www.wxwidgets.org/"); + + wxClipboardLocker locker; + if ( !!locker && wxTheClipboard->AddData(new wxURLDataObject(url)) ) + { + wxLogStatus(this, "Copied URL \"%s\" to %s.", + url, + GetMenuBar()->IsChecked(Menu_UsePrimary) + ? "primary selection" + : "clipboard"); + } + else + { + wxLogError("Failed to copy URL."); + } +} + // --------------------------------------------------------------------------- // text clipboard // --------------------------------------------------------------------------- @@ -1383,18 +1518,18 @@ void DnDFrame::OnCopy(wxCommandEvent& WXUNUSED(event)) { if ( !wxTheClipboard->Open() ) { - wxLogError(_T("Can't open clipboard.")); + wxLogError(wxT("Can't open clipboard.")); return; } if ( !wxTheClipboard->AddData(new wxTextDataObject(m_strText)) ) { - wxLogError(_T("Can't copy data to the clipboard")); + wxLogError(wxT("Can't copy data to the clipboard")); } else { - wxLogMessage(_T("Text '%s' put on the clipboard"), m_strText.c_str()); + wxLogMessage(wxT("Text '%s' put on the clipboard"), m_strText.c_str()); } wxTheClipboard->Close(); @@ -1404,14 +1539,14 @@ void DnDFrame::OnPaste(wxCommandEvent& WXUNUSED(event)) { if ( !wxTheClipboard->Open() ) { - wxLogError(_T("Can't open clipboard.")); + wxLogError(wxT("Can't open clipboard.")); return; } if ( !wxTheClipboard->IsSupported(wxDF_TEXT) ) { - wxLogWarning(_T("No text data on clipboard")); + wxLogWarning(wxT("No text data on clipboard")); wxTheClipboard->Close(); return; @@ -1420,17 +1555,19 @@ void DnDFrame::OnPaste(wxCommandEvent& WXUNUSED(event)) wxTextDataObject text; if ( !wxTheClipboard->GetData(text) ) { - wxLogError(_T("Can't paste data from the clipboard")); + wxLogError(wxT("Can't paste data from the clipboard")); } else { - wxLogMessage(_T("Text '%s' pasted from the clipboard"), + wxLogMessage(wxT("Text '%s' pasted from the clipboard"), text.GetText().c_str()); } wxTheClipboard->Close(); } +#if wxUSE_DRAG_AND_DROP + // ---------------------------------------------------------------------------- // Notifications called by the base class // ---------------------------------------------------------------------------- @@ -1439,20 +1576,23 @@ bool DnDText::OnDropText(wxCoord, wxCoord, const wxString& text) { m_pOwner->Append(text); - return TRUE; + return true; } bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames) { size_t nFiles = filenames.GetCount(); wxString str; - str.Printf( _T("%d files dropped"), nFiles); - m_pOwner->Append(str); - for ( size_t n = 0; n < nFiles; n++ ) { - m_pOwner->Append(filenames[n]); + str.Printf( wxT("%d files dropped"), (int)nFiles); + + if (m_pOwner != NULL) + { + m_pOwner->Append(str); + for ( size_t n = 0; n < nFiles; n++ ) + m_pOwner->Append(filenames[n]); } - return TRUE; + return true; } // ---------------------------------------------------------------------------- @@ -1460,23 +1600,11 @@ bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames) // ---------------------------------------------------------------------------- DnDShapeDialog::DnDShapeDialog(wxFrame *parent, DnDShape *shape) -#if !USE_RESOURCES :wxDialog( parent, 6001, wxT("Choose Shape"), wxPoint( 10, 10 ), wxSize( 40, 40 ), - wxRAISED_BORDER|wxCAPTION|wxTHICK_FRAME|wxSYSTEM_MENU ) -#endif + wxDEFAULT_DIALOG_STYLE | wxRAISED_BORDER | wxRESIZE_BORDER ) { m_shape = shape; -#if USE_RESOURCES - 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); -#else wxBoxSizer* topSizer = new wxBoxSizer( wxVERTICAL ); // radio box @@ -1484,39 +1612,39 @@ DnDShapeDialog::DnDShapeDialog(wxFrame *parent, DnDShape *shape) const wxString choices[] = { wxT("None"), wxT("Triangle"), wxT("Rectangle"), wxT("Ellipse") }; - m_radio = new wxRadioBox( this, -1, wxT("&Shape"), + m_radio = new wxRadioBox( this, wxID_ANY, 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") ); + wxStaticBox* box = new wxStaticBox( this, wxID_ANY, wxT("&Attributes") ); wxStaticBoxSizer* attrSizer = new wxStaticBoxSizer( box, wxHORIZONTAL ); - wxFlexGridSizer* xywhSizer = new wxFlexGridSizer( 4, 2 ); + wxFlexGridSizer* xywhSizer = new wxFlexGridSizer( 2 ); wxStaticText* st; - st = new wxStaticText( this, -1, wxT("Position &X:") ); - m_textX = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, + st = new wxStaticText( this, wxID_ANY, wxT("Position &X:") ); + m_textX = new wxTextCtrl( this, wxID_ANY, 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, + st = new wxStaticText( this, wxID_ANY, wxT("Size &width:") ); + m_textW = new wxTextCtrl( this, wxID_ANY, 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, + st = new wxStaticText( this, wxID_ANY, wxT("&Y:") ); + m_textY = new wxTextCtrl( this, wxID_ANY, 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, + st = new wxStaticText( this, wxID_ANY, wxT("&height:") ); + m_textH = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 30, 20 ) ); xywhSizer->Add( st, 1, wxALL|wxALIGN_RIGHT, 2 ); xywhSizer->Add( m_textH, 1, wxGROW|wxALL, 2 ); @@ -1535,10 +1663,7 @@ DnDShapeDialog::DnDShapeDialog(wxFrame *parent, DnDShape *shape) buttonSizer->Add( bt, 0, wxALL, 2 ); topSizer->Add( buttonSizer, 0, wxALL|wxALIGN_RIGHT, 2 ); - SetAutoLayout( TRUE ); - SetSizer( topSizer ); - topSizer->Fit( this ); -#endif + SetSizerAndFit( topSizer ); } DnDShape *DnDShapeDialog::GetShape() const @@ -1575,7 +1700,7 @@ bool DnDShapeDialog::TransferDataToWindow() m_textW->SetValue(wxString() << m_size.x); m_textH->SetValue(wxString() << m_size.y); - return TRUE; + return true; } bool DnDShapeDialog::TransferDataFromWindow() @@ -1589,22 +1714,22 @@ bool DnDShapeDialog::TransferDataFromWindow() 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(wxT("All sizes and positions should be non null!"), + wxT("Invalid shape"), wxICON_HAND | wxOK, this); - return FALSE; + return false; } - return TRUE; + return true; } void DnDShapeDialog::OnColour(wxCommandEvent& WXUNUSED(event)) { wxColourData data; - data.SetChooseFull(TRUE); + 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); } @@ -1622,28 +1747,31 @@ void DnDShapeDialog::OnColour(wxCommandEvent& WXUNUSED(event)) DnDShapeFrame *DnDShapeFrame::ms_lastDropTarget = NULL; DnDShapeFrame::DnDShapeFrame(wxFrame *parent) - : wxFrame(parent, -1, "Shape Frame", - wxDefaultPosition, wxSize(250, 150)) + : wxFrame(parent, wxID_ANY, wxT("Shape Frame")) { +#if wxUSE_STATUSBAR CreateStatusBar(); +#endif // wxUSE_STATUSBAR 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, wxT("&New default shape\tCtrl-S")); + menuShape->Append(Menu_Shape_Edit, wxT("&Edit shape\tCtrl-E")); menuShape->AppendSeparator(); - menuShape->Append(Menu_Shape_Clear, "&Clear shape\tCtrl-L"); + menuShape->Append(Menu_Shape_Clear, wxT("&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, wxT("&Copy\tCtrl-C")); + menuClipboard->Append(Menu_ShapeClipboard_Paste, wxT("&Paste\tCtrl-V")); wxMenuBar *menubar = new wxMenuBar; - menubar->Append(menuShape, "&Shape"); - menubar->Append(menuClipboard, "&Clipboard"); + menubar->Append(menuShape, wxT("&Shape")); + menubar->Append(menuClipboard, wxT("&Clipboard")); SetMenuBar(menubar); - SetStatusText("Press Ctrl-S to create a new shape"); +#if wxUSE_STATUSBAR + SetStatusText(wxT("Press Ctrl-S to create a new shape")); +#endif // wxUSE_STATUSBAR SetDropTarget(new DnDShapeDropTarget(this)); @@ -1680,24 +1808,26 @@ void DnDShapeFrame::OnDrag(wxMouseEvent& event) DnDShapeDataObject shapeData(m_shape); wxDropSource source(shapeData, this); - const char *pc = NULL; - switch ( source.DoDragDrop(TRUE) ) + const wxChar *pc = NULL; + switch ( source.DoDragDrop(true) ) { 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: - SetStatusText("Nothing happened"); +#if wxUSE_STATUSBAR + SetStatusText(wxT("Nothing happened")); +#endif // wxUSE_STATUSBAR break; case wxDragCopy: - pc = "copied"; + pc = wxT("copied"); break; case wxDragMove: - pc = "moved"; + pc = wxT("moved"); if ( ms_lastDropTarget != this ) { // don't delete the shape if we dropped it on ourselves! @@ -1706,13 +1836,17 @@ void DnDShapeFrame::OnDrag(wxMouseEvent& event) break; case wxDragCancel: - SetStatusText("Drag and drop operation cancelled"); +#if wxUSE_STATUSBAR + SetStatusText(wxT("Drag and drop operation cancelled")); +#endif // wxUSE_STATUSBAR break; } if ( pc ) { - SetStatusText(wxString("Shape successfully ") + pc); +#if wxUSE_STATUSBAR + SetStatusText(wxString(wxT("Shape successfully ")) + pc); +#endif // wxUSE_STATUSBAR } //else: status text already set } @@ -1723,41 +1857,47 @@ void DnDShapeFrame::OnDrop(wxCoord x, wxCoord y, DnDShape *shape) wxPoint pt(x, y); +#if wxUSE_STATUSBAR wxString s; - s.Printf(wxT("Shape dropped at (%ld, %ld)"), pt.x, pt.y); + s.Printf(wxT("Shape dropped at (%d, %d)"), pt.x, pt.y); SetStatusText(s); +#endif // wxUSE_STATUSBAR 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 ) { SetShape(dlg.GetShape()); +#if wxUSE_STATUSBAR if ( m_shape ) { - SetStatusText("You can now drag the shape to another frame"); + SetStatusText(wxT("You can now drag the shape to another frame")); } +#endif // wxUSE_STATUSBAR } } -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"); +#if wxUSE_STATUSBAR + SetStatusText(wxT("You can now drag the shape to another frame")); +#endif // wxUSE_STATUSBAR } -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 ) { @@ -1773,7 +1913,7 @@ void DnDShapeFrame::OnCopyShape(wxCommandEvent& event) } } -void DnDShapeFrame::OnPasteShape(wxCommandEvent& event) +void DnDShapeFrame::OnPasteShape(wxCommandEvent& WXUNUSED(event)) { wxClipboardLocker clipLocker; if ( !clipLocker ) @@ -1852,7 +1992,7 @@ DnDShape *DnDShape::New(const void *buf) // DnDShapeDataObject // ---------------------------------------------------------------------------- -#ifdef USE_METAFILES +#if wxUSE_METAFILE void DnDShapeDataObject::CreateMetaFile() const { @@ -1867,12 +2007,12 @@ void DnDShapeDataObject::CreateMetaFile() const DnDShapeDataObject *self = (DnDShapeDataObject *)this; // const_cast self->m_dobjMetaFile.SetMetafile(*mf); - self->m_hasMetaFile = TRUE; + self->m_hasMetaFile = true; delete mf; } -#endif // Windows +#endif // wxUSE_METAFILE void DnDShapeDataObject::CreateBitmap() const { @@ -1883,50 +2023,58 @@ void DnDShapeDataObject::CreateBitmap() const wxBitmap bitmap(x, y); wxMemoryDC dc; dc.SelectObject(bitmap); - dc.SetBrush(wxBrush(wxT("white"), wxSOLID)); + dc.SetBrush(*wxWHITE_BRUSH); dc.Clear(); m_shape->Draw(dc); dc.SelectObject(wxNullBitmap); DnDShapeDataObject *self = (DnDShapeDataObject *)this; // const_cast self->m_dobjBitmap.SetBitmap(bitmap); - self->m_hasBitmap = TRUE; + self->m_hasBitmap = true; } +#endif // wxUSE_DRAG_AND_DROP + // ---------------------------------------------------------------------------- // global functions // ---------------------------------------------------------------------------- static void ShowBitmap(const wxBitmap& bitmap) { - wxFrame *frame = new wxFrame(NULL, -1, _T("Bitmap view")); + wxFrame *frame = new wxFrame(NULL, wxID_ANY, wxT("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(); - frame->SetStatusText(wxString::Format(_T("%dx%d"), w, h)); +#if wxUSE_STATUSBAR + frame->SetStatusText(wxString::Format(wxT("%dx%d"), w, h)); +#endif // wxUSE_STATUSBAR frame->SetClientSize(w > 100 ? 100 : w, h > 100 ? 100 : h); - frame->Show(TRUE); + frame->Show(true); } -#ifdef USE_METAFILES +#if wxUSE_METAFILE static void ShowMetaFile(const wxMetaFile& metafile) { - wxFrame *frame = new wxFrame(NULL, -1, _T("Metafile view")); + wxFrame *frame = new wxFrame(NULL, wxID_ANY, wxT("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->SetStatusText(wxString::Format(wxT("%dx%d"), size.x, size.y)); frame->SetClientSize(size.x > 100 ? 100 : size.x, size.y > 100 ? 100 : size.y); frame->Show(); } -#endif // USE_METAFILES +#endif // wxUSE_METAFILE + +#endif // wxUSE_DRAG_AND_DROP || wxUSE_CLIPBOARD