]> git.saurik.com Git - wxWidgets.git/blobdiff - src/richtext/richtextstyledlg.cpp
Added support for sub-object virtual attributes (temporary attributes for characters...
[wxWidgets.git] / src / richtext / richtextstyledlg.cpp
index d8ed49fd093b8e9c1eb3bd644d327c8b5dfe69ff..40705cff21c5b30f2336ab936493f779489179a2 100644 (file)
@@ -1,12 +1,12 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        richtextstyledlg.cpp
-// Purpose:     
+// Name:        src/richtext/richtextstyledlg.cpp
+// Purpose:
 // Author:      Julian Smart
-// Modified by: 
+// Modified by:
 // Created:     10/5/2006 12:05:31 PM
-// RCS-ID:      
+// RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
-// Licence:     
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx/wx.h".
 #pragma hdrstop
 #endif
 
+#if wxUSE_RICHTEXT
+
 #ifndef WX_PRECOMP
 #include "wx/wx.h"
 #endif
 
-////@begin includes
-////@end includes
-
 #include "wx/richtext/richtextstyledlg.h"
 #include "wx/richtext/richtextformatdlg.h"
 
-////@begin XPM images
-////@end XPM images
-
 /*!
  * wxRichTextStyleOrganiserDialog type definition
  */
@@ -55,6 +51,9 @@ BEGIN_EVENT_TABLE( wxRichTextStyleOrganiserDialog, wxDialog )
     EVT_BUTTON( ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST, wxRichTextStyleOrganiserDialog::OnNewListClick )
     EVT_UPDATE_UI( ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST, wxRichTextStyleOrganiserDialog::OnNewListUpdate )
 
+    EVT_BUTTON( ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_BOX, wxRichTextStyleOrganiserDialog::OnNewBoxClick )
+    EVT_UPDATE_UI( ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_BOX, wxRichTextStyleOrganiserDialog::OnNewBoxUpdate )
+
     EVT_BUTTON( ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY, wxRichTextStyleOrganiserDialog::OnApplyClick )
     EVT_UPDATE_UI( ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY, wxRichTextStyleOrganiserDialog::OnApplyUpdate )
 
@@ -71,6 +70,8 @@ BEGIN_EVENT_TABLE( wxRichTextStyleOrganiserDialog, wxDialog )
 
 END_EVENT_TABLE()
 
+IMPLEMENT_HELP_PROVISION(wxRichTextStyleOrganiserDialog)
+
 /*!
  * wxRichTextStyleOrganiserDialog constructors
  */
@@ -97,7 +98,7 @@ void wxRichTextStyleOrganiserDialog::Init()
     m_dontUpdate = false;
     m_flags = 0;
     m_restartNumbering = true;
-    
+
 ////@begin wxRichTextStyleOrganiserDialog member initialisation
     m_innerSizer = NULL;
     m_buttonSizerParent = NULL;
@@ -107,6 +108,7 @@ void wxRichTextStyleOrganiserDialog::Init()
     m_newCharacter = NULL;
     m_newParagraph = NULL;
     m_newList = NULL;
+    m_newBox = NULL;
     m_applyStyle = NULL;
     m_renameStyle = NULL;
     m_editStyle = NULL;
@@ -114,6 +116,7 @@ void wxRichTextStyleOrganiserDialog::Init()
     m_closeButton = NULL;
     m_bottomButtonSizer = NULL;
     m_restartNumberingCtrl = NULL;
+    m_stdButtonSizer = NULL;
     m_okButton = NULL;
     m_cancelButton = NULL;
 ////@end wxRichTextStyleOrganiserDialog member initialisation
@@ -128,9 +131,9 @@ bool wxRichTextStyleOrganiserDialog::Create( int flags, wxRichTextStyleSheet* sh
     m_richTextStyleSheet = sheet;
     m_richTextCtrl = ctrl;
     m_flags = flags;
-    
+
 ////@begin wxRichTextStyleOrganiserDialog creation
-    SetExtraStyle(GetExtraStyle()|wxWS_EX_BLOCK_EVENTS|wxDIALOG_EX_CONTEXTHELP);
+    SetExtraStyle(wxWS_EX_BLOCK_EVENTS|wxDIALOG_EX_CONTEXTHELP);
     wxDialog::Create( parent, id, caption, pos, size, style );
 
     CreateControls();
@@ -148,10 +151,14 @@ bool wxRichTextStyleOrganiserDialog::Create( int flags, wxRichTextStyleSheet* sh
  */
 
 void wxRichTextStyleOrganiserDialog::CreateControls()
-{    
+{
+#ifdef __WXMAC__
+    SetWindowVariant(wxWINDOW_VARIANT_SMALL);
+#endif
+
     bool hideTypeSelector = false;
     wxRichTextStyleListBox::wxRichTextStyleType typesToShow = wxRichTextStyleListBox::wxRICHTEXT_STYLE_ALL;
-    
+
     if ((m_flags & wxRICHTEXT_ORGANISER_SHOW_CHARACTER) != 0)
     {
         typesToShow = wxRichTextStyleListBox::wxRICHTEXT_STYLE_CHARACTER;
@@ -162,6 +169,11 @@ void wxRichTextStyleOrganiserDialog::CreateControls()
         typesToShow = wxRichTextStyleListBox::wxRICHTEXT_STYLE_PARAGRAPH;
         hideTypeSelector = true;
     }
+    else if ((m_flags & wxRICHTEXT_ORGANISER_SHOW_BOX) != 0)
+    {
+        typesToShow = wxRichTextStyleListBox::wxRICHTEXT_STYLE_BOX;
+        hideTypeSelector = true;
+    }
     else if ((m_flags & wxRICHTEXT_ORGANISER_SHOW_LIST) != 0)
     {
         typesToShow = wxRichTextStyleListBox::wxRICHTEXT_STYLE_LIST;
@@ -171,11 +183,11 @@ void wxRichTextStyleOrganiserDialog::CreateControls()
     {
         // wxRICHTEXT_ORGANISER_SHOW_ALL is implied if the other styles aren't included
     }
-    
+
     long listCtrlStyle = 0;
     if (hideTypeSelector)
         listCtrlStyle = wxRICHTEXTSTYLELIST_HIDE_TYPE_SELECTOR;
-    
+
 ////@begin wxRichTextStyleOrganiserDialog content construction
     wxRichTextStyleOrganiserDialog* itemDialog1 = this;
 
@@ -192,23 +204,23 @@ void wxRichTextStyleOrganiserDialog::CreateControls()
     m_buttonSizerParent->Add(itemBoxSizer5, 1, wxGROW, 5);
 
     wxStaticText* itemStaticText6 = new wxStaticText( itemDialog1, wxID_STATIC, _("&Styles:"), wxDefaultPosition, wxDefaultSize, 0 );
-    itemBoxSizer5->Add(itemStaticText6, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
+    itemBoxSizer5->Add(itemStaticText6, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5);
 
-    m_stylesListBox = new wxRichTextStyleListCtrl( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_STYLES, wxDefaultPosition, wxSize(200, 350), wxSIMPLE_BORDER|listCtrlStyle );
+    m_stylesListBox = new wxRichTextStyleListCtrl( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_STYLES, wxDefaultPosition, wxSize(280, 260), listCtrlStyle );
     m_stylesListBox->SetHelpText(_("The available styles."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_stylesListBox->SetToolTip(_("The available styles."));
     itemBoxSizer5->Add(m_stylesListBox, 1, wxGROW|wxALL, 5);
 
     wxBoxSizer* itemBoxSizer8 = new wxBoxSizer(wxVERTICAL);
     m_buttonSizerParent->Add(itemBoxSizer8, 0, wxGROW, 5);
 
-    wxStaticText* itemStaticText9 = new wxStaticText( itemDialog1, wxID_STATIC, _(" "), wxDefaultPosition, wxDefaultSize, 0 );
-    itemBoxSizer8->Add(itemStaticText9, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
+    wxStaticText* itemStaticText9 = new wxStaticText( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_CURRENT_STYLE, _(" "), wxDefaultPosition, wxDefaultSize, 0 );
+    itemBoxSizer8->Add(itemStaticText9, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5);
 
-    m_previewCtrl = new wxRichTextCtrl( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_PREVIEW, wxEmptyString, wxDefaultPosition, wxSize(310, 200), wxSIMPLE_BORDER|wxTE_READONLY );
+    m_previewCtrl = new wxRichTextCtrl( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_PREVIEW, wxEmptyString, wxDefaultPosition, wxSize(250, 200), wxBORDER_THEME|wxVSCROLL|wxTE_READONLY );
     m_previewCtrl->SetHelpText(_("The style preview."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_previewCtrl->SetToolTip(_("The style preview."));
     itemBoxSizer8->Add(m_previewCtrl, 1, wxGROW|wxALL, 5);
 
@@ -216,49 +228,55 @@ void wxRichTextStyleOrganiserDialog::CreateControls()
     m_buttonSizerParent->Add(m_buttonSizer, 0, wxGROW, 5);
 
     wxStaticText* itemStaticText12 = new wxStaticText( itemDialog1, wxID_STATIC, _(" "), wxDefaultPosition, wxDefaultSize, 0 );
-    m_buttonSizer->Add(itemStaticText12, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
+    m_buttonSizer->Add(itemStaticText12, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5);
 
     m_newCharacter = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR, _("New &Character Style..."), wxDefaultPosition, wxDefaultSize, 0 );
     m_newCharacter->SetHelpText(_("Click to create a new character style."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_newCharacter->SetToolTip(_("Click to create a new character style."));
     m_buttonSizer->Add(m_newCharacter, 0, wxGROW|wxALL, 5);
 
     m_newParagraph = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA, _("New &Paragraph Style..."), wxDefaultPosition, wxDefaultSize, 0 );
     m_newParagraph->SetHelpText(_("Click to create a new paragraph style."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_newParagraph->SetToolTip(_("Click to create a new paragraph style."));
     m_buttonSizer->Add(m_newParagraph, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
 
     m_newList = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST, _("New &List Style..."), wxDefaultPosition, wxDefaultSize, 0 );
     m_newList->SetHelpText(_("Click to create a new list style."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_newList->SetToolTip(_("Click to create a new list style."));
     m_buttonSizer->Add(m_newList, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
 
+    m_newBox = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_BOX, _("New &Box Style..."), wxDefaultPosition, wxDefaultSize, 0 );
+    m_newBox->SetHelpText(_("Click to create a new box style."));
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
+        m_newBox->SetToolTip(_("Click to create a new box style."));
+    m_buttonSizer->Add(m_newBox, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
+
     m_buttonSizer->Add(5, 5, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
 
     m_applyStyle = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY, _("&Apply Style"), wxDefaultPosition, wxDefaultSize, 0 );
     m_applyStyle->SetHelpText(_("Click to apply the selected style."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_applyStyle->SetToolTip(_("Click to apply the selected style."));
     m_buttonSizer->Add(m_applyStyle, 0, wxGROW|wxALL, 5);
 
     m_renameStyle = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME, _("&Rename Style..."), wxDefaultPosition, wxDefaultSize, 0 );
     m_renameStyle->SetHelpText(_("Click to rename the selected style."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_renameStyle->SetToolTip(_("Click to rename the selected style."));
     m_buttonSizer->Add(m_renameStyle, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
 
     m_editStyle = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT, _("&Edit Style..."), wxDefaultPosition, wxDefaultSize, 0 );
     m_editStyle->SetHelpText(_("Click to edit the selected style."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_editStyle->SetToolTip(_("Click to edit the selected style."));
     m_buttonSizer->Add(m_editStyle, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
 
     m_deleteStyle = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE, _("&Delete Style..."), wxDefaultPosition, wxDefaultSize, 0 );
     m_deleteStyle->SetHelpText(_("Click to delete the selected style."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_deleteStyle->SetToolTip(_("Click to delete the selected style."));
     m_buttonSizer->Add(m_deleteStyle, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
 
@@ -267,7 +285,7 @@ void wxRichTextStyleOrganiserDialog::CreateControls()
     m_closeButton = new wxButton( itemDialog1, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 );
     m_closeButton->SetDefault();
     m_closeButton->SetHelpText(_("Click to close this window."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_closeButton->SetToolTip(_("Click to close this window."));
     m_buttonSizer->Add(m_closeButton, 0, wxGROW|wxALL, 5);
 
@@ -277,32 +295,39 @@ void wxRichTextStyleOrganiserDialog::CreateControls()
     m_restartNumberingCtrl = new wxCheckBox( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_RESTART_NUMBERING, _("&Restart numbering"), wxDefaultPosition, wxDefaultSize, 0 );
     m_restartNumberingCtrl->SetValue(false);
     m_restartNumberingCtrl->SetHelpText(_("Check to restart numbering."));
-    if (ShowToolTips())
+    if (wxRichTextStyleOrganiserDialog::ShowToolTips())
         m_restartNumberingCtrl->SetToolTip(_("Check to restart numbering."));
     m_bottomButtonSizer->Add(m_restartNumberingCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
 
-    m_bottomButtonSizer->Add(5, 5, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);
+    m_stdButtonSizer = new wxStdDialogButtonSizer;
 
+    m_bottomButtonSizer->Add(m_stdButtonSizer, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);
     m_okButton = new wxButton( itemDialog1, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
-    m_okButton->SetDefault();
-    m_okButton->SetHelpText(_("Click to confirm your selection."));
-    if (ShowToolTips())
-        m_okButton->SetToolTip(_("Click to confirm your selection."));
-    m_bottomButtonSizer->Add(m_okButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
+    m_stdButtonSizer->AddButton(m_okButton);
 
     m_cancelButton = new wxButton( itemDialog1, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
-    m_cancelButton->SetHelpText(_("Click to cancel this window."));
-    if (ShowToolTips())
-        m_cancelButton->SetToolTip(_("Click to cancel this window."));
-    m_bottomButtonSizer->Add(m_cancelButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
+    m_stdButtonSizer->AddButton(m_cancelButton);
+
+    wxButton* itemButton29 = new wxButton( itemDialog1, wxID_HELP, _("&Help"), wxDefaultPosition, wxDefaultSize, 0 );
+    m_stdButtonSizer->AddButton(itemButton29);
+
+    m_stdButtonSizer->Realize();
 
 ////@end wxRichTextStyleOrganiserDialog content construction
 
+    if (GetHelpId() == -1)
+    {
+        wxWindow* button = FindWindowById(wxID_HELP);
+        if (button)
+            m_stdButtonSizer->Show(button, false);
+    }
+
     if ((m_flags & wxRICHTEXT_ORGANISER_CREATE_STYLES) == 0)
     {
         m_buttonSizer->Show(m_newCharacter, false);
         m_buttonSizer->Show(m_newParagraph, false);
         m_buttonSizer->Show(m_newList, false);
+        m_buttonSizer->Show(m_newBox, false);
     }
     if ((m_flags & wxRICHTEXT_ORGANISER_DELETE_STYLES) == 0)
     {
@@ -327,8 +352,8 @@ void wxRichTextStyleOrganiserDialog::CreateControls()
 
     if ((m_flags & wxRICHTEXT_ORGANISER_OK_CANCEL) == 0)
     {
-        m_bottomButtonSizer->Show(m_okButton, false);
-        m_bottomButtonSizer->Show(m_cancelButton, false);
+        m_stdButtonSizer->Show(m_okButton, false);
+        m_stdButtonSizer->Show(m_cancelButton, false);
     }
     else
     {
@@ -340,18 +365,18 @@ void wxRichTextStyleOrganiserDialog::CreateControls()
     {
         m_buttonSizerParent->Show(m_buttonSizer, false);
     }
-    
+
     // No buttons in the horizontal group are shown, so hide the whole sizer
     if ((m_flags & (wxRICHTEXT_ORGANISER_OK_CANCEL|wxRICHTEXT_ORGANISER_RENUMBER)) == 0)
     {
         m_innerSizer->Show(m_bottomButtonSizer, false);
     }
-    
+
     if (hideTypeSelector)
     {
         m_stylesListBox->GetStyleListBox()->SetStyleType(typesToShow);
     }
-    
+
     m_stylesListBox->SetStyleSheet(m_richTextStyleSheet);
     m_stylesListBox->SetRichTextCtrl(m_richTextCtrl);
     m_stylesListBox->UpdateStyles();
@@ -389,9 +414,9 @@ bool wxRichTextStyleOrganiserDialog::TransferDataFromWindow()
 {
     if (!wxDialog::TransferDataFromWindow())
         return false;
-        
+
     m_restartNumbering = m_restartNumberingCtrl->GetValue();
-        
+
     return true;
 }
 
@@ -399,9 +424,9 @@ bool wxRichTextStyleOrganiserDialog::TransferDataToWindow()
 {
     if (!wxDialog::TransferDataToWindow())
         return false;
-        
+
     m_restartNumberingCtrl->SetValue(m_restartNumbering);
-        
+
     return true;
 }
 
@@ -409,72 +434,88 @@ bool wxRichTextStyleOrganiserDialog::TransferDataToWindow()
 void wxRichTextStyleOrganiserDialog::ShowPreview(int sel)
 {
     static const wxChar* s_para1 = wxT("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. \
-Nullam ante sapien, vestibulum nonummy, pulvinar sed, luctus ut, lacus.");
+Nullam ante sapien, vestibulum nonummy, pulvinar sed, luctus ut, lacus.\n");
 
-    static const wxChar* s_para2List = wxT("Duis pharetra consequat dui. Nullam vitae justo id mauris lobortis interdum.");
+    static const wxChar* s_para2List = wxT("Duis pharetra consequat dui. Nullam vitae justo id mauris lobortis interdum.\n");
 
     static const wxChar* s_para2 = wxT("Duis pharetra consequat dui. Cum sociis natoque penatibus \
-et magnis dis parturient montes, nascetur ridiculus mus. Nullam vitae justo id mauris lobortis interdum.");
+et magnis dis parturient montes, nascetur ridiculus mus. Nullam vitae justo id mauris lobortis interdum.\n");
 
-    static const wxChar* s_para3 = wxT("\nInteger convallis dolor at augue \
+    static const wxChar* s_para3 = wxT("Integer convallis dolor at augue \
 iaculis malesuada. Donec bibendum ipsum ut ante porta fringilla.\n");
 
     if (sel == -1)
     {
         sel = m_stylesListBox->GetStyleListBox()->GetSelection();
         if (sel == -1)
-            return;    
+            return;
     }
 
     wxRichTextStyleDefinition* def = m_stylesListBox->GetStyleListBox()->GetStyle(sel);
-    
     wxRichTextListStyleDefinition* listDef = wxDynamicCast(def, wxRichTextListStyleDefinition);
-    //wxRichTextParagraphStyleDefinition* paraDef = wxDynamicCast(def, wxRichTextParagraphStyleDefinition);
-    //wxRichTextCharacterStyleDefinition* charDef = wxDynamicCast(def, wxRichTextCharacterStyleDefinition);        
-    
-    wxTextAttrEx attr(def->GetStyle());
-#if 0
-    attr.SetFlags(attr.GetFlags() &
-      (wxTEXT_ATTR_ALIGNMENT|wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_PARA_SPACING_BEFORE|wxTEXT_ATTR_PARA_SPACING_AFTER|
-       wxTEXT_ATTR_LINE_SPACING|
-       wxTEXT_ATTR_BULLET_STYLE|wxTEXT_ATTR_BULLET_NUMBER|wxTEXT_ATTR_BULLET_SYMBOL));
-#endif
+    wxRichTextBoxStyleDefinition* boxDef = wxDynamicCast(def, wxRichTextBoxStyleDefinition);
+
+    wxStaticText* labelCtrl = (wxStaticText*) FindWindow(ID_RICHTEXTSTYLEORGANISERDIALOG_CURRENT_STYLE);
+    if (labelCtrl)
+        labelCtrl->SetLabel(def->GetName() + wxT(":"));
+
+    wxRichTextAttr attr(def->GetStyleMergedWithBase(GetStyleSheet()));
 
     wxFont font(m_previewCtrl->GetFont());
     font.SetPointSize(9);
     m_previewCtrl->SetFont(font);
 
-    wxTextAttrEx normalParaAttr;
+    wxRichTextAttr normalParaAttr;
     normalParaAttr.SetFont(font);
     normalParaAttr.SetTextColour(wxColour(wxT("LIGHT GREY")));
 
     m_previewCtrl->Freeze();
-    m_previewCtrl->Clear();    
+    m_previewCtrl->Clear();
 
     m_previewCtrl->BeginStyle(normalParaAttr);
     m_previewCtrl->WriteText(s_para1);
     m_previewCtrl->EndStyle();
-    
-    m_previewCtrl->BeginStyle(attr);
-    
+
     if (listDef)
     {
+        m_previewCtrl->BeginStyle(attr);
+        long listStart = m_previewCtrl->GetInsertionPoint() + 1;
         int i;
         for (i = 0; i < 10; i++)
         {
-            wxTextAttrEx levelAttr = * listDef->GetLevelAttributes(i);
+            wxRichTextAttr levelAttr = * listDef->GetLevelAttributes(i);
             levelAttr.SetBulletNumber(1);
             m_previewCtrl->BeginStyle(levelAttr);
-            m_previewCtrl->WriteText(wxString::Format(wxT("\nList level %d. "), i+1) + s_para2List);
+            m_previewCtrl->WriteText(wxString::Format(wxT("List level %d. "), i+1) + s_para2List);
             m_previewCtrl->EndStyle();
         }
+        long listEnd = m_previewCtrl->GetInsertionPoint();
+        m_previewCtrl->NumberList(wxRichTextRange(listStart, listEnd), listDef);
+        m_previewCtrl->EndStyle();
+    }
+    else if (boxDef)
+    {
+        wxRichTextAttr cellParaAttr;
+        cellParaAttr.SetFont(font);
+        cellParaAttr.SetTextColour(*wxBLACK);
+
+        wxRichTextBox* textBox = m_previewCtrl->WriteTextBox(attr);
+        m_previewCtrl->SetFocusObject(textBox);
+        m_previewCtrl->BeginStyle(cellParaAttr);
+        wxString text(s_para2);
+        text.Replace(wxT("\n"), wxEmptyString);
+        m_previewCtrl->WriteText(text);
+        m_previewCtrl->EndStyle();
+        m_previewCtrl->SetFocusObject(NULL); // Set the focus back to the main buffer
+        m_previewCtrl->SetInsertionPointEnd();
+        m_previewCtrl->SetDefaultStyle(wxRichTextAttr());
     }
     else
     {
-        m_previewCtrl->WriteText(wxString(wxT("\n")) + s_para2);
+        m_previewCtrl->BeginStyle(attr);
+        m_previewCtrl->WriteText(s_para2);
+        m_previewCtrl->EndStyle();
     }
-    
-    m_previewCtrl->EndStyle();
 
     m_previewCtrl->BeginStyle(normalParaAttr);
     m_previewCtrl->WriteText(s_para3);
@@ -482,11 +523,14 @@ iaculis malesuada. Donec bibendum ipsum ut ante porta fringilla.\n");
 
     m_previewCtrl->Thaw();
 }
-    
+
 /// Clears the preview
 void wxRichTextStyleOrganiserDialog::ClearPreview()
 {
-    m_richTextCtrl->Clear();
+    m_previewCtrl->Clear();
+    wxStaticText* labelCtrl = (wxStaticText*) FindWindow(ID_RICHTEXTSTYLEORGANISERDIALOG_CURRENT_STYLE);
+    if (labelCtrl)
+        labelCtrl->SetLabel(wxEmptyString);
 }
 
 bool wxRichTextStyleOrganiserDialog::ApplyStyle(wxRichTextCtrl* ctrl)
@@ -498,14 +542,11 @@ bool wxRichTextStyleOrganiserDialog::ApplyStyle(wxRichTextCtrl* ctrl)
         ctrl = GetRichTextCtrl();
     if (!ctrl)
         return false;
-    if (!ctrl->HasSelection())
-        return false;
-        
 
-    wxRichTextStyleDefinition* def = m_stylesListBox->GetStyleListBox()->GetStyle(sel);    
+    wxRichTextStyleDefinition* def = m_stylesListBox->GetStyleListBox()->GetStyle(sel);
     wxRichTextListStyleDefinition* listDef = wxDynamicCast(def, wxRichTextListStyleDefinition);
 
-    if (listDef && m_restartNumberingCtrl->GetValue())
+    if (listDef && m_restartNumberingCtrl->GetValue() && ctrl->HasSelection())
     {
         wxRichTextRange range = ctrl->GetSelectionRange();
         return ctrl->SetListStyle(range, listDef, wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_RENUMBER);
@@ -575,9 +616,9 @@ void wxRichTextStyleOrganiserDialog::OnNewCharClick( wxCommandEvent& WXUNUSED(ev
             wxMessageBox(_("Sorry, that name is taken. Please choose another."), _("New Style"), wxICON_EXCLAMATION|wxOK, this);
             return;
         }
-        
+
         wxRichTextCharacterStyleDefinition* style = new wxRichTextCharacterStyleDefinition(styleName);
-        
+
         int pages = wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_STYLE_EDITOR;
         wxRichTextFormattingDialog formatDlg;
         formatDlg.SetStyleDefinition(*style, GetStyleSheet());
@@ -586,9 +627,9 @@ void wxRichTextStyleOrganiserDialog::OnNewCharClick( wxCommandEvent& WXUNUSED(ev
         if (formatDlg.ShowModal() == wxID_OK)
         {
             wxRichTextCharacterStyleDefinition* charDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextCharacterStyleDefinition);
-            
+
             (*((wxRichTextCharacterStyleDefinition* ) style)) = (*charDef);
-            
+
             GetStyleSheet()->AddCharacterStyle(style);
 
             m_stylesListBox->UpdateStyles();
@@ -596,7 +637,7 @@ void wxRichTextStyleOrganiserDialog::OnNewCharClick( wxCommandEvent& WXUNUSED(ev
         }
         else
             delete style;
-    }    
+    }
 }
 
 /*!
@@ -623,9 +664,9 @@ void wxRichTextStyleOrganiserDialog::OnNewParaClick( wxCommandEvent& WXUNUSED(ev
             wxMessageBox(_("Sorry, that name is taken. Please choose another."), _("New Style"), wxICON_EXCLAMATION|wxOK, this);
             return;
         }
-        
+
         wxRichTextParagraphStyleDefinition* style = new wxRichTextParagraphStyleDefinition(styleName);
-        
+
         int pages = wxRICHTEXT_FORMAT_STYLE_EDITOR|wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_INDENTS_SPACING|wxRICHTEXT_FORMAT_TABS|wxRICHTEXT_FORMAT_BULLETS;
         wxRichTextFormattingDialog formatDlg;
         formatDlg.SetStyleDefinition(*style, GetStyleSheet());
@@ -634,9 +675,9 @@ void wxRichTextStyleOrganiserDialog::OnNewParaClick( wxCommandEvent& WXUNUSED(ev
         if (formatDlg.ShowModal() == wxID_OK)
         {
             wxRichTextParagraphStyleDefinition* paraDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextParagraphStyleDefinition);
-            
+
             (*((wxRichTextParagraphStyleDefinition* ) style)) = (*paraDef);
-            
+
             GetStyleSheet()->AddParagraphStyle(style);
 
             m_stylesListBox->UpdateStyles();
@@ -644,7 +685,7 @@ void wxRichTextStyleOrganiserDialog::OnNewParaClick( wxCommandEvent& WXUNUSED(ev
         }
         else
             delete style;
-    }    
+    }
 }
 
 /*!
@@ -667,22 +708,26 @@ void wxRichTextStyleOrganiserDialog::OnEditClick( wxCommandEvent& WXUNUSED(event
     if (sel != wxNOT_FOUND)
     {
         wxRichTextStyleDefinition* def = m_stylesListBox->GetStyleListBox()->GetStyle(sel);
-        
+
         int pages = wxRICHTEXT_FORMAT_STYLE_EDITOR;
-        
-        if (def->IsKindOf(CLASSINFO(wxRichTextCharacterStyleDefinition)))
+
+        if (wxDynamicCast(def, wxRichTextCharacterStyleDefinition))
         {
             pages |= wxRICHTEXT_FORMAT_FONT;
         }
-        else if (def->IsKindOf(CLASSINFO(wxRichTextListStyleDefinition)))
+        else if (wxDynamicCast(def, wxRichTextListStyleDefinition))
         {
             pages |= wxRICHTEXT_FORMAT_LIST_STYLE|wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_INDENTS_SPACING;
         }
-        else if (def->IsKindOf(CLASSINFO(wxRichTextParagraphStyleDefinition)))
+        else if (wxDynamicCast(def, wxRichTextParagraphStyleDefinition))
         {
             pages |= wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_INDENTS_SPACING|wxRICHTEXT_FORMAT_TABS|wxRICHTEXT_FORMAT_BULLETS;
         }
-        
+        else if (wxDynamicCast(def, wxRichTextBoxStyleDefinition))
+        {
+            pages |= wxRICHTEXT_FORMAT_MARGINS|wxRICHTEXT_FORMAT_SIZE|wxRICHTEXT_FORMAT_BORDERS|wxRICHTEXT_FORMAT_BACKGROUND;
+        }
+
         wxRichTextFormattingDialog formatDlg;
         formatDlg.SetStyleDefinition(*def, GetStyleSheet());
         formatDlg.Create(pages, this);
@@ -692,7 +737,8 @@ void wxRichTextStyleOrganiserDialog::OnEditClick( wxCommandEvent& WXUNUSED(event
             wxRichTextParagraphStyleDefinition* paraDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextParagraphStyleDefinition);
             wxRichTextCharacterStyleDefinition* charDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextCharacterStyleDefinition);
             wxRichTextListStyleDefinition* listDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextListStyleDefinition);
-            
+            wxRichTextBoxStyleDefinition* boxDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextBoxStyleDefinition);
+
             if (listDef)
             {
                 (*((wxRichTextListStyleDefinition* ) def)) = (*listDef);
@@ -701,12 +747,17 @@ void wxRichTextStyleOrganiserDialog::OnEditClick( wxCommandEvent& WXUNUSED(event
             {
                 (*((wxRichTextParagraphStyleDefinition* ) def)) = (*paraDef);
             }
+            else if (boxDef)
+            {
+                (*((wxRichTextBoxStyleDefinition* ) def)) = (*boxDef);
+            }
             else
             {
                 (*((wxRichTextCharacterStyleDefinition* ) def)) = (*charDef);
             }
 
             m_stylesListBox->UpdateStyles();
+            m_stylesListBox->GetStyleListBox()->SetSelection(sel);
             ShowPreview();
         }
     }
@@ -733,17 +784,19 @@ void wxRichTextStyleOrganiserDialog::OnDeleteClick( wxCommandEvent& WXUNUSED(eve
     {
         wxRichTextStyleDefinition* def = m_stylesListBox->GetStyleListBox()->GetStyle(sel);
         wxString name(def->GetName());
-        if (wxYES == wxMessageBox(wxString::Format(_("Delete style %s?"), (const wxChar*) name), _("Delete Style"), wxYES_NO|wxICON_QUESTION, this))
+        if (wxYES == wxMessageBox(wxString::Format(_("Delete style %s?"), name), _("Delete Style"), wxYES_NO|wxICON_QUESTION, this))
         {
             m_stylesListBox->GetStyleListBox()->SetItemCount(0);
-            
-            if (def->IsKindOf(CLASSINFO(wxRichTextListStyleDefinition)))
+
+            if (wxDynamicCast(def, wxRichTextListStyleDefinition))
                 GetStyleSheet()->RemoveListStyle((wxRichTextListStyleDefinition*) def, true);
-            else if (def->IsKindOf(CLASSINFO(wxRichTextParagraphStyleDefinition)))
+            else if (wxDynamicCast(def, wxRichTextParagraphStyleDefinition))
                 GetStyleSheet()->RemoveParagraphStyle((wxRichTextParagraphStyleDefinition*) def, true);
-            else if (def->IsKindOf(CLASSINFO(wxRichTextCharacterStyleDefinition)))
+            else if (wxDynamicCast(def, wxRichTextCharacterStyleDefinition))
                 GetStyleSheet()->RemoveCharacterStyle((wxRichTextCharacterStyleDefinition*) def, true);
-                
+            else if (wxDynamicCast(def, wxRichTextBoxStyleDefinition))
+                GetStyleSheet()->RemoveBoxStyle((wxRichTextBoxStyleDefinition*) def, true);
+
             m_stylesListBox->UpdateStyles();
 
             if (m_stylesListBox->GetStyleListBox()->GetSelection() != -1)
@@ -777,9 +830,9 @@ void wxRichTextStyleOrganiserDialog::OnNewListClick( wxCommandEvent& WXUNUSED(ev
             wxMessageBox(_("Sorry, that name is taken. Please choose another."), _("New Style"), wxICON_EXCLAMATION|wxOK, this);
             return;
         }
-        
+
         wxRichTextListStyleDefinition* style = new wxRichTextListStyleDefinition(styleName);
-        
+
         // Initialize the style to make it easier to edit
         int i;
         for (i = 0; i < 10; i++)
@@ -798,7 +851,7 @@ void wxRichTextStyleOrganiserDialog::OnNewListClick( wxCommandEvent& WXUNUSED(ev
 
             style->SetAttributes(i, (i+1)*60, 60, wxTEXT_ATTR_BULLET_STYLE_SYMBOL, bulletSymbol);
         }
-        
+
         int pages = wxRICHTEXT_FORMAT_LIST_STYLE|wxRICHTEXT_FORMAT_STYLE_EDITOR|wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_INDENTS_SPACING;
         wxRichTextFormattingDialog formatDlg;
         formatDlg.SetStyleDefinition(*style, GetStyleSheet());
@@ -807,9 +860,9 @@ void wxRichTextStyleOrganiserDialog::OnNewListClick( wxCommandEvent& WXUNUSED(ev
         if (formatDlg.ShowModal() == wxID_OK)
         {
             wxRichTextListStyleDefinition* listDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextListStyleDefinition);
-            
+
             (*((wxRichTextListStyleDefinition* ) style)) = (*listDef);
-            
+
             GetStyleSheet()->AddListStyle(style);
 
             m_stylesListBox->UpdateStyles();
@@ -817,7 +870,7 @@ void wxRichTextStyleOrganiserDialog::OnNewListClick( wxCommandEvent& WXUNUSED(ev
         }
         else
             delete style;
-    }    
+    }
 }
 
 /*!
@@ -835,6 +888,28 @@ void wxRichTextStyleOrganiserDialog::OnNewListUpdate( wxUpdateUIEvent& event )
 
 void wxRichTextStyleOrganiserDialog::OnRenameClick( wxCommandEvent& WXUNUSED(event) )
 {
+    int sel = m_stylesListBox->GetStyleListBox()->GetSelection();
+    if (sel == -1)
+        return;
+    wxRichTextStyleDefinition* def = m_stylesListBox->GetStyleListBox()->GetStyle(sel);
+    if (!def)
+        return;
+
+    wxString styleName = wxGetTextFromUser(_("Enter a new style name"), _("New Style"), def->GetName());
+    if (!styleName.IsEmpty())
+    {
+        if (styleName == def->GetName())
+            return;
+
+        if (GetStyleSheet()->FindParagraphStyle(styleName) || GetStyleSheet()->FindCharacterStyle(styleName) || GetStyleSheet()->FindListStyle(styleName) || GetStyleSheet()->FindBoxStyle(styleName))
+        {
+            wxMessageBox(_("Sorry, that name is taken. Please choose another."), _("New Style"), wxICON_EXCLAMATION|wxOK, this);
+            return;
+        }
+
+        def->SetName(styleName);
+        m_stylesListBox->UpdateStyles();
+    }
 }
 
 /*!
@@ -855,3 +930,52 @@ void wxRichTextStyleOrganiserDialog::OnListSelection(wxCommandEvent& event)
         event.Skip();
 }
 
+/*!
+ * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_BOX
+ */
+
+void wxRichTextStyleOrganiserDialog::OnNewBoxClick( wxCommandEvent& WXUNUSED(event) )
+{
+    wxString styleName = wxGetTextFromUser(_("Enter a box style name"), _("New Style"));
+    if (!styleName.IsEmpty())
+    {
+        if (GetStyleSheet()->FindBoxStyle(styleName))
+        {
+            wxMessageBox(_("Sorry, that name is taken. Please choose another."), _("New Style"), wxICON_EXCLAMATION|wxOK, this);
+            return;
+        }
+
+        wxRichTextBoxStyleDefinition* style = new wxRichTextBoxStyleDefinition(styleName);
+
+        int pages = wxRICHTEXT_FORMAT_MARGINS|wxRICHTEXT_FORMAT_SIZE|wxRICHTEXT_FORMAT_BORDERS|wxRICHTEXT_FORMAT_BACKGROUND;
+        wxRichTextFormattingDialog formatDlg;
+        formatDlg.SetStyleDefinition(*style, GetStyleSheet());
+        formatDlg.Create(pages, this);
+
+        if (formatDlg.ShowModal() == wxID_OK)
+        {
+            wxRichTextBoxStyleDefinition* boxDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextBoxStyleDefinition);
+
+            (*((wxRichTextBoxStyleDefinition* ) style)) = (*boxDef);
+
+            GetStyleSheet()->AddBoxStyle(style);
+
+            m_stylesListBox->UpdateStyles();
+            ShowPreview();
+        }
+        else
+            delete style;
+    }
+}
+
+/*!
+ * wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_BOX
+ */
+
+void wxRichTextStyleOrganiserDialog::OnNewBoxUpdate( wxUpdateUIEvent& event )
+{
+    event.Enable((GetFlags() & wxRICHTEXT_ORGANISER_CREATE_STYLES) != 0);
+}
+
+#endif
+    // wxUSE_RICHTEXT