X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bbe28fbb8364c150e9e2dae9bafb05921aa5d63d..cc3977bf132d40cb66c6b488890ef67a396d4a0a:/samples/richtext/richtext.cpp diff --git a/samples/richtext/richtext.cpp b/samples/richtext/richtext.cpp index 0028970274..1f728785ae 100644 --- a/samples/richtext/richtext.cpp +++ b/samples/richtext/richtext.cpp @@ -34,6 +34,7 @@ #include "wx/splitter.h" #include "wx/sstream.h" #include "wx/html/htmlwin.h" +#include "wx/stopwatch.h" #if wxUSE_FILESYSTEM #include "wx/filesys.h" @@ -78,6 +79,7 @@ #include "wx/richtext/richtextsymboldlg.h" #include "wx/richtext/richtextstyledlg.h" #include "wx/richtext/richtextprint.h" +#include "wx/richtext/richtextimagedlg.h" // ---------------------------------------------------------------------------- // resources @@ -145,6 +147,8 @@ public: void OnIndentLess(wxCommandEvent& event); void OnFont(wxCommandEvent& event); + void OnImage(wxCommandEvent& event); + void OnUpdateImage(wxUpdateUIEvent& event); void OnParagraph(wxCommandEvent& event); void OnFormat(wxCommandEvent& event); void OnUpdateFormat(wxUpdateUIEvent& event); @@ -181,6 +185,9 @@ public: void OnPreview(wxCommandEvent& event); void OnPageSetup(wxCommandEvent& event); + void OnInsertImage(wxCommandEvent& event); +protected: + // Forward command events to the current rich text control, if any bool ProcessEvent(wxEvent& event); @@ -209,6 +216,7 @@ enum ID_FORMAT_ITALIC, ID_FORMAT_UNDERLINE, ID_FORMAT_FONT, + ID_FORMAT_IMAGE, ID_FORMAT_PARAGRAPH, ID_FORMAT_CONTENT, @@ -216,6 +224,7 @@ enum ID_INSERT_SYMBOL, ID_INSERT_URL, + ID_INSERT_IMAGE, ID_FORMAT_ALIGN_LEFT, ID_FORMAT_ALIGN_CENTRE, @@ -284,10 +293,12 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_UPDATE_UI(ID_FORMAT_ALIGN_RIGHT, MyFrame::OnUpdateAlignRight) EVT_MENU(ID_FORMAT_FONT, MyFrame::OnFont) + EVT_MENU(ID_FORMAT_IMAGE, MyFrame::OnImage) EVT_MENU(ID_FORMAT_PARAGRAPH, MyFrame::OnParagraph) EVT_MENU(ID_FORMAT_CONTENT, MyFrame::OnFormat) EVT_UPDATE_UI(ID_FORMAT_CONTENT, MyFrame::OnUpdateFormat) EVT_UPDATE_UI(ID_FORMAT_FONT, MyFrame::OnUpdateFormat) + EVT_UPDATE_UI(ID_FORMAT_IMAGE, MyFrame::OnUpdateImage) EVT_UPDATE_UI(ID_FORMAT_PARAGRAPH, MyFrame::OnUpdateFormat) EVT_MENU(ID_FORMAT_INDENT_MORE, MyFrame::OnIndentMore) EVT_MENU(ID_FORMAT_INDENT_LESS, MyFrame::OnIndentLess) @@ -303,6 +314,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_INSERT_SYMBOL, MyFrame::OnInsertSymbol) EVT_MENU(ID_INSERT_URL, MyFrame::OnInsertURL) + EVT_MENU(ID_INSERT_IMAGE, MyFrame::OnInsertImage) EVT_MENU(ID_FORMAT_NUMBER_LIST, MyFrame::OnNumberList) EVT_MENU(ID_FORMAT_BULLETS_AND_NUMBERING, MyFrame::OnBulletsAndNumbering) @@ -379,7 +391,7 @@ bool MyApp::OnInit() #endif // create the main application window - MyFrame *frame = new MyFrame(_T("wxRichTextCtrl Sample"), wxID_ANY, wxDefaultPosition, wxSize(700, 600)); + MyFrame *frame = new MyFrame(wxT("wxRichTextCtrl Sample"), wxID_ANY, wxDefaultPosition, wxSize(700, 600)); m_printing->SetParentWindow(frame); @@ -435,7 +447,7 @@ void MyApp::CreateStyles() wxRichTextAttr indentedAttr2; indentedAttr2.SetFontFaceName(romanFont.GetFaceName()); indentedAttr2.SetFontSize(12); - indentedAttr2.SetFontWeight(wxBOLD); + indentedAttr2.SetFontWeight(wxFONTWEIGHT_BOLD); indentedAttr2.SetTextColour(*wxRED); indentedAttr2.SetFontSize(12); indentedAttr2.SetLeftIndent(100, 0); @@ -462,7 +474,7 @@ void MyApp::CreateStyles() wxRichTextAttr boldAttr; boldAttr.SetFontFaceName(romanFont.GetFaceName()); boldAttr.SetFontSize(12); - boldAttr.SetFontWeight(wxBOLD); + boldAttr.SetFontWeight(wxFONTWEIGHT_BOLD); // We only want to affect boldness boldAttr.SetFlags(wxTEXT_ATTR_FONT_WEIGHT); boldDef->SetStyle(boldAttr); @@ -473,7 +485,7 @@ void MyApp::CreateStyles() wxRichTextAttr italicAttr; italicAttr.SetFontFaceName(romanFont.GetFaceName()); italicAttr.SetFontSize(12); - italicAttr.SetFontStyle(wxITALIC); + italicAttr.SetFontStyle(wxFONTSTYLE_ITALIC); // We only want to affect italics italicAttr.SetFlags(wxTEXT_ATTR_FONT_ITALIC); italicDef->SetStyle(italicAttr); @@ -484,7 +496,7 @@ void MyApp::CreateStyles() wxRichTextAttr redAttr; redAttr.SetFontFaceName(romanFont.GetFaceName()); redAttr.SetFontSize(12); - redAttr.SetFontWeight(wxBOLD); + redAttr.SetFontWeight(wxFONTWEIGHT_BOLD); redAttr.SetTextColour(*wxRED); // We only want to affect colour, weight and face redAttr.SetFlags(wxTEXT_ATTR_FONT_FACE|wxTEXT_ATTR_FONT_WEIGHT|wxTEXT_ATTR_TEXT_COLOUR); @@ -567,21 +579,21 @@ MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos, // the "About" item should be in the help menu wxMenu *helpMenu = new wxMenu; - helpMenu->Append(ID_About, _T("&About...\tF1"), _T("Show about dialog")); + helpMenu->Append(ID_About, wxT("&About...\tF1"), wxT("Show about dialog")); - fileMenu->Append(wxID_OPEN, _T("&Open\tCtrl+O"), _T("Open a file")); - 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->Append(wxID_OPEN, wxT("&Open\tCtrl+O"), wxT("Open a file")); + fileMenu->Append(wxID_SAVE, wxT("&Save\tCtrl+S"), wxT("Save a file")); + fileMenu->Append(wxID_SAVEAS, wxT("&Save As...\tF12"), wxT("Save to a new file")); fileMenu->AppendSeparator(); - fileMenu->Append(ID_RELOAD, _T("&Reload Text\tF2"), _T("Reload the initial text")); + fileMenu->Append(ID_RELOAD, wxT("&Reload Text\tF2"), wxT("Reload the initial text")); 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->Append(ID_PAGE_SETUP, wxT("Page Set&up..."), wxT("Page setup")); + fileMenu->Append(ID_PRINT, wxT("&Print...\tCtrl+P"), wxT("Print")); + fileMenu->Append(ID_PREVIEW, wxT("Print Pre&view"), wxT("Print preview")); fileMenu->AppendSeparator(); - fileMenu->Append(ID_VIEW_HTML, _T("&View as HTML"), _T("View HTML")); + fileMenu->Append(ID_VIEW_HTML, wxT("&View as HTML"), wxT("View HTML")); fileMenu->AppendSeparator(); - fileMenu->Append(ID_Quit, _T("E&xit\tAlt+X"), _T("Quit this program")); + fileMenu->Append(ID_Quit, wxT("E&xit\tAlt+X"), wxT("Quit this program")); wxMenu* editMenu = new wxMenu; editMenu->Append(wxID_UNDO, _("&Undo\tCtrl+Z")); @@ -619,6 +631,7 @@ MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos, formatMenu->Append(ID_FORMAT_LINE_SPACING_DOUBLE, _("Double Line Spacing")); formatMenu->AppendSeparator(); formatMenu->Append(ID_FORMAT_FONT, _("&Font...")); + formatMenu->Append(ID_FORMAT_IMAGE, _("Image Property")); formatMenu->Append(ID_FORMAT_PARAGRAPH, _("&Paragraph...")); formatMenu->Append(ID_FORMAT_CONTENT, _("Font and Pa&ragraph...\tShift+Ctrl+F")); formatMenu->AppendSeparator(); @@ -638,15 +651,16 @@ 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...")); + insertMenu->Append(ID_INSERT_IMAGE, _("&Image...")); // now append the freshly created menu to the menu bar... wxMenuBar *menuBar = new wxMenuBar(); - menuBar->Append(fileMenu, _T("&File")); - menuBar->Append(editMenu, _T("&Edit")); - menuBar->Append(formatMenu, _T("F&ormat")); - menuBar->Append(listsMenu, _T("&Lists")); - menuBar->Append(insertMenu, _T("&Insert")); - menuBar->Append(helpMenu, _T("&Help")); + menuBar->Append(fileMenu, wxT("&File")); + menuBar->Append(editMenu, wxT("&Edit")); + menuBar->Append(formatMenu, wxT("F&ormat")); + menuBar->Append(listsMenu, wxT("&Lists")); + menuBar->Append(insertMenu, wxT("&Insert")); + menuBar->Append(helpMenu, wxT("&Help")); // ... and attach this menu bar to the frame SetMenuBar(menuBar); @@ -659,7 +673,7 @@ MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos, if ( !is_pda ) { CreateStatusBar(2); - SetStatusText(_T("Welcome to wxRichTextCtrl!")); + SetStatusText(wxT("Welcome to wxRichTextCtrl!")); } #endif @@ -687,6 +701,7 @@ MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos, toolBar->AddTool(ID_FORMAT_INDENT_MORE, wxEmptyString, wxBitmap(indentmore_xpm), _("Indent More")); toolBar->AddSeparator(); toolBar->AddTool(ID_FORMAT_FONT, wxEmptyString, wxBitmap(font_xpm), _("Font")); + toolBar->AddTool(ID_FORMAT_IMAGE, wxString("Im"), wxBitmap(font_xpm), _("Image Property")); wxRichTextStyleComboCtrl* combo = new wxRichTextStyleComboCtrl(toolBar, ID_RICHTEXT_STYLE_COMBO, wxDefaultPosition, wxSize(200, -1)); toolBar->AddControl(combo); @@ -740,6 +755,8 @@ void MyFrame::WriteInitialText() r.BeginSuppressUndo(); + r.Freeze(); + r.BeginParagraphSpacing(0, 20); r.BeginAlignment(wxTEXT_ALIGNMENT_CENTRE); @@ -766,6 +783,19 @@ void MyFrame::WriteInitialText() r.EndAlignment(); + r.BeginAlignment(wxTEXT_ALIGNMENT_LEFT); + 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(); + r.WriteText(wxT("What can you do with this thing? ")); r.WriteImage(wxBitmap(smiley_xpm)); @@ -856,7 +886,7 @@ void MyFrame::WriteInitialText() tabs.Add(600); tabs.Add(800); tabs.Add(1000); - wxTextAttrEx attr; + wxRichTextAttr attr; attr.SetFlags(wxTEXT_ATTR_TABS); attr.SetTabs(tabs); r.SetDefaultStyle(attr); @@ -921,6 +951,8 @@ void MyFrame::WriteInitialText() r.EndParagraphSpacing(); + r.Thaw(); + r.EndSuppressUndo(); } @@ -935,8 +967,8 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { wxString msg; - msg.Printf( _T("This is a demo for wxRichTextCtrl, a control for editing styled text.\n(c) Julian Smart, 2005")); - wxMessageBox(msg, _T("About wxRichTextCtrl Sample"), wxOK | wxICON_INFORMATION, this); + msg.Printf( wxT("This is a demo for wxRichTextCtrl, a control for editing styled text.\n(c) Julian Smart, 2005")); + wxMessageBox(msg, wxT("About wxRichTextCtrl Sample"), wxOK | wxICON_INFORMATION, this); } // Forward command events to the current rich text control, if any @@ -958,7 +990,7 @@ bool MyFrame::ProcessEvent(wxEvent& event) s_id = event.GetId(); wxWindow* focusWin = wxFindFocusDescendant(this); - if (focusWin && focusWin->ProcessEvent(event)) + if (focusWin && focusWin->GetEventHandler()->ProcessEvent(event)) { //s_command = NULL; s_eventType = 0; @@ -1040,7 +1072,14 @@ void MyFrame::OnSaveAs(wxCommandEvent& WXUNUSED(event)) 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)); } } } @@ -1132,7 +1171,7 @@ void MyFrame::OnFont(wxCommandEvent& WXUNUSED(event)) wxRichTextRange range = m_richTextCtrl->GetSelectionRange(); wxFontData fontData; - wxTextAttrEx attr; + wxRichTextAttr attr; attr.SetFlags(wxTEXT_ATTR_FONT); if (m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr)) @@ -1152,6 +1191,27 @@ void MyFrame::OnFont(wxCommandEvent& WXUNUSED(event)) #endif } +void MyFrame::OnImage(wxCommandEvent& WXUNUSED(event)) +{ + wxRichTextRange range; + wxASSERT(m_richTextCtrl->HasSelection()); + + range = m_richTextCtrl->GetSelectionRange(); + wxASSERT(range.ToInternal().GetLength() == 1); + + wxRichTextImage* image = wxDynamicCast(m_richTextCtrl->GetBuffer().GetLeafObjectAtPosition(range.GetStart()), wxRichTextImage); + if (image) + { + wxRichTextImageDialog imageDlg(this); + imageDlg.SetImageObject(image, &m_richTextCtrl->GetBuffer()); + + if (imageDlg.ShowModal() == wxID_OK) + { + image = imageDlg.ApplyImageAttr(); + } + } +} + void MyFrame::OnParagraph(wxCommandEvent& WXUNUSED(event)) { wxRichTextRange range; @@ -1195,6 +1255,25 @@ void MyFrame::OnUpdateFormat(wxUpdateUIEvent& event) event.Enable(m_richTextCtrl->HasSelection()); } +void MyFrame::OnUpdateImage(wxUpdateUIEvent& event) +{ + wxRichTextRange range; + wxRichTextObject *obj; + + range = m_richTextCtrl->GetSelectionRange(); + if (range.ToInternal().GetLength() == 1) + { + obj = m_richTextCtrl->GetBuffer().GetLeafObjectAtPosition(range.GetStart()); + if (obj && obj->IsKindOf(CLASSINFO(wxRichTextImage))) + { + event.Enable(true); + return; + } + } + + event.Enable(false); +} + void MyFrame::OnIndentMore(wxCommandEvent& WXUNUSED(event)) { wxRichTextAttr attr; @@ -1560,6 +1639,16 @@ void MyFrame::OnInsertURL(wxCommandEvent& WXUNUSED(event)) } } +void MyFrame::OnInsertImage(wxCommandEvent& WXUNUSED(event)) +{ + wxFileDialog dialog(this, _("Choose an image"), "", "", "BMP and GIF files (*.bmp;*.gif)|*.bmp;*.gif|PNG files (*.png)|*.png"); + if (dialog.ShowModal() == wxID_OK) + { + wxString path = dialog.GetPath(); + m_richTextCtrl->WriteImage(path, wxBITMAP_TYPE_ANY); + } +} + void MyFrame::OnURL(wxTextUrlEvent& event) { wxMessageBox(event.GetString()); @@ -1584,5 +1673,21 @@ void MyFrame::OnPreview(wxCommandEvent& WXUNUSED(event)) 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(); }