Added rich text buffer clipboard support.

Added double-left-click word selection support.
Now saves only the active attributes to XML.
Eliminated wxRichTextFragment class to allow  wxRichTextBuffer
to be used where wxRichTextFragment was used.
Fixed AddParagraph virtual function hiding warning.
Miscellaneous small wxRichTextCtrl bug fixes and cleanup.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41542 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2006-10-01 14:46:03 +00:00
parent eb753b56c4
commit 0ca07313fb
5 changed files with 526 additions and 156 deletions

View File

@@ -30,6 +30,7 @@
#include "wx/wfstream.h"
#include "wx/sstream.h"
#include "wx/txtstrm.h"
#include "wx/tokenzr.h"
#include "wx/xml/xml.h"
IMPLEMENT_DYNAMIC_CLASS(wxRichTextXMLHandler, wxRichTextFileHandler)
@@ -98,6 +99,9 @@ bool wxRichTextXMLHandler::ImportXML(wxRichTextBuffer* buffer, wxXmlNode* node)
if (name == wxT("paragraphlayout"))
{
wxString partial = node->GetPropVal(wxT("partialparagraph"), wxEmptyString);
if (partial == wxT("true"))
buffer->SetPartialParagraph(true);
}
else if (name == wxT("paragraph"))
{
@@ -506,6 +510,9 @@ bool wxRichTextXMLHandler::ExportXML(wxOutputStream& stream, wxMBConv* convMem,
wxString style = CreateStyle(obj.GetAttributes(), isPara);
if (objectName == wxT("paragraphlayout") && ((wxRichTextParagraphLayoutBox&) obj).GetPartialParagraph())
style << wxT(" partialparagraph=\"true\"");
OutputString(stream, style + wxT(">"), convMem, convFile);
wxRichTextCompositeObject& composite = (wxRichTextCompositeObject&) obj;
@@ -529,23 +536,34 @@ bool wxRichTextXMLHandler::ExportXML(wxOutputStream& stream, wxMBConv* convMem,
wxString wxRichTextXMLHandler::CreateStyle(const wxTextAttrEx& attr, bool isPara)
{
wxString str;
if (attr.GetTextColour().Ok())
if (attr.HasTextColour() && attr.GetTextColour().Ok())
{
str << wxT(" textcolor=\"#") << ColourToHexString(attr.GetTextColour()) << wxT("\"");
}
if (attr.GetBackgroundColour().Ok())
if (attr.HasBackgroundColour() && attr.GetBackgroundColour().Ok())
{
str << wxT(" bgcolor=\"#") << ColourToHexString(attr.GetBackgroundColour()) << wxT("\"");
}
if (attr.GetFont().Ok())
{
str << wxT(" fontsize=\"") << attr.GetFont().GetPointSize() << wxT("\"");
str << wxT(" fontfamily=\"") << attr.GetFont().GetFamily() << wxT("\"");
str << wxT(" fontstyle=\"") << attr.GetFont().GetStyle() << wxT("\"");
str << wxT(" fontweight=\"") << attr.GetFont().GetWeight() << wxT("\"");
str << wxT(" fontunderlined=\"") << (int) attr.GetFont().GetUnderlined() << wxT("\"");
str << wxT(" fontface=\"") << attr.GetFont().GetFaceName() << wxT("\"");
if (attr.HasSize())
str << wxT(" fontsize=\"") << attr.GetFont().GetPointSize() << wxT("\"");
//if (attr.HasFamily())
// str << wxT(" fontfamily=\"") << attr.GetFont().GetFamily() << wxT("\"");
if (attr.HasItalic())
str << wxT(" fontstyle=\"") << attr.GetFont().GetStyle() << wxT("\"");
if (attr.HasWeight())
str << wxT(" fontweight=\"") << attr.GetFont().GetWeight() << wxT("\"");
if (attr.HasUnderlined())
str << wxT(" fontunderlined=\"") << (int) attr.GetFont().GetUnderlined() << wxT("\"");
if (attr.HasFaceName())
str << wxT(" fontface=\"") << attr.GetFont().GetFaceName() << wxT("\"");
}
if (!attr.GetCharacterStyleName().empty())
@@ -553,19 +571,51 @@ wxString wxRichTextXMLHandler::CreateStyle(const wxTextAttrEx& attr, bool isPara
if (isPara)
{
str << wxT(" alignment=\"") << (int) attr.GetAlignment() << wxT("\"");
str << wxT(" leftindent=\"") << (int) attr.GetLeftIndent() << wxT("\"");
str << wxT(" leftsubindent=\"") << (int) attr.GetLeftSubIndent() << wxT("\"");
str << wxT(" rightindent=\"") << (int) attr.GetRightIndent() << wxT("\"");
str << wxT(" parspacingafter=\"") << (int) attr.GetParagraphSpacingAfter() << wxT("\"");
str << wxT(" parspacingbefore=\"") << (int) attr.GetParagraphSpacingBefore() << wxT("\"");
str << wxT(" linespacing=\"") << (int) attr.GetLineSpacing() << wxT("\"");
str << wxT(" bulletstyle=\"") << (int) attr.GetBulletStyle() << wxT("\"");
str << wxT(" bulletnumber=\"") << (int) attr.GetBulletNumber() << wxT("\"");
str << wxT(" bulletsymbol=\"") << wxString(attr.GetBulletSymbol()) << wxT("\"");
if (attr.HasAlignment())
str << wxT(" alignment=\"") << (int) attr.GetAlignment() << wxT("\"");
if (attr.HasLeftIndent())
{
str << wxT(" leftindent=\"") << (int) attr.GetLeftIndent() << wxT("\"");
str << wxT(" leftsubindent=\"") << (int) attr.GetLeftSubIndent() << wxT("\"");
}
if (attr.HasRightIndent())
str << wxT(" rightindent=\"") << (int) attr.GetRightIndent() << wxT("\"");
if (attr.HasParagraphSpacingAfter())
str << wxT(" parspacingafter=\"") << (int) attr.GetParagraphSpacingAfter() << wxT("\"");
if (attr.HasParagraphSpacingBefore())
str << wxT(" parspacingbefore=\"") << (int) attr.GetParagraphSpacingBefore() << wxT("\"");
if (attr.HasLineSpacing())
str << wxT(" linespacing=\"") << (int) attr.GetLineSpacing() << wxT("\"");
if (attr.HasBulletStyle())
str << wxT(" bulletstyle=\"") << (int) attr.GetBulletStyle() << wxT("\"");
if (attr.HasBulletNumber())
str << wxT(" bulletnumber=\"") << (int) attr.GetBulletNumber() << wxT("\"");
if (attr.HasBulletSymbol())
str << wxT(" bulletsymbol=\"") << wxString(attr.GetBulletSymbol()) << wxT("\"");
if (!attr.GetParagraphStyleName().empty())
str << wxT(" parstyle=\"") << wxString(attr.GetParagraphStyleName()) << wxT("\"");
if (attr.HasTabs())
{
str << wxT(" tabs=\"");
size_t i;
for (i = 0; i < attr.GetTabs().GetCount(); i++)
{
if (i > 0)
str << wxT(",");
str << attr.GetTabs()[i];
}
str << wxT("\"");
}
}
return str;
@@ -581,29 +631,52 @@ bool wxRichTextXMLHandler::GetStyle(wxTextAttrEx& attr, wxXmlNode* node, bool is
int fontStyle = wxNORMAL;
bool fontUnderlined = false;
fontFacename = node->GetPropVal(wxT("fontface"), wxEmptyString);
int fontFlags = 0;
wxString value = node->GetPropVal(wxT("fontfamily"), wxEmptyString);
if (!value.empty())
fontFamily = wxAtoi(value);
fontFacename = node->GetPropVal(wxT("fontface"), wxEmptyString);
if (!fontFacename.IsEmpty())
fontFlags |= wxTEXT_ATTR_FONT_FACE;
wxString value;
//value = node->GetPropVal(wxT("fontfamily"), wxEmptyString);
//if (!value.empty())
// fontFamily = wxAtoi(value);
value = node->GetPropVal(wxT("fontstyle"), wxEmptyString);
if (!value.empty())
{
fontStyle = wxAtoi(value);
fontFlags |= wxTEXT_ATTR_FONT_ITALIC;
}
value = node->GetPropVal(wxT("fontsize"), wxEmptyString);
if (!value.empty())
{
fontSize = wxAtoi(value);
fontFlags |= wxTEXT_ATTR_FONT_SIZE;
}
value = node->GetPropVal(wxT("fontweight"), wxEmptyString);
if (!value.empty())
{
fontWeight = wxAtoi(value);
fontFlags |= wxTEXT_ATTR_FONT_WEIGHT;
}
value = node->GetPropVal(wxT("fontunderlined"), wxEmptyString);
if (!value.empty())
{
fontUnderlined = wxAtoi(value) != 0;
fontFlags |= wxTEXT_ATTR_FONT_UNDERLINE;
}
attr.SetFont(* wxTheFontList->FindOrCreateFont(fontSize, fontFamily, fontStyle, fontWeight, fontUnderlined, fontFacename));
attr.SetFlags(fontFlags);
if (attr.HasFlag(wxTEXT_ATTR_FONT))
attr.SetFont(* wxTheFontList->FindOrCreateFont(fontSize, fontFamily, fontStyle, fontWeight, fontUnderlined, fontFacename));
// Restore correct font flags
attr.SetFlags(fontFlags);
value = node->GetPropVal(wxT("textcolor"), wxEmptyString);
if (!value.empty())
@@ -636,13 +709,24 @@ bool wxRichTextXMLHandler::GetStyle(wxTextAttrEx& attr, wxXmlNode* node, bool is
int leftSubIndent = 0;
int leftIndent = 0;
bool hasLeftIndent = false;
value = node->GetPropVal(wxT("leftindent"), wxEmptyString);
if (!value.empty())
{
leftIndent = wxAtoi(value);
hasLeftIndent = true;
}
value = node->GetPropVal(wxT("leftsubindent"), wxEmptyString);
if (!value.empty())
{
leftSubIndent = wxAtoi(value);
attr.SetLeftIndent(leftIndent, leftSubIndent);
hasLeftIndent = true;
}
if (hasLeftIndent)
attr.SetLeftIndent(leftIndent, leftSubIndent);
value = node->GetPropVal(wxT("rightindent"), wxEmptyString);
if (!value.empty())
@@ -675,6 +759,19 @@ bool wxRichTextXMLHandler::GetStyle(wxTextAttrEx& attr, wxXmlNode* node, bool is
value = node->GetPropVal(wxT("parstyle"), wxEmptyString);
if (!value.empty())
attr.SetParagraphStyleName(value);
value = node->GetPropVal(wxT("tabs"), wxEmptyString);
if (!value.empty())
{
wxArrayInt tabs;
wxStringTokenizer tkz(value, wxT(","));
while (tkz.HasMoreTokens())
{
wxString token = tkz.GetNextToken();
tabs.Add(wxAtoi(token));
}
attr.SetTabs(tabs);
}
}
return true;