#include "wx/colordlg.h"
#include "wx/fontdlg.h"
#include "wx/numdlg.h"
+#include "wx/tokenzr.h"
//----------------------------------------------------------------------
// class definitions
void OnTextURL(wxTextUrlEvent& event);
void OnTextMaxLen(wxCommandEvent& event);
+ void OnTextCut(wxClipboardTextEvent & event);
+ void OnTextCopy(wxClipboardTextEvent & event);
+ void OnTextPaste(wxClipboardTextEvent & event);
+
void OnMouseEvent(wxMouseEvent& event);
void OnSetFocus(wxFocusEvent& event);
static bool ms_logMouse;
static bool ms_logText;
static bool ms_logFocus;
+ static bool ms_logClip;
private:
static inline wxChar GetChar(bool on, wxChar c) { return on ? c : _T('-'); }
+
void LogKeyEvent(const wxChar *name, wxKeyEvent& event) const;
+ void LogClipEvent(const wxChar *what, wxClipboardTextEvent& event);
bool m_hasCapture;
}
#endif // wxUSE_CLIPBOARD
+ void OnAddTextLine(wxCommandEvent& WXUNUSED(event))
+ {
+ static int s_n = 0;
+ m_panel->m_textrich->AppendText(wxString::Format("Line %d\n", ++s_n));
+ }
+
void OnAddTextFreeze( wxCommandEvent& WXUNUSED(event) )
{ DoAddText(true); }
void OnAddText( wxCommandEvent& WXUNUSED(event) )
MyTextCtrl::ms_logFocus = event.IsChecked();
}
+ void OnLogClip(wxCommandEvent& event)
+ {
+ MyTextCtrl::ms_logClip = event.IsChecked();
+ }
+
void OnSetText(wxCommandEvent& WXUNUSED(event))
{
- m_panel->m_text->SetValue(_T("Hello, world (what else did you expect)?"));
+ m_panel->m_text->SetValue(_T("Hello, world! (what else did you expect?)"));
+ }
+
+ void OnChangeText(wxCommandEvent& WXUNUSED(event))
+ {
+ m_panel->m_text->ChangeValue(_T("Changed, not set: no event"));
}
void OnIdle( wxIdleEvent& event );
void DoAddText(bool freeze)
{
wxTextCtrl * const text = m_panel->m_textrich;
- text->Clear();
if ( freeze )
text->Freeze();
+ text->Clear();
+
for ( int i = 0; i < 100; i++ )
{
text->AppendText(wxString::Format(wxT("Line %i\n"), i));
}
+ text->SetInsertionPoint(0);
+
if ( freeze )
text->Thaw();
-
- text->SetInsertionPoint(0);
}
MyPanel *m_panel;
void OnChangeBackgroundColour(wxCommandEvent& event);
void OnLeftIndent(wxCommandEvent& event);
void OnRightIndent(wxCommandEvent& event);
+ void OnTabStops(wxCommandEvent& event);
private:
wxTextCtrl *m_textCtrl;
// clipboard menu
TEXT_CLIPBOARD_COPY = 200,
TEXT_CLIPBOARD_PASTE,
+ TEXT_CLIPBOARD_VETO,
// tooltip menu
TEXT_TOOLTIPS_SETDELAY = 300,
// text menu
TEXT_ADD_SOME = 400,
TEXT_ADD_FREEZE,
+ TEXT_ADD_LINE,
TEXT_MOVE_ENDTEXT,
TEXT_MOVE_ENDENTRY,
TEXT_SET_EDITABLE,
TEXT_REPLACE,
TEXT_SELECT,
TEXT_SET,
+ TEXT_CHANGE,
// log menu
TEXT_LOG_KEY,
TEXT_LOG_MOUSE,
TEXT_LOG_TEXT,
TEXT_LOG_FOCUS,
+ TEXT_LOG_CLIP,
TEXT_END
};
bool MyApp::OnInit()
{
+ if ( !wxApp::OnInit() )
+ return false;
+
// Create the main frame window
MyFrame *frame = new MyFrame((wxFrame *) NULL,
_T("Text wxWidgets sample"), 50, 50, 700, 550);
_T("Copy the selection to the clipboard"));
menuClipboard->Append(TEXT_CLIPBOARD_PASTE, _T("&Paste\tCtrl-Shift-V"),
_T("Paste from clipboard to the text control"));
+ menuClipboard->AppendSeparator();
+ menuClipboard->AppendCheckItem(TEXT_CLIPBOARD_VETO, _T("Vet&o\tCtrl-Shift-O"),
+ _T("Veto all clipboard operations"));
menu_bar->Append(menuClipboard, _T("&Clipboard"));
#endif // wxUSE_CLIPBOARD
wxMenu *menuText = new wxMenu;
menuText->Append(TEXT_ADD_SOME, _T("&Append some text\tCtrl-A"));
menuText->Append(TEXT_ADD_FREEZE, _T("&Append text with freeze/thaw\tShift-Ctrl-A"));
+ menuText->Append(TEXT_ADD_LINE, _T("Append a new &line\tAlt-Shift-A"));
menuText->Append(TEXT_REMOVE, _T("&Remove first 10 characters\tCtrl-Y"));
menuText->Append(TEXT_REPLACE, _T("&Replace characters 4 to 8 with ABC\tCtrl-R"));
menuText->Append(TEXT_SELECT, _T("&Select characters 4 to 8\tCtrl-I"));
menuText->Append(TEXT_SET, _T("&Set the first text zone value\tCtrl-E"));
+ menuText->Append(TEXT_CHANGE, _T("&Change the first text zone value\tShift-Ctrl-E"));
menuText->AppendSeparator();
menuText->Append(TEXT_MOVE_ENDTEXT, _T("Move cursor to the end of &text"));
menuText->Append(TEXT_MOVE_ENDENTRY, _T("Move cursor to the end of &entry"));
menuLog->AppendCheckItem(TEXT_LOG_MOUSE, _T("Log &mouse events"));
menuLog->AppendCheckItem(TEXT_LOG_TEXT, _T("Log &text events"));
menuLog->AppendCheckItem(TEXT_LOG_FOCUS, _T("Log &focus events"));
+ menuLog->AppendCheckItem(TEXT_LOG_CLIP, _T("Log clip&board events"));
menuLog->AppendSeparator();
menuLog->Append(TEXT_CLEAR, _T("&Clear the log\tCtrl-L"),
_T("Clear the log window contents"));
// select only the interesting events by default
- MyTextCtrl::ms_logKey =
- MyTextCtrl::ms_logChar = false;
+ MyTextCtrl::ms_logClip =
MyTextCtrl::ms_logText = true;
menuLog->Check(TEXT_LOG_KEY, MyTextCtrl::ms_logKey);
EVT_TEXT_ENTER(wxID_ANY, MyTextCtrl::OnTextEnter)
EVT_TEXT_URL(wxID_ANY, MyTextCtrl::OnTextURL)
EVT_TEXT_MAXLEN(wxID_ANY, MyTextCtrl::OnTextMaxLen)
+ EVT_TEXT_CUT(wxID_ANY, MyTextCtrl::OnTextCut)
+ EVT_TEXT_COPY(wxID_ANY, MyTextCtrl::OnTextCopy)
+ EVT_TEXT_PASTE(wxID_ANY, MyTextCtrl::OnTextPaste)
EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent)
bool MyTextCtrl::ms_logMouse = false;
bool MyTextCtrl::ms_logText = false;
bool MyTextCtrl::ms_logFocus = false;
+bool MyTextCtrl::ms_logClip = false;
void MyTextCtrl::LogKeyEvent(const wxChar *name, wxKeyEvent& event) const
{
return;
MyTextCtrl *win = (MyTextCtrl *)event.GetEventObject();
+ const wxChar *changeVerb = win->IsModified() ? _T("changed")
+ : _T("set by program");
const wxChar *data = (const wxChar *)(win->GetClientData());
if ( data )
{
- wxLogMessage(_T("Text changed in control '%s'"), data);
+ wxLogMessage(_T("Text %s in control \"%s\""), changeVerb, data);
}
else
{
- // wxLogMessage( event.GetString() );
- wxLogMessage(_T("Text changed in some control"));
+ wxLogMessage(_T("Text %s in some control"), changeVerb);
}
}
wxLogMessage(_T("You can't enter more characters into this control."));
}
+
+void MyTextCtrl::OnTextCut(wxClipboardTextEvent& event)
+{
+ LogClipEvent(_T("cut to"), event);
+}
+
+void MyTextCtrl::OnTextCopy(wxClipboardTextEvent& event)
+{
+ LogClipEvent(_T("copied to"), event);
+}
+
+void MyTextCtrl::OnTextPaste(wxClipboardTextEvent& event)
+{
+ LogClipEvent(_T("pasted from"), event);
+}
+
+void MyTextCtrl::LogClipEvent(const wxChar *what, wxClipboardTextEvent& event)
+{
+ wxFrame *frame = wxDynamicCast(wxGetTopLevelParent(this), wxFrame);
+ wxCHECK_RET( frame, _T("no parent frame?") );
+
+ const bool veto = frame->GetMenuBar()->IsChecked(TEXT_CLIPBOARD_VETO);
+ if ( !veto )
+ event.Skip();
+
+ if ( ms_logClip )
+ {
+ wxLogMessage(_T("Text %s%s the clipboard."),
+ veto ? _T("not ") : _T(""), what);
+ }
+}
+
+
void MyTextCtrl::OnTextURL(wxTextUrlEvent& event)
{
const wxMouseEvent& ev = event.GetMouseEvent();
wxLogMessage(_T("Selection = '%s' (len = %u)"),
sel.c_str(),
(unsigned int) sel.length());
+
+ const wxString text = GetLineText(line);
+ wxLogMessage(_T("Current line: \"%s\"; length = %lu"),
+ text.c_str(), text.length());
}
break;
case WXK_F6:
wxLogMessage(_T("IsModified() before SetValue(): %d"),
IsModified());
- SetValue(_T("SetValue() has been called"));
+ ChangeValue(_T("ChangeValue() has been called"));
wxLogMessage(_T("IsModified() after SetValue(): %d"),
IsModified());
break;
case WXK_F10:
AppendText(_T("AppendText() has been called"));
break;
+
+ case WXK_F11:
+ DiscardEdits();
+ wxLogMessage(_T("Control marked as non modified"));
+ break;
}
if ( ms_logKey )
// a little hack to use the command line argument for encoding testing
if ( wxTheApp->argc == 2 )
{
- switch ( wxTheApp->argv[1][0] )
+ switch ( (wxChar)wxTheApp->argv[1][0] )
{
case '2':
m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
m_horizontal->AppendText(_T("Text in default encoding"));
}
- m_multitext = new MyTextCtrl( this, wxID_ANY, _T("Multi line."),
- wxPoint(180,10), wxSize(200,70), wxTE_MULTILINE );
+ m_multitext = new MyTextCtrl( this, wxID_ANY,
+ _T("Multi line without vertical scrollbar."),
+ wxPoint(180,10), wxSize(200,70), wxTE_MULTILINE | wxTE_NO_VSCROLL );
m_multitext->SetFont(*wxITALIC_FONT);
(*m_multitext) << _T(" Appended.");
m_multitext->SetInsertionPoint(0);
topSizer->Add( m_log, 1, wxALL | wxEXPAND, 10 );
#endif
- SetAutoLayout( true );
SetSizer(topSizer);
}
EVT_MENU(TEXT_LOG_MOUSE,MyFrame::OnLogMouse)
EVT_MENU(TEXT_LOG_TEXT, MyFrame::OnLogText)
EVT_MENU(TEXT_LOG_FOCUS,MyFrame::OnLogFocus)
+ EVT_MENU(TEXT_LOG_CLIP, MyFrame::OnLogClip)
#if wxUSE_LOG
EVT_MENU(TEXT_CLEAR, MyFrame::OnLogClear)
#endif // wxUSE_LOG
EVT_MENU(TEXT_SELECT, MyFrame::OnSelectText)
EVT_MENU(TEXT_ADD_SOME, MyFrame::OnAddText)
EVT_MENU(TEXT_ADD_FREEZE, MyFrame::OnAddTextFreeze)
+ EVT_MENU(TEXT_ADD_LINE, MyFrame::OnAddTextLine)
EVT_MENU(TEXT_MOVE_ENDTEXT, MyFrame::OnMoveToEndOfText)
EVT_MENU(TEXT_MOVE_ENDENTRY, MyFrame::OnMoveToEndOfEntry)
EVT_MENU(TEXT_PAGE_DOWN, MyFrame::OnScrollPageDown)
EVT_MENU(TEXT_PAGE_UP, MyFrame::OnScrollPageUp)
- EVT_MENU(TEXT_GET_LINE, MyFrame::OnGetLine)
- EVT_MENU(TEXT_GET_LINELENGTH, MyFrame::OnGetLineLength)
+ EVT_MENU(TEXT_GET_LINE, MyFrame::OnGetLine)
+ EVT_MENU(TEXT_GET_LINELENGTH, MyFrame::OnGetLineLength)
EVT_MENU(TEXT_SET, MyFrame::OnSetText)
+ EVT_MENU(TEXT_CHANGE, MyFrame::OnChangeText)
EVT_IDLE(MyFrame::OnIdle)
END_EVENT_TABLE()
wxString msg;
msg.Printf(
#ifdef __WXMSW__
- _T("Focus: wxWindow = %p, HWND = %08x"),
+ _T("Focus: wxWindow = %p, HWND = %p"),
#else
_T("Focus: wxWindow = %p"),
#endif
s_windowFocus
#ifdef __WXMSW__
- , (unsigned int) s_windowFocus->GetHWND()
+ , s_windowFocus->GetHWND()
#endif
);
RICHTEXT_CHANGE_TEXT_COLOUR,
RICHTEXT_CHANGE_BACKGROUND_COLOUR,
RICHTEXT_LEFT_INDENT,
- RICHTEXT_RIGHT_INDENT
+ RICHTEXT_RIGHT_INDENT,
+ RICHTEXT_TAB_STOPS
};
BEGIN_EVENT_TABLE(RichTextFrame, wxFrame)
EVT_MENU(RICHTEXT_CHANGE_BACKGROUND_COLOUR, RichTextFrame::OnChangeBackgroundColour)
EVT_MENU(RICHTEXT_LEFT_INDENT, RichTextFrame::OnLeftIndent)
EVT_MENU(RICHTEXT_RIGHT_INDENT, RichTextFrame::OnRightIndent)
+ EVT_MENU(RICHTEXT_TAB_STOPS, RichTextFrame::OnTabStops)
END_EVENT_TABLE()
RichTextFrame::RichTextFrame(wxWindow* parent, const wxString& title):
editMenu->Append(RICHTEXT_CHANGE_BACKGROUND_COLOUR, _("Change Background Colour"));
editMenu->AppendSeparator();
editMenu->Append(RICHTEXT_LEFT_INDENT, _("Left Indent"));
- editMenu->Append(RICHTEXT_RIGHT_INDENT, _("Right indent"));
+ editMenu->Append(RICHTEXT_RIGHT_INDENT, _("Right Indent"));
+ editMenu->Append(RICHTEXT_TAB_STOPS, _("Tab Stops"));
menuBar->Append(editMenu, _("Edit"));
SetMenuBar(menuBar);
}
}
+void RichTextFrame::OnTabStops(wxCommandEvent& WXUNUSED(event))
+{
+ wxString tabsStr = wxGetTextFromUser
+ (
+ _("Please enter the tab stop positions in tenths of a millimetre, separated by spaces.\nLeave empty to reset tab stops."),
+ _("Tab Stops"),
+ wxEmptyString,
+ this
+ );
+
+ wxArrayInt tabs;
+
+ wxStringTokenizer tokens(tabsStr, _T(" "));
+ while (tokens.HasMoreTokens())
+ {
+ wxString token = tokens.GetNextToken();
+ tabs.Add(wxAtoi(token));
+ }
+
+ wxTextAttr attr;
+ attr.SetTabs(tabs);
+
+ long start, end;
+ m_textCtrl->GetSelection(& start, & end);
+ m_textCtrl->SetStyle(start, end, attr);
+
+ m_currentPosition = -1;
+}
+
void RichTextFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
{
long insertionPoint = m_textCtrl->GetInsertionPoint();
alignment = wxT("left-aligned");
else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_JUSTIFIED)
alignment = wxT("justified");
- msg.Printf(wxT("Facename: %s, wxColour(%d, %d, %d), %s"),
- (const wxChar*) facename,
+ msg.Printf( "Facename: %s, wxColour(%d, %d, %d), %s", facename,
attr.GetTextColour().Red(), attr.GetTextColour().Green(), attr.GetTextColour().Blue(),
- (const wxChar*) alignment);
+ alignment );
if (attr.HasFont())
{