]> git.lyx.org Git - lyx.git/blob - src/PaperLayout.C
a023143bdb7768879d5b9dc125b97c4c3f89d7e3
[lyx.git] / src / PaperLayout.C
1 #include <config.h>
2
3 #include <cstdlib>
4
5 #include "definitions.h"
6 #include FORMS_H_LOCATION
7 #include "layout_forms.h"
8 #include "lyx_main.h"
9 #include "lyxrc.h"
10 #include "LString.h"
11 #include "support/filetools.h"
12 #include "buffer.h"
13 #include "minibuffer.h"
14 #include "vspace.h"
15 #include "lyx_gui_misc.h"
16 #include "BufferView.h"
17 #include "gettext.h"
18
19 extern FD_form_paper *fd_form_paper;
20 extern MiniBuffer *minibuffer;
21 extern BufferView *current_view;
22
23
24 inline void DeactivatePaperButtons ()
25 {
26         fl_deactivate_object (fd_form_paper->button_ok);
27         fl_deactivate_object (fd_form_paper->button_apply);
28         fl_set_object_lcol (fd_form_paper->button_ok, FL_INACTIVE);
29         fl_set_object_lcol (fd_form_paper->button_apply, FL_INACTIVE);
30 }
31
32
33 inline void ActivatePaperButtons ()
34 {
35         fl_activate_object (fd_form_paper->button_ok);
36         fl_activate_object (fd_form_paper->button_apply);
37         fl_set_object_lcol (fd_form_paper->button_ok, FL_BLACK);
38         fl_set_object_lcol (fd_form_paper->button_apply, FL_BLACK);
39 }
40
41
42 inline void DisablePaperLayout()
43 {
44         DeactivatePaperButtons();
45         fl_deactivate_object (fd_form_paper->choice_paperpackage);
46         fl_deactivate_object (fd_form_paper->greoup_radio_orientation);
47         fl_deactivate_object (fd_form_paper->radio_portrait);
48         fl_deactivate_object (fd_form_paper->radio_landscape);
49         fl_deactivate_object (fd_form_paper->choice_papersize2);
50         fl_deactivate_object (fd_form_paper->push_use_geometry);
51         fl_deactivate_object (fd_form_paper->input_custom_width);
52         fl_deactivate_object (fd_form_paper->input_custom_height);
53         fl_deactivate_object (fd_form_paper->input_top_margin);
54         fl_deactivate_object (fd_form_paper->input_bottom_margin);
55         fl_deactivate_object (fd_form_paper->input_left_margin);
56         fl_deactivate_object (fd_form_paper->input_right_margin);
57         fl_deactivate_object (fd_form_paper->input_head_height);
58         fl_deactivate_object (fd_form_paper->input_head_sep);
59         fl_deactivate_object (fd_form_paper->input_foot_skip);
60         fl_deactivate_object (fd_form_paper->text_warning);
61 }
62
63
64 inline void EnablePaperLayout()
65 {
66         ActivatePaperButtons();
67         fl_activate_object (fd_form_paper->choice_paperpackage);
68         fl_activate_object (fd_form_paper->greoup_radio_orientation);
69         fl_activate_object (fd_form_paper->radio_portrait);
70         fl_activate_object (fd_form_paper->radio_landscape);
71         fl_activate_object (fd_form_paper->choice_papersize2);
72         fl_activate_object (fd_form_paper->push_use_geometry);
73         fl_activate_object (fd_form_paper->input_custom_width);
74         fl_activate_object (fd_form_paper->input_custom_height);
75         fl_activate_object (fd_form_paper->input_top_margin);
76         fl_activate_object (fd_form_paper->input_bottom_margin);
77         fl_activate_object (fd_form_paper->input_left_margin);
78         fl_activate_object (fd_form_paper->input_right_margin);
79         fl_activate_object (fd_form_paper->input_head_height);
80         fl_activate_object (fd_form_paper->input_head_sep);
81         fl_activate_object (fd_form_paper->input_foot_skip);
82         fl_activate_object (fd_form_paper->text_warning);
83 }
84
85
86 static void checkMarginValues()
87 {
88         int allEmpty;
89     
90         fl_hide_object(fd_form_paper->text_warning);
91         ActivatePaperButtons();
92 #if 0
93         val = fl_get_choice(fd_form_paper->choice_papersize2)-1;
94         if (val == VM_PAPER_DEFAULT)
95                 return;
96 #endif
97         allEmpty = (!strlen(fl_get_input(fd_form_paper->input_top_margin)) &&
98                     !strlen(fl_get_input(fd_form_paper->input_bottom_margin)) &&
99                     !strlen(fl_get_input(fd_form_paper->input_left_margin)) &&
100                     !strlen(fl_get_input(fd_form_paper->input_right_margin)) &&
101                     !strlen(fl_get_input(fd_form_paper->input_head_height)) &&
102                     !strlen(fl_get_input(fd_form_paper->input_head_sep)) &&
103                     !strlen(fl_get_input(fd_form_paper->input_foot_skip)) &&
104                     !strlen(fl_get_input(fd_form_paper->input_custom_width)) &&
105                     !strlen(fl_get_input(fd_form_paper->input_custom_height)));
106         if (!allEmpty) {
107                 fl_set_button(fd_form_paper->push_use_geometry, 1);
108         }
109 }
110
111
112 bool UpdateLayoutPaper()
113 {
114         bool update = true;
115         if (!current_view->available())
116                 update = false;
117
118         if (update) {
119                 BufferParams * params = &current_view->currentBuffer()->params;
120
121                 fl_set_choice(fd_form_paper->choice_papersize2,
122                               params->papersize2 + 1);
123                 fl_set_choice(fd_form_paper->choice_paperpackage,
124                               params->paperpackage + 1);
125                 fl_set_button(fd_form_paper->push_use_geometry,
126                               params->use_geometry);
127                 fl_set_button(fd_form_paper->radio_portrait, 0);
128                 fl_set_button(fd_form_paper->radio_landscape, 0);
129                 if (params->orientation == ORIENTATION_LANDSCAPE)
130                         fl_set_button(fd_form_paper->radio_landscape, 1);
131                 else
132                         fl_set_button(fd_form_paper->radio_portrait, 1);
133    
134                 fl_set_input(fd_form_paper->input_custom_width,
135                              params->paperwidth.c_str());
136                 fl_set_input(fd_form_paper->input_custom_height,
137                              params->paperheight.c_str());
138                 fl_set_input(fd_form_paper->input_left_margin,
139                              params->leftmargin.c_str());
140                 fl_set_input(fd_form_paper->input_top_margin,
141                              params->topmargin.c_str());
142                 fl_set_input(fd_form_paper->input_right_margin,
143                              params->rightmargin.c_str());
144                 fl_set_input(fd_form_paper->input_bottom_margin,
145                              params->bottommargin.c_str());
146                 fl_set_input(fd_form_paper->input_head_height,
147                              params->headheight.c_str());
148                 fl_set_input(fd_form_paper->input_head_sep,
149                              params->headsep.c_str());
150                 fl_set_input(fd_form_paper->input_foot_skip,
151                              params->footskip.c_str());
152                 fl_set_focus_object(fd_form_paper->form_paper,
153                                     fd_form_paper->choice_papersize2);
154                 fl_hide_object(fd_form_paper->text_warning);
155                 if (current_view->currentBuffer()->isReadonly()) {
156                         DisablePaperLayout();
157                         fl_set_object_label(fd_form_paper->text_warning,
158                                             _("Document is read-only."
159                                               "  No changes to layout"
160                                               " permitted."));
161                         fl_show_object(fd_form_paper->text_warning);
162                 } else {
163                         EnablePaperLayout();
164                 }
165         } else if (fd_form_paper->form_paper->visible) {
166                 fl_hide_form(fd_form_paper->form_paper);
167         }
168         return update;
169 }
170
171
172 void MenuLayoutPaper()
173 {
174         if (UpdateLayoutPaper()) {
175                 if (fd_form_paper->form_paper->visible) {
176                         fl_raise_form(fd_form_paper->form_paper);
177                 } else {
178                         fl_show_form(fd_form_paper->form_paper,
179                                      FL_PLACE_MOUSE, FL_FULLBORDER,
180                                      _("Paper Layout"));
181                 }
182         }
183 }
184
185
186 void PaperApplyCB(FL_OBJECT *, long)
187 {
188         if (! current_view->available()) 
189                 return;
190         
191         BufferParams *params = &current_view->currentBuffer()->params;
192         
193         const FD_form_paper* fd = fd_form_paper;
194     
195         params->papersize2 = fl_get_choice(fd->choice_papersize2)-1;
196         params->paperpackage = fl_get_choice(fd->choice_paperpackage)-1;
197         params->use_geometry = fl_get_button(fd_form_paper->push_use_geometry);
198         if (fl_get_button(fd_form_paper->radio_landscape))
199                 params->orientation = ORIENTATION_LANDSCAPE;
200         else
201                 params->orientation = ORIENTATION_PORTRAIT;
202         params->paperwidth = fl_get_input(fd->input_custom_width);
203         params->paperheight = fl_get_input(fd->input_custom_height);
204         params->leftmargin = fl_get_input(fd->input_left_margin);
205         params->topmargin = fl_get_input(fd->input_top_margin);
206         params->rightmargin = fl_get_input(fd->input_right_margin);
207         params->bottommargin = fl_get_input(fd->input_bottom_margin);
208         params->headheight = fl_get_input(fd->input_head_height);
209         params->headsep = fl_get_input(fd->input_head_sep);
210         params->footskip = fl_get_input(fd->input_foot_skip);
211         current_view->currentBuffer()->setPaperStuff();
212         minibuffer->Set(_("Paper layout set"));
213         current_view->currentBuffer()->markDirty();
214         
215         return;
216 }
217
218
219 void PaperCancelCB(FL_OBJECT *, long)
220 {
221         fl_hide_form(fd_form_paper->form_paper);
222 }
223
224
225 void PaperOKCB(FL_OBJECT *ob, long data)
226 {
227         PaperCancelCB(ob,data);
228         PaperApplyCB(ob,data);
229 }
230
231
232 void PaperMarginsCB(FL_OBJECT *ob, long)
233 {
234         const FD_form_paper
235                 *fd = fd_form_paper;
236         string
237                 str;
238         char
239                 val;
240     
241         checkMarginValues();
242         if (ob == fd->choice_papersize2) {
243                 val = fl_get_choice(fd->choice_papersize2)-1;
244                 if (val == VM_PAPER_DEFAULT) {
245                         fl_set_button(fd->push_use_geometry, 0);
246                         checkMarginValues();
247                 } else {
248                         if ((val != VM_PAPER_USLETTER) && (val != VM_PAPER_USLEGAL) &&
249                             (val != VM_PAPER_USEXECUTIVE) && (val != VM_PAPER_A4) &&
250                             (val != VM_PAPER_A5) && (val != VM_PAPER_B5)) {
251                                 fl_set_button(fd->push_use_geometry, 1);
252                         }
253                         fl_set_choice(fd->choice_paperpackage, PACKAGE_NONE + 1);
254                 }
255         } else if (ob == fd->choice_paperpackage) {
256                 val = fl_get_choice(fd->choice_paperpackage)-1;
257                 if (val != PACKAGE_NONE) {
258                         fl_set_choice(fd->choice_papersize2, VM_PAPER_DEFAULT + 1);
259                         fl_set_button(fd->push_use_geometry, 0);
260                 }
261         } else if ((ob==fd->input_custom_width) || (ob==fd->input_custom_height) ||
262                    (ob==fd->input_left_margin) || (ob==fd->input_right_margin) ||
263                    (ob==fd->input_top_margin) || (ob==fd->input_bottom_margin) ||
264                    (ob==fd->input_head_height) || (ob==fd->input_head_sep) ||
265                    (ob==fd->input_foot_skip)) {
266                 str = fl_get_input(ob);
267                 if (!str.empty() && !isValidLength(str)) {
268                         fl_set_object_label(fd_form_paper->text_warning,
269                                             _("Warning: Invalid Length"
270                                               " (valid example: 10mm)"));
271                         fl_show_object(fd_form_paper->text_warning);
272                         DeactivatePaperButtons();
273                 } else if (!str.empty())
274                         fl_set_button(fd->push_use_geometry, 1);
275         }
276         return;
277 }