4 #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"
20 extern void BeforeChange();
23 extern FD_form_table_options * fd_form_table_options;
24 extern FD_form_table_extra * fd_form_table_extra;
25 extern BufferView * current_view;
27 static int Confirmed = false;
30 // hack to keep the cursor from jumping to the end of the text in the Extra
31 // form input fields during editing. The values in LyXTable itself is
32 // changed in real-time, but we have no callbacks for the input fields,
33 // so I simply store and restore the cursor position for now.
34 // (too much of a hazzle to do it proper; we'll trash all this code
36 static int extra_col_cursor_x; // need no y's, one-line input fields
37 static int extra_multicol_cursor_x;
41 bool UpdateLayoutTable(int flag)
44 if (!current_view->getScreen() || !current_view->available())
47 if (update && current_view->text->cursor.par->table) {
49 string pwidth, special;
51 LyXTable * table = current_view->text->cursor.par->table;
53 int cell = current_view->text->
54 NumberOfCell(current_view->text->cursor.par,
55 current_view->text->cursor.pos);
57 int column = table->column_of_cell(cell)+1;
58 fl_set_object_label(fd_form_table_options->text_warning, "");
60 fl_activate_object(fd_form_table_extra->input_special_alignment);
61 fl_activate_object(fd_form_table_extra->input_special_multialign);
62 fl_activate_object(fd_form_table_options->input_column_width);
63 sprintf(buf, "%d", column);
64 fl_set_input(fd_form_table_options->input_table_column, buf);
65 fl_deactivate_object(fd_form_table_options->input_table_column);
66 int row = table->row_of_cell(cell)+1;
67 sprintf(buf, "%d", row);
68 fl_set_input(fd_form_table_options->input_table_row, buf);
69 fl_deactivate_object(fd_form_table_options->input_table_row);
70 if (table->IsMultiColumn(cell))
71 fl_set_button(fd_form_table_options->radio_multicolumn, 1);
73 fl_set_button(fd_form_table_options->radio_multicolumn, 0);
74 if (table->RotateCell(cell))
75 fl_set_button(fd_form_table_options->radio_rotate_cell, 1);
77 fl_set_button(fd_form_table_options->radio_rotate_cell, 0);
78 if (table->TopLine(cell))
79 fl_set_button(fd_form_table_options->radio_border_top, 1);
81 fl_set_button(fd_form_table_options->radio_border_top, 0);
82 if (table->BottomLine(cell))
83 fl_set_button(fd_form_table_options->radio_border_bottom, 1);
85 fl_set_button(fd_form_table_options->radio_border_bottom, 0);
86 if (table->LeftLine(cell))
87 fl_set_button(fd_form_table_options->radio_border_left, 1);
89 fl_set_button(fd_form_table_options->radio_border_left, 0);
90 if (table->RightLine(cell))
91 fl_set_button(fd_form_table_options->radio_border_right, 1);
93 fl_set_button(fd_form_table_options->radio_border_right, 0);
94 int align = table->GetAlignment(cell);
95 fl_set_button(fd_form_table_options->radio_align_left, 0);
96 fl_set_button(fd_form_table_options->radio_align_right, 0);
97 fl_set_button(fd_form_table_options->radio_align_center, 0);
98 special = table->GetAlignSpecial(cell, LyXTable::SET_SPECIAL_COLUMN);
101 fl_set_input(fd_form_table_extra->input_special_alignment,
103 fl_set_input_cursorpos(fd_form_table_extra->input_special_alignment,
104 extra_col_cursor_x, 0); // restore the cursor
106 if (current_view->buffer()->isReadonly())
107 fl_deactivate_object(fd_form_table_extra->input_special_alignment);
108 special = table->GetAlignSpecial(cell, LyXTable::SET_SPECIAL_MULTI);
111 fl_set_input(fd_form_table_extra->input_special_multialign,
113 fl_set_input_cursorpos(fd_form_table_extra->input_special_multialign,
114 extra_multicol_cursor_x, 0); // restore the cursor
116 if (current_view->buffer()->isReadonly())
117 fl_deactivate_object(fd_form_table_extra->input_special_multialign);
118 pwidth = table->GetPWidth(cell);
120 fl_set_input(fd_form_table_options->input_column_width, pwidth.c_str());
121 if (current_view->buffer()->isReadonly())
122 fl_deactivate_object(fd_form_table_options->input_column_width);
123 if (!pwidth.empty()) {
124 fl_activate_object(fd_form_table_options->radio_linebreak_cell);
125 fl_set_object_lcol(fd_form_table_options->radio_linebreak_cell,
127 fl_set_button(fd_form_table_options->radio_linebreak_cell,
128 table->Linebreaks(table->FirstVirtualCell(cell)));
130 fl_deactivate_object(fd_form_table_options->radio_linebreak_cell);
131 fl_set_object_lcol(fd_form_table_options->radio_linebreak_cell,
133 fl_set_button(fd_form_table_options->radio_linebreak_cell, 0);
135 if ((!pwidth.empty() && !table->IsMultiColumn(cell)) ||
136 (align == LYX_ALIGN_LEFT))
137 fl_set_button(fd_form_table_options->radio_align_left, 1);
138 else if (align == LYX_ALIGN_RIGHT)
139 fl_set_button(fd_form_table_options->radio_align_right, 1);
141 fl_set_button(fd_form_table_options->radio_align_center, 1);
142 if (!pwidth.empty() && !table->IsMultiColumn(cell)) {
143 fl_deactivate_object(fd_form_table_options->radio_align_left);
144 fl_deactivate_object(fd_form_table_options->radio_align_right);
145 fl_deactivate_object(fd_form_table_options->radio_align_center);
146 fl_set_object_lcol(fd_form_table_options->radio_align_left,
148 fl_set_object_lcol(fd_form_table_options->radio_align_right,
150 fl_set_object_lcol(fd_form_table_options->radio_align_center,
153 fl_activate_object(fd_form_table_options->radio_align_left);
154 fl_activate_object(fd_form_table_options->radio_align_right);
155 fl_activate_object(fd_form_table_options->radio_align_center);
156 fl_set_object_lcol(fd_form_table_options->radio_align_left,
158 fl_set_object_lcol(fd_form_table_options->radio_align_right,
160 fl_set_object_lcol(fd_form_table_options->radio_align_center,
163 fl_set_button(fd_form_table_options->radio_longtable, table->IsLongTable());
164 if (table->IsLongTable()) {
165 fl_activate_object(fd_form_table_options->radio_lt_firsthead);
166 fl_activate_object(fd_form_table_options->radio_lt_head);
167 fl_activate_object(fd_form_table_options->radio_lt_foot);
168 fl_activate_object(fd_form_table_options->radio_lt_lastfoot);
169 fl_activate_object(fd_form_table_options->radio_lt_newpage);
170 fl_set_object_lcol(fd_form_table_options->radio_lt_firsthead,
172 fl_set_object_lcol(fd_form_table_options->radio_lt_head,
174 fl_set_object_lcol(fd_form_table_options->radio_lt_foot,
176 fl_set_object_lcol(fd_form_table_options->radio_lt_lastfoot,
178 fl_set_object_lcol(fd_form_table_options->radio_lt_newpage,
180 fl_set_button(fd_form_table_options->radio_lt_firsthead,
181 table->RowOfLTFirstHead(cell));
182 fl_set_button(fd_form_table_options->radio_lt_head,
183 table->RowOfLTHead(cell));
184 fl_set_button(fd_form_table_options->radio_lt_foot,
185 table->RowOfLTFoot(cell));
186 fl_set_button(fd_form_table_options->radio_lt_lastfoot,
187 table->RowOfLTLastFoot(cell));
188 fl_set_button(fd_form_table_options->radio_lt_newpage,
189 table->LTNewPage(cell));
191 fl_deactivate_object(fd_form_table_options->radio_lt_firsthead);
192 fl_deactivate_object(fd_form_table_options->radio_lt_head);
193 fl_deactivate_object(fd_form_table_options->radio_lt_foot);
194 fl_deactivate_object(fd_form_table_options->radio_lt_lastfoot);
195 fl_deactivate_object(fd_form_table_options->radio_lt_newpage);
196 fl_set_button(fd_form_table_options->radio_lt_firsthead, 0);
197 fl_set_button(fd_form_table_options->radio_lt_head, 0);
198 fl_set_button(fd_form_table_options->radio_lt_foot, 0);
199 fl_set_button(fd_form_table_options->radio_lt_lastfoot, 0);
200 fl_set_button(fd_form_table_options->radio_lt_newpage, 0);
201 fl_set_object_lcol(fd_form_table_options->radio_lt_firsthead,
203 fl_set_object_lcol(fd_form_table_options->radio_lt_head,
205 fl_set_object_lcol(fd_form_table_options->radio_lt_foot,
207 fl_set_object_lcol(fd_form_table_options->radio_lt_lastfoot,
209 fl_set_object_lcol(fd_form_table_options->radio_lt_newpage,
212 fl_set_button(fd_form_table_options->radio_rotate_table,
213 table->RotateTable());
214 fl_set_focus_object(fd_form_table_options->form_table_options,
215 fd_form_table_options->button_table_delete);
216 } else if (fd_form_table_options->form_table_options->visible) {
217 fl_set_focus_object(fd_form_table_options->form_table_options,
218 fd_form_table_options->button_table_delete);
219 fl_hide_form(fd_form_table_options->form_table_options);
225 void OpenLayoutTableExtra()
228 if (fd_form_table_extra->form_table_extra->visible) {
229 fl_raise_form(fd_form_table_extra->form_table_extra);
231 static int ow = -1, oh;
232 fl_show_form(fd_form_table_extra->form_table_extra,
233 FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER,
234 _("Table Extra Form"));
236 ow = fd_form_table_extra->form_table_extra->w;
237 oh = fd_form_table_extra->form_table_extra->h;
239 fl_set_form_minsize(fd_form_table_extra->form_table_extra,
245 void MenuLayoutTable(int flag)
247 if (UpdateLayoutTable(flag)) {
248 if (fd_form_table_options->form_table_options->visible) {
249 fl_raise_form(fd_form_table_options->form_table_options);
252 fl_show_form(fd_form_table_options->form_table_options,
253 FL_PLACE_MOUSE, FL_FULLBORDER,
260 void TableOptionsCB(FL_OBJECT * ob, long)
262 LyXTable * table = 0;
266 if (!current_view->available()
267 || !(table = current_view->text->cursor.par->table)) {
271 int cell = current_view->text->
272 NumberOfCell(current_view->text->cursor.par,
273 current_view->text->cursor.pos);
274 if (ActCell != cell) {
276 fl_set_object_label(fd_form_table_options->text_warning,
277 _("Warning: Wrong Cursor position, updated window"));
278 fl_show_object(fd_form_table_options->text_warning);
279 extra_col_cursor_x = 0; // would rather place it at the end, but...
280 extra_multicol_cursor_x = 0;
284 // No point in processing directives that you can't do anything with
285 // anyhow, so exit now if the buffer is read-only.
286 if (current_view->buffer()->isReadonly()) {
291 if (ob != fd_form_table_options->button_table_delete) {
292 fl_set_object_label(fd_form_table_options->text_warning, "");
295 str = fl_get_input(fd_form_table_options->input_column_width);
296 if (!str.empty() && !isValidLength(str)) {
297 fl_set_object_label(fd_form_table_options->text_warning,
298 _("Warning: Invalid Length (valid example: 10mm)"));
299 fl_show_object(fd_form_table_options->text_warning);
302 if (((ob == fd_form_table_options->button_delete_row) && (table->rows<= 1)) ||
303 ((ob == fd_form_table_options->button_delete_column) && (table->columns<= 1)))
304 ob = fd_form_table_options->button_table_delete;
305 if (ob == fd_form_table_options->button_append_row)
306 num = LyXTable::APPEND_ROW;
307 else if (ob == fd_form_table_options->button_append_column)
308 num = LyXTable::APPEND_COLUMN;
309 else if (ob == fd_form_table_options->button_delete_row)
310 num = LyXTable::DELETE_ROW;
311 else if (ob == fd_form_table_options->button_delete_column)
312 num = LyXTable::DELETE_COLUMN;
313 else if (ob == fd_form_table_options->button_set_borders)
314 num = LyXTable::SET_ALL_LINES;
315 else if (ob == fd_form_table_options->button_unset_borders)
316 num = LyXTable::UNSET_ALL_LINES;
317 else if (ob == fd_form_table_options->radio_border_top)
318 num = LyXTable::TOGGLE_LINE_TOP;
319 else if (ob == fd_form_table_options->radio_border_bottom)
320 num = LyXTable::TOGGLE_LINE_BOTTOM;
321 else if (ob == fd_form_table_options->radio_border_left)
322 num = LyXTable::TOGGLE_LINE_LEFT;
323 else if (ob == fd_form_table_options->radio_border_right)
324 num = LyXTable::TOGGLE_LINE_RIGHT;
325 else if (ob == fd_form_table_options->radio_align_left)
326 num = LyXTable::ALIGN_LEFT;
327 else if (ob == fd_form_table_options->radio_align_right)
328 num = LyXTable::ALIGN_RIGHT;
329 else if (ob == fd_form_table_options->radio_align_center)
330 num = LyXTable::ALIGN_CENTER;
331 else if ((ob == fd_form_table_options->button_table_delete) && !Confirmed) {
332 fl_set_object_label(fd_form_table_options->text_warning,
333 _("Confirm: press Delete-Button again"));
336 } else if ((ob == fd_form_table_options->button_table_delete)
338 num = LyXTable::DELETE_TABLE;
340 } else if (ob == fd_form_table_options->radio_multicolumn)
341 num = LyXTable::MULTICOLUMN;
342 else if (ob == fd_form_table_options->radio_longtable) {
343 s = fl_get_button(fd_form_table_options->radio_longtable);
345 num = LyXTable::SET_LONGTABLE;
346 fl_activate_object(fd_form_table_options->radio_lt_firsthead);
347 fl_activate_object(fd_form_table_options->radio_lt_head);
348 fl_activate_object(fd_form_table_options->radio_lt_foot);
349 fl_activate_object(fd_form_table_options->radio_lt_lastfoot);
350 fl_activate_object(fd_form_table_options->radio_lt_newpage);
351 fl_set_button(fd_form_table_options->radio_lt_firsthead,
352 table->RowOfLTFirstHead(cell));
353 fl_set_button(fd_form_table_options->radio_lt_head,
354 table->RowOfLTHead(cell));
355 fl_set_button(fd_form_table_options->radio_lt_foot,
356 table->RowOfLTFoot(cell));
357 fl_set_button(fd_form_table_options->radio_lt_lastfoot,
358 table->RowOfLTLastFoot(cell));
359 fl_set_button(fd_form_table_options->radio_lt_firsthead,
360 table->LTNewPage(cell));
362 num = LyXTable::UNSET_LONGTABLE;
363 fl_deactivate_object(fd_form_table_options->radio_lt_firsthead);
364 fl_deactivate_object(fd_form_table_options->radio_lt_head);
365 fl_deactivate_object(fd_form_table_options->radio_lt_foot);
366 fl_deactivate_object(fd_form_table_options->radio_lt_lastfoot);
367 fl_deactivate_object(fd_form_table_options->radio_lt_newpage);
368 fl_set_button(fd_form_table_options->radio_lt_firsthead, 0);
369 fl_set_button(fd_form_table_options->radio_lt_firsthead, 0);
370 fl_set_button(fd_form_table_options->radio_lt_firsthead, 0);
371 fl_set_button(fd_form_table_options->radio_lt_firsthead, 0);
372 fl_set_button(fd_form_table_options->radio_lt_firsthead, 0);
373 fl_set_object_lcol(fd_form_table_options->radio_lt_firsthead,
375 fl_set_object_lcol(fd_form_table_options->radio_lt_head,
377 fl_set_object_lcol(fd_form_table_options->radio_lt_foot,
379 fl_set_object_lcol(fd_form_table_options->radio_lt_lastfoot,
381 fl_set_object_lcol(fd_form_table_options->radio_lt_newpage,
384 } else if (ob == fd_form_table_options->radio_rotate_table) {
385 s = fl_get_button(fd_form_table_options->radio_rotate_table);
387 num = LyXTable::SET_ROTATE_TABLE;
389 num = LyXTable::UNSET_ROTATE_TABLE;
390 } else if (ob == fd_form_table_options->radio_rotate_cell) {
391 s = fl_get_button(fd_form_table_options->radio_rotate_cell);
393 num = LyXTable::SET_ROTATE_CELL;
395 num = LyXTable::UNSET_ROTATE_CELL;
396 } else if (ob == fd_form_table_options->radio_linebreak_cell) {
397 num = LyXTable::SET_LINEBREAKS;
398 } else if (ob == fd_form_table_options->radio_lt_firsthead) {
399 num = LyXTable::SET_LTFIRSTHEAD;
400 } else if (ob == fd_form_table_options->radio_lt_head) {
401 num = LyXTable::SET_LTHEAD;
402 } else if (ob == fd_form_table_options->radio_lt_foot) {
403 num = LyXTable::SET_LTFOOT;
404 } else if (ob == fd_form_table_options->radio_lt_lastfoot) {
405 num = LyXTable::SET_LTLASTFOOT;
406 } else if (ob == fd_form_table_options->radio_lt_newpage) {
407 num = LyXTable::SET_LTNEWPAGE;
408 } else if (ob == fd_form_table_options->button_table_extra) {
409 OpenLayoutTableExtra();
411 } else if (ob == fd_form_table_extra->input_special_alignment) {
412 special = fl_get_input(fd_form_table_extra->input_special_alignment);
414 fl_get_input_cursorpos(ob, &extra_col_cursor_x, &dummy);
415 num = LyXTable::SET_SPECIAL_COLUMN;
416 } else if (ob == fd_form_table_extra->input_special_multialign) {
417 special = fl_get_input(fd_form_table_extra->input_special_multialign);
419 fl_get_input_cursorpos(ob, &extra_multicol_cursor_x, &dummy);
420 num = LyXTable::SET_SPECIAL_MULTI;
423 if (current_view->available()) {
424 current_view->getScreen()->HideCursor();
425 if (!current_view->text->selection){
427 current_view->update(-2);
429 if ((num == LyXTable::SET_SPECIAL_COLUMN) ||
430 (num == LyXTable::SET_SPECIAL_MULTI))
431 current_view->text->TableFeatures(num, special);
433 current_view->text->TableFeatures(num);
434 current_view->update(1);
436 if (num == LyXTable::DELETE_TABLE) {
437 fl_set_focus_object(fd_form_table_options->form_table_options,
438 fd_form_table_options->button_table_delete);
439 fl_hide_form(fd_form_table_options->form_table_options);
441 UpdateLayoutTable(true);
446 void TableOptCloseCB(FL_OBJECT *, long)
448 fl_set_focus_object(fd_form_table_options->form_table_options,
449 fd_form_table_options->button_table_delete);
450 fl_hide_form(fd_form_table_options->form_table_options);
454 void TableSpeCloseCB(FL_OBJECT *, long)
456 fl_set_focus_object(fd_form_table_options->form_table_options,
457 fd_form_table_options->button_table_delete);
458 fl_hide_form(fd_form_table_extra->form_table_extra);
462 void SetPWidthCB(FL_OBJECT * ob, long)
464 fl_set_object_label(fd_form_table_options->text_warning, "");
466 if (ob == fd_form_table_options->input_column_width) {
467 string str = fl_get_input(ob);
468 if (!str.empty() && !isValidLength(str)) {
469 fl_set_object_label(fd_form_table_options->text_warning,
470 _("Warning: Invalid Length (valid example: 10mm)"));
471 fl_show_object(fd_form_table_options->text_warning);
474 if (current_view->available()){
475 current_view->getScreen()->HideCursor();
476 if (!current_view->text->selection) {
478 current_view->update(-2);
480 current_view->text->TableFeatures(LyXTable::SET_PWIDTH, str);
481 current_view->update(1);
483 MenuLayoutTable(0); // update for alignment