4 #include "definitions.h"
5 #include FORMS_H_LOCATION
6 #include "layout_forms.h"
10 #include "support/filetools.h"
13 #include "lyx_gui_misc.h"
14 #include "BufferView.h"
15 #include "lyxscreen.h"
19 extern void BeforeChange();
22 extern FD_form_table_options *fd_form_table_options;
23 extern FD_form_table_extra *fd_form_table_extra;
24 extern BufferView *current_view;
29 // hack to keep the cursor from jumping to the end of the text in the Extra
30 // form input fields during editing. The values in LyXTable itself is changed in
31 // real-time, but we have no callbacks for the input fields, so I simply
32 // store and restore the cursor position for now. (too much of a hazzle to
33 // do it proper; we'll trash all this code in 1.1 anyway)
35 extra_col_cursor_x, // need no y's, one-line input fields
36 extra_multicol_cursor_x;
39 bool UpdateLayoutTable(int flag)
42 if (!current_view->getScreen() || !current_view->available())
45 if (update && current_view->currentBuffer()->text->cursor.par->table) {
55 LyXTable *table = current_view->currentBuffer()->text->cursor.par->table;
57 cell = current_view->currentBuffer()->text->
58 NumberOfCell(current_view->currentBuffer()->text->cursor.par,
59 current_view->currentBuffer()->text->cursor.pos);
61 column = table->column_of_cell(cell)+1;
62 fl_set_object_label(fd_form_table_options->text_warning,"");
64 fl_activate_object(fd_form_table_extra->input_special_alignment);
65 fl_activate_object(fd_form_table_extra->input_special_multialign);
66 fl_activate_object(fd_form_table_options->input_column_width);
67 sprintf(buf,"%d",column);
68 fl_set_input(fd_form_table_options->input_table_column, buf);
69 fl_deactivate_object(fd_form_table_options->input_table_column);
70 row = table->row_of_cell(cell)+1;
71 sprintf(buf,"%d",row);
72 fl_set_input(fd_form_table_options->input_table_row, buf);
73 fl_deactivate_object(fd_form_table_options->input_table_row);
74 if (table->IsMultiColumn(cell))
75 fl_set_button(fd_form_table_options->radio_multicolumn, 1);
77 fl_set_button(fd_form_table_options->radio_multicolumn, 0);
78 if (table->RotateCell(cell))
79 fl_set_button(fd_form_table_options->radio_rotate_cell, 1);
81 fl_set_button(fd_form_table_options->radio_rotate_cell, 0);
82 if (table->TopLine(cell))
83 fl_set_button(fd_form_table_options->radio_border_top, 1);
85 fl_set_button(fd_form_table_options->radio_border_top, 0);
86 if (table->BottomLine(cell))
87 fl_set_button(fd_form_table_options->radio_border_bottom, 1);
89 fl_set_button(fd_form_table_options->radio_border_bottom, 0);
90 if (table->LeftLine(cell))
91 fl_set_button(fd_form_table_options->radio_border_left, 1);
93 fl_set_button(fd_form_table_options->radio_border_left, 0);
94 if (table->RightLine(cell))
95 fl_set_button(fd_form_table_options->radio_border_right, 1);
97 fl_set_button(fd_form_table_options->radio_border_right, 0);
98 align = table->GetAlignment(cell);
99 fl_set_button(fd_form_table_options->radio_align_left, 0);
100 fl_set_button(fd_form_table_options->radio_align_right, 0);
101 fl_set_button(fd_form_table_options->radio_align_center, 0);
102 special = table->GetAlignSpecial(cell,LyXTable::SET_SPECIAL_COLUMN);
105 fl_set_input(fd_form_table_extra->input_special_alignment,
107 fl_set_input_cursorpos(fd_form_table_extra->input_special_alignment,
108 extra_col_cursor_x, 0); // restore the cursor
110 if (current_view->currentBuffer()->isReadonly())
111 fl_deactivate_object(fd_form_table_extra->input_special_alignment);
112 special = table->GetAlignSpecial(cell,LyXTable::SET_SPECIAL_MULTI);
115 fl_set_input(fd_form_table_extra->input_special_multialign,
117 fl_set_input_cursorpos(fd_form_table_extra->input_special_multialign,
118 extra_multicol_cursor_x, 0); // restore the cursor
120 if (current_view->currentBuffer()->isReadonly())
121 fl_deactivate_object(fd_form_table_extra->input_special_multialign);
122 pwidth = table->GetPWidth(cell);
124 fl_set_input(fd_form_table_options->input_column_width,pwidth.c_str());
125 if (current_view->currentBuffer()->isReadonly())
126 fl_deactivate_object(fd_form_table_options->input_column_width);
127 if (!pwidth.empty()) {
128 fl_activate_object(fd_form_table_options->radio_linebreak_cell);
129 fl_set_object_lcol(fd_form_table_options->radio_linebreak_cell,
131 fl_set_button(fd_form_table_options->radio_linebreak_cell,
132 table->Linebreaks(table->FirstVirtualCell(cell)));
134 fl_deactivate_object(fd_form_table_options->radio_linebreak_cell);
135 fl_set_object_lcol(fd_form_table_options->radio_linebreak_cell,
137 fl_set_button(fd_form_table_options->radio_linebreak_cell,0);
139 if ((!pwidth.empty() && !table->IsMultiColumn(cell)) ||
140 (align == LYX_ALIGN_LEFT))
141 fl_set_button(fd_form_table_options->radio_align_left, 1);
142 else if (align == LYX_ALIGN_RIGHT)
143 fl_set_button(fd_form_table_options->radio_align_right, 1);
145 fl_set_button(fd_form_table_options->radio_align_center, 1);
146 if (!pwidth.empty() && !table->IsMultiColumn(cell)) {
147 fl_deactivate_object(fd_form_table_options->radio_align_left);
148 fl_deactivate_object(fd_form_table_options->radio_align_right);
149 fl_deactivate_object(fd_form_table_options->radio_align_center);
150 fl_set_object_lcol(fd_form_table_options->radio_align_left,
152 fl_set_object_lcol(fd_form_table_options->radio_align_right,
154 fl_set_object_lcol(fd_form_table_options->radio_align_center,
157 fl_activate_object(fd_form_table_options->radio_align_left);
158 fl_activate_object(fd_form_table_options->radio_align_right);
159 fl_activate_object(fd_form_table_options->radio_align_center);
160 fl_set_object_lcol(fd_form_table_options->radio_align_left,
162 fl_set_object_lcol(fd_form_table_options->radio_align_right,
164 fl_set_object_lcol(fd_form_table_options->radio_align_center,
167 fl_set_button(fd_form_table_options->radio_longtable,table->IsLongTable());
168 if (table->IsLongTable()) {
169 fl_activate_object(fd_form_table_options->radio_lt_firsthead);
170 fl_activate_object(fd_form_table_options->radio_lt_head);
171 fl_activate_object(fd_form_table_options->radio_lt_foot);
172 fl_activate_object(fd_form_table_options->radio_lt_lastfoot);
173 fl_activate_object(fd_form_table_options->radio_lt_newpage);
174 fl_set_object_lcol(fd_form_table_options->radio_lt_firsthead,
176 fl_set_object_lcol(fd_form_table_options->radio_lt_head,
178 fl_set_object_lcol(fd_form_table_options->radio_lt_foot,
180 fl_set_object_lcol(fd_form_table_options->radio_lt_lastfoot,
182 fl_set_object_lcol(fd_form_table_options->radio_lt_newpage,
184 fl_set_button(fd_form_table_options->radio_lt_firsthead,
185 table->RowOfLTFirstHead(cell));
186 fl_set_button(fd_form_table_options->radio_lt_head,
187 table->RowOfLTHead(cell));
188 fl_set_button(fd_form_table_options->radio_lt_foot,
189 table->RowOfLTFoot(cell));
190 fl_set_button(fd_form_table_options->radio_lt_lastfoot,
191 table->RowOfLTLastFoot(cell));
192 fl_set_button(fd_form_table_options->radio_lt_newpage,
193 table->LTNewPage(cell));
195 fl_deactivate_object(fd_form_table_options->radio_lt_firsthead);
196 fl_deactivate_object(fd_form_table_options->radio_lt_head);
197 fl_deactivate_object(fd_form_table_options->radio_lt_foot);
198 fl_deactivate_object(fd_form_table_options->radio_lt_lastfoot);
199 fl_deactivate_object(fd_form_table_options->radio_lt_newpage);
200 fl_set_button(fd_form_table_options->radio_lt_firsthead,0);
201 fl_set_button(fd_form_table_options->radio_lt_head,0);
202 fl_set_button(fd_form_table_options->radio_lt_foot,0);
203 fl_set_button(fd_form_table_options->radio_lt_lastfoot,0);
204 fl_set_button(fd_form_table_options->radio_lt_newpage,0);
205 fl_set_object_lcol(fd_form_table_options->radio_lt_firsthead,
207 fl_set_object_lcol(fd_form_table_options->radio_lt_head,
209 fl_set_object_lcol(fd_form_table_options->radio_lt_foot,
211 fl_set_object_lcol(fd_form_table_options->radio_lt_lastfoot,
213 fl_set_object_lcol(fd_form_table_options->radio_lt_newpage,
216 fl_set_button(fd_form_table_options->radio_rotate_table,
217 table->RotateTable());
218 fl_set_focus_object(fd_form_table_options->form_table_options,
219 fd_form_table_options->button_table_delete);
220 } else if (fd_form_table_options->form_table_options->visible) {
221 fl_set_focus_object(fd_form_table_options->form_table_options,
222 fd_form_table_options->button_table_delete);
223 fl_hide_form(fd_form_table_options->form_table_options);
228 void OpenLayoutTableExtra()
230 static int ow = -1, oh;
232 if (fd_form_table_extra->form_table_extra->visible) {
233 fl_raise_form(fd_form_table_extra->form_table_extra);
235 fl_show_form(fd_form_table_extra->form_table_extra,
236 FL_PLACE_MOUSE | FL_FREE_SIZE,FL_FULLBORDER,
237 _("Table Extra Form"));
239 ow = fd_form_table_extra->form_table_extra->w;
240 oh = fd_form_table_extra->form_table_extra->h;
242 fl_set_form_minsize(fd_form_table_extra->form_table_extra,
247 void MenuLayoutTable(int flag)
249 if (UpdateLayoutTable(flag)) {
250 if (fd_form_table_options->form_table_options->visible) {
251 fl_raise_form(fd_form_table_options->form_table_options);
254 fl_show_form(fd_form_table_options->form_table_options,
255 FL_PLACE_MOUSE, FL_FULLBORDER,
261 void TableOptionsCB(FL_OBJECT *ob, long)
273 if (!current_view->available()
275 !(table = current_view->currentBuffer()->text->cursor.par->table))
280 cell = current_view->currentBuffer()->text->
281 NumberOfCell(current_view->currentBuffer()->text->cursor.par,
282 current_view->currentBuffer()->text->cursor.pos);
283 if (ActCell != cell) {
285 fl_set_object_label(fd_form_table_options->text_warning,
286 _("Warning: Wrong Cursor position, updated window"));
287 fl_show_object(fd_form_table_options->text_warning);
288 extra_col_cursor_x=0; // would rather place it at the end, but...
289 extra_multicol_cursor_x=0;
292 // No point in processing directives that you can't do anything with
293 // anyhow, so exit now if the buffer is read-only.
294 if (current_view->currentBuffer()->isReadonly()) {
299 if (ob != fd_form_table_options->button_table_delete) {
300 fl_set_object_label(fd_form_table_options->text_warning,"");
303 str = fl_get_input(fd_form_table_options->input_column_width);
304 if (!str.empty() && !isValidLength(str)) {
305 fl_set_object_label(fd_form_table_options->text_warning,
306 _("Warning: Invalid Length (valid example: 10mm)"));
307 fl_show_object(fd_form_table_options->text_warning);
310 if (((ob==fd_form_table_options->button_delete_row) && (table->rows<=1)) ||
311 ((ob==fd_form_table_options->button_delete_column) && (table->columns<=1)))
312 ob = fd_form_table_options->button_table_delete;
313 if (ob == fd_form_table_options->button_append_row)
314 num = LyXTable::APPEND_ROW;
315 else if (ob == fd_form_table_options->button_append_column)
316 num = LyXTable::APPEND_COLUMN;
317 else if (ob == fd_form_table_options->button_delete_row)
318 num = LyXTable::DELETE_ROW;
319 else if (ob == fd_form_table_options->button_delete_column)
320 num = LyXTable::DELETE_COLUMN;
321 else if (ob == fd_form_table_options->button_set_borders)
322 num = LyXTable::SET_ALL_LINES;
323 else if (ob == fd_form_table_options->button_unset_borders)
324 num = LyXTable::UNSET_ALL_LINES;
325 else if (ob == fd_form_table_options->radio_border_top)
326 num = LyXTable::TOGGLE_LINE_TOP;
327 else if (ob == fd_form_table_options->radio_border_bottom)
328 num = LyXTable::TOGGLE_LINE_BOTTOM;
329 else if (ob == fd_form_table_options->radio_border_left)
330 num = LyXTable::TOGGLE_LINE_LEFT;
331 else if (ob == fd_form_table_options->radio_border_right)
332 num = LyXTable::TOGGLE_LINE_RIGHT;
333 else if (ob == fd_form_table_options->radio_align_left)
334 num = LyXTable::ALIGN_LEFT;
335 else if (ob == fd_form_table_options->radio_align_right)
336 num = LyXTable::ALIGN_RIGHT;
337 else if (ob == fd_form_table_options->radio_align_center)
338 num = LyXTable::ALIGN_CENTER;
339 else if ((ob==fd_form_table_options->button_table_delete) && !Confirmed) {
340 fl_set_object_label(fd_form_table_options->text_warning,
341 _("Confirm: press Delete-Button again"));
344 } else if ((ob == fd_form_table_options->button_table_delete)
346 num = LyXTable::DELETE_TABLE;
348 } else if (ob == fd_form_table_options->radio_multicolumn)
349 num = LyXTable::MULTICOLUMN;
350 else if (ob == fd_form_table_options->radio_longtable) {
351 s=fl_get_button(fd_form_table_options->radio_longtable);
353 num = LyXTable::SET_LONGTABLE;
354 fl_activate_object(fd_form_table_options->radio_lt_firsthead);
355 fl_activate_object(fd_form_table_options->radio_lt_head);
356 fl_activate_object(fd_form_table_options->radio_lt_foot);
357 fl_activate_object(fd_form_table_options->radio_lt_lastfoot);
358 fl_activate_object(fd_form_table_options->radio_lt_newpage);
359 fl_set_button(fd_form_table_options->radio_lt_firsthead,
360 table->RowOfLTFirstHead(cell));
361 fl_set_button(fd_form_table_options->radio_lt_head,
362 table->RowOfLTHead(cell));
363 fl_set_button(fd_form_table_options->radio_lt_foot,
364 table->RowOfLTFoot(cell));
365 fl_set_button(fd_form_table_options->radio_lt_lastfoot,
366 table->RowOfLTLastFoot(cell));
367 fl_set_button(fd_form_table_options->radio_lt_firsthead,
368 table->LTNewPage(cell));
370 num = LyXTable::UNSET_LONGTABLE;
371 fl_deactivate_object(fd_form_table_options->radio_lt_firsthead);
372 fl_deactivate_object(fd_form_table_options->radio_lt_head);
373 fl_deactivate_object(fd_form_table_options->radio_lt_foot);
374 fl_deactivate_object(fd_form_table_options->radio_lt_lastfoot);
375 fl_deactivate_object(fd_form_table_options->radio_lt_newpage);
376 fl_set_button(fd_form_table_options->radio_lt_firsthead,0);
377 fl_set_button(fd_form_table_options->radio_lt_firsthead,0);
378 fl_set_button(fd_form_table_options->radio_lt_firsthead,0);
379 fl_set_button(fd_form_table_options->radio_lt_firsthead,0);
380 fl_set_button(fd_form_table_options->radio_lt_firsthead,0);
381 fl_set_object_lcol(fd_form_table_options->radio_lt_firsthead,
383 fl_set_object_lcol(fd_form_table_options->radio_lt_head,
385 fl_set_object_lcol(fd_form_table_options->radio_lt_foot,
387 fl_set_object_lcol(fd_form_table_options->radio_lt_lastfoot,
389 fl_set_object_lcol(fd_form_table_options->radio_lt_newpage,
392 } else if (ob == fd_form_table_options->radio_rotate_table) {
393 s=fl_get_button(fd_form_table_options->radio_rotate_table);
395 num = LyXTable::SET_ROTATE_TABLE;
397 num = LyXTable::UNSET_ROTATE_TABLE;
398 } else if (ob == fd_form_table_options->radio_rotate_cell) {
399 s=fl_get_button(fd_form_table_options->radio_rotate_cell);
401 num = LyXTable::SET_ROTATE_CELL;
403 num = LyXTable::UNSET_ROTATE_CELL;
404 } else if (ob == fd_form_table_options->radio_linebreak_cell) {
405 num = LyXTable::SET_LINEBREAKS;
406 } else if (ob == fd_form_table_options->radio_lt_firsthead) {
407 num = LyXTable::SET_LTFIRSTHEAD;
408 } else if (ob == fd_form_table_options->radio_lt_head) {
409 num = LyXTable::SET_LTHEAD;
410 } else if (ob == fd_form_table_options->radio_lt_foot) {
411 num = LyXTable::SET_LTFOOT;
412 } else if (ob == fd_form_table_options->radio_lt_lastfoot) {
413 num = LyXTable::SET_LTLASTFOOT;
414 } else if (ob == fd_form_table_options->radio_lt_newpage) {
415 num = LyXTable::SET_LTNEWPAGE;
416 } else if (ob == fd_form_table_options->button_table_extra) {
417 OpenLayoutTableExtra();
419 } else if (ob == fd_form_table_extra->input_special_alignment) {
420 special=fl_get_input(fd_form_table_extra->input_special_alignment);
422 fl_get_input_cursorpos(ob, &extra_col_cursor_x, &dummy);
423 num = LyXTable::SET_SPECIAL_COLUMN;
424 } else if (ob == fd_form_table_extra->input_special_multialign) {
425 special=fl_get_input(fd_form_table_extra->input_special_multialign);
427 fl_get_input_cursorpos(ob, &extra_multicol_cursor_x, &dummy);
428 num = LyXTable::SET_SPECIAL_MULTI;
431 if (current_view->available()){
432 current_view->getScreen()->HideCursor();
433 if (!current_view->currentBuffer()->text->selection){
435 current_view->currentBuffer()->update(-2);
437 if ((num == LyXTable::SET_SPECIAL_COLUMN) ||
438 (num == LyXTable::SET_SPECIAL_MULTI))
439 current_view->currentBuffer()->text->TableFeatures(num,special);
441 current_view->currentBuffer()->text->TableFeatures(num);
442 current_view->currentBuffer()->update(1);
444 if (num == LyXTable::DELETE_TABLE) {
445 fl_set_focus_object(fd_form_table_options->form_table_options,
446 fd_form_table_options->button_table_delete);
447 fl_hide_form(fd_form_table_options->form_table_options);
449 UpdateLayoutTable(true);
453 void TableOptCloseCB(FL_OBJECT *, long)
455 fl_set_focus_object(fd_form_table_options->form_table_options,
456 fd_form_table_options->button_table_delete);
457 fl_hide_form(fd_form_table_options->form_table_options);
461 void TableSpeCloseCB(FL_OBJECT *, long)
463 fl_set_focus_object(fd_form_table_options->form_table_options,
464 fd_form_table_options->button_table_delete);
465 fl_hide_form(fd_form_table_extra->form_table_extra);
469 void SetPWidthCB(FL_OBJECT *ob, long)
471 fl_set_object_label(fd_form_table_options->text_warning,"");
473 if (ob == fd_form_table_options->input_column_width) {
476 str = fl_get_input(ob);
477 if (!str.empty() && !isValidLength(str)) {
478 fl_set_object_label(fd_form_table_options->text_warning,
479 _("Warning: Invalid Length (valid example: 10mm)"));
480 fl_show_object(fd_form_table_options->text_warning);
483 if (current_view->available()){
484 current_view->getScreen()->HideCursor();
485 if (!current_view->currentBuffer()->text->selection){
487 current_view->currentBuffer()->update(-2);
489 current_view->currentBuffer()->text->TableFeatures(LyXTable::SET_PWIDTH,str);
490 current_view->currentBuffer()->update(1);
492 MenuLayoutTable(0); // update for alignment