X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e4723634039cf0aa3130a9a779b666d9d438413e..9e15c94f41c8cdf42470d318269e48e90d6ba75e:/samples/richtext/richtext.cpp diff --git a/samples/richtext/richtext.cpp b/samples/richtext/richtext.cpp index c0f12931b9..08d7db7605 100644 --- a/samples/richtext/richtext.cpp +++ b/samples/richtext/richtext.cpp @@ -35,6 +35,11 @@ #include "wx/sstream.h" #include "wx/html/htmlwin.h" +#if wxUSE_FILESYSTEM +#include "wx/filesys.h" +#include "wx/fs_mem.h" +#endif + #if wxUSE_HELP #include "wx/cshelp.h" #endif @@ -72,6 +77,7 @@ #include "wx/richtext/richtextformatdlg.h" #include "wx/richtext/richtextsymboldlg.h" #include "wx/richtext/richtextstyledlg.h" +#include "wx/richtext/richtextprint.h" // ---------------------------------------------------------------------------- // resources @@ -97,8 +103,10 @@ public: void CreateStyles(); wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; } + wxRichTextPrinting* GetPrinting() const { return m_printing; } - wxRichTextStyleSheet* m_styleSheet; + wxRichTextStyleSheet* m_styleSheet; + wxRichTextPrinting* m_printing; }; // Define a new frame type: this is going to be our main frame @@ -163,6 +171,14 @@ public: void OnSwitchStyleSheets(wxCommandEvent& event); void OnManageStyles(wxCommandEvent& event); + void OnInsertURL(wxCommandEvent& event); + void OnURL(wxTextUrlEvent& event); + void OnStyleSheetReplacing(wxRichTextEvent& event); + + void OnPrint(wxCommandEvent& event); + void OnPreview(wxCommandEvent& event); + void OnPageSetup(wxCommandEvent& event); + // Forward command events to the current rich text control, if any bool ProcessEvent(wxEvent& event); @@ -192,6 +208,7 @@ enum ID_FORMAT_CONTENT, ID_INSERT_SYMBOL, + ID_INSERT_URL, ID_FORMAT_ALIGN_LEFT, ID_FORMAT_ALIGN_CENTRE, @@ -219,6 +236,10 @@ enum ID_SWITCH_STYLE_SHEETS, ID_MANAGE_STYLES, + ID_PRINT, + ID_PREVIEW, + ID_PAGE_SETUP, + ID_RICHTEXT_CTRL, ID_RICHTEXT_STYLE_LIST, ID_RICHTEXT_STYLE_COMBO @@ -272,6 +293,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_FORMAT_PARAGRAPH_SPACING_LESS, MyFrame::OnParagraphSpacingLess) EVT_MENU(ID_INSERT_SYMBOL, MyFrame::OnInsertSymbol) + EVT_MENU(ID_INSERT_URL, MyFrame::OnInsertURL) EVT_MENU(ID_FORMAT_NUMBER_LIST, MyFrame::OnNumberList) EVT_MENU(ID_FORMAT_BULLETS_AND_NUMBERING, MyFrame::OnBulletsAndNumbering) @@ -284,6 +306,13 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_VIEW_HTML, MyFrame::OnViewHTML) EVT_MENU(ID_SWITCH_STYLE_SHEETS, MyFrame::OnSwitchStyleSheets) EVT_MENU(ID_MANAGE_STYLES, MyFrame::OnManageStyles) + + EVT_MENU(ID_PRINT, MyFrame::OnPrint) + EVT_MENU(ID_PREVIEW, MyFrame::OnPreview) + EVT_MENU(ID_PAGE_SETUP, MyFrame::OnPageSetup) + + EVT_TEXT_URL(wxID_ANY, MyFrame::OnURL) + EVT_RICHTEXT_STYLESHEET_REPLACING(wxID_ANY, MyFrame::OnStyleSheetReplacing) END_EVENT_TABLE() // Create a new application object: this macro will allow wxWidgets to create @@ -309,6 +338,10 @@ bool MyApp::OnInit() #endif m_styleSheet = new wxRichTextStyleSheet; + m_printing = new wxRichTextPrinting(wxT("Test Document")); + + m_printing->SetFooterText(wxT("@TITLE@"), wxRICHTEXT_PAGE_ALL, wxRICHTEXT_PAGE_CENTRE); + m_printing->SetFooterText(wxT("Page @PAGENUM@"), wxRICHTEXT_PAGE_ALL, wxRICHTEXT_PAGE_RIGHT); CreateStyles(); @@ -329,9 +362,15 @@ bool MyApp::OnInit() wxImage::AddHandler( new wxGIFHandler ); #endif +#if wxUSE_FILESYSTEM + wxFileSystem::AddHandler( new wxMemoryFSHandler ); +#endif + // create the main application window MyFrame *frame = new MyFrame(_T("wxRichTextCtrl Sample"), wxID_ANY, wxDefaultPosition, wxSize(700, 600)); + m_printing->SetParentWindow(frame); + // and show it (the frames, unlike simple controls, are not shown when // created initially) frame->Show(true); @@ -344,7 +383,9 @@ bool MyApp::OnInit() int MyApp::OnExit() { + delete m_printing; delete m_styleSheet; + return 0; } @@ -443,19 +484,19 @@ void MyApp::CreateStyles() int i; for (i = 0; i < 10; i++) { - wxString bulletSymbol; + wxString bulletText; if (i == 0) - bulletSymbol = wxT("*"); + bulletText = wxT("standard/circle"); else if (i == 1) - bulletSymbol = wxT("-"); + bulletText = wxT("standard/square"); else if (i == 2) - bulletSymbol = wxT("*"); + bulletText = wxT("standard/circle"); else if (i == 3) - bulletSymbol = wxT("-"); + bulletText = wxT("standard/square"); else - bulletSymbol = wxT("*"); + bulletText = wxT("standard/circle"); - bulletList->SetAttributes(i, (i+1)*60, 60, wxTEXT_ATTR_BULLET_STYLE_SYMBOL, bulletSymbol); + bulletList->SetAttributes(i, (i+1)*60, 60, wxTEXT_ATTR_BULLET_STYLE_STANDARD, bulletText); } m_styleSheet->AddListStyle(bulletList); @@ -475,10 +516,26 @@ void MyApp::CreateStyles() else numberStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD; + numberStyle |= wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT; + numberedList->SetAttributes(i, (i+1)*60, 60, numberStyle); } m_styleSheet->AddListStyle(numberedList); + + wxRichTextListStyleDefinition* outlineList = new wxRichTextListStyleDefinition(wxT("Outline List 1")); + for (i = 0; i < 10; i++) + { + long numberStyle; + if (i < 4) + numberStyle = wxTEXT_ATTR_BULLET_STYLE_OUTLINE|wxTEXT_ATTR_BULLET_STYLE_PERIOD; + else + numberStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD; + + outlineList->SetAttributes(i, (i+1)*120, 120, numberStyle); + } + + m_styleSheet->AddListStyle(outlineList); } // ---------------------------------------------------------------------------- @@ -504,6 +561,10 @@ MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos, fileMenu->Append(wxID_SAVE, _T("&Save\tCtrl+S"), _T("Save a file")); fileMenu->Append(wxID_SAVEAS, _T("&Save As...\tF12"), _T("Save to a new file")); fileMenu->AppendSeparator(); + fileMenu->Append(ID_PAGE_SETUP, _T("Page Set&up..."), _T("Page setup")); + fileMenu->Append(ID_PRINT, _T("&Print...\tCtrl+P"), _T("Print")); + fileMenu->Append(ID_PREVIEW, _T("Print Pre&view"), _T("Print preview")); + fileMenu->AppendSeparator(); fileMenu->Append(ID_VIEW_HTML, _T("&View as HTML"), _T("View HTML")); fileMenu->AppendSeparator(); fileMenu->Append(ID_Quit, _T("E&xit\tAlt+X"), _T("Quit this program")); @@ -564,6 +625,7 @@ MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos, wxMenu* insertMenu = new wxMenu; insertMenu->Append(ID_INSERT_SYMBOL, _("&Symbol...\tCtrl+I")); + insertMenu->Append(ID_INSERT_URL, _("&URL...")); // now append the freshly created menu to the menu bar... wxMenuBar *menuBar = new wxMenuBar(); @@ -818,6 +880,21 @@ MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos, r.Newline(); + // Make a style suitable for showing a URL + wxRichTextAttr urlStyle; + urlStyle.SetTextColour(*wxBLUE); + urlStyle.SetFontUnderlined(true); + + r.WriteText(wxT("wxRichTextCtrl can also display URLs, such as this one: ")); + r.BeginStyle(urlStyle); + r.BeginURL(wxT("http://www.wxwidgets.org")); + r.WriteText(wxT("The wxWidgets Web Site")); + r.EndURL(); + r.EndStyle(); + r.WriteText(wxT(". Click on the URL to generate an event.")); + + r.Newline(); + 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!")); r.EndParagraphSpacing(); @@ -1252,6 +1329,8 @@ void MyFrame::OnViewHTML(wxCommandEvent& WXUNUSED(event)) wxStringOutputStream strStream(& text); wxRichTextHTMLHandler htmlHandler; + htmlHandler.SetFlags(wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY); + if (htmlHandler.SaveFile(& m_richTextCtrl->GetBuffer(), strStream)) { win->SetPage(text); @@ -1260,6 +1339,9 @@ void MyFrame::OnViewHTML(wxCommandEvent& WXUNUSED(event)) boxSizer->Fit(& dialog); dialog.ShowModal(); + + // Now delete the temporary in-memory images + htmlHandler.DeleteTemporaryImages(); } // Demonstrates how you can change the style sheets and have the changes @@ -1269,11 +1351,10 @@ void MyFrame::OnSwitchStyleSheets(wxCommandEvent& WXUNUSED(event)) { static wxRichTextStyleSheet* gs_AlternateStyleSheet = NULL; - wxRichTextCtrl* ctrl = (wxRichTextCtrl*) FindWindow(ID_RICHTEXT_CTRL); wxRichTextStyleListCtrl *styleList = (wxRichTextStyleListCtrl*) FindWindow(ID_RICHTEXT_STYLE_LIST); wxRichTextStyleComboCtrl* styleCombo = (wxRichTextStyleComboCtrl*) FindWindow(ID_RICHTEXT_STYLE_COMBO); - wxRichTextStyleSheet* sheet = ctrl->GetStyleSheet(); + wxRichTextStyleSheet* sheet = m_richTextCtrl->GetStyleSheet(); // One-time creation of an alternate style sheet if (!gs_AlternateStyleSheet) @@ -1307,8 +1388,8 @@ void MyFrame::OnSwitchStyleSheets(wxCommandEvent& WXUNUSED(event)) gs_AlternateStyleSheet = sheet; sheet = tmp; - ctrl->SetStyleSheet(sheet); - ctrl->ApplyStyleSheet(sheet); // Makes the control reflect the new style definitions + m_richTextCtrl->SetStyleSheet(sheet); + m_richTextCtrl->ApplyStyleSheet(sheet); // Makes the control reflect the new style definitions styleList->SetStyleSheet(sheet); styleList->UpdateStyles(); @@ -1319,8 +1400,7 @@ void MyFrame::OnSwitchStyleSheets(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnManageStyles(wxCommandEvent& WXUNUSED(event)) { - wxRichTextCtrl* ctrl = (wxRichTextCtrl*) FindWindow(ID_RICHTEXT_CTRL); - wxRichTextStyleSheet* sheet = ctrl->GetStyleSheet(); + wxRichTextStyleSheet* sheet = m_richTextCtrl->GetStyleSheet(); int flags = wxRICHTEXT_ORGANISER_CREATE_STYLES|wxRICHTEXT_ORGANISER_EDIT_STYLES; @@ -1330,11 +1410,9 @@ void MyFrame::OnManageStyles(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnInsertSymbol(wxCommandEvent& WXUNUSED(event)) { - wxRichTextCtrl* ctrl = (wxRichTextCtrl*) FindWindow(ID_RICHTEXT_CTRL); - wxTextAttrEx attr; attr.SetFlags(wxTEXT_ATTR_FONT); - ctrl->GetStyle(ctrl->GetInsertionPoint(), attr); + m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr); wxString currentFontName; if (attr.HasFont() && attr.GetFont().Ok()) @@ -1350,16 +1428,16 @@ void MyFrame::OnInsertSymbol(wxCommandEvent& WXUNUSED(event)) { if (dlg.HasSelection()) { - long insertionPoint = ctrl->GetInsertionPoint(); + long insertionPoint = m_richTextCtrl->GetInsertionPoint(); - ctrl->WriteText(dlg.GetSymbol()); + m_richTextCtrl->WriteText(dlg.GetSymbol()); if (!dlg.UseNormalFont()) { wxFont font(attr.GetFont()); font.SetFaceName(dlg.GetFontName()); attr.SetFont(font); - ctrl->SetStyle(insertionPoint, insertionPoint+1, attr); + m_richTextCtrl->SetStyle(insertionPoint, insertionPoint+1, attr); } } } @@ -1367,23 +1445,20 @@ void MyFrame::OnInsertSymbol(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnNumberList(wxCommandEvent& WXUNUSED(event)) { - wxRichTextCtrl* ctrl = (wxRichTextCtrl*) FindWindow(ID_RICHTEXT_CTRL); - - if (ctrl->HasSelection()) + if (m_richTextCtrl->HasSelection()) { - wxRichTextRange range = ctrl->GetSelectionRange(); - ctrl->SetListStyle(range, wxT("Numbered List 1"), wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_RENUMBER); + wxRichTextRange range = m_richTextCtrl->GetSelectionRange(); + m_richTextCtrl->SetListStyle(range, wxT("Numbered List 1"), wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_RENUMBER); } } void MyFrame::OnBulletsAndNumbering(wxCommandEvent& WXUNUSED(event)) { - wxRichTextCtrl* ctrl = (wxRichTextCtrl*) FindWindow(ID_RICHTEXT_CTRL); - wxRichTextStyleSheet* sheet = ctrl->GetStyleSheet(); + wxRichTextStyleSheet* sheet = m_richTextCtrl->GetStyleSheet(); int flags = wxRICHTEXT_ORGANISER_BROWSE_NUMBERING; - wxRichTextStyleOrganiserDialog dlg(flags, sheet, ctrl, this, wxID_ANY, _("Bullets and Numbering")); + wxRichTextStyleOrganiserDialog dlg(flags, sheet, m_richTextCtrl, this, wxID_ANY, _("Bullets and Numbering")); if (dlg.ShowModal() == wxID_OK) { if (dlg.GetSelectedStyleDefinition()) @@ -1393,56 +1468,90 @@ void MyFrame::OnBulletsAndNumbering(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnItemizeList(wxCommandEvent& WXUNUSED(event)) { - wxRichTextCtrl* ctrl = (wxRichTextCtrl*) FindWindow(ID_RICHTEXT_CTRL); - - if (ctrl->HasSelection()) + if (m_richTextCtrl->HasSelection()) { - wxRichTextRange range = ctrl->GetSelectionRange(); - ctrl->SetListStyle(range, wxT("Bullet List 1")); + wxRichTextRange range = m_richTextCtrl->GetSelectionRange(); + m_richTextCtrl->SetListStyle(range, wxT("Bullet List 1")); } } void MyFrame::OnRenumberList(wxCommandEvent& WXUNUSED(event)) { - wxRichTextCtrl* ctrl = (wxRichTextCtrl*) FindWindow(ID_RICHTEXT_CTRL); - - if (ctrl->HasSelection()) + if (m_richTextCtrl->HasSelection()) { - wxRichTextRange range = ctrl->GetSelectionRange(); - ctrl->NumberList(range, NULL, wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_RENUMBER); + wxRichTextRange range = m_richTextCtrl->GetSelectionRange(); + m_richTextCtrl->NumberList(range, NULL, wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_RENUMBER); } } void MyFrame::OnPromoteList(wxCommandEvent& WXUNUSED(event)) { - wxRichTextCtrl* ctrl = (wxRichTextCtrl*) FindWindow(ID_RICHTEXT_CTRL); - - if (ctrl->HasSelection()) + if (m_richTextCtrl->HasSelection()) { - wxRichTextRange range = ctrl->GetSelectionRange(); - ctrl->PromoteList(1, range, NULL); + wxRichTextRange range = m_richTextCtrl->GetSelectionRange(); + m_richTextCtrl->PromoteList(1, range, NULL); } } void MyFrame::OnDemoteList(wxCommandEvent& WXUNUSED(event)) { - wxRichTextCtrl* ctrl = (wxRichTextCtrl*) FindWindow(ID_RICHTEXT_CTRL); - - if (ctrl->HasSelection()) + if (m_richTextCtrl->HasSelection()) { - wxRichTextRange range = ctrl->GetSelectionRange(); - ctrl->PromoteList(-1, range, NULL); + wxRichTextRange range = m_richTextCtrl->GetSelectionRange(); + m_richTextCtrl->PromoteList(-1, range, NULL); } } void MyFrame::OnClearList(wxCommandEvent& WXUNUSED(event)) { - wxRichTextCtrl* ctrl = (wxRichTextCtrl*) FindWindow(ID_RICHTEXT_CTRL); + if (m_richTextCtrl->HasSelection()) + { + wxRichTextRange range = m_richTextCtrl->GetSelectionRange(); + m_richTextCtrl->ClearListStyle(range); + } +} - if (ctrl->HasSelection()) +void MyFrame::OnInsertURL(wxCommandEvent& WXUNUSED(event)) +{ + wxString url = wxGetTextFromUser(_("URL:"), _("Insert URL")); + if (!url.IsEmpty()) { - wxRichTextRange range = ctrl->GetSelectionRange(); - ctrl->ClearListStyle(range); + // Make a style suitable for showing a URL + wxRichTextAttr urlStyle; + urlStyle.SetTextColour(*wxBLUE); + urlStyle.SetFontUnderlined(true); + + m_richTextCtrl->BeginStyle(urlStyle); + m_richTextCtrl->BeginURL(url); + m_richTextCtrl->WriteText(url); + m_richTextCtrl->EndURL(); + m_richTextCtrl->EndStyle(); } } +void MyFrame::OnURL(wxTextUrlEvent& event) +{ + wxMessageBox(event.GetString()); +} + +// Veto style sheet replace events when loading from XML, since we want +// to keep the original style sheet. +void MyFrame::OnStyleSheetReplacing(wxRichTextEvent& event) +{ + event.Veto(); +} + +void MyFrame::OnPrint(wxCommandEvent& WXUNUSED(event)) +{ + wxGetApp().GetPrinting()->PrintBuffer(m_richTextCtrl->GetBuffer()); +} + +void MyFrame::OnPreview(wxCommandEvent& WXUNUSED(event)) +{ + wxGetApp().GetPrinting()->PreviewBuffer(m_richTextCtrl->GetBuffer()); +} + +void MyFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event)) +{ + wxGetApp().GetPrinting()->PageSetup(); +}