1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 //
6 // Any parts of this program derived from the xMule, lMule or eMule project,
7 // or contributed by third-party developers are copyrighted by their
8 // respective authors.
9 //
10 // This program is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 2 of the License, or
13 // (at your option) any later version.
14 //
15 // This program is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
23 //
24 
25 #include "MuleTextCtrl.h"
26 #include <wx/menu.h>
27 #include <wx/intl.h>
28 #include <wx/dataobj.h>
29 #include <wx/clipbrd.h>
30 
31 /**
32  * These are the IDs used to identify the different menu-items.
33  *
34  * Please note that I make use of predefined wxIDs for the first two, but not
35  * for Paste. This is because wxMenu poses some restrictions on what can be
36  * done with items using those IDs, and by default, Paste is enabled even if
37  * there's nothing to paste!
38  */
39 enum CMTC_Events
40 {
41 	//! Cut text, uses provided ID
42 	CMTCE_Cut	= wxID_CUT,
43 	//! Copy text, uses privided ID
44 	CMTCE_Copy	= wxID_COPY,
45 	//! Paste text, uses custom ID
46 	CMTCE_Paste = wxID_HIGHEST + 666,	// Random satanic ID
47 	//! Clear text, uses custom ID
48 	CMTCE_Clear,
49 	//! Select All text, uses custom ID
50 	CMTCE_SelAll
51 };
52 
53 
54 BEGIN_EVENT_TABLE(CMuleTextCtrl, wxTextCtrl)
55 #ifndef __WXGTK__
56 	EVT_RIGHT_DOWN	(CMuleTextCtrl::OnRightDown)
57 
58 	EVT_MENU	(CMTCE_Paste,	CMuleTextCtrl::OnPaste)
59 	EVT_MENU	(CMTCE_Clear,	CMuleTextCtrl::OnClear)
60 	EVT_MENU	(CMTCE_SelAll,	CMuleTextCtrl::OnSelAll)
61 #endif
62 END_EVENT_TABLE()
63 
64 
65 CMuleTextCtrl::CMuleTextCtrl(wxWindow* parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name)
66  :  wxTextCtrl( parent, id, value, pos, size, style, validator, name)
67 {
68 }
69 
70 
71 void CMuleTextCtrl::OnRightDown( wxMouseEvent& evt )
72 {
73 	// If this control doesn't have focus, then set it
74 	if ( FindFocus() != this )
75 		SetFocus();
76 
77 	wxMenu popup_menu;
78 
79 	popup_menu.Append( CMTCE_Cut, _("Cut") );
80 	popup_menu.Append( CMTCE_Copy, _("Copy") );
81 	popup_menu.Append( CMTCE_Paste, _("Paste") );
82 	popup_menu.Append( CMTCE_Clear, _("Clear") );
83 
84 	popup_menu.AppendSeparator();
85 
86 	popup_menu.Append( CMTCE_SelAll, _("Select All") );
87 
88 
89 	// wxMenu will automatically enable/disable the Cut and Copy items,
90 	// however, were are a little more pricky about the Paste item than they
91 	// are, so we enable/disable it on our own, depending on whenever or not
92 	// there's actually something to paste
93 	bool canpaste = false;
94 	if ( CanPaste() ) {
95 		if ( wxTheClipboard->Open() ) {
96 			if ( wxTheClipboard->IsSupported( wxDF_TEXT ) ) {
97 				wxTextDataObject data;
98 				wxTheClipboard->GetData( data );
99 
100 				canpaste = (data.GetTextLength() > 0);
101 			}
102 			wxTheClipboard->Close();
103 		}
104 	}
105 
106 
107 	popup_menu.Enable( CMTCE_Paste,		canpaste );
108 	popup_menu.Enable( CMTCE_Clear,		IsEditable() && !GetValue().IsEmpty() );
109 
110 	PopupMenu( &popup_menu, evt.GetX(), evt.GetY() );
111 }
112 
113 
114 void CMuleTextCtrl::OnPaste( wxCommandEvent& WXUNUSED(evt) )
115 {
116 	Paste();
117 }
118 
119 
120 void CMuleTextCtrl::OnSelAll( wxCommandEvent& WXUNUSED(evt) )
121 {
122 	// Move the pointer to the front
123 	SetInsertionPoint( 0 );
124 
125 	// Selects everything
126 	SetSelection( -1, -1 );
127 }
128 
129 
130 void CMuleTextCtrl::OnClear( wxCommandEvent& WXUNUSED(evt) )
131 {
132 	Clear();
133 }
134 
135 
136 #ifdef __WXMAC__
137 //#warning Remove this when wxMAC has been fixed.
138 // https://sourceforge.net/tracker/?func=detail&atid=109863&aid=1189859&group_id=9863
139 void CMuleTextCtrl::Clear()
140 {
141 	if (IsMultiLine()) {
142 		wxFont font = GetFont();
143 		wxTextCtrl::Clear();
144 		SetFont(font);
145 	} else {
146 		wxTextCtrl::Clear();
147 	}
148 }
149 #endif
150 
151 // File_checked_for_headers
152