#include "wx/splitter.h"
#include "wx/sstream.h"
#include "wx/html/htmlwin.h"
+#include "wx/stopwatch.h"
#if wxUSE_FILESYSTEM
#include "wx/filesys.h"
void OnItalic(wxCommandEvent& event);
void OnUnderline(wxCommandEvent& event);
+ void OnStrikethrough(wxCommandEvent& event);
+ void OnSuperscript(wxCommandEvent& event);
+ void OnSubscript(wxCommandEvent& event);
+
void OnUpdateBold(wxUpdateUIEvent& event);
void OnUpdateItalic(wxUpdateUIEvent& event);
void OnUpdateUnderline(wxUpdateUIEvent& event);
+ void OnUpdateStrikethrough(wxUpdateUIEvent& event);
+ void OnUpdateSuperscript(wxUpdateUIEvent& event);
+ void OnUpdateSubscript(wxUpdateUIEvent& event);
void OnAlignLeft(wxCommandEvent& event);
void OnAlignCentre(wxCommandEvent& event);
ID_FORMAT_BOLD = 100,
ID_FORMAT_ITALIC,
ID_FORMAT_UNDERLINE,
+ ID_FORMAT_STRIKETHROUGH,
+ ID_FORMAT_SUPERSCRIPT,
+ ID_FORMAT_SUBSCRIPT,
ID_FORMAT_FONT,
ID_FORMAT_IMAGE,
ID_FORMAT_PARAGRAPH,
EVT_MENU(ID_FORMAT_ITALIC, MyFrame::OnItalic)
EVT_MENU(ID_FORMAT_UNDERLINE, MyFrame::OnUnderline)
+ EVT_MENU(ID_FORMAT_STRIKETHROUGH, MyFrame::OnStrikethrough)
+ EVT_MENU(ID_FORMAT_SUPERSCRIPT, MyFrame::OnSuperscript)
+ EVT_MENU(ID_FORMAT_SUBSCRIPT, MyFrame::OnSubscript)
+
EVT_UPDATE_UI(ID_FORMAT_BOLD, MyFrame::OnUpdateBold)
EVT_UPDATE_UI(ID_FORMAT_ITALIC, MyFrame::OnUpdateItalic)
EVT_UPDATE_UI(ID_FORMAT_UNDERLINE, MyFrame::OnUpdateUnderline)
+ EVT_UPDATE_UI(ID_FORMAT_STRIKETHROUGH, MyFrame::OnUpdateStrikethrough)
+ EVT_UPDATE_UI(ID_FORMAT_SUPERSCRIPT, MyFrame::OnUpdateSuperscript)
+ EVT_UPDATE_UI(ID_FORMAT_SUBSCRIPT, MyFrame::OnUpdateSubscript)
+
EVT_MENU(ID_FORMAT_ALIGN_LEFT, MyFrame::OnAlignLeft)
EVT_MENU(ID_FORMAT_ALIGN_CENTRE, MyFrame::OnAlignCentre)
EVT_MENU(ID_FORMAT_ALIGN_RIGHT, MyFrame::OnAlignRight)
formatMenu->AppendCheckItem(ID_FORMAT_ITALIC, _("&Italic\tCtrl+I"));
formatMenu->AppendCheckItem(ID_FORMAT_UNDERLINE, _("&Underline\tCtrl+U"));
formatMenu->AppendSeparator();
+ formatMenu->AppendCheckItem(ID_FORMAT_STRIKETHROUGH, _("Stri&kethrough"));
+ formatMenu->AppendCheckItem(ID_FORMAT_SUPERSCRIPT, _("Superscrip&t"));
+ formatMenu->AppendCheckItem(ID_FORMAT_SUBSCRIPT, _("Subscrip&t"));
+ formatMenu->AppendSeparator();
formatMenu->AppendCheckItem(ID_FORMAT_ALIGN_LEFT, _("L&eft Align"));
formatMenu->AppendCheckItem(ID_FORMAT_ALIGN_RIGHT, _("&Right Align"));
formatMenu->AppendCheckItem(ID_FORMAT_ALIGN_CENTRE, _("&Centre"));
m_richTextCtrl->SetFont(font);
+ m_richTextCtrl->SetMargins(10, 10);
+
m_richTextCtrl->SetStyleSheet(wxGetApp().GetStyleSheet());
combo->SetStyleSheet(wxGetApp().GetStyleSheet());
r.EndAlignment();
r.BeginAlignment(wxTEXT_ALIGNMENT_LEFT);
- wxRichTextAnchoredObjectAttr anchoredAttr;
- anchoredAttr.m_floating = wxRICHTEXT_FLOAT_LEFT;
- r.WriteText(wxString(wxT("This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side. This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side. This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side.")));
- r.WriteImage(wxBitmap(zebra_xpm), wxBITMAP_TYPE_PNG, anchoredAttr);
- anchoredAttr.m_floating = wxRICHTEXT_FLOAT_RIGHT;
- anchoredAttr.m_offset = 200;
- r.WriteImage(wxBitmap(zebra_xpm), wxBITMAP_TYPE_PNG, anchoredAttr);
+ wxRichTextAttr imageAttr;
+ imageAttr.GetTextBoxAttr().SetFloatMode(wxTEXT_BOX_ATTR_FLOAT_LEFT);
r.WriteText(wxString(wxT("This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side. This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side. This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side.")));
+ r.WriteImage(wxBitmap(zebra_xpm), wxBITMAP_TYPE_PNG, imageAttr);
+
+ imageAttr.GetTextBoxAttr().GetTop().SetValue(200);
+ imageAttr.GetTextBoxAttr().GetTop().SetUnits(wxTEXT_ATTR_UNITS_PIXELS);
+ imageAttr.GetTextBoxAttr().SetFloatMode(wxTEXT_BOX_ATTR_FLOAT_RIGHT);
+ r.WriteImage(wxBitmap(zebra_xpm), wxBITMAP_TYPE_PNG, imageAttr);
+ r.WriteText(wxString(wxT("This is a simple test for a floating right image test. The zebra image should be placed at the right side of the current buffer and all the text should flow around it at the left side. This is a simple test for a floating left image test. The zebra image should be placed at the right side of the current buffer and all the text should flow around it at the left side. This is a simple test for a floating left image test. The zebra image should be placed at the right side of the current buffer and all the text should flow around it at the left side.")));
r.EndAlignment();
r.Newline();
tabs.Add(600);
tabs.Add(800);
tabs.Add(1000);
- wxTextAttrEx attr;
+ wxRichTextAttr attr;
attr.SetFlags(wxTEXT_ATTR_TABS);
attr.SetTabs(tabs);
r.SetDefaultStyle(attr);
r.WriteText(wxT("Note: this sample content was generated programmatically from within the MyFrame constructor in the demo. The images were loaded from inline XPMs. Enjoy wxRichTextCtrl!\n"));
r.EndParagraphSpacing();
+#if 1
+
+ {
+ // Add a text box
+
+ r.Newline();
+
+ wxRichTextAttr attr;
+ attr.GetTextBoxAttr().GetMargins().GetLeft().SetValue(20, wxTEXT_ATTR_UNITS_PIXELS);
+ attr.GetTextBoxAttr().GetMargins().GetTop().SetValue(20, wxTEXT_ATTR_UNITS_PIXELS);
+ attr.GetTextBoxAttr().GetMargins().GetRight().SetValue(20, wxTEXT_ATTR_UNITS_PIXELS);
+ attr.GetTextBoxAttr().GetMargins().GetBottom().SetValue(20, wxTEXT_ATTR_UNITS_PIXELS);
+
+ attr.GetTextBoxAttr().GetBorder().SetColour(*wxBLACK);
+ attr.GetTextBoxAttr().GetBorder().SetWidth(1, wxTEXT_ATTR_UNITS_PIXELS);
+ attr.GetTextBoxAttr().GetBorder().SetStyle(wxTEXT_BOX_ATTR_BORDER_SOLID);
+
+ wxRichTextBox* textBox = r.WriteTextBox(attr);
+ r.SetFocusObject(textBox);
+
+ r.WriteText(wxT("This is a text box. Just testing! Once more unto the breach, dear friends, once more..."));
+
+ r.SetFocusObject(NULL); // Set the focus back to the main buffer
+ r.SetInsertionPointEnd();
+ }
+#endif
+#if 1
+ {
+ // Add a table
+
+ r.Newline();
+
+ wxRichTextAttr attr;
+ attr.GetTextBoxAttr().GetMargins().GetLeft().SetValue(5, wxTEXT_ATTR_UNITS_PIXELS);
+ attr.GetTextBoxAttr().GetMargins().GetTop().SetValue(5, wxTEXT_ATTR_UNITS_PIXELS);
+ attr.GetTextBoxAttr().GetMargins().GetRight().SetValue(5, wxTEXT_ATTR_UNITS_PIXELS);
+ attr.GetTextBoxAttr().GetMargins().GetBottom().SetValue(5, wxTEXT_ATTR_UNITS_PIXELS);
+ attr.GetTextBoxAttr().GetPadding() = attr.GetTextBoxAttr().GetMargins();
+
+ attr.GetTextBoxAttr().GetBorder().SetColour(*wxBLACK);
+ attr.GetTextBoxAttr().GetBorder().SetWidth(1, wxTEXT_ATTR_UNITS_PIXELS);
+ attr.GetTextBoxAttr().GetBorder().SetStyle(wxTEXT_BOX_ATTR_BORDER_SOLID);
+
+ wxRichTextAttr cellAttr = attr;
+ cellAttr.GetTextBoxAttr().GetWidth().SetValue(200, wxTEXT_ATTR_UNITS_PIXELS);
+ cellAttr.GetTextBoxAttr().GetHeight().SetValue(150, wxTEXT_ATTR_UNITS_PIXELS);
+
+ wxRichTextTable* table = r.WriteTable(3, 2, attr, cellAttr);
+ int i, j;
+ for (j = 0; j < table->GetRowCount(); j++)
+ {
+ for (i = 0; i < table->GetColumnCount(); i++)
+ {
+ wxString msg = wxString::Format(wxT("This is cell %d, %d"), (j+1), (i+1));
+ r.SetFocusObject(table->GetCell(j, i));
+ r.WriteText(msg);
+ }
+ }
+ r.SetFocusObject(NULL); // Set the focus back to the main buffer
+ r.SetInsertionPointEnd();
+ }
+#endif
r.Thaw();
if (!path.empty())
{
+ wxBusyCursor busy;
+ wxStopWatch stopwatch;
+
m_richTextCtrl->SaveFile(path);
+
+ long t = stopwatch.Time();
+ wxLogDebug(wxT("Saving took %ldms"), t);
+ wxMessageBox(wxString::Format(wxT("Saving took %ldms"), t));
}
}
}
m_richTextCtrl->ApplyUnderlineToSelection();
}
+void MyFrame::OnStrikethrough(wxCommandEvent& WXUNUSED(event))
+{
+ m_richTextCtrl->ApplyTextEffectToSelection(wxTEXT_ATTR_EFFECT_STRIKETHROUGH);
+}
+
+void MyFrame::OnSuperscript(wxCommandEvent& WXUNUSED(event))
+{
+ m_richTextCtrl->ApplyTextEffectToSelection(wxTEXT_ATTR_EFFECT_SUPERSCRIPT);
+}
+
+void MyFrame::OnSubscript(wxCommandEvent& WXUNUSED(event))
+{
+ m_richTextCtrl->ApplyTextEffectToSelection(wxTEXT_ATTR_EFFECT_SUBSCRIPT);
+}
+
void MyFrame::OnUpdateBold(wxUpdateUIEvent& event)
{
event.Check(m_richTextCtrl->IsSelectionUnderlined());
}
+void MyFrame::OnUpdateStrikethrough(wxUpdateUIEvent& event)
+{
+ event.Check(m_richTextCtrl->DoesSelectionHaveTextEffectFlag(wxTEXT_ATTR_EFFECT_STRIKETHROUGH));
+}
+
+void MyFrame::OnUpdateSuperscript(wxUpdateUIEvent& event)
+{
+ event.Check(m_richTextCtrl->DoesSelectionHaveTextEffectFlag(wxTEXT_ATTR_EFFECT_SUPERSCRIPT));
+}
+
+void MyFrame::OnUpdateSubscript(wxUpdateUIEvent& event)
+{
+ event.Check(m_richTextCtrl->DoesSelectionHaveTextEffectFlag(wxTEXT_ATTR_EFFECT_SUBSCRIPT));
+}
+
void MyFrame::OnAlignLeft(wxCommandEvent& WXUNUSED(event))
{
m_richTextCtrl->ApplyAlignmentToSelection(wxTEXT_ALIGNMENT_LEFT);
wxRichTextRange range = m_richTextCtrl->GetSelectionRange();
wxFontData fontData;
- wxTextAttrEx attr;
+ wxRichTextAttr attr;
attr.SetFlags(wxTEXT_ATTR_FONT);
if (m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr))
fontData = dialog.GetFontData();
attr.SetFlags(wxTEXT_ATTR_FONT);
attr.SetFont(fontData.GetChosenFont());
- if (attr.GetFont().Ok())
+ if (attr.GetFont().IsOk())
{
m_richTextCtrl->SetStyle(range, attr);
}
range = m_richTextCtrl->GetSelectionRange();
wxASSERT(range.ToInternal().GetLength() == 1);
- wxRichTextImage* image = wxDynamicCast(m_richTextCtrl->GetBuffer().GetLeafObjectAtPosition(range.GetStart()), wxRichTextImage);
+ wxRichTextImage* image = wxDynamicCast(m_richTextCtrl->GetFocusObject()->GetLeafObjectAtPosition(range.GetStart()), wxRichTextImage);
if (image)
{
- wxRichTextImageDialog imageDlg(this);
- imageDlg.SetImageObject(image, &m_richTextCtrl->GetBuffer());
+ wxRichTextObjectPropertiesDialog imageDlg(image, this);
if (imageDlg.ShowModal() == wxID_OK)
{
- image = imageDlg.ApplyImageAttr();
+ imageDlg.ApplyStyle(m_richTextCtrl);
}
}
}
range = m_richTextCtrl->GetSelectionRange();
if (range.ToInternal().GetLength() == 1)
{
- obj = m_richTextCtrl->GetBuffer().GetLeafObjectAtPosition(range.GetStart());
+ obj = m_richTextCtrl->GetFocusObject()->GetLeafObjectAtPosition(range.GetStart());
if (obj && obj->IsKindOf(CLASSINFO(wxRichTextImage)))
{
event.Enable(true);
m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr);
wxString currentFontName;
- if (attr.HasFont() && attr.GetFont().Ok())
+ if (attr.HasFont() && attr.GetFont().IsOk())
currentFontName = attr.GetFont().GetFaceName();
// Don't set the initial font in the dialog (so the user is choosing
void MyFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event))
{
- wxGetApp().GetPrinting()->PageSetup();
+ wxDialog dialog(this, wxID_ANY, wxT("Testing"), wxPoint(10, 10), wxSize(400, 300), wxDEFAULT_DIALOG_STYLE);
+
+ wxNotebook* nb = new wxNotebook(& dialog, wxID_ANY, wxPoint(5, 5), wxSize(300, 250));
+ wxPanel* panel = new wxPanel(nb, wxID_ANY, wxDefaultPosition, wxDefaultSize);
+ wxPanel* panel2 = new wxPanel(nb, wxID_ANY, wxDefaultPosition, wxDefaultSize);
+
+ new wxRichTextCtrl(panel, wxID_ANY, wxEmptyString, wxPoint(5, 5), wxSize(200, 150), wxVSCROLL|wxTE_READONLY);
+ nb->AddPage(panel, wxT("Page 1"));
+
+ new wxRichTextCtrl(panel2, wxID_ANY, wxEmptyString, wxPoint(5, 5), wxSize(200, 150), wxVSCROLL|wxTE_READONLY);
+ nb->AddPage(panel2, wxT("Page 2"));
+
+ new wxButton(& dialog, wxID_OK, wxT("OK"), wxPoint(5, 180));
+
+ dialog.ShowModal();
+
+// wxGetApp().GetPrinting()->PageSetup();
}