]> git.lyx.org Git - lyx.git/blob - src/frontends/xforms/FormTabular.C
Added lyx-func tabular-feature for menu structure.
[lyx.git] / src / frontends / xforms / FormTabular.C
1 /* FormTabular.C
2  * FormTabular Interface Class Implementation
3  */
4
5 #include <config.h>
6 #include "lyx_gui_misc.h"
7 #include "gettext.h"
8 #include FORMS_H_LOCATION
9
10 #include "FormTabular.h"
11 #include "form_tabular.h"
12 #include "xform_macros.h"
13 #include "input_validators.h"
14 #include "LyXView.h"
15 #include "lyxfunc.h"
16 #include "Dialogs.h"
17 #include "lyxrc.h"
18 #include "debug.h"
19 #include "insets/insettabular.h"
20 #include "buffer.h"
21
22
23 #ifdef SIGC_CXX_NAMESPACES
24 using SigC::slot;
25 #endif
26
27 C_RETURNCB(FormTabular,  WMHideCB)
28 C_GENERICCB(FormTabular, CloseCB)
29 C_GENERICCB(FormTabular, InputCB)
30 C_GENERICCB(FormTabular, OKCB)
31 C_GENERICCB(FormTabular, ApplyCB)
32 C_GENERICCB(FormTabular, CancelCB)
33
34
35 FormTabular::FormTabular(LyXView * lv, Dialogs * d)
36         : dialog_(0), tabular_options_(0), column_options_(0),
37           cell_options_(0), longtable_options_(0), create_tabular_(0),
38           lv_(lv), d_(d), u_(0), h_(0), inset_(0), actCell_(-1) 
39 {
40     // let the dialog be shown
41     // This is a permanent connection so we won't bother
42     // storing a copy because we won't be disconnecting.
43     d->showTabular.connect(slot(this, &FormTabular::showInset));
44     d->updateTabular.connect(slot(this, &FormTabular::updateInset));
45     d->hideTabular.connect(slot(this, &FormTabular::hideInset));
46     d->showTabularCreate.connect(slot(this, &FormTabular::show_create));
47 }
48
49
50 FormTabular::~FormTabular()
51 {
52     free();
53 }
54
55
56 void FormTabular::build()
57 {
58     dialog_ = build_tabular();
59     tabular_options_ = build_tabular_options();
60     column_options_ = build_column_options();
61     cell_options_ = build_cell_options();
62     longtable_options_ = build_longtable_options();
63     create_tabular_ = build_create_tabular();
64
65     fl_set_input_return(column_options_->input_column_width,
66                         FL_RETURN_END);
67     fl_set_input_return(column_options_->input_special_alignment,
68                         FL_RETURN_CHANGED);
69     fl_set_input_return(cell_options_->input_mcolumn_width,
70                         FL_RETURN_CHANGED);
71     fl_set_input_return(cell_options_->input_special_multialign,
72                         FL_RETURN_CHANGED);
73
74     fl_addto_tabfolder(dialog_->tabFolder, _("Tabular"),
75                        tabular_options_->form_tabular_options);
76     fl_addto_tabfolder(dialog_->tabFolder, _("Column/Row"),
77                        column_options_->form_column_options);
78     fl_addto_tabfolder(dialog_->tabFolder, _("Cell"),
79                        cell_options_->form_cell_options);
80     fl_addto_tabfolder(dialog_->tabFolder, _("LongTable"),
81                        longtable_options_->form_longtable_options);
82     
83     fl_set_form_atclose(dialog_->form_tabular,
84                         C_FormTabularWMHideCB, 0);
85
86     fl_set_slider_bounds(create_tabular_->slider_rows, 1, 50);
87     fl_set_slider_bounds(create_tabular_->slider_columns, 1, 50);
88     fl_set_slider_value(create_tabular_->slider_rows, 5);
89     fl_set_slider_value(create_tabular_->slider_columns, 5);
90     fl_set_slider_precision(create_tabular_->slider_rows, 0);
91     fl_set_slider_precision(create_tabular_->slider_columns, 0);
92     fl_set_form_atclose(create_tabular_->form_create_tabular, 
93                         C_FormTabularWMHideCB, 0);
94 }
95
96
97 void FormTabular::show()
98 {
99     if (!dialog_) {
100         build();
101     }
102     update();  // make sure its up-to-date
103
104     if (dialog_->form_tabular->visible) {
105         fl_raise_form(dialog_->form_tabular);
106     } else {
107         fl_show_form(dialog_->form_tabular,
108                      FL_PLACE_MOUSE | FL_FREE_SIZE,
109                      FL_TRANSIENT,
110                      _("Tabular Layout"));
111 //      u_ = d_->updateBufferDependent.connect(slot(this,
112 //                                                  &FormTabular::update));
113         h_ = d_->hideBufferDependent.connect(slot(this,
114                                                   &FormTabular::hide));
115     }
116 }
117
118 void FormTabular::showInset(InsetTabular * ti)
119 {
120     inset_ = ti;
121     if (ti) {
122         show();
123     }
124 }
125
126 void FormTabular::hide()
127 {
128     if (dialog_ && dialog_->form_tabular && dialog_->form_tabular->visible) {
129         fl_hide_form(dialog_->form_tabular);
130         u_.disconnect();
131         h_.disconnect();
132         inset_ = 0;
133     }
134 }
135
136
137 void FormTabular::hideInset(InsetTabular * ti)
138 {
139     if (inset_ == ti) {
140         inset_ = 0;
141         hide();
142     }
143 }
144
145
146 void FormTabular::update()
147 {
148     if (dialog_) {
149         local_update(true);
150     }
151 }
152
153 void FormTabular::updateInset(InsetTabular * ti)
154 {
155     inset_ = ti;
156     if (ti && dialog_ && dialog_->form_tabular->visible) {
157         update();
158     }
159 }
160
161
162 void FormTabular::free()
163 {
164     // we don't need to delete u and h here because
165     // hide() does that after disconnecting.
166     if (dialog_) {
167         if (dialog_->form_tabular
168             && dialog_->form_tabular->visible) {
169             hide();
170         }
171         fl_free_form(dialog_->form_tabular);
172         delete dialog_;
173         dialog_ = 0;
174
175         fl_free_form(tabular_options_->form_tabular_options);
176         delete tabular_options_;
177         tabular_options_ = 0;
178
179         fl_free_form(column_options_->form_column_options);
180         delete column_options_;
181         column_options_ = 0;
182
183         fl_free_form(cell_options_->form_cell_options);
184         delete cell_options_;
185         cell_options_ = 0;
186
187         fl_free_form(longtable_options_->form_longtable_options);
188         delete longtable_options_;
189         longtable_options_ = 0;
190
191         hide_create();
192         fl_free_form(create_tabular_->form_create_tabular);
193         delete create_tabular_;
194         create_tabular_ = 0;
195     }
196 }
197
198
199 int FormTabular::WMHideCB(FL_FORM * form, void *)
200 {
201     // Ensure that the signals (u and h) are disconnected even if the
202     // window manager is used to close the dialog.
203     FormTabular * pre = static_cast<FormTabular*>(form->u_vdata);
204     pre->hide();
205     return FL_CANCEL;
206 }
207
208
209 void FormTabular::CloseCB(FL_OBJECT * ob, long)
210 {
211     FormTabular * pre = static_cast<FormTabular*>(ob->form->u_vdata);
212     pre->hide();
213 }
214
215
216 void FormTabular::InputCB(FL_OBJECT * ob, long l)
217 {
218     FormTabular * pre = static_cast<FormTabular*>(ob->form->u_vdata);
219     pre->SetTabularOptions(ob, l);
220 }
221
222
223 bool FormTabular::local_update(bool)
224 {
225     if (!inset_ || !inset_->tabular)
226         return false;
227
228     LyXTabular
229         * tabular = inset_->tabular;
230     int
231         align,
232         cell,
233         column,row;
234     char
235         buf[12];
236     string
237         pwidth, special;
238
239     actCell_ = cell = inset_->GetActCell();
240     column = tabular->column_of_cell(cell)+1;
241     fl_set_object_label(dialog_->text_warning,"");
242     fl_activate_object(column_options_->input_special_alignment);
243     fl_activate_object(cell_options_->input_special_multialign);
244     fl_activate_object(column_options_->input_column_width);
245     sprintf(buf,"%d",column);
246     fl_set_input(dialog_->input_tabular_column, buf);
247     fl_deactivate_object(dialog_->input_tabular_column);
248     row = tabular->row_of_cell(cell)+1;
249     sprintf(buf,"%d",row);
250     fl_set_input(dialog_->input_tabular_row, buf);
251     fl_deactivate_object(dialog_->input_tabular_row);
252     if (tabular->IsMultiColumn(cell)) {
253         fl_set_button(cell_options_->radio_multicolumn, 1);
254         fl_set_button(cell_options_->radio_border_top,
255                       tabular->TopLine(cell)?1:0);
256         fl_activate_object(cell_options_->radio_border_top);
257         fl_set_object_lcol(cell_options_->radio_border_top, FL_BLACK);
258         fl_set_button(cell_options_->radio_border_bottom,
259                       tabular->BottomLine(cell)?1:0);
260         fl_activate_object(cell_options_->radio_border_bottom);
261         fl_set_object_lcol(cell_options_->radio_border_bottom, FL_BLACK);
262         fl_set_button(cell_options_->radio_border_left,
263                       tabular->LeftLine(cell)?1:0);
264         fl_activate_object(cell_options_->radio_border_left);
265         fl_set_object_lcol(cell_options_->radio_border_left, FL_BLACK);
266         fl_set_button(cell_options_->radio_border_right,
267                       tabular->RightLine(cell)?1:0);
268         fl_activate_object(cell_options_->radio_border_right);
269         fl_set_object_lcol(cell_options_->radio_border_right, FL_BLACK);
270         pwidth = tabular->GetMColumnPWidth(cell);
271         align = tabular->GetAlignment(cell);
272         if (!pwidth.empty() || (align == LYX_ALIGN_LEFT))
273             fl_set_button(cell_options_->radio_align_left, 1);
274         else if (align == LYX_ALIGN_RIGHT)
275             fl_set_button(cell_options_->radio_align_right, 1);
276         else
277             fl_set_button(cell_options_->radio_align_center, 1);
278         fl_activate_object(cell_options_->radio_align_left);
279         fl_set_object_lcol(cell_options_->radio_align_left, FL_BLACK);
280         fl_activate_object(cell_options_->radio_align_right);
281         fl_set_object_lcol(cell_options_->radio_align_right, FL_BLACK);
282         fl_activate_object(cell_options_->radio_align_center);
283         fl_set_object_lcol(cell_options_->radio_align_center, FL_BLACK);
284         align = tabular->GetVAlignment(cell);
285         fl_set_button(cell_options_->radio_valign_top, 0);
286         fl_set_button(cell_options_->radio_valign_bottom, 0);
287         fl_set_button(cell_options_->radio_valign_center, 0);
288         if (pwidth.empty() || (align == LyXTabular::LYX_VALIGN_CENTER))
289             fl_set_button(cell_options_->radio_valign_center, 1);
290         else if (align == LyXTabular::LYX_VALIGN_BOTTOM)
291             fl_set_button(cell_options_->radio_valign_bottom, 1);
292         else
293             fl_set_button(cell_options_->radio_valign_top, 1);
294         fl_activate_object(cell_options_->radio_valign_top);
295         fl_set_object_lcol(cell_options_->radio_valign_top, FL_BLACK);
296         fl_activate_object(cell_options_->radio_valign_bottom);
297         fl_set_object_lcol(cell_options_->radio_valign_bottom, FL_BLACK);
298         fl_activate_object(cell_options_->radio_valign_center);
299         fl_set_object_lcol(cell_options_->radio_valign_center, FL_BLACK);
300         special = tabular->GetAlignSpecial(cell,LyXTabular::SET_SPECIAL_MULTI);
301         fl_set_input(cell_options_->input_special_multialign, special.c_str());
302         fl_set_input(cell_options_->input_mcolumn_width,pwidth.c_str());
303         if (!lv_->buffer()->isReadonly()) {
304             fl_activate_object(cell_options_->input_special_multialign);
305             fl_set_object_lcol(cell_options_->input_special_multialign,
306                                FL_BLACK);
307             fl_activate_object(cell_options_->input_mcolumn_width);
308             fl_set_object_lcol(cell_options_->input_mcolumn_width, FL_BLACK);
309         }
310         if (!pwidth.empty()) {
311             fl_deactivate_object(cell_options_->radio_align_left);
312             fl_deactivate_object(cell_options_->radio_align_right);
313             fl_deactivate_object(cell_options_->radio_align_center);
314             fl_set_object_lcol(cell_options_->radio_align_left, FL_INACTIVE);
315             fl_set_object_lcol(cell_options_->radio_align_right, FL_INACTIVE);
316             fl_set_object_lcol(cell_options_->radio_align_center, FL_INACTIVE);
317             fl_activate_object(cell_options_->radio_valign_top);
318             fl_activate_object(cell_options_->radio_valign_bottom);
319             fl_activate_object(cell_options_->radio_valign_center);
320             fl_set_object_lcol(cell_options_->radio_valign_top, FL_BLACK);
321             fl_set_object_lcol(cell_options_->radio_valign_bottom, FL_BLACK);
322             fl_set_object_lcol(cell_options_->radio_valign_center, FL_BLACK);
323         } else {
324             fl_activate_object(cell_options_->radio_align_left);
325             fl_activate_object(cell_options_->radio_align_right);
326             fl_activate_object(cell_options_->radio_align_center);
327             fl_set_object_lcol(cell_options_->radio_align_left, FL_BLACK);
328             fl_set_object_lcol(cell_options_->radio_align_right, FL_BLACK);
329             fl_set_object_lcol(cell_options_->radio_align_center, FL_BLACK);
330             fl_deactivate_object(cell_options_->radio_valign_top);
331             fl_deactivate_object(cell_options_->radio_valign_bottom);
332             fl_deactivate_object(cell_options_->radio_valign_center);
333             fl_set_object_lcol(cell_options_->radio_valign_top, FL_INACTIVE);
334             fl_set_object_lcol(cell_options_->radio_valign_bottom,FL_INACTIVE);
335             fl_set_object_lcol(cell_options_->radio_valign_center,FL_INACTIVE);
336         }
337     } else {
338         fl_set_button(cell_options_->radio_multicolumn, 0);
339         fl_set_button(cell_options_->radio_border_top, 0);
340         fl_deactivate_object(cell_options_->radio_border_top);
341         fl_set_object_lcol(cell_options_->radio_border_top, FL_INACTIVE);
342         fl_set_button(cell_options_->radio_border_bottom, 0);
343         fl_deactivate_object(cell_options_->radio_border_bottom);
344         fl_set_object_lcol(cell_options_->radio_border_bottom, FL_INACTIVE);
345         fl_set_button(cell_options_->radio_border_left, 0);
346         fl_deactivate_object(cell_options_->radio_border_left);
347         fl_set_object_lcol(cell_options_->radio_border_left, FL_INACTIVE);
348         fl_set_button(cell_options_->radio_border_right, 0);
349         fl_deactivate_object(cell_options_->radio_border_right);
350         fl_set_object_lcol(cell_options_->radio_border_right, FL_INACTIVE);
351         fl_set_button(cell_options_->radio_align_left, 0);
352         fl_deactivate_object(cell_options_->radio_align_left);
353         fl_set_object_lcol(cell_options_->radio_align_left, FL_INACTIVE);
354         fl_set_button(cell_options_->radio_align_right, 0);
355         fl_deactivate_object(cell_options_->radio_align_right);
356         fl_set_object_lcol(cell_options_->radio_align_right, FL_INACTIVE);
357         fl_set_button(cell_options_->radio_align_center, 0);
358         fl_deactivate_object(cell_options_->radio_align_center);
359         fl_set_object_lcol(cell_options_->radio_align_center, FL_INACTIVE);
360         fl_set_button(cell_options_->radio_valign_top, 0);
361         fl_deactivate_object(cell_options_->radio_valign_top);
362         fl_set_object_lcol(cell_options_->radio_valign_top, FL_INACTIVE);
363         fl_set_button(cell_options_->radio_valign_bottom, 0);
364         fl_deactivate_object(cell_options_->radio_valign_bottom);
365         fl_set_object_lcol(cell_options_->radio_valign_bottom, FL_INACTIVE);
366         fl_set_button(cell_options_->radio_valign_center, 0);
367         fl_deactivate_object(cell_options_->radio_valign_center);
368         fl_set_object_lcol(cell_options_->radio_valign_center, FL_INACTIVE);
369         fl_set_input(cell_options_->input_special_multialign, "");
370         fl_deactivate_object(cell_options_->input_special_multialign);
371         fl_set_object_lcol(cell_options_->input_special_multialign, FL_INACTIVE);
372         fl_set_input(cell_options_->input_mcolumn_width,"");
373         fl_deactivate_object(cell_options_->input_mcolumn_width);
374         fl_set_object_lcol(cell_options_->input_mcolumn_width, FL_INACTIVE);
375     }
376     if (tabular->GetRotateCell(cell))
377         fl_set_button(cell_options_->radio_rotate_cell, 1);
378     else
379         fl_set_button(cell_options_->radio_rotate_cell, 0);
380     if (tabular->TopLine(cell, true))
381         fl_set_button(column_options_->radio_border_top, 1);
382     else
383         fl_set_button(column_options_->radio_border_top, 0);
384     if (tabular->BottomLine(cell, true))
385         fl_set_button(column_options_->radio_border_bottom, 1);
386     else
387         fl_set_button(column_options_->radio_border_bottom, 0);
388     if (tabular->LeftLine(cell, true))
389         fl_set_button(column_options_->radio_border_left, 1);
390     else
391         fl_set_button(column_options_->radio_border_left, 0);
392     if (tabular->RightLine(cell, true))
393         fl_set_button(column_options_->radio_border_right, 1);
394     else
395         fl_set_button(column_options_->radio_border_right, 0);
396     special = tabular->GetAlignSpecial(cell,LyXTabular::SET_SPECIAL_COLUMN);
397     fl_set_input(column_options_->input_special_alignment, special.c_str());
398     if (lv_->buffer()->isReadonly()) 
399         fl_deactivate_object(column_options_->input_special_alignment);
400     else
401         fl_activate_object(column_options_->input_special_alignment);
402     pwidth = tabular->GetColumnPWidth(cell);
403     fl_set_input(column_options_->input_column_width,pwidth.c_str());
404     if (lv_->buffer()->isReadonly()) {
405         fl_deactivate_object(column_options_->input_column_width);
406     } else {
407         fl_activate_object(column_options_->input_column_width);
408     }
409     if (!pwidth.empty()) {
410         fl_activate_object(cell_options_->radio_linebreak_cell);
411         fl_set_object_lcol(cell_options_->radio_linebreak_cell, FL_BLACK);
412         fl_set_button(cell_options_->radio_linebreak_cell,
413                       tabular->GetLinebreaks(cell));
414     } else {
415         fl_deactivate_object(cell_options_->radio_linebreak_cell);
416         fl_set_object_lcol(cell_options_->radio_linebreak_cell, FL_INACTIVE);
417         fl_set_button(cell_options_->radio_linebreak_cell,0);
418     }
419     align = tabular->GetAlignment(cell, true);
420     fl_set_button(column_options_->radio_align_left, 0);
421     fl_set_button(column_options_->radio_align_right, 0);
422     fl_set_button(column_options_->radio_align_center, 0);
423     if (!pwidth.empty() || (align == LYX_ALIGN_LEFT))
424         fl_set_button(column_options_->radio_align_left, 1);
425     else if (align == LYX_ALIGN_RIGHT)
426         fl_set_button(column_options_->radio_align_right, 1);
427     else
428         fl_set_button(column_options_->radio_align_center, 1);
429     align = tabular->GetVAlignment(cell, true);
430     fl_set_button(column_options_->radio_valign_top, 0);
431     fl_set_button(column_options_->radio_valign_bottom, 0);
432     fl_set_button(column_options_->radio_valign_center, 0);
433     if (pwidth.empty() || (align == LyXTabular::LYX_VALIGN_CENTER))
434         fl_set_button(column_options_->radio_valign_center, 1);
435     else if (align == LyXTabular::LYX_VALIGN_BOTTOM)
436         fl_set_button(column_options_->radio_valign_bottom, 1);
437     else
438         fl_set_button(column_options_->radio_valign_top, 1);
439     if (!pwidth.empty()) {
440         fl_deactivate_object(column_options_->radio_align_left);
441         fl_deactivate_object(column_options_->radio_align_right);
442         fl_deactivate_object(column_options_->radio_align_center);
443         fl_set_object_lcol(column_options_->radio_align_left, FL_INACTIVE);
444         fl_set_object_lcol(column_options_->radio_align_right, FL_INACTIVE);
445         fl_set_object_lcol(column_options_->radio_align_center, FL_INACTIVE);
446         fl_activate_object(column_options_->radio_valign_top);
447         fl_activate_object(column_options_->radio_valign_bottom);
448         fl_activate_object(column_options_->radio_valign_center);
449         fl_set_object_lcol(column_options_->radio_valign_top, FL_BLACK);
450         fl_set_object_lcol(column_options_->radio_valign_bottom, FL_BLACK);
451         fl_set_object_lcol(column_options_->radio_valign_center, FL_BLACK);
452     } else {
453         fl_activate_object(column_options_->radio_align_left);
454         fl_activate_object(column_options_->radio_align_right);
455         fl_activate_object(column_options_->radio_align_center);
456         fl_set_object_lcol(column_options_->radio_align_left, FL_BLACK);
457         fl_set_object_lcol(column_options_->radio_align_right, FL_BLACK);
458         fl_set_object_lcol(column_options_->radio_align_center, FL_BLACK);
459         fl_deactivate_object(column_options_->radio_valign_top);
460         fl_deactivate_object(column_options_->radio_valign_bottom);
461         fl_deactivate_object(column_options_->radio_valign_center);
462         fl_set_object_lcol(column_options_->radio_valign_top, FL_INACTIVE);
463         fl_set_object_lcol(column_options_->radio_valign_bottom, FL_INACTIVE);
464         fl_set_object_lcol(column_options_->radio_valign_center, FL_INACTIVE);
465     }
466     fl_set_button(tabular_options_->radio_longtable,
467                   tabular->IsLongTabular());
468     if (tabular->IsLongTabular()) {
469         fl_activate_object(longtable_options_->radio_lt_firsthead);
470         fl_activate_object(longtable_options_->radio_lt_head);
471         fl_activate_object(longtable_options_->radio_lt_foot);
472         fl_activate_object(longtable_options_->radio_lt_lastfoot);
473         fl_activate_object(longtable_options_->radio_lt_newpage);
474         fl_set_object_lcol(longtable_options_->radio_lt_firsthead, FL_BLACK);
475         fl_set_object_lcol(longtable_options_->radio_lt_head, FL_BLACK);
476         fl_set_object_lcol(longtable_options_->radio_lt_foot, FL_BLACK);
477         fl_set_object_lcol(longtable_options_->radio_lt_lastfoot, FL_BLACK);
478         fl_set_object_lcol(longtable_options_->radio_lt_newpage, FL_BLACK);
479         int dummy;
480         fl_set_button(longtable_options_->radio_lt_firsthead,
481                       tabular->GetRowOfLTFirstHead(cell, dummy));
482         fl_set_button(longtable_options_->radio_lt_head,
483                       tabular->GetRowOfLTHead(cell, dummy));
484         fl_set_button(longtable_options_->radio_lt_foot,
485                       tabular->GetRowOfLTFoot(cell, dummy));
486         fl_set_button(longtable_options_->radio_lt_lastfoot,
487                       tabular->GetRowOfLTLastFoot(cell, dummy));
488         fl_set_button(longtable_options_->radio_lt_newpage,
489                       tabular->GetLTNewPage(cell));
490     } else {
491         fl_deactivate_object(longtable_options_->radio_lt_firsthead);
492         fl_deactivate_object(longtable_options_->radio_lt_head);
493         fl_deactivate_object(longtable_options_->radio_lt_foot);
494         fl_deactivate_object(longtable_options_->radio_lt_lastfoot);
495         fl_deactivate_object(longtable_options_->radio_lt_newpage);
496         fl_set_button(longtable_options_->radio_lt_firsthead,0);
497         fl_set_button(longtable_options_->radio_lt_head,0);
498         fl_set_button(longtable_options_->radio_lt_foot,0);
499         fl_set_button(longtable_options_->radio_lt_lastfoot,0);
500         fl_set_button(longtable_options_->radio_lt_newpage,0);
501         fl_set_object_lcol(longtable_options_->radio_lt_firsthead,FL_INACTIVE);
502         fl_set_object_lcol(longtable_options_->radio_lt_head, FL_INACTIVE);
503         fl_set_object_lcol(longtable_options_->radio_lt_foot, FL_INACTIVE);
504         fl_set_object_lcol(longtable_options_->radio_lt_lastfoot, FL_INACTIVE);
505         fl_set_object_lcol(longtable_options_->radio_lt_newpage, FL_INACTIVE);
506     }
507     fl_set_button(tabular_options_->radio_rotate_tabular,
508                   tabular->GetRotateTabular());
509     return true;
510 }
511
512 void FormTabular::SetTabularOptions(FL_OBJECT * ob, long)
513 {
514     if (!inset_)
515         return;
516
517     LyXTabular
518         * tabular = inset_->tabular;
519     int
520         cell,
521         s,
522         num = 0;
523     string
524         special,
525         str;
526
527     cell = inset_->GetActCell();
528     if (actCell_ != cell) {
529         local_update(false);
530         fl_set_object_label(dialog_->text_warning,
531                      _("Warning: Wrong Cursor position, updated window"));
532         fl_show_object(dialog_->text_warning);
533         return;
534     }
535     // No point in processing directives that you can't do anything with
536     // anyhow, so exit now if the buffer is read-only.
537     if (lv_->buffer()->isReadonly()) {
538       local_update(false);
539       return;
540     }
541     if (ob == column_options_->input_column_width) {
542         string
543             str;
544         str = fl_get_input(ob);
545         if (!str.empty() && !isValidLength(str)) {
546             fl_set_object_label(dialog_->text_warning,
547                  _("Warning: Invalid Length (valid example: 10mm)"));
548             fl_show_object(dialog_->text_warning);
549             return;
550         }
551         inset_->TabularFeatures(lv_->view(), LyXTabular::SET_PWIDTH,str);
552         local_update(false); // update for alignment
553         return;
554     }
555     if (ob == cell_options_->input_mcolumn_width) {
556         string
557             str;
558         str = fl_get_input(ob);
559         if (!str.empty() && !isValidLength(str)) {
560             fl_set_object_label(dialog_->text_warning,
561                  _("Warning: Invalid Length (valid example: 10mm)"));
562             fl_show_object(dialog_->text_warning);
563             return;
564         }
565         inset_->TabularFeatures(lv_->view(), LyXTabular::SET_MPWIDTH,str);
566         local_update(false); // update for alignment
567         return;
568     }
569     str = fl_get_input(column_options_->input_column_width);
570     if (!str.empty() && !isValidLength(str)) {
571         fl_set_object_label(
572             dialog_->text_warning,
573             _("Warning: Invalid Length (valid example: 10mm)"));
574         fl_show_object(dialog_->text_warning);
575         return;
576     }
577     if (ob == tabular_options_->button_append_row)
578         num = LyXTabular::APPEND_ROW;
579     else if (ob == tabular_options_->button_append_column)
580         num = LyXTabular::APPEND_COLUMN;
581     else if (ob == tabular_options_->button_delete_row)
582         num = LyXTabular::DELETE_ROW;
583     else if (ob == tabular_options_->button_delete_column)
584         num = LyXTabular::DELETE_COLUMN;
585     else if (ob == tabular_options_->button_set_borders)
586         num = LyXTabular::SET_ALL_LINES;
587     else if (ob == tabular_options_->button_unset_borders)
588         num = LyXTabular::UNSET_ALL_LINES;
589     else if (ob == column_options_->radio_border_top)
590         num = LyXTabular::TOGGLE_LINE_TOP;
591     else if (ob == column_options_->radio_border_bottom)
592         num = LyXTabular::TOGGLE_LINE_BOTTOM;
593     else if (ob == column_options_->radio_border_left)
594         num = LyXTabular::TOGGLE_LINE_LEFT;
595     else if (ob == column_options_->radio_border_right)
596         num = LyXTabular::TOGGLE_LINE_RIGHT;
597     else if (ob == column_options_->radio_align_left)
598         num = LyXTabular::ALIGN_LEFT;
599     else if (ob == column_options_->radio_align_right)
600         num = LyXTabular::ALIGN_RIGHT;
601     else if (ob == column_options_->radio_align_center)
602         num = LyXTabular::ALIGN_CENTER;
603     else if (ob == column_options_->radio_valign_top)
604         num = LyXTabular::VALIGN_TOP;
605     else if (ob == column_options_->radio_valign_bottom)
606         num = LyXTabular::VALIGN_BOTTOM;
607     else if (ob == column_options_->radio_valign_center)
608         num = LyXTabular::VALIGN_CENTER;
609     else if (ob == cell_options_->radio_multicolumn)
610         num = LyXTabular::MULTICOLUMN;
611     else if (ob == tabular_options_->radio_longtable) {
612         s=fl_get_button(tabular_options_->radio_longtable);
613         if (s) {
614             num = LyXTabular::SET_LONGTABULAR;
615             fl_activate_object(longtable_options_->radio_lt_firsthead);
616             fl_activate_object(longtable_options_->radio_lt_head);
617             fl_activate_object(longtable_options_->radio_lt_foot);
618             fl_activate_object(longtable_options_->radio_lt_lastfoot);
619             fl_activate_object(longtable_options_->radio_lt_newpage);
620             int dummy;
621             fl_set_button(longtable_options_->radio_lt_firsthead,
622                           tabular->GetRowOfLTFirstHead(cell, dummy));
623             fl_set_button(longtable_options_->radio_lt_head,
624                           tabular->GetRowOfLTHead(cell, dummy));
625             fl_set_button(longtable_options_->radio_lt_foot,
626                           tabular->GetRowOfLTFoot(cell, dummy));
627             fl_set_button(longtable_options_->radio_lt_lastfoot,
628                           tabular->GetRowOfLTLastFoot(cell, dummy));
629             fl_set_button(longtable_options_->radio_lt_firsthead,
630                           tabular->GetLTNewPage(cell));
631         } else {
632             num = LyXTabular::UNSET_LONGTABULAR;
633             fl_deactivate_object(longtable_options_->radio_lt_firsthead);
634             fl_deactivate_object(longtable_options_->radio_lt_head);
635             fl_deactivate_object(longtable_options_->radio_lt_foot);
636             fl_deactivate_object(longtable_options_->radio_lt_lastfoot);
637             fl_deactivate_object(longtable_options_->radio_lt_newpage);
638             fl_set_button(longtable_options_->radio_lt_firsthead,0);
639             fl_set_button(longtable_options_->radio_lt_head,0);
640             fl_set_button(longtable_options_->radio_lt_foot,0);
641             fl_set_button(longtable_options_->radio_lt_lastfoot,0);
642             fl_set_button(longtable_options_->radio_lt_newpage,0);
643             fl_set_object_lcol(longtable_options_->radio_lt_firsthead,
644                                FL_INACTIVE);
645             fl_set_object_lcol(longtable_options_->radio_lt_head, FL_INACTIVE);
646             fl_set_object_lcol(longtable_options_->radio_lt_foot, FL_INACTIVE);
647             fl_set_object_lcol(longtable_options_->radio_lt_lastfoot,
648                                FL_INACTIVE);
649             fl_set_object_lcol(longtable_options_->radio_lt_newpage,
650                                FL_INACTIVE);
651         }
652     } else if (ob == tabular_options_->radio_rotate_tabular) {
653         s=fl_get_button(tabular_options_->radio_rotate_tabular);
654         if (s)
655             num = LyXTabular::SET_ROTATE_TABULAR;
656         else
657             num = LyXTabular::UNSET_ROTATE_TABULAR;
658     } else if (ob == cell_options_->radio_rotate_cell) {
659         s=fl_get_button(cell_options_->radio_rotate_cell);
660         if (s)
661             num = LyXTabular::SET_ROTATE_CELL;
662         else
663             num = LyXTabular::UNSET_ROTATE_CELL;
664     } else if (ob == cell_options_->radio_linebreak_cell) {
665         num = LyXTabular::SET_LINEBREAKS;
666     } else if (ob == longtable_options_->radio_lt_firsthead) {
667         num = LyXTabular::SET_LTFIRSTHEAD;
668     } else if (ob == longtable_options_->radio_lt_head) {
669         num = LyXTabular::SET_LTHEAD;
670     } else if (ob == longtable_options_->radio_lt_foot) {
671         num = LyXTabular::SET_LTFOOT;
672     } else if (ob == longtable_options_->radio_lt_lastfoot) {
673         num = LyXTabular::SET_LTLASTFOOT;
674     } else if (ob == longtable_options_->radio_lt_newpage) {
675         num = LyXTabular::SET_LTNEWPAGE;
676     } else if (ob == column_options_->input_special_alignment) {
677         special = fl_get_input(column_options_->input_special_alignment);
678         num = LyXTabular::SET_SPECIAL_COLUMN;
679     } else if (ob == cell_options_->input_special_multialign) {
680         special = fl_get_input(cell_options_->input_special_multialign);
681         num = LyXTabular::SET_SPECIAL_MULTI;
682     } else if (ob == cell_options_->radio_border_top)
683         num = LyXTabular::M_TOGGLE_LINE_TOP;
684     else if (ob == cell_options_->radio_border_bottom)
685         num = LyXTabular::M_TOGGLE_LINE_BOTTOM;
686     else if (ob == cell_options_->radio_border_left)
687         num = LyXTabular::M_TOGGLE_LINE_LEFT;
688     else if (ob == cell_options_->radio_border_right)
689         num = LyXTabular::M_TOGGLE_LINE_RIGHT;
690     else if (ob == cell_options_->radio_align_left)
691         num = LyXTabular::M_ALIGN_LEFT;
692     else if (ob == cell_options_->radio_align_right)
693         num = LyXTabular::M_ALIGN_RIGHT;
694     else if (ob == cell_options_->radio_align_center)
695         num = LyXTabular::M_ALIGN_CENTER;
696     else if (ob == cell_options_->radio_valign_top)
697         num = LyXTabular::M_VALIGN_TOP;
698     else if (ob == cell_options_->radio_valign_bottom)
699         num = LyXTabular::M_VALIGN_BOTTOM;
700     else if (ob == cell_options_->radio_valign_center)
701         num = LyXTabular::M_VALIGN_CENTER;
702     else
703         return;
704     
705     inset_->TabularFeatures(lv_->view(), num, special);
706     local_update(false);
707 }
708
709 // +-----------------------------------------------------------------------+
710 // |          Functions/Dialogs for creating tabular insets                |
711 // +-----------------------------------------------------------------------+
712
713 void FormTabular::show_create()
714 {
715     if (!dialog_) {
716         build();
717     }
718     if (create_tabular_->form_create_tabular->visible) {
719         fl_raise_form(create_tabular_->form_create_tabular);
720     } else {
721         fl_show_form(create_tabular_->form_create_tabular,
722                      FL_PLACE_MOUSE | FL_FREE_SIZE,
723                      FL_FULLBORDER, _("Insert Tabular"));
724     }
725 }
726
727
728 void FormTabular::hide_create()
729 {
730     if (create_tabular_->form_create_tabular &&
731         create_tabular_->form_create_tabular->visible)
732         fl_hide_form(create_tabular_->form_create_tabular);
733 }
734
735
736 void FormTabular::apply_create()
737 {
738     int
739         xsize,ysize;
740
741 //    comm->setMinibuffer(_("Inserting tabular inset..."));
742     ysize = int(fl_get_slider_value(create_tabular_->slider_columns) + 0.5);
743     xsize = int(fl_get_slider_value(create_tabular_->slider_rows) + 0.5);
744     InsetTabular * in = new InsetTabular(lv_->buffer(),xsize,ysize);
745     if (!lv_->view()->open_new_inset(in)) {
746         delete in;
747     }
748 //    comm->setMinibuffer(_("Tabular mode"));
749 }
750
751
752 void FormTabular::OKCB(FL_OBJECT * ob, long)
753 {
754     FormTabular * pre = (FormTabular*)ob->form->u_vdata;
755     pre->apply_create();
756     pre->hide_create();
757 }
758
759
760 void FormTabular::ApplyCB(FL_OBJECT * ob, long)
761 {
762     FormTabular * pre = (FormTabular*)ob->form->u_vdata;
763     pre->apply_create();
764 }
765
766
767 void FormTabular::CancelCB(FL_OBJECT * ob, long)
768 {
769     FormTabular * pre = (FormTabular*)ob->form->u_vdata;
770     pre->hide_create();
771 }
772
773