X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fxforms%2FFormParagraph.C;h=dd5c4bb3151dffefeb08cf3fbbb08a50fb836d95;hb=82a83d7ae6eee25e1182c713a726b17037844ffb;hp=1adfec0e3f2bf1e870c54ee2bb0c851d335870dc;hpb=e7401bd8f2310213b4b765c01676459f37adb530;p=lyx.git diff --git a/src/frontends/xforms/FormParagraph.C b/src/frontends/xforms/FormParagraph.C index 1adfec0e3f..dd5c4bb315 100644 --- a/src/frontends/xforms/FormParagraph.C +++ b/src/frontends/xforms/FormParagraph.C @@ -1,13 +1,10 @@ -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * - * Copyright 2000 The LyX Team. +/** + * \file FormParagraph.C + * Copyright 2000-2001 The LyX Team. + * See the file COPYING. * - * @author Jürgen Vigna - * - *======================================================*/ + * \author Jürgen Vigna, jug@sad.it + */ #include @@ -24,122 +21,171 @@ #include "LyXView.h" #include "buffer.h" #include "lyxtext.h" +#include "xforms_helpers.h" +#include "lyxrc.h" // to set the deafult length values +#include "BufferView.h" +#include "lyxtextclasslist.h" +#include "Spacing.h" +#include "ParagraphParameters.h" +#include "input_validators.h" +#include "helper_funcs.h" + +#include "support/lstrings.h" + +#include -#ifdef CXX_WORKING_NAMESPACES using Liason::setMinibuffer; -#endif +using SigC::slot; +using std::vector; +using std::bind2nd; +using std::remove_if; + FormParagraph::FormParagraph(LyXView * lv, Dialogs * d) - : FormBase(lv, d, _("Paragraph Layout"), BUFFER_DEPENDENT, UPDATE, - new NoRepeatedApplyReadOnlyPolicy), - dialog_(0), general_(0), extra_(0) + : FormBaseBD(lv, d, _("Paragraph Layout")), par_(0) { - // let the popup be shown + // let the dialog be shown // This is a permanent connection so we won't bother // storing a copy because we won't be disconnecting. - d->showLayoutParagraph.connect(slot(this, &FormParagraph::show)); + d->showParagraph.connect(slot(this, &FormParagraph::show)); } -FormParagraph::~FormParagraph() +void FormParagraph::connect() { - delete general_; - delete extra_; - delete dialog_; + cp_ = d_->updateParagraph + .connect(slot(this, &FormParagraph::changedParagraph)); + FormBaseBD::connect(); } -FL_FORM * FormParagraph::form() const +void FormParagraph::disconnect() { - if (dialog_) return dialog_->form; - return 0; + cp_.disconnect(); + FormBaseBD::disconnect(); } -void FormParagraph::build() +Paragraph const * FormParagraph::getCurrentParagraph() const { - // the tabbed folder - dialog_ = build_tabbed_paragraph(); + return lv_->view()->getLyXText()->cursor.par(); +} - // manage the restore, ok, apply and cancel/close buttons - bc_.setOK(dialog_->button_ok); - bc_.setApply(dialog_->button_apply); - bc_.setCancel(dialog_->button_cancel); - bc_.setUndoAll(dialog_->button_restore); - bc_.refresh(); - // the general paragraph data form - general_ = build_paragraph_general(); +void FormParagraph::changedParagraph() +{ + /// Record the paragraph + Paragraph const * const p = getCurrentParagraph(); + if (p == 0 || p == par_) + return; - fl_addto_choice(general_->choice_space_above, - _(" None | Defskip | Smallskip " - "| Medskip | Bigskip | VFill | Length ")); - fl_addto_choice(general_->choice_space_below, - _(" None | Defskip | Smallskip " - "| Medskip | Bigskip | VFill | Length ")); + // OBS FIX LOOK HERE + + // shouldn't we chage the par_ pointer too? + // anyway for me the below function does just nothing! + // (Jug 20020108) - fl_set_input_return(general_->input_space_above, FL_RETURN_CHANGED); - fl_set_input_return(general_->input_space_below, FL_RETURN_CHANGED); - fl_set_input_return(general_->input_labelwidth, FL_RETURN_CHANGED); - - bc_.addReadOnly (general_->radio_align_right); - bc_.addReadOnly (general_->radio_align_left); - bc_.addReadOnly (general_->radio_align_block); - bc_.addReadOnly (general_->radio_align_center); - bc_.addReadOnly (general_->check_lines_top); - bc_.addReadOnly (general_->check_lines_bottom); - bc_.addReadOnly (general_->choice_space_above); - bc_.addReadOnly (general_->input_space_above); - bc_.addReadOnly (general_->check_space_above); - bc_.addReadOnly (general_->choice_space_below); - bc_.addReadOnly (general_->input_space_below); - bc_.addReadOnly (general_->check_space_below); - bc_.addReadOnly (general_->check_noindent); - bc_.addReadOnly (general_->input_labelwidth); - - // the document class form - extra_ = build_paragraph_extra(); - - fl_set_input_return(extra_->input_pextra_width, FL_RETURN_CHANGED); - fl_set_input_return(extra_->input_pextra_widthp, FL_RETURN_CHANGED); - - bc_.addReadOnly (extra_->radio_pextra_indent); - bc_.addReadOnly (extra_->radio_pextra_minipage); - bc_.addReadOnly (extra_->radio_pextra_floatflt); - - // now make them fit together - fl_addto_tabfolder(dialog_->tabbed_folder,_("General"), general_->form); - fl_addto_tabfolder(dialog_->tabbed_folder,_("Extra"), extra_->form); + // For now don't bother checking if the params are different, + // just activate the Apply button + bc().valid(); } -void FormParagraph::apply() +void FormParagraph::redraw() { - if (!lv_->view()->available() || !dialog_) - return; + if (form() && form()->visible) + fl_redraw_form(form()); +} - general_apply(); - extra_apply(); - lv_->view()->update(BufferView::SELECT | BufferView::FITCUR | - BufferView::CHANGE); - lv_->buffer()->markDirty(); - setMinibuffer(lv_, _("Paragraph layout set")); +FL_FORM * FormParagraph::form() const +{ + if (dialog_.get()) return dialog_->form; + return 0; } -void FormParagraph::update() +void FormParagraph::build() { - if (!dialog_) - return; + // the tabbed folder + dialog_.reset(build_paragraph()); + + fl_addto_choice(dialog_->choice_space_above, + _(" None | Defskip | Smallskip " + "| Medskip | Bigskip | VFill | Length ")); + fl_addto_choice(dialog_->choice_space_below, + _(" None | Defskip | Smallskip " + "| Medskip | Bigskip | VFill | Length ")); - general_update(); - extra_update(); + fl_addto_choice(dialog_->choice_linespacing, + _(" Default | Single | OneHalf | Double | Other ")); + + fl_set_input_return(dialog_->input_space_above, FL_RETURN_CHANGED); + fl_set_input_return(dialog_->input_space_below, FL_RETURN_CHANGED); + fl_set_input_return(dialog_->input_labelwidth, FL_RETURN_CHANGED); + fl_set_input_return(dialog_->input_linespacing, FL_RETURN_CHANGED); + fl_set_input_filter(dialog_->input_linespacing, fl_unsigned_float_filter); + + setPrehandler(dialog_->input_space_above); + setPrehandler(dialog_->input_space_below); + setPrehandler(dialog_->input_labelwidth); + setPrehandler(dialog_->input_linespacing); + + // Create the contents of the unit choices + // Don't include the "%" terms... + vector units_vec = getLatexUnits(); +#if 0 + for (vector::iterator it = units_vec.begin(); + it != units_vec.end(); ++it) { + if (contains(*it, "%")) + it = units_vec.erase(it, it+1) - 1; + } +#else + // Something similar to this is a better way to erase + vector::iterator del = + remove_if(units_vec.begin(), units_vec.end(), + bind2nd(contains_functor(), "%")); + units_vec.erase(del, units_vec.end()); +#endif + + string units = getStringFromVector(units_vec, "|"); + + fl_addto_choice(dialog_->choice_value_space_above, units.c_str()); + fl_addto_choice(dialog_->choice_value_space_below, units.c_str()); + + // Manage the ok, apply, restore and cancel/close buttons + bc_.setOK(dialog_->button_ok); + bc_.setApply(dialog_->button_apply); + bc_.setCancel(dialog_->button_cancel); + bc_.setRestore(dialog_->button_restore); + + bc_.addReadOnly (dialog_->group_radio_alignment); + // bc_.addReadOnly (dialog_->radio_align_right); + // bc_.addReadOnly (dialog_->radio_align_left); + // bc_.addReadOnly (dialog_->radio_align_block); + // bc_.addReadOnly (dialog_->radio_align_center); + bc_.addReadOnly (dialog_->check_lines_top); + bc_.addReadOnly (dialog_->check_lines_bottom); + bc_.addReadOnly (dialog_->check_pagebreaks_top); + bc_.addReadOnly (dialog_->check_pagebreaks_bottom); + bc_.addReadOnly (dialog_->choice_space_above); + bc_.addReadOnly (dialog_->input_space_above); + bc_.addReadOnly (dialog_->check_space_above); + bc_.addReadOnly (dialog_->choice_space_below); + bc_.addReadOnly (dialog_->input_space_below); + bc_.addReadOnly (dialog_->check_space_below); + bc_.addReadOnly (dialog_->choice_linespacing); + bc_.addReadOnly (dialog_->input_linespacing); + bc_.addReadOnly (dialog_->check_noindent); + bc_.addReadOnly (dialog_->input_labelwidth); } -void FormParagraph::general_apply() +void FormParagraph::apply() { + if (!lv_->view()->available() || !dialog_.get()) + return; + VSpace space_top, space_bottom; LyXAlignment align; string labelwidthstring; @@ -147,23 +193,23 @@ void FormParagraph::general_apply() // If a vspace kind is "Length" but there's no text in // the input field, reset the kind to "None". - if ((fl_get_choice (general_->choice_space_above) == 7) && - !*(fl_get_input (general_->input_space_above))) + if ((fl_get_choice (dialog_->choice_space_above) == 7) && + !*(fl_get_input (dialog_->input_space_above))) { - fl_set_choice (general_->choice_space_above, 1); + fl_set_choice (dialog_->choice_space_above, 1); } - if ((fl_get_choice (general_->choice_space_below) == 7) && - !*(fl_get_input (general_->input_space_below))) + if ((fl_get_choice (dialog_->choice_space_below) == 7) && + !*(fl_get_input (dialog_->input_space_below))) { - fl_set_choice (general_->choice_space_below, 1); + fl_set_choice (dialog_->choice_space_below, 1); } - bool line_top = fl_get_button(general_->check_lines_top); - bool line_bottom = fl_get_button(general_->check_lines_bottom); - bool pagebreak_top = fl_get_button(general_->check_pagebreaks_top); - bool pagebreak_bottom = fl_get_button(general_->check_pagebreaks_bottom); + bool line_top = fl_get_button(dialog_->check_lines_top); + bool line_bottom = fl_get_button(dialog_->check_lines_bottom); + bool pagebreak_top = fl_get_button(dialog_->check_pagebreaks_top); + bool pagebreak_bottom = fl_get_button(dialog_->check_pagebreaks_bottom); - switch (fl_get_choice (general_->choice_space_above)) { + switch (fl_get_choice (dialog_->choice_space_above)) { case 1: space_top = VSpace(VSpace::NONE); break; @@ -183,12 +229,19 @@ void FormParagraph::general_apply() space_top = VSpace(VSpace::VFILL); break; case 7: - space_top = VSpace(LyXGlueLength(fl_get_input(general_->input_space_above))); + { + string const length = + getLengthFromWidgets(dialog_->input_space_above, + dialog_->choice_value_space_above); + space_top = + VSpace(LyXGlueLength(length)); break; } - if (fl_get_button (general_->check_space_above)) + } + + if (fl_get_button (dialog_->check_space_above)) space_top.setKeep (true); - switch (fl_get_choice (general_->choice_space_below)) { + switch (fl_get_choice (dialog_->choice_space_below)) { case 1: space_bottom = VSpace(VSpace::NONE); break; @@ -208,508 +261,309 @@ void FormParagraph::general_apply() space_bottom = VSpace(VSpace::VFILL); break; case 7: - space_bottom = VSpace(LyXGlueLength(fl_get_input(general_->input_space_below))); + string const length = + getLengthFromWidgets(dialog_->input_space_below, + dialog_->choice_value_space_below); + space_bottom = VSpace(LyXGlueLength(length)); break; } - if (fl_get_button (general_->check_space_below)) + if (fl_get_button (dialog_->check_space_below)) space_bottom.setKeep (true); - if (fl_get_button(general_->radio_align_left)) + if (fl_get_button(dialog_->radio_align_left)) align = LYX_ALIGN_LEFT; - else if (fl_get_button(general_->radio_align_right)) + else if (fl_get_button(dialog_->radio_align_right)) align = LYX_ALIGN_RIGHT; - else if (fl_get_button(general_->radio_align_center)) + else if (fl_get_button(dialog_->radio_align_center)) align = LYX_ALIGN_CENTER; else align = LYX_ALIGN_BLOCK; - labelwidthstring = fl_get_input(general_->input_labelwidth); - noindent = fl_get_button(general_->check_noindent); - - LyXText * text = 0; - if (lv_->view()->theLockingInset()) - text = lv_->view()->theLockingInset()->getLyXText(lv_->view()); - if (!text) - text = lv_->view()->text; - text->SetParagraph(lv_->view(), line_top, line_bottom, pagebreak_top, - pagebreak_bottom, space_top, space_bottom, align, - labelwidthstring, noindent); -} + labelwidthstring = fl_get_input(dialog_->input_labelwidth); + noindent = fl_get_button(dialog_->check_noindent); + Spacing::Space linespacing = Spacing::Default; + string other_linespacing; + switch (fl_get_choice(dialog_->choice_linespacing)) { + case 1: linespacing = Spacing::Default; break; + case 2: linespacing = Spacing::Single; break; + case 3: linespacing = Spacing::Onehalf; break; + case 4: linespacing = Spacing::Double; break; + case 5: + linespacing = Spacing::Other; + other_linespacing = fl_get_input(dialog_->input_linespacing); + break; + } + Spacing const spacing(linespacing, other_linespacing); + LyXText * text(lv_->view()->getLyXText()); + text->setParagraph(lv_->view(), line_top, line_bottom, pagebreak_top, + pagebreak_bottom, space_top, space_bottom, spacing, + align, labelwidthstring, noindent); -void FormParagraph::extra_apply() -{ - char const * width = fl_get_input(extra_->input_pextra_width); - char const * widthp = fl_get_input(extra_->input_pextra_widthp); - LyXText * text = lv_->view()->text; - int type = LyXParagraph::PEXTRA_NONE; - LyXParagraph::MINIPAGE_ALIGNMENT - alignment = LyXParagraph::MINIPAGE_ALIGN_TOP; - bool - hfill = false, - start_minipage = false; - - if (fl_get_button(extra_->radio_pextra_indent)) { - type = LyXParagraph::PEXTRA_INDENT; - } else if (fl_get_button(extra_->radio_pextra_minipage)) { - type = LyXParagraph::PEXTRA_MINIPAGE; - hfill = fl_get_button(extra_->radio_pextra_hfill); - start_minipage = fl_get_button(extra_->radio_pextra_startmp); - if (fl_get_button(extra_->radio_pextra_top)) - alignment = LyXParagraph::MINIPAGE_ALIGN_TOP; - else if (fl_get_button(extra_->radio_pextra_middle)) - alignment = LyXParagraph::MINIPAGE_ALIGN_MIDDLE; - else if (fl_get_button(extra_->radio_pextra_bottom)) - alignment = LyXParagraph::MINIPAGE_ALIGN_BOTTOM; - } else if (fl_get_button(extra_->radio_pextra_floatflt)) { - type = LyXParagraph::PEXTRA_FLOATFLT; - } - text->SetParagraphExtraOpt(lv_->view(), type, width, widthp, alignment, - hfill, start_minipage); + + // Actually apply these settings + lv_->view()->update(text, + BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE); + lv_->buffer()->markDirty(); + setMinibuffer(lv_, _("Paragraph layout set")); } -void FormParagraph::general_update() +void FormParagraph::update() { - if (!general_) + if (!dialog_.get()) return; + // Do this first; some objects may be de/activated subsequently. + bc_.readOnly(lv_->buffer()->isReadonly()); + Buffer * buf = lv_->view()->buffer(); - LyXText * text = 0; - if (lv_->view()->theLockingInset()) - text = lv_->view()->theLockingInset()->getLyXText(lv_->view()); - if (!text) - text = lv_->view()->text; + /// Record the paragraph + par_ = getCurrentParagraph(); - fl_set_input(general_->input_labelwidth, - text->cursor.par()->GetLabelWidthString().c_str()); - fl_set_button(general_->radio_align_right, 0); - fl_set_button(general_->radio_align_left, 0); - fl_set_button(general_->radio_align_center, 0); - fl_set_button(general_->radio_align_block, 0); + fl_set_input(dialog_->input_labelwidth, + par_->getLabelWidthString().c_str()); + setEnabled(dialog_->input_labelwidth, + (par_->getLabelWidthString() != _("Senseless with this layout!"))); - int align = text->cursor.par()->GetAlign(); + fl_set_button(dialog_->radio_align_right, 0); + fl_set_button(dialog_->radio_align_left, 0); + fl_set_button(dialog_->radio_align_center, 0); + fl_set_button(dialog_->radio_align_block, 0); + + LyXTextClass const & tclass = textclasslist[buf->params.textclass]; + + int align = par_->getAlign(); if (align == LYX_ALIGN_LAYOUT) - align = textclasslist.Style(buf->params.textclass, - text->cursor.par()->GetLayout()).align; - + align = tclass[par_->layout()].align; + switch (align) { case LYX_ALIGN_RIGHT: - fl_set_button(general_->radio_align_right, 1); + fl_set_button(dialog_->radio_align_right, 1); break; case LYX_ALIGN_LEFT: - fl_set_button(general_->radio_align_left, 1); + fl_set_button(dialog_->radio_align_left, 1); break; case LYX_ALIGN_CENTER: - fl_set_button(general_->radio_align_center, 1); + fl_set_button(dialog_->radio_align_center, 1); break; default: - fl_set_button(general_->radio_align_block, 1); + fl_set_button(dialog_->radio_align_block, 1); break; } -#ifndef NEW_INSETS - fl_set_button(general_->check_lines_top, - text->cursor.par()->FirstPhysicalPar()->line_top); - - fl_set_button(general_->check_lines_bottom, - text->cursor.par()->FirstPhysicalPar()->line_bottom); - - fl_set_button(general_->check_pagebreaks_top, - text->cursor.par()->FirstPhysicalPar()->pagebreak_top); + LyXAlignment alignpos = tclass[par_->layout()].alignpossible; + + setEnabled(dialog_->radio_align_block, bool(alignpos & LYX_ALIGN_BLOCK)); + setEnabled(dialog_->radio_align_center, bool(alignpos & LYX_ALIGN_CENTER)); + setEnabled(dialog_->radio_align_left, bool(alignpos & LYX_ALIGN_LEFT)); + setEnabled(dialog_->radio_align_right, bool(alignpos & LYX_ALIGN_RIGHT)); - fl_set_button(general_->check_pagebreaks_bottom, - text->cursor.par()->FirstPhysicalPar()->pagebreak_bottom); - fl_set_button(general_->check_noindent, - text->cursor.par()->FirstPhysicalPar()->noindent); -#else - fl_set_button(general_->check_lines_top, - text->cursor.par()->line_top); - fl_set_button(general_->check_lines_bottom, - text->cursor.par()->line_bottom); - fl_set_button(general_->check_pagebreaks_top, - text->cursor.par()->pagebreak_top); - fl_set_button(general_->check_pagebreaks_bottom, - text->cursor.par()->pagebreak_bottom); - fl_set_button(general_->check_noindent, - text->cursor.par()->noindent); -#endif - fl_set_input (general_->input_space_above, ""); + // no inset-text-owned paragraph may have pagebreaks + setEnabled(dialog_->check_pagebreaks_top, !par_->inInset()); + setEnabled(dialog_->check_pagebreaks_bottom, !par_->inInset()); + + fl_set_button(dialog_->check_lines_top, + par_->params().lineTop()); + fl_set_button(dialog_->check_lines_bottom, + par_->params().lineBottom()); + fl_set_button(dialog_->check_pagebreaks_top, + par_->params().pagebreakTop()); + fl_set_button(dialog_->check_pagebreaks_bottom, + par_->params().pagebreakBottom()); + fl_set_button(dialog_->check_noindent, + par_->params().noindent()); + + int linespacing; + Spacing const space = par_->params().spacing(); + + switch (space.getSpace()) { + default: linespacing = 1; break; + case Spacing::Single: linespacing = 2; break; + case Spacing::Onehalf: linespacing = 3; break; + case Spacing::Double: linespacing = 4; break; + case Spacing::Other: linespacing = 5; break; + } + + fl_set_choice(dialog_->choice_linespacing, linespacing); + if (space.getSpace() == Spacing::Other) { + string const sp = tostr(space.getValue()); + fl_set_input(dialog_->input_linespacing, sp.c_str()); + setEnabled(dialog_->input_linespacing, true); + } else { + fl_set_input(dialog_->input_linespacing, ""); + setEnabled(dialog_->input_linespacing, false); + } -#ifndef NEW_INSETS - switch (text->cursor.par()->FirstPhysicalPar()->added_space_top.kind()) { -#else - switch (text->cursor.par()->added_space_top.kind()) { -#endif + fl_set_input (dialog_->input_space_above, ""); + setEnabled(dialog_->input_space_above, false); + setEnabled(dialog_->choice_value_space_above, false); + switch (par_->params().spaceTop().kind()) { case VSpace::NONE: - fl_set_choice (general_->choice_space_above, 1); + fl_set_choice (dialog_->choice_space_above, 1); break; case VSpace::DEFSKIP: - fl_set_choice (general_->choice_space_above, 2); + fl_set_choice (dialog_->choice_space_above, 2); break; case VSpace::SMALLSKIP: - fl_set_choice (general_->choice_space_above, 3); + fl_set_choice (dialog_->choice_space_above, 3); break; case VSpace::MEDSKIP: - fl_set_choice (general_->choice_space_above, 4); + fl_set_choice (dialog_->choice_space_above, 4); break; case VSpace::BIGSKIP: - fl_set_choice (general_->choice_space_above, 5); + fl_set_choice (dialog_->choice_space_above, 5); break; case VSpace::VFILL: - fl_set_choice (general_->choice_space_above, 6); + fl_set_choice (dialog_->choice_space_above, 6); break; case VSpace::LENGTH: - fl_set_choice (general_->choice_space_above, 7); -#ifndef NEW_INSETS - fl_set_input(general_->input_space_above, - text->cursor.par()->FirstPhysicalPar()-> - added_space_top.length().asString().c_str()); -#else - fl_set_input(general_->input_space_above, text->cursor.par()-> - added_space_top.length().asString().c_str()); -#endif + { + fl_set_choice (dialog_->choice_space_above, 7); + setEnabled(dialog_->input_space_above, true); + setEnabled(dialog_->choice_value_space_above, true); + bool const metric = lyxrc.default_papersize > 3; + string const default_unit = metric ? "cm" : "in"; + string const length = par_->params().spaceTop().length().asString(); + updateWidgetsFromLengthString(dialog_->input_space_above, + dialog_->choice_value_space_above, + length, default_unit); break; } -#ifndef NEW_INSETS - fl_set_button(general_->check_space_above, - text->cursor.par()->FirstPhysicalPar()-> - added_space_top.keep()); - fl_set_input(general_->input_space_below, ""); - switch (text->cursor.par()->FirstPhysicalPar()-> - added_space_bottom.kind()) { -#else - fl_set_button (general_->check_space_above, - text->cursor.par()->added_space_top.keep()); - fl_set_input (general_->input_space_below, ""); - switch (text->cursor.par()->added_space_bottom.kind()) { -#endif + } + + fl_set_button (dialog_->check_space_above, + par_->params().spaceTop().keep()); + fl_set_input (dialog_->input_space_below, ""); + + setEnabled(dialog_->input_space_below, false); + setEnabled(dialog_->choice_value_space_below, false); + switch (par_->params().spaceBottom().kind()) { case VSpace::NONE: - fl_set_choice (general_->choice_space_below, 1); + fl_set_choice (dialog_->choice_space_below, 1); break; case VSpace::DEFSKIP: - fl_set_choice (general_->choice_space_below, 2); + fl_set_choice (dialog_->choice_space_below, 2); break; case VSpace::SMALLSKIP: - fl_set_choice (general_->choice_space_below, 3); + fl_set_choice (dialog_->choice_space_below, 3); break; case VSpace::MEDSKIP: - fl_set_choice (general_->choice_space_below, 4); + fl_set_choice (dialog_->choice_space_below, 4); break; case VSpace::BIGSKIP: - fl_set_choice (general_->choice_space_below, 5); + fl_set_choice (dialog_->choice_space_below, 5); break; case VSpace::VFILL: - fl_set_choice (general_->choice_space_below, 6); + fl_set_choice (dialog_->choice_space_below, 6); break; case VSpace::LENGTH: - fl_set_choice (general_->choice_space_below, 7); -#ifndef NEW_INSETS - fl_set_input(general_->input_space_below, - text->cursor.par()->FirstPhysicalPar()-> - added_space_bottom.length().asString().c_str()); + { + fl_set_choice (dialog_->choice_space_below, 7); + setEnabled(dialog_->input_space_below, true); + setEnabled(dialog_->choice_value_space_below, true); + bool const metric = lyxrc.default_papersize > 3; + string const default_unit = metric ? "cm" : "in"; + string const length = + par_->params().spaceBottom().length().asString(); + updateWidgetsFromLengthString(dialog_->input_space_below, + dialog_->choice_value_space_below, + length, default_unit); break; } - fl_set_button(general_->check_space_below, - text->cursor.par()->FirstPhysicalPar()-> - added_space_bottom.keep()); - fl_set_button(general_->check_noindent, - text->cursor.par()->FirstPhysicalPar()->noindent); - if (text->cursor.par()->FirstPhysicalPar()->InInset()) { - fl_set_button(general_->check_pagebreaks_top, 0); - fl_deactivate_object(general_->check_pagebreaks_top); - fl_set_object_lcol(general_->check_pagebreaks_top, FL_INACTIVE); - fl_set_button(general_->check_pagebreaks_bottom, 0); - fl_deactivate_object(general_->check_pagebreaks_bottom); - fl_set_object_lcol(general_->check_pagebreaks_bottom, FL_INACTIVE); - } else { - fl_activate_object(general_->check_pagebreaks_top); - fl_set_object_lcol(general_->check_pagebreaks_top, FL_BLACK); - fl_activate_object(general_->check_pagebreaks_bottom); - fl_set_object_lcol(general_->check_pagebreaks_bottom, FL_BLACK); } -#else - fl_set_input(general_->input_space_below, text->cursor.par()-> - added_space_bottom.length().asString().c_str()); - break; - } - fl_set_button(general_->check_space_below, - text->cursor.par()->added_space_bottom.keep()); - fl_set_button(general_->check_noindent, - text->cursor.par()->noindent); -#endif -} - - -void FormParagraph::extra_update() -{ - if (!lv_->view()->available() || !extra_) - return; - - LyXParagraph * par = lv_->view()->text->cursor.par(); - fl_activate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_BLACK); - fl_activate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_BLACK); - fl_set_input(extra_->input_pextra_width, - par->pextra_width.c_str()); - fl_set_input(extra_->input_pextra_widthp, - par->pextra_widthp.c_str()); - switch(par->pextra_alignment) { - case LyXParagraph::MINIPAGE_ALIGN_TOP: - fl_set_button(extra_->radio_pextra_top, 1); - break; - case LyXParagraph::MINIPAGE_ALIGN_MIDDLE: - fl_set_button(extra_->radio_pextra_middle, 1); - break; - case LyXParagraph::MINIPAGE_ALIGN_BOTTOM: - fl_set_button(extra_->radio_pextra_bottom, 1); - break; - } - fl_set_button(extra_->radio_pextra_hfill, - par->pextra_hfill); - fl_set_button(extra_->radio_pextra_startmp, - par->pextra_start_minipage); - if (par->pextra_type == LyXParagraph::PEXTRA_INDENT) { - fl_set_button(extra_->radio_pextra_indent, 1); - fl_set_button(extra_->radio_pextra_minipage, 0); - fl_set_button(extra_->radio_pextra_floatflt, 0); - fl_deactivate_object(extra_->radio_pextra_top); - fl_set_object_lcol(extra_->radio_pextra_top, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_middle); - fl_set_object_lcol(extra_->radio_pextra_middle, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_bottom); - fl_set_object_lcol(extra_->radio_pextra_bottom, FL_INACTIVE); - input(extra_->radio_pextra_indent, 0); - } else if (par->pextra_type == LyXParagraph::PEXTRA_MINIPAGE) { - fl_set_button(extra_->radio_pextra_indent, 0); - fl_set_button(extra_->radio_pextra_minipage, 1); - fl_set_button(extra_->radio_pextra_floatflt, 0); - fl_activate_object(extra_->radio_pextra_top); - fl_set_object_lcol(extra_->radio_pextra_top, FL_BLACK); - fl_activate_object(extra_->radio_pextra_middle); - fl_set_object_lcol(extra_->radio_pextra_middle, FL_BLACK); - fl_activate_object(extra_->radio_pextra_bottom); - fl_set_object_lcol(extra_->radio_pextra_bottom, FL_BLACK); - input(extra_->radio_pextra_minipage, 0); - } else if (par->pextra_type == LyXParagraph::PEXTRA_FLOATFLT) { - fl_set_button(extra_->radio_pextra_indent, 0); - fl_set_button(extra_->radio_pextra_minipage, 0); - fl_set_button(extra_->radio_pextra_floatflt, 1); - fl_deactivate_object(extra_->radio_pextra_top); - fl_set_object_lcol(extra_->radio_pextra_top, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_middle); - fl_set_object_lcol(extra_->radio_pextra_middle, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_bottom); - fl_set_object_lcol(extra_->radio_pextra_bottom, FL_INACTIVE); - input(extra_->radio_pextra_floatflt, 0); - } else { - fl_set_button(extra_->radio_pextra_indent, 0); - fl_set_button(extra_->radio_pextra_minipage, 0); - fl_set_button(extra_->radio_pextra_floatflt, 0); - fl_deactivate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_INACTIVE); - fl_deactivate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_top); - fl_set_object_lcol(extra_->radio_pextra_top, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_middle); - fl_set_object_lcol(extra_->radio_pextra_middle, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_bottom); - fl_set_object_lcol(extra_->radio_pextra_bottom, FL_INACTIVE); - input(0, 0); - } - fl_hide_object(dialog_->text_warning); + fl_set_button(dialog_->check_space_below, + par_->params().spaceBottom().keep()); + fl_set_button(dialog_->check_noindent, + par_->params().noindent()); } bool FormParagraph::input(FL_OBJECT * ob, long) { - bool ret = true; + bool valid = true; fl_hide_object(dialog_->text_warning); // First check the buttons which are exclusive and you have to // check only the actuall de/activated button. // - // general form first - // // "Synchronize" the choices and input fields, making it // impossible to commit senseless data. - if (ob == general_->choice_space_above) { - if (fl_get_choice (general_->choice_space_above) != 7) - fl_set_input (general_->input_space_above, ""); - } else if (ob == general_->choice_space_below) { - if (fl_get_choice (general_->choice_space_below) != 7) - fl_set_input (general_->input_space_below, ""); + + if (ob == dialog_->choice_space_above) { + if (fl_get_choice (dialog_->choice_space_above) != 7) { + fl_set_input (dialog_->input_space_above, ""); + setEnabled (dialog_->input_space_above, false); + setEnabled (dialog_->choice_value_space_above, false); + } else { + setEnabled (dialog_->input_space_above, !lv_->buffer()->isReadonly()); + setEnabled (dialog_->choice_value_space_above, !lv_->buffer()->isReadonly()); + bool const metric = lyxrc.default_papersize > 3; + int const default_unit = metric ? 8 : 9; + if (strip(fl_get_input(dialog_->input_space_above)).empty()) + fl_set_choice(dialog_->choice_value_space_above, + default_unit); + } } - // - // then the extra form - // - else if (ob == extra_->radio_pextra_indent) { - int n = fl_get_button(extra_->radio_pextra_indent); - if (n) { - fl_set_button(extra_->radio_pextra_minipage, 0); - fl_set_button(extra_->radio_pextra_floatflt, 0); - fl_activate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_BLACK); - fl_activate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_BLACK); - } else { - fl_deactivate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_INACTIVE); - fl_deactivate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_INACTIVE); - } - fl_deactivate_object(extra_->radio_pextra_top); - fl_set_object_lcol(extra_->radio_pextra_top, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_middle); - fl_set_object_lcol(extra_->radio_pextra_middle, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_bottom); - fl_set_object_lcol(extra_->radio_pextra_bottom, FL_INACTIVE); - fl_activate_object(extra_->radio_pextra_hfill); - fl_set_object_lcol(extra_->radio_pextra_hfill, FL_INACTIVE); - fl_activate_object(extra_->radio_pextra_startmp); - fl_set_object_lcol(extra_->radio_pextra_startmp, FL_INACTIVE); - } else if (ob == extra_->radio_pextra_minipage) { - int n = fl_get_button(extra_->radio_pextra_minipage); - if (n) { - fl_set_button(extra_->radio_pextra_indent, 0); - fl_set_button(extra_->radio_pextra_floatflt, 0); - fl_activate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_BLACK); - fl_activate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_BLACK); - fl_activate_object(extra_->radio_pextra_top); - fl_set_object_lcol(extra_->radio_pextra_top, FL_BLACK); - fl_activate_object(extra_->radio_pextra_middle); - fl_set_object_lcol(extra_->radio_pextra_middle, FL_BLACK); - fl_activate_object(extra_->radio_pextra_bottom); - fl_set_object_lcol(extra_->radio_pextra_bottom, FL_BLACK); - fl_activate_object(extra_->radio_pextra_hfill); - fl_set_object_lcol(extra_->radio_pextra_hfill, FL_BLACK); - fl_activate_object(extra_->radio_pextra_startmp); - fl_set_object_lcol(extra_->radio_pextra_startmp, FL_BLACK); - } else { - fl_deactivate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_INACTIVE); - fl_deactivate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_top); - fl_set_object_lcol(extra_->radio_pextra_top, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_middle); - fl_set_object_lcol(extra_->radio_pextra_middle, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_bottom); - fl_set_object_lcol(extra_->radio_pextra_bottom, FL_INACTIVE); - fl_activate_object(extra_->radio_pextra_hfill); - fl_set_object_lcol(extra_->radio_pextra_hfill, FL_INACTIVE); - fl_activate_object(extra_->radio_pextra_startmp); - fl_set_object_lcol(extra_->radio_pextra_startmp, FL_INACTIVE); - } - } else if (ob == extra_->radio_pextra_floatflt) { - int n = fl_get_button(extra_->radio_pextra_floatflt); - if (n) { - fl_set_button(extra_->radio_pextra_indent, 0); - fl_set_button(extra_->radio_pextra_minipage, 0); - fl_activate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_BLACK); - fl_activate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_BLACK); - } else { - fl_deactivate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_INACTIVE); - fl_deactivate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_INACTIVE); - } - fl_deactivate_object(extra_->radio_pextra_top); - fl_set_object_lcol(extra_->radio_pextra_top, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_middle); - fl_set_object_lcol(extra_->radio_pextra_middle, FL_INACTIVE); - fl_deactivate_object(extra_->radio_pextra_bottom); - fl_set_object_lcol(extra_->radio_pextra_bottom, FL_INACTIVE); - fl_activate_object(extra_->radio_pextra_hfill); - fl_set_object_lcol(extra_->radio_pextra_hfill, FL_INACTIVE); - fl_activate_object(extra_->radio_pextra_startmp); - fl_set_object_lcol(extra_->radio_pextra_startmp, FL_INACTIVE); + if (ob == dialog_->choice_space_below) { + if (fl_get_choice (dialog_->choice_space_below) != 7) { + fl_set_input (dialog_->input_space_below, ""); + setEnabled (dialog_->input_space_below, false); + setEnabled (dialog_->choice_value_space_below, false); + } else { + setEnabled (dialog_->input_space_below, !lv_->buffer()->isReadonly()); + setEnabled (dialog_->choice_value_space_below, !lv_->buffer()->isReadonly()); + bool const metric = lyxrc.default_papersize > 3; + int const default_unit = metric ? 8 : 9; + if (strip(fl_get_input(dialog_->input_space_below)).empty()) + fl_set_choice(dialog_->choice_value_space_below, + default_unit); + } } - + // - // first the general form + // warnings if input is senseless // - string input = fl_get_input (general_->input_space_above); - - if (input.empty()) { - fl_set_choice (general_->choice_space_above, 1); - } else if (isValidGlueLength (input)) { - fl_set_choice (general_->choice_space_above, 7); - } else { - fl_set_choice (general_->choice_space_above, 7); - fl_set_object_label(dialog_->text_warning, - _("Warning: Invalid Length (valid example: 10mm)")); - fl_show_object(dialog_->text_warning); - ret = false; - } - - input = fl_get_input (general_->input_space_below); - - if (input.empty()) { - fl_set_choice (general_->choice_space_below, 1); - } else if (isValidGlueLength(input)) { - fl_set_choice (general_->choice_space_below, 7); - } else { - fl_set_choice (general_->choice_space_below, 7); - fl_set_object_label(dialog_->text_warning, - _("Warning: Invalid Length (valid example: 10mm)")); - fl_show_object(dialog_->text_warning); - ret = false; + string input = fl_get_input (dialog_->input_space_above); + bool invalid = false; + + if (fl_get_choice(dialog_->choice_space_above)==7) + invalid = !input.empty() && !isValidGlueLength(input) && !isStrDbl(input); + + input = fl_get_input (dialog_->input_space_below); + + if (fl_get_choice(dialog_->choice_space_below)==7) + invalid = invalid + || (!input.empty() && !isValidGlueLength(input) && !isStrDbl(input)); + + if (ob == dialog_->input_space_above || ob == dialog_->input_space_below) { + if (invalid) { + fl_set_object_label(dialog_->text_warning, + _("Warning: Invalid Length (valid example: 10mm)")); + fl_show_object(dialog_->text_warning); + return false; + } else { + fl_hide_object(dialog_->text_warning); + return true; + } } - // - // then the extra form - // - int n = fl_get_button(extra_->radio_pextra_indent) + - fl_get_button(extra_->radio_pextra_minipage) + - fl_get_button(extra_->radio_pextra_floatflt); - string s1 = fl_get_input(extra_->input_pextra_width); - string s2 = fl_get_input(extra_->input_pextra_widthp); - if (!n) { // no button pressed both should be deactivated now - fl_deactivate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_INACTIVE); - fl_deactivate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_INACTIVE); - fl_hide_object(dialog_->text_warning); - } else if (s1.empty() && s2.empty()) { - fl_activate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_BLACK); - fl_activate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_BLACK); - fl_hide_object(dialog_->text_warning); - ret = false; - } else if (!s1.empty()) { // LyXLength parameter - fl_activate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_BLACK); - fl_deactivate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_INACTIVE); - if (!isValidLength(s1)) { - fl_set_object_label(dialog_->text_warning, - _("Warning: Invalid Length (valid example: 10mm)")); - fl_show_object(dialog_->text_warning); - ret = false; - } - } else { // !s2.empty() % parameter - fl_deactivate_object(extra_->input_pextra_width); - fl_set_object_lcol(extra_->input_pextra_width, FL_INACTIVE); - fl_activate_object(extra_->input_pextra_widthp); - fl_set_object_lcol(extra_->input_pextra_widthp, FL_BLACK); - if ((lyx::atoi(s2) < 0 ) || (lyx::atoi(s2) > 100)) { - ret = false; - fl_set_object_label(dialog_->text_warning, - _("Warning: Invalid percent value (0-100)")); - fl_show_object(dialog_->text_warning); - } + + if (fl_get_choice (dialog_->choice_linespacing) == 5) + setEnabled (dialog_->input_linespacing, true); + else { + setEnabled (dialog_->input_linespacing, false); + fl_set_input (dialog_->input_linespacing, ""); } - return ret; -} + double spacing(strToDbl(fl_get_input(dialog_->input_linespacing))); + + if (fl_get_choice (dialog_->choice_linespacing) == 5 + && int(spacing) == 0) + valid = false; + + return valid; +}