diff --git a/uppsrc/RichEdit/FormatDlg.cpp b/uppsrc/RichEdit/FormatDlg.cpp index c1d05a63e..da8a29781 100644 --- a/uppsrc/RichEdit/FormatDlg.cpp +++ b/uppsrc/RichEdit/FormatDlg.cpp @@ -107,6 +107,10 @@ void ParaFormatting::Set(int unit, const RichText::FormatInfo& formatinfo) rulerink <<= formatinfo.rulerink; else rulerink <<= Null; + if(RichText::RULERSTYLE & formatinfo.paravalid) + rulerstyle <<= formatinfo.rulerstyle; + else + rulerstyle <<= Null; tabpos.SetUnit(unit); if(RichText::BULLET & formatinfo.paravalid) bullet <<= formatinfo.bullet; @@ -221,9 +225,22 @@ dword ParaFormatting::Get(RichText::FormatInfo& formatinfo) formatinfo.rulerink = ~rulerink; v |= RichText::RULERINK; } + if(!IsNull(rulerstyle)) { + formatinfo.rulerstyle = ~rulerstyle; + v |= RichText::RULERSTYLE; + } return v; } +struct RulerStyleDisplay : Display { + virtual void Paint(Draw& w, const Rect& r, const Value& q, Color ink, Color paper, dword style) const + { + w.DrawRect(r, paper); + if(!IsNull(q)) + RichPara::DrawRuler(w, r.left, (r.top + r.bottom) / 2 - 1, r.Width(), 2, ink, q); + } +}; + ParaFormatting::ParaFormatting() { CtrlLayout(*this); @@ -269,6 +286,11 @@ ParaFormatting::ParaFormatting() bullet <<= THISBACK(SetupIndent); EnableNumbering(); rulerink.NullText("---"); + rulerstyle.SetDisplay(Single()); + rulerstyle.Add(Null); + rulerstyle.Add(RichPara::RULER_SOLID); + rulerstyle.Add(RichPara::RULER_DOT); + rulerstyle.Add(RichPara::RULER_DASH); } void StyleManager::EnterStyle() diff --git a/uppsrc/RichEdit/RichEdit.lay b/uppsrc/RichEdit/RichEdit.lay index 178cb8129..ca987444f 100644 --- a/uppsrc/RichEdit/RichEdit.lay +++ b/uppsrc/RichEdit/RichEdit.lay @@ -16,25 +16,27 @@ LAYOUT(ParaLayout, 488, 352) ITEM(LabelBox, dv___14, SetLabel(t_("Ruler")).LeftPosZ(8, 472).TopPosZ(100, 40)) ITEM(Label, dv___15, SetLabel(t_("Ruler height")).LeftPosZ(16, 88).TopPosZ(112, 19)) ITEM(UnitEdit, ruler, LeftPosZ(108, 68).TopPosZ(112, 19)) - ITEM(Label, dv___17, SetLabel(t_("Ink")).LeftPosZ(192, 76).TopPosZ(112, 20)) - ITEM(ColorPusher, rulerink, LeftPosZ(268, 92).TopPosZ(112, 19)) - ITEM(LabelBox, dv___19, SetLabel(t_("Indentation")).LeftPosZ(8, 176).TopPosZ(144, 124)) - ITEM(Label, dv___20, SetLabel(t_("Left margin")).LeftPosZ(16, 88).TopPosZ(164, 19)) + ITEM(Label, dv___17, SetLabel(t_("Ink")).LeftPosZ(192, 36).TopPosZ(112, 20)) + ITEM(ColorPusher, rulerink, LeftPosZ(232, 92).TopPosZ(112, 19)) + ITEM(Label, dv___19, SetLabel(t_("Style")).LeftPosZ(340, 36).TopPosZ(112, 20)) + ITEM(DropList, rulerstyle, LeftPosZ(380, 92).TopPosZ(112, 19)) + ITEM(LabelBox, dv___21, SetLabel(t_("Indentation")).LeftPosZ(8, 176).TopPosZ(144, 124)) + ITEM(Label, dv___22, SetLabel(t_("Left margin")).LeftPosZ(16, 88).TopPosZ(164, 19)) ITEM(UnitEdit, lm, LeftPosZ(108, 68).TopPosZ(164, 19)) - ITEM(Label, dv___22, SetLabel(t_("ParaLayout_rm_1_SetLabel\aRight margin")).LeftPosZ(16, 88).TopPosZ(188, 19)) + ITEM(Label, dv___24, SetLabel(t_("ParaLayout_rm_1_SetLabel\aRight margin")).LeftPosZ(16, 88).TopPosZ(188, 19)) ITEM(UnitEdit, rm, LeftPosZ(108, 68).TopPosZ(188, 19)) - ITEM(Label, dv___24, SetLabel(t_("First line")).LeftPosZ(16, 88).TopPosZ(212, 19)) + ITEM(Label, dv___26, SetLabel(t_("First line")).LeftPosZ(16, 88).TopPosZ(212, 19)) ITEM(UnitEdit, indent, LeftPosZ(108, 68).TopPosZ(212, 19)) - ITEM(Label, dv___26, SetLabel(t_("\vBullet")).LeftPosZ(16, 104).TopPosZ(236, 24)) + ITEM(Label, dv___28, SetLabel(t_("\vBullet")).LeftPosZ(16, 104).TopPosZ(236, 24)) ITEM(DropList, bullet, LeftPosZ(124, 52).TopPosZ(236, 24)) - ITEM(LabelBox, dv___28, SetLabel(t_("Tabs")).LeftPosZ(192, 288).TopPosZ(144, 124)) + ITEM(LabelBox, dv___30, SetLabel(t_("Tabs")).LeftPosZ(192, 288).TopPosZ(144, 124)) ITEM(ArrayCtrl, tabs, AutoHideSb(true).LeftPosZ(200, 272).TopPosZ(160, 72)) - ITEM(Label, dv___30, SetLabel(t_("Default tab size")).LeftPosZ(200, 196).TopPosZ(240, 20)) + ITEM(Label, dv___32, SetLabel(t_("Default tab size")).LeftPosZ(200, 196).TopPosZ(240, 20)) ITEM(UnitEdit, tabsize, LeftPosZ(404, 68).TopPosZ(240, 19)) - ITEM(LabelBox, dv___32, SetLabel(t_("Numbering")).LeftPosZ(8, 472).TopPosZ(276, 68)) - ITEM(Label, dv___33, SetLabel(t_("Before number")).LeftPosZ(16, 100).TopPosZ(292, 20)) + ITEM(LabelBox, dv___34, SetLabel(t_("Numbering")).LeftPosZ(8, 472).TopPosZ(276, 68)) + ITEM(Label, dv___35, SetLabel(t_("Before number")).LeftPosZ(16, 100).TopPosZ(292, 20)) ITEM(EditString, before_number, LeftPosZ(116, 72).TopPosZ(292, 19)) - ITEM(Label, dv___35, SetLabel(t_("After number")).LeftPosZ(208, 100).TopPosZ(292, 20)) + ITEM(Label, dv___37, SetLabel(t_("After number")).LeftPosZ(208, 100).TopPosZ(292, 20)) ITEM(EditString, after_number, LeftPosZ(308, 72).TopPosZ(292, 19)) ITEM(Option, reset_number, SetLabel(t_("Reset")).LeftPosZ(396, 72).TopPosZ(292, 20)) UNTYPED(n[0], LeftPosZ(16, 54).TopPosZ(320, 19)) diff --git a/uppsrc/RichText/EncodeQtf.cpp b/uppsrc/RichText/EncodeQtf.cpp index 5abd68ebc..63b6f2c3b 100644 --- a/uppsrc/RichText/EncodeQtf.cpp +++ b/uppsrc/RichText/EncodeQtf.cpp @@ -97,6 +97,7 @@ void QTFEncodeParaFormat(String& qtf, const RichPara::Format& format, const Rich FmtNumber(qtf, 'H', style.ruler, format.ruler); if(style.rulerink != format.rulerink) qtf << "h" << QtfFormat(format.rulerink); + FmtNumber(qtf, 'L', style.rulerstyle, format.rulerstyle); FmtNumber(qtf, 'b', style.before, format.before); FmtNumber(qtf, 'a', style.after, format.after); if(style.newpage != format.newpage) diff --git a/uppsrc/RichText/Format.cpp b/uppsrc/RichText/Format.cpp index ce501aaa2..40c42d78c 100644 --- a/uppsrc/RichText/Format.cpp +++ b/uppsrc/RichText/Format.cpp @@ -124,6 +124,8 @@ void RichTxt::FormatInfo::Combine(const RichPara::Format& fmt) paravalid &= ~RULER; if(rulerink != fmt.rulerink) paravalid &= ~RULERINK; + if(rulerstyle != fmt.rulerstyle) + paravalid &= ~RULERSTYLE; } void RichTxt::FormatInfo::ApplyTo(RichPara::CharFormat& fmt) const @@ -207,6 +209,8 @@ void RichTxt::FormatInfo::ApplyTo(RichPara::Format& fmt) const fmt.linespacing = linespacing; if(paravalid & RULERINK) fmt.rulerink = rulerink; + if(paravalid & RULERSTYLE) + fmt.rulerstyle = rulerstyle; } END_UPP_NAMESPACE diff --git a/uppsrc/RichText/Para.h b/uppsrc/RichText/Para.h index 3f18bbfaf..b2b2de9e3 100644 --- a/uppsrc/RichText/Para.h +++ b/uppsrc/RichText/Para.h @@ -76,6 +76,12 @@ struct RichPara { enum TabSpecial { TAB_RIGHTPOS = 0x8000000 }; + + enum RulerStyle { + RULER_SOLID, + RULER_DOT, + RULER_DASH, + }; struct CharFormat : public Font { int language; @@ -114,6 +120,7 @@ struct RichPara { int align; int ruler, before, lm, indent, rm, after; Color rulerink; + int rulerstyle; int tabsize; int bullet; int linespacing; @@ -229,6 +236,8 @@ struct RichPara { static void Charformat(Stream& out, const CharFormat& o, const CharFormat& n, const CharFormat& s); + static void DrawRuler(Draw& w, int x, int y, int cx, int cy, Color ink, int style); + void Cat(const WString& s, const CharFormat& f); void Cat(const char *s, const CharFormat& f); void Cat(const RichObject& o, const CharFormat& f); diff --git a/uppsrc/RichText/ParaData.cpp b/uppsrc/RichText/ParaData.cpp index 0a7cb5b73..a2937d45a 100644 --- a/uppsrc/RichText/ParaData.cpp +++ b/uppsrc/RichText/ParaData.cpp @@ -178,6 +178,7 @@ RichPara::Format::Format() align = ALIGN_LEFT; ruler = before = lm = rm = indent = after = 0; rulerink = Black; + rulerstyle = RULER_SOLID; bullet = 0; keep = newpage = keepnext = orphan = false; tabsize = 296; @@ -348,6 +349,7 @@ String RichPara::Pack(const RichPara::Format& style, Array& obj) con if(format.tab != style.tab) pattr |= 0x8000; if(format.ruler != style.ruler) pattr |= 0x10000; if(format.rulerink != style.rulerink) pattr |= 0x20000; + if(format.rulerstyle != style.rulerstyle) pattr |= 0x40000; out.Put32(pattr); if(pattr & 1) out.Put16(format.align); if(pattr & 2) out.Put16(format.before); @@ -393,6 +395,8 @@ String RichPara::Pack(const RichPara::Format& style, Array& obj) con Color c = format.rulerink; c.Serialize(out); } + if(pattr & 0x40000) + out.Put16(format.rulerstyle); obj.Clear(); CharFormat cf = style; if(part.GetCount()) @@ -615,6 +619,8 @@ void RichPara::Unpack(const String& data, const Array& obj, format.ruler = in.Get16(); if(pattr & 0x20000) format.rulerink.Serialize(in); + if(pattr & 0x40000) + format.rulerstyle = in.Get16(); part.Clear(); int oi = 0; UnpackParts(in, style, part, obj, oi); @@ -761,7 +767,7 @@ void RichPara::ApplyStyle(const Format& newstyle) void RichPara::Dump() { LOG("RichPara dump" << LOG_BEGIN); - LOG("RULER: " << format.ruler << " " << format.rulerink); + LOG("RULER: " << format.ruler << " " << format.rulerink << " " << format.rulerstyle); LOG("BEFORE: " << format.before); LOG("INDENT: " << format.indent); LOG("LM: " << format.lm); diff --git a/uppsrc/RichText/ParaPaint.cpp b/uppsrc/RichText/ParaPaint.cpp index 95238048b..13351cf87 100644 --- a/uppsrc/RichText/ParaPaint.cpp +++ b/uppsrc/RichText/ParaPaint.cpp @@ -149,6 +149,25 @@ Image RichObjectImageMaker::Make() const */ } +void RichPara::DrawRuler(Draw& w, int x, int y, int cx, int cy, Color ink, int style) +{ + int segment = cy; + int r = x + cx; + switch(style) { + case RULER_DASH: + segment = 2 * cy; + case RULER_DOT: + while(x < r) { + w.DrawRect(x, y, min(r - x, segment), cy, ink); + x += 2 * segment; + } + break; + default: + w.DrawRect(x, y, cx, cy, ink); + break; + } +} + void RichPara::Paint(PageDraw& pw, const Rect& page, PageY py, const PaintInfo& pi, const Number& n, const Bits& spellerror, int nbefore, int nline) const @@ -162,9 +181,9 @@ void RichPara::Paint(PageDraw& pw, const Rect& page, PageY py, const PaintInfo& int hy = py.y - format.before - format.ruler; int phy = py.page; if(format.ruler && hy >= 0 && hy + format.ruler < page.bottom) - pw.Page(phy).DrawRect(z * page.left + z * format.lm, z * hy, - z * page.right - z * page.left - z * format.rm - z * format.lm, - max(1, z * format.ruler), format.rulerink); + DrawRuler(pw.Page(phy), z * page.left + z * format.lm, z * hy, + z * page.right - z * page.left - z * format.rm - z * format.lm, + max(1, z * format.ruler), format.rulerink, format.rulerstyle); if(pi.sell < 0 && pi.selh > 0) for(int p = opy.page; p <= py.page; p++) { int top = z * (p == opy.page ? opy.y : page.top); diff --git a/uppsrc/RichText/ParseQtf.cpp b/uppsrc/RichText/ParseQtf.cpp index d7ffe40ae..8fee99440 100644 --- a/uppsrc/RichText/ParseQtf.cpp +++ b/uppsrc/RichText/ParseQtf.cpp @@ -650,6 +650,7 @@ void RichQtfParser::Parse(const char *qtf, int _accesskey) case 'K': format.keepnext = !format.keepnext; break; case 'H': format.ruler = GetNumber(); break; case 'h': format.rulerink = GetColor(); break; + case 'L': format.rulerstyle = GetNumber(); break; case 'Q': format.orphan = !format.orphan; break; case 'n': format.before_number = GetText(';'); break; case 'm': format.after_number = GetText(';'); break; diff --git a/uppsrc/RichText/Txt.h b/uppsrc/RichText/Txt.h index a2cc402ef..028fec015 100644 --- a/uppsrc/RichText/Txt.h +++ b/uppsrc/RichText/Txt.h @@ -39,6 +39,7 @@ public: SPACING = 0x00008000, RULER = 0x00004000, RULERINK = 0x00002000, + RULERSTYLE= 0x00001000, }; struct FormatInfo : RichPara::Format { diff --git a/uppsrc/RichText/srcdoc.tpp/QTF$en-us.tpp b/uppsrc/RichText/srcdoc.tpp/QTF$en-us.tpp index 6cf8235eb..728d573c0 100644 --- a/uppsrc/RichText/srcdoc.tpp/QTF$en-us.tpp +++ b/uppsrc/RichText/srcdoc.tpp/QTF$en-us.tpp @@ -312,6 +312,9 @@ optimization, [*@(128.0.255) %`-] is equivalent to [@(128.0.255) %][@(0.0.255) 0 ::= [s0; Horizontal ruler height (if zero, there is no ruler).] ::^ [s0;%- [C@(128.0.255) h][/C@(0.0.255) color]] ::= [s0; Color of horizontal ruler (default is black).] +::^ [s0;%- [C@(128.0.255) L][/C@(0.0.255) number]] +::= [s0; Style of horizontal ruler line, 0 `- solid color, 1 `- dots, +2 `- dashes] ::^ [s0;%- [C@(128.0.255) b][/C@(0.0.255) number]] ::= [s0; Space before paragraph in dots.] ::^ [s0;%- [C@(128.0.255) a][/C@(0.0.255) number]]