1 #include "RichEdit.h"
2
3 namespace Upp {
4
5 struct RichEditHdrFtr : public RichEdit {
6 ToolBar toolbar;
7
8 void RefreshBar();
9 void TheBar(Bar& bar);
10
11 void PageNumber();
12 void PageCount();
13
14 void Init(int pageno, int pagecount);
15
16 typedef RichEditHdrFtr CLASSNAME;
17
18 RichEditHdrFtr();
19 };
20
TheBar(Bar & bar)21 void RichEditHdrFtr::TheBar(Bar& bar)
22 {
23 EditTools(bar);
24 bar.Gap();
25 FontTools(bar);
26 bar.Gap();
27 InkTool(bar);
28 PaperTool(bar);
29 bar.Gap();
30 LanguageTool(bar);
31 SpellCheckTool(bar);
32 bar.Break();
33 StyleTool(bar);
34 bar.Gap();
35 ParaTools(bar);
36 bar.Gap();
37 TableTools(bar);
38 bar.Gap();
39 bar.Add(!IsReadOnly(), t_("Insert page number"), RichEditImg::PageNumber(), THISBACK(PageNumber));
40 bar.Add(!IsReadOnly(), t_("Insert page count"), RichEditImg::PageCount(), THISBACK(PageCount));
41 }
42
PageNumber()43 void RichEditHdrFtr::PageNumber()
44 {
45 PasteText(ParseQTF("{:VALUE:PAGENUMBER:}"));
46 EvaluateFields();
47 }
48
PageCount()49 void RichEditHdrFtr::PageCount()
50 {
51 PasteText(ParseQTF("{:VALUE:PAGECOUNT:}"));
52 EvaluateFields();
53 }
54
RefreshBar()55 void RichEditHdrFtr::RefreshBar()
56 {
57 toolbar.Set(THISBACK(TheBar));
58 }
59
RichEditHdrFtr()60 RichEditHdrFtr::RichEditHdrFtr()
61 {
62 InsertFrame(0, toolbar);
63 WhenRefreshBar = callback(this, &RichEditHdrFtr::RefreshBar);
64 SetVar("PAGECOUNT", "###");
65 SetVar("PAGENUMBER", "#");
66 SetVar("__DISPLAY_VALUE_FIELDS", 1);
67 }
68
69 struct HeaderFooterDlg : WithHeaderFooterLayout<TopWindow> {
70 typedef HeaderFooterDlg CLASSNAME;
71
72 RichEditHdrFtr header_editor, footer_editor;
73
74 void Sync();
75 void Set(const String& header_qtf, const String& footer_qtf);
76 void Get(String& header_qtf, String& footer_qtf);
77 void Load(const RichText& text);
78 void Save(RichText& text);
79
80 HeaderFooterDlg();
81 };
82
Sync()83 void HeaderFooterDlg::Sync()
84 {
85 header_editor.Enable(use_header);
86 footer_editor.Enable(use_footer);
87 }
88
HeaderFooterDlg()89 HeaderFooterDlg::HeaderFooterDlg()
90 {
91 CtrlLayoutOKCancel(*this, "Header / Footer");
92 use_header <<= use_footer <<= THISBACK(Sync);
93 Sync();
94 }
95
Set(const String & header_qtf,const String & footer_qtf)96 void HeaderFooterDlg::Set(const String& header_qtf, const String& footer_qtf)
97 {
98 use_header = !IsNull(header_qtf);
99 if(use_header)
100 header_editor.SetQTF(header_qtf);
101 header_editor.EvaluateFields();
102 use_footer = !IsNull(footer_qtf);
103 if(use_footer)
104 footer_editor.SetQTF(footer_qtf);
105 footer_editor.EvaluateFields();
106 Sync();
107 }
108
Get(String & header_qtf,String & footer_qtf)109 void HeaderFooterDlg::Get(String& header_qtf, String& footer_qtf)
110 {
111 header_qtf = use_header ? header_editor.GetQTF() : String();
112 footer_qtf = use_footer ? footer_editor.GetQTF() : String();
113 }
114
Load(const RichText & text)115 void HeaderFooterDlg::Load(const RichText& text)
116 {
117 Set(text.GetHeaderQtf(), text.GetFooterQtf());
118 }
119
Save(RichText & text)120 void HeaderFooterDlg::Save(RichText& text)
121 {
122 if(use_header)
123 text.SetHeaderQtf(header_editor.GetQTF());
124 else
125 text.ClearHeader();
126 if(use_footer)
127 text.SetFooterQtf(footer_editor.GetQTF());
128 else
129 text.ClearFooter();
130 }
131
HeaderFooter()132 void RichEdit::HeaderFooter()
133 {
134 HeaderFooterDlg dlg;
135 dlg.Load(text);
136 dlg.SetRect(0, 0, GetSize().cx, dlg.GetLayoutSize().cy);
137 if(dlg.Execute() == IDOK) {
138 dlg.Save(text);
139 Refresh();
140 Finish();
141 }
142 }
143
EditRichHeaderFooter(String & header_qtf,String & footer_qtf)144 bool EditRichHeaderFooter(String& header_qtf, String& footer_qtf)
145 {
146 HeaderFooterDlg dlg;
147 dlg.Set(header_qtf, footer_qtf);
148 if(dlg.Execute() == IDOK) {
149 dlg.Get(header_qtf, footer_qtf);
150 return true;
151 }
152 return false;
153 }
154
155 }