]> git.lyx.org Git - lyx.git/blob - src/PaperLayout.C
a64ce1f0f4253fffc21cb240ae13e0b657ce9c65
[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
93         allEmpty = (!strlen(fl_get_input(fd_form_paper->input_top_margin)) &&
94                     !strlen(fl_get_input(fd_form_paper->input_bottom_margin)) &&
95                     !strlen(fl_get_input(fd_form_paper->input_left_margin)) &&
96                     !strlen(fl_get_input(fd_form_paper->input_right_margin)) &&
97                     !strlen(fl_get_input(fd_form_paper->input_head_height)) &&
98                     !strlen(fl_get_input(fd_form_paper->input_head_sep)) &&
99                     !strlen(fl_get_input(fd_form_paper->input_foot_skip)) &&
100                     !strlen(fl_get_input(fd_form_paper->input_custom_width)) &&
101                     !strlen(fl_get_input(fd_form_paper->input_custom_height)));
102         if (!allEmpty) {
103                 fl_set_button(fd_form_paper->push_use_geometry, 1);
104         }
105 }
106
107
108 bool UpdateLayoutPaper()
109 {
110         bool update = true;
111         if (!current_view->available())
112                 update = false;
113
114         if (update) {
115                 BufferParams * params = &current_view->buffer()->params;
116
117                 fl_set_choice(fd_form_paper->choice_papersize2,
118                               params->papersize2 + 1);
119                 fl_set_choice(fd_form_paper->choice_paperpackage,
120                               params->paperpackage + 1);
121                 fl_set_button(fd_form_paper->push_use_geometry,
122                               params->use_geometry);
123                 fl_set_button(fd_form_paper->radio_portrait, 0);
124                 fl_set_button(fd_form_paper->radio_landscape, 0);
125                 if (params->orientation == ORIENTATION_LANDSCAPE)
126                         fl_set_button(fd_form_paper->radio_landscape, 1);
127                 else
128                         fl_set_button(fd_form_paper->radio_portrait, 1);
129    
130                 fl_set_input(fd_form_paper->input_custom_width,
131                              params->paperwidth.c_str());
132                 fl_set_input(fd_form_paper->input_custom_height,
133                              params->paperheight.c_str());
134                 fl_set_input(fd_form_paper->input_left_margin,
135                              params->leftmargin.c_str());
136                 fl_set_input(fd_form_paper->input_top_margin,
137                              params->topmargin.c_str());
138                 fl_set_input(fd_form_paper->input_right_margin,
139                              params->rightmargin.c_str());
140                 fl_set_input(fd_form_paper->input_bottom_margin,
141                              params->bottommargin.c_str());
142                 fl_set_input(fd_form_paper->input_head_height,
143                              params->headheight.c_str());
144                 fl_set_input(fd_form_paper->input_head_sep,
145                              params->headsep.c_str());
146                 fl_set_input(fd_form_paper->input_foot_skip,
147                              params->footskip.c_str());
148                 fl_set_focus_object(fd_form_paper->form_paper,
149                                     fd_form_paper->choice_papersize2);
150                 fl_hide_object(fd_form_paper->text_warning);
151                 if (current_view->buffer()->isReadonly()) {
152                         DisablePaperLayout();
153                         fl_set_object_label(fd_form_paper->text_warning,
154                                             _("Document is read-only."
155                                               "  No changes to layout"
156                                               " permitted."));
157                         fl_show_object(fd_form_paper->text_warning);
158                 } else {
159                         EnablePaperLayout();
160                 }
161         } else if (fd_form_paper->form_paper->visible) {
162                 fl_hide_form(fd_form_paper->form_paper);
163         }
164         return update;
165 }
166
167
168 void MenuLayoutPaper()
169 {
170         if (UpdateLayoutPaper()) {
171                 if (fd_form_paper->form_paper->visible) {
172                         fl_raise_form(fd_form_paper->form_paper);
173                 } else {
174                         fl_show_form(fd_form_paper->form_paper,
175                                      FL_PLACE_MOUSE, FL_FULLBORDER,
176                                      _("Paper Layout"));
177                 }
178         }
179 }
180
181
182 void PaperApplyCB(FL_OBJECT *, long)
183 {
184         if (! current_view->available()) 
185                 return;
186         
187         BufferParams * params = &current_view->buffer()->params;
188         
189         FD_form_paper const * fd = fd_form_paper;
190     
191         params->papersize2 = fl_get_choice(fd->choice_papersize2)-1;
192         params->paperpackage = fl_get_choice(fd->choice_paperpackage)-1;
193         params->use_geometry = fl_get_button(fd_form_paper->push_use_geometry);
194         if (fl_get_button(fd_form_paper->radio_landscape))
195                 params->orientation = ORIENTATION_LANDSCAPE;
196         else
197                 params->orientation = ORIENTATION_PORTRAIT;
198         params->paperwidth = fl_get_input(fd->input_custom_width);
199         params->paperheight = fl_get_input(fd->input_custom_height);
200         params->leftmargin = fl_get_input(fd->input_left_margin);
201         params->topmargin = fl_get_input(fd->input_top_margin);
202         params->rightmargin = fl_get_input(fd->input_right_margin);
203         params->bottommargin = fl_get_input(fd->input_bottom_margin);
204         params->headheight = fl_get_input(fd->input_head_height);
205         params->headsep = fl_get_input(fd->input_head_sep);
206         params->footskip = fl_get_input(fd->input_foot_skip);
207         current_view->buffer()->setPaperStuff();
208         minibuffer->Set(_("Paper layout set"));
209         current_view->buffer()->markDirty();
210         
211         return;
212 }
213
214
215 void PaperCancelCB(FL_OBJECT *, long)
216 {
217         fl_hide_form(fd_form_paper->form_paper);
218 }
219
220
221 void PaperOKCB(FL_OBJECT * ob, long data)
222 {
223         PaperCancelCB(ob,data);
224         PaperApplyCB(ob,data);
225 }
226
227
228 void PaperMarginsCB(FL_OBJECT * ob, long)
229 {
230         FD_form_paper const * fd = fd_form_paper;
231         string str;
232         char val;
233     
234         checkMarginValues();
235         if (ob == fd->choice_papersize2) {
236                 val = fl_get_choice(fd->choice_papersize2)-1;
237                 if (val == VM_PAPER_DEFAULT) {
238                         fl_set_button(fd->push_use_geometry, 0);
239                         checkMarginValues();
240                 } else {
241                         if ((val != VM_PAPER_USLETTER) && (val != VM_PAPER_USLEGAL) &&
242                             (val != VM_PAPER_USEXECUTIVE) && (val != VM_PAPER_A4) &&
243                             (val != VM_PAPER_A5) && (val != VM_PAPER_B5)) {
244                                 fl_set_button(fd->push_use_geometry, 1);
245                         }
246                         fl_set_choice(fd->choice_paperpackage, PACKAGE_NONE + 1);
247                 }
248         } else if (ob == fd->choice_paperpackage) {
249                 val = fl_get_choice(fd->choice_paperpackage)-1;
250                 if (val != PACKAGE_NONE) {
251                         fl_set_choice(fd->choice_papersize2, VM_PAPER_DEFAULT + 1);
252                         fl_set_button(fd->push_use_geometry, 0);
253                 }
254         } else if ((ob==fd->input_custom_width)
255                    || (ob==fd->input_custom_height) 
256                    || (ob==fd->input_left_margin)
257                    || (ob==fd->input_right_margin) 
258                    || (ob==fd->input_top_margin)
259                    || (ob==fd->input_bottom_margin) 
260                    || (ob==fd->input_head_height)
261                    || (ob==fd->input_head_sep)
262                    || (ob==fd->input_foot_skip)) {
263                 str = fl_get_input(ob);
264                 if (!str.empty() && !isValidLength(str)) {
265                         fl_set_object_label(fd_form_paper->text_warning,
266                                             _("Warning: Invalid Length"
267                                               " (valid example: 10mm)"));
268                         fl_show_object(fd_form_paper->text_warning);
269                         DeactivatePaperButtons();
270                 } else if (!str.empty())
271                         fl_set_button(fd->push_use_geometry, 1);
272         }
273         return;
274 }