From 1ebc70b60f7b426d9eecbf095c0100879ea4f43f Mon Sep 17 00:00:00 2001 From: rylek Date: Mon, 14 Feb 2011 23:59:20 +0000 Subject: [PATCH] +RichEdit: added some missing czech translations; fixed ToPara to honor objects & fields +CtrlCore: EncodeRTF improved to support page size & margins and table cell borders .RichText: ParseQtf fixed to honor formatting of last paragraph in text git-svn-id: svn://ultimatepp.org/upp/trunk@3210 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/CtrlCore/CtrlCore.h | 7 ++- uppsrc/CtrlCore/EncodeRTF.cpp | 112 ++++++++++++++++++++++++++++------ uppsrc/RichEdit/Modify.cpp | 8 +++ uppsrc/RichEdit/RichEdit.t | 12 ++-- uppsrc/RichText/ParseQtf.cpp | 5 +- 5 files changed, 113 insertions(+), 31 deletions(-) diff --git a/uppsrc/CtrlCore/CtrlCore.h b/uppsrc/CtrlCore/CtrlCore.h index 23cd75f39..20d991d38 100644 --- a/uppsrc/CtrlCore/CtrlCore.h +++ b/uppsrc/CtrlCore/CtrlCore.h @@ -1746,8 +1746,11 @@ inline void WriteClipboardImage(const Image& img) bool (*&DisplayErrorFn())(const Value& v); inline bool DisplayError(const Value& v) { return DisplayErrorFn()(v); } -void EncodeRTF(Stream& stream, const RichText& richtext, byte charset); -String EncodeRTF(const RichText& richtext, byte charset); +void EncodeRTF(Stream& stream, const RichText& richtext, byte charset, + Size dot_page_size = Size(4960, 7015), const Rect& dot_margin = Rect(472, 472, 472, 472)); +String EncodeRTF(const RichText& richtext, byte charset, + Size dot_page_size = Size(4960, 7015), const Rect& dot_margin = Rect(472, 472, 472, 472)); +String EncodeRTF(const RichText& richtext, byte charset, int dot_page_width); String EncodeRTF(const RichText& richtext); RichText ParseRTF(const char *rtf); diff --git a/uppsrc/CtrlCore/EncodeRTF.cpp b/uppsrc/CtrlCore/EncodeRTF.cpp index 46ad70bc5..6861d3971 100644 --- a/uppsrc/CtrlCore/EncodeRTF.cpp +++ b/uppsrc/CtrlCore/EncodeRTF.cpp @@ -26,7 +26,7 @@ static int GetParaHeight(const Array& parts) class RTFEncoder { public: - RTFEncoder(Stream& stream, const RichText& richtext, byte charset); + RTFEncoder(Stream& stream, const RichText& richtext, byte charset, Size dot_page_size, const Rect& dot_margins); void Run(); @@ -50,11 +50,12 @@ private: void Command(const char *cmd); void Command(const char *cmd, int param); void Space() { stream.Put(' '); } - void PutText(const char *text); + void PutText(const wchar *text); void PutObject(const RichObject& object); void PutTabs(const Vector& tabs); void PutBinHex(const byte *data, int count); void PutBinHex(const String& s) { PutBinHex(s, s.GetLength()); } + void PutBorder(StringBuffer& rowfmt, int wd, Color c, const char *clpar); bool PutParaFormat(const RichPara::Format& pf, const RichPara::Format& difpf); bool PutCharFormat(const RichPara::CharFormat& cf, const RichPara::CharFormat& difcf, bool pn); @@ -75,6 +76,9 @@ private: Stream& stream; const RichText& richtext; byte charset; + Size dot_page_size; + Rect dot_margins; + RichPara::CharFormat charfmt; RichPara::Format parafmt; @@ -89,30 +93,42 @@ private: Index styleid; }; -void EncodeRTF(Stream& stream, const RichText& richtext, byte charset) +void EncodeRTF(Stream& stream, const RichText& richtext, byte charset, + Size dot_page_size, const Rect& dot_margins) { - RTFEncoder(stream, richtext, charset).Run(); + RTFEncoder(stream, richtext, charset, dot_page_size, dot_margins).Run(); } -String EncodeRTF(const RichText& richtext, byte charset) +String EncodeRTF(const RichText& richtext, byte charset, Size dot_page_size, const Rect& dot_margins) { StringStream out; - EncodeRTF(out, richtext, charset); + EncodeRTF(out, richtext, charset, dot_page_size, dot_margins); String s = out.GetResult(); LLOG("EncodeRTF <<<<<\n" << s << "\n>>>>> EncodeRTF"); return s; } +String EncodeRTF(const RichText& richtext, byte charset, int dot_page_width) +{ + int dot_page_height = iscale(dot_page_width, 1414, 1000); + Rect margins(472, 472, 472, 472); + return EncodeRTF(richtext, charset, Size(dot_page_width + margins.left + margins.right, + dot_page_height + margins.top + margins.bottom), margins); +} + String EncodeRTF(const RichText& richtext) { return EncodeRTF(richtext, GetDefaultCharset() == CHARSET_UTF8 ? GetLNGCharset(GetSystemLNG()) : GetDefaultCharset()); } -RTFEncoder::RTFEncoder(Stream& stream, const RichText& richtext, byte charset) -: stream(stream) -, richtext(richtext) -, charset(charset) +RTFEncoder::RTFEncoder(Stream& stream_, const RichText& richtext_, byte charset_, + Size dot_page_size_, const Rect& dot_margins_) +: stream(stream_) +, richtext(richtext_) +, charset(charset_) +, dot_page_size(dot_page_size_) +, dot_margins(dot_margins_) { for(int i = 0; i < richtext.GetStyleCount(); i++) styleid.Add(richtext.GetStyleId(i)); @@ -204,12 +220,17 @@ void RTFEncoder::Command(const char *cmd, int param) stream.Put(IntStr(param)); } -void RTFEncoder::PutText(const char *text) +void RTFEncoder::PutText(const wchar *text) { - while(*text) { - if(*text == '{' || *text == '}' || *text == '\\') - stream.Put('\\'); - stream.Put(*text++); + for(; *text; text++) { + if((uint16)*text >= 128) { + stream.Put(NFormat("\\u%d\\'%02x", (int16)*text, FromUnicode(*text, CHARSET_DEFAULT))); + } + else { + if(*text == '{' || *text == '}' || *text == '\\') + stream.Put('\\'); + stream.Put((byte)*text); + } } } @@ -365,7 +386,7 @@ void RTFEncoder::PutParts(const Array& parts, if(PutCharFormat(part.format, base, false) || p == 0) Space(); base = part.format; - PutText(FromUnicode(px, charset)); + PutText(px); } } else if(part.object) @@ -465,6 +486,13 @@ void RTFEncoder::PutHeader() End(); } End(); + + Command("paperw", DotTwips(dot_page_size.cx)); + Command("paperh", DotTwips(dot_page_size.cy)); + Command("margl", DotTwips(dot_margins.left)); + Command("margr", DotTwips(dot_margins.right)); + Command("margt", DotTwips(dot_margins.top)); + Command("margb", DotTwips(dot_margins.bottom)); } void RTFEncoder::PutTable(const RichTable& table, int nesting, int dot_width) @@ -485,7 +513,7 @@ void RTFEncoder::PutTable(const RichTable& table, int nesting, int dot_width) column_pos[c + 1] = column_pos[c] + part; } for(int r = 0; r < table.GetRows(); r++) { - String rowfmt; + StringBuffer rowfmt; if(nesting) rowfmt << "\\*\\nesttableprops"; rowfmt << "\\trowd" @@ -509,6 +537,8 @@ void RTFEncoder::PutTable(const RichTable& table, int nesting, int dot_width) "\\trpaddr" << DotTwips(dflt_margin.right) << "\\trpaddfr3" "\\trpaddb" << DotTwips(dflt_margin.bottom) << "\\trpaddfb3"; */ + bool istop = (r == 0); + bool isbottom = (r == table.GetRows() - 1); for(int c = 0; c < table.GetColumns(); c++) { const RichCell& cell = table.cell[r][c]; /* @@ -527,9 +557,11 @@ void RTFEncoder::PutTable(const RichTable& table, int nesting, int dot_width) case ALIGN_CENTER: rowfmt << "\\clvertalc"; break; case ALIGN_BOTTOM: rowfmt << "\\clvertalb"; break; } + bool isleft = (c == 0); cellindex.Add(c); if(cell.hspan) c += cell.hspan; + bool isright = (c + 1 == table.GetColumns()); int cell_end = column_pos[c + 1]; if(cell.vspan) { vspan_counts.At(c, 0) = cell.vspan; @@ -539,6 +571,36 @@ void RTFEncoder::PutTable(const RichTable& table, int nesting, int dot_width) rowfmt << "\\clvmrg"; if(!IsNull(cell.format.color)) rowfmt << "\\clcbpat" << phys_colors.Find(cell.format.color); + int lb, tb, rb, bb; + Color lc, tc, rc, bc; + lc = tc = rc = bc = table.format.gridcolor; + lb = tb = rb = bb = table.format.grid; + if(isleft) { + lb = table.format.frame; + lc = table.format.framecolor; + } + if(isright) { + rb = table.format.frame; + rc = table.format.framecolor; + } + if(istop) { + tb = table.format.frame; + tc = table.format.framecolor; + } + if(isbottom) { + bb = table.format.frame; + bc = table.format.framecolor; + } + if(!IsNull(cell.format.bordercolor)) + lc = tc = rc = bc = cell.format.bordercolor; + lb = max(lb, cell.format.border.left); + tb = max(tb, cell.format.border.top); + rb = max(rb, cell.format.border.right); + bb = max(bb, cell.format.border.bottom); + PutBorder(rowfmt, lb, lc, "clbrdrl"); + PutBorder(rowfmt, tb, tc, "clbrdrt"); + PutBorder(rowfmt, rb, rc, "clbrdrr"); + PutBorder(rowfmt, bb, bc, "clbrdrb"); rowfmt << "\\cellx" << DotTwips(cell_end); } Begin(); @@ -548,8 +610,9 @@ void RTFEncoder::PutTable(const RichTable& table, int nesting, int dot_width) charfmt = RichPara::CharFormat(); if(nesting) Command("itap", nesting + 1); + String fmtstr = rowfmt; if(!nesting) - stream.Put(rowfmt); + stream.Put(fmtstr); for(int c = 0; c < cellindex.GetCount(); c++) { int cx = cellindex[c]; const RichCell& cell = table.cell[r][cx]; @@ -557,12 +620,21 @@ void RTFEncoder::PutTable(const RichTable& table, int nesting, int dot_width) PutTxt(cell.text, nesting + 1, cell_wd); Command(nesting ? "nestcell" : "cell"); } - stream.Put(rowfmt); + if(nesting) + stream.Put(fmtstr); Command(nesting ? "nestrow" : "row"); End(); } } +void RTFEncoder::PutBorder(StringBuffer& rowfmt, int wd, Color c, const char *clpar) +{ + if(wd > 0) { + rowfmt << "\\" << clpar << "\\brdrs\\brdrw" << wd << "\\brdrcf" + << phys_colors.Find(Nvl(c, Black())) << " "; + } +} + void RTFEncoder::PutTxt(const RichTxt& txt, int nesting, int dot_width) { for(int i = 0; i < txt.GetPartCount(); i++) { @@ -672,7 +744,7 @@ void RTFEncoder::PutDocument() old_ht = DotPoints(2 * tabs(charfmt.GetHeight())); para_ht = 0; oldstyle = Uuid::Create(); - PutTxt(richtext, 0, 3600); + PutTxt(richtext, 0, dot_page_size.cx - dot_margins.left - dot_margins.right); } END_UPP_NAMESPACE diff --git a/uppsrc/RichEdit/Modify.cpp b/uppsrc/RichEdit/Modify.cpp index 21a922ef4..a31b064a9 100644 --- a/uppsrc/RichEdit/Modify.cpp +++ b/uppsrc/RichEdit/Modify.cpp @@ -240,6 +240,14 @@ struct ToParaIterator : RichText::Iterator { } } } + else if(!part.field.IsNull()) { + para.Cat(part.field, part.fieldparam, part.format); + space = false; + } + else if(part.object) { + para.Cat(part.object, part.format); + space = false; + } } space = true; return false; diff --git a/uppsrc/RichEdit/RichEdit.t b/uppsrc/RichEdit/RichEdit.t index 2e94c8ef1..f6ca93b46 100644 --- a/uppsrc/RichEdit/RichEdit.t +++ b/uppsrc/RichEdit/RichEdit.t @@ -1124,7 +1124,7 @@ zhTW("\350\241\250\346\240\274\345\261\254\346\200\247") T_("Invalid header row count %d, cell at rw %d, co %d has vspan = %d.") caES("Cap\303\247alera no v\303\240lid fila %d, cel at fila %d, col. %d ha v" "span = %d.") -csCZ("") +csCZ("Chybn\303\275 po\304\215et \305\231\303\241dk\305\257 z\303\241hlav\303\255 %d, bu\305\210ka na \305\231\303\241dku %d, sloupec %d m\303\241 vertik\303\241ln\303\255 span = %d.") deDE("") esES("Suma de filas en cabecera invalida, celda en la fila %d, col %d tiene " "vspan = %d") @@ -1919,7 +1919,7 @@ zhTW("\345\226\256\346\240\274\345\261\254\346\200\247") T_("Style keys..") caES("Estil claus..") -csCZ("") +csCZ("Kl\303\241vesov\303\251 zkratky styl\305\257..") deDE("") esES("Teclas de estilo") fiFI("") @@ -2189,7 +2189,7 @@ zhTW("\351\207\217\345\260\272") T_("Ruler height") caES("Al\303\247ada de regla") -csCZ("") +csCZ("V\303\275\305\241ka prav\303\255tka") deDE("") esES("Altura de regla") fiFI("") @@ -2307,7 +2307,7 @@ zhTW("\351\246\226\350\241\214") T_("\vBullet") caES("\vVi\303\261eta") -csCZ("") +csCZ("\vOdr\303\241\305\276ka") deDE("") esES("\vVi\303\261eta") fiFI("") @@ -2506,7 +2506,7 @@ zhTW("\347\270\256\346\224\276\345\244\247\345\260\217") T_("Style keys") caES("Tecles d'estil") -csCZ("") +csCZ("Kl\303\241vesov\303\251 zkratky styl\305\257") deDE("") esES("Teclas de estilo") fiFI("") @@ -3009,7 +3009,7 @@ zhTW("\347\266\262\346\240\274") T_("Keep rows together") caES("Mantenir les files juntes") -csCZ("") +csCZ("Sv\303\241zat \305\231\303\241dky odstavce") deDE("") esES("Mantener las filas juntas") fiFI("") diff --git a/uppsrc/RichText/ParseQtf.cpp b/uppsrc/RichText/ParseQtf.cpp index 44e6933e2..d3221dc77 100644 --- a/uppsrc/RichText/ParseQtf.cpp +++ b/uppsrc/RichText/ParseQtf.cpp @@ -109,7 +109,6 @@ RichQtfParser::RichQtfParser(void *context_) format.Height(100); format.charset = GetDefaultCharset(); format.language = 0; - context = NULL; breakpage = false; istable = false; oldtab = false; @@ -947,8 +946,8 @@ void RichQtfParser::Parse(const char *qtf, int _accesskey) term++; } } - if(paragraph.GetCount() == 0) - SetFormat(); +// if(paragraph.GetCount() == 0) // TRC 11/02/15: kills formatting of last paragraph in text +// SetFormat(); if(oldtab) FinishOldTable(); else