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 }