X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e680a378413d7624d148a641864efbbcf16b203f..8601b2e15bf924d4be6b7843064028e514a71ec8:/samples/dnd/dnd.cpp?ds=sidebyside diff --git a/samples/dnd/dnd.cpp b/samples/dnd/dnd.cpp index 6ba0420bb3..9af14885d2 100644 --- a/samples/dnd/dnd.cpp +++ b/samples/dnd/dnd.cpp @@ -29,6 +29,12 @@ #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" @@ -38,14 +44,22 @@ #include "wx/image.h" #include "wx/clipbrd.h" #include "wx/colordlg.h" -#include "wx/resource.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(__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 // ---------------------------------------------------------------------------- @@ -76,6 +90,42 @@ 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; + } +}; + // ---------------------------------------------------------------------------- // Define a new application type // ---------------------------------------------------------------------------- @@ -174,6 +224,7 @@ public: ~DnDFrame(); void OnPaint(wxPaintEvent& event); + void OnSize(wxSizeEvent& event); void OnQuit (wxCommandEvent& event); void OnAbout(wxCommandEvent& event); void OnDrag (wxCommandEvent& event); @@ -305,12 +356,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; } @@ -342,12 +393,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; } @@ -379,12 +430,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; } @@ -404,7 +455,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 { @@ -523,7 +574,7 @@ public: else { wxASSERT_MSG( m_dobjBitmap.IsSupported(format), - "unexpected format" ); + wxT("unexpected format") ); if ( !m_hasBitmap ) CreateBitmap(); @@ -552,7 +603,7 @@ public: else { wxASSERT_MSG( m_dobjBitmap.IsSupported(format), - "unexpected format" ); + wxT("unexpected format") ); if ( !m_hasBitmap ) CreateBitmap(); @@ -564,7 +615,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); @@ -692,7 +744,7 @@ public: { if ( !GetData() ) { - wxLogError("Failed to get drag and drop data"); + wxLogError(wxT("Failed to get drag and drop data")); return wxDragNone; } @@ -765,6 +817,7 @@ BEGIN_EVENT_TABLE(DnDFrame, wxFrame) 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) @@ -804,6 +857,7 @@ 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("."); @@ -815,13 +869,14 @@ bool DnDApp::OnInit() wxString path = pathList.FindValidPath("dnd.wxr"); if ( !path ) { - wxLogError("Can't find the resource file dnd.wxr in the current " - "directory, aborting."); + wxLogError(wxT("Can't find the resource file dnd.wxr in the current ") + wxT("directory, aborting.")); return FALSE; } wxDefaultResourceTable->ParseResourceFile(path); +#endif // switch on trace messages #if defined(__WXGTK__) @@ -878,17 +933,17 @@ DnDFrame::DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h) help_menu->Append(Menu_About, "&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, "&Copy text\tCtrl-C"); + clip_menu->Append(Menu_Paste, "&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"); + 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->AppendSeparator(); clip_menu->Append(Menu_PasteMFile, "Paste &metafile\tCtrl-M"); #endif // USE_METAFILES clip_menu->AppendSeparator(); - clip_menu->Append(Menu_CopyFiles, "Copy &files\tCtrl+F"); + clip_menu->Append(Menu_CopyFiles, "Copy &files\tCtrl-F"); wxMenuBar *menu_bar = new wxMenuBar; menu_bar->Append(file_menu, "&File"); @@ -917,9 +972,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; @@ -955,6 +1011,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; @@ -962,6 +1025,7 @@ void DnDFrame::OnPaint(wxPaintEvent& WXUNUSED(event)) GetClientSize( &w, &h ); wxPaintDC dc(this); + dc.Clear(); dc.SetFont( wxFont( 24, wxDECORATIVE, wxNORMAL, wxNORMAL, FALSE, "charter" ) ); dc.DrawText( "Drag text from here!", 100, h-50 ); } @@ -992,7 +1056,7 @@ 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)) @@ -1065,14 +1129,10 @@ 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 - ); + wxDropSource source(textData, this, + wxDROP_ICON(dnd_copy), + wxDROP_ICON(dnd_move), + wxDROP_ICON(dnd_none)); const char *pc; @@ -1157,7 +1217,7 @@ void DnDFrame::OnCopyBitmap(wxCommandEvent& WXUNUSED(event)) wxLogStatus( _T("Decoding image file...") ); wxYield(); - wxBitmap bitmap( image.ConvertToBitmap() ); + wxBitmap bitmap( image ); if ( !wxTheClipboard->Open() ) { @@ -1282,27 +1342,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 } @@ -1391,9 +1451,14 @@ 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 { m_shape = shape; - +#if USE_RESOURCES LoadFromResource(parent, "dialogShape"); m_textX = (wxTextCtrl *)wxFindWindowByName("textX", this); @@ -1402,6 +1467,69 @@ DnDShapeDialog::DnDShapeDialog(wxFrame *parent, DnDShape *shape) m_textH = (wxTextCtrl *)wxFindWindowByName("textH", this); m_radio = (wxRadioBox *)wxFindWindowByName("radio", this); +#else + 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 ); +#endif } DnDShape *DnDShapeDialog::GetShape() const @@ -1445,10 +1573,10 @@ 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 ) { @@ -1511,19 +1639,19 @@ DnDShapeFrame::DnDShapeFrame(wxFrame *parent) 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(); @@ -1548,7 +1676,7 @@ void DnDShapeFrame::OnDrag(wxMouseEvent& event) { 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: @@ -1587,7 +1715,7 @@ 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 (%ld, %ld)"), pt.x, pt.y); SetStatusText(s); shape->Move(pt); @@ -1627,7 +1755,7 @@ void DnDShapeFrame::OnCopyShape(wxCommandEvent& event) wxClipboardLocker clipLocker; if ( !clipLocker ) { - wxLogError("Can't open the clipboard"); + wxLogError(wxT("Can't open the clipboard")); return; } @@ -1641,7 +1769,7 @@ void DnDShapeFrame::OnPasteShape(wxCommandEvent& event) wxClipboardLocker clipLocker; if ( !clipLocker ) { - wxLogError("Can't open the clipboard"); + wxLogError(wxT("Can't open the clipboard")); return; } @@ -1653,7 +1781,7 @@ void DnDShapeFrame::OnPasteShape(wxCommandEvent& event) } else { - wxLogStatus("No shape on the clipboard"); + wxLogStatus(wxT("No shape on the clipboard")); } } @@ -1706,7 +1834,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; } } @@ -1746,7 +1874,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);