]> git.lyx.org Git - lyx.git/blob - src/frontends/qt2/QVSpace.C
The VSpace fixes (removal of VSPACE::NONE) from Michael and myself
[lyx.git] / src / frontends / qt2 / QVSpace.C
1 /**
2  * \file QVSpace.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author André Pönitz
7  * \author Jürgen Vigna
8  * \author Rob Lahaye
9  * \author Angus Leeming
10  * \author Edwin Leuven
11  * \author Jürgen Spitzmüller
12  *
13  * Full author contact details are available in file CREDITS.
14  */
15
16 #include <config.h>
17
18 #include "debug.h"
19 #include "ControlVSpace.h"
20 #include "QVSpace.h"
21 #include "QVSpaceDialog.h"
22 #include "Qt2BC.h"
23 #include "lyxrc.h" // to set the default length values
24 #include "qt_helpers.h"
25 #include "helper_funcs.h"
26
27 #include "Spacing.h"
28 #include "vspace.h"
29
30 #include "support/lstrings.h"
31 #include "support/tostr.h"
32
33 #include <qcombobox.h>
34 #include <qlineedit.h>
35 #include <qcheckbox.h>
36 #include <qpushbutton.h>
37 #include "lengthcombo.h"
38
39
40 using std::string;
41
42
43 namespace {
44
45 void setWidgetsFromVSpace(VSpace const & space,
46                           QComboBox * spacing,
47                           QLineEdit * value,
48                           LengthCombo * unit,
49                           QCheckBox * keep)
50 {
51         int item = 0;
52         switch (space.kind()) {
53         case VSpace::DEFSKIP:
54                 item = 0;
55                 break;
56         case VSpace::SMALLSKIP:
57                 item = 1;
58                 break;
59         case VSpace::MEDSKIP:
60                 item = 2;
61                 break;
62         case VSpace::BIGSKIP:
63                 item = 3;
64                 break;
65         case VSpace::VFILL:
66                 item = 4;
67                 break;
68         case VSpace::LENGTH:
69                 item = 5;
70                 break;
71         }
72         spacing->setCurrentItem(item);
73         keep->setChecked(space.keep());
74
75         LyXLength::UNIT default_unit =
76                         (lyxrc.default_papersize > 3) ? LyXLength::CM : LyXLength::IN;
77         bool const custom_vspace = space.kind() == VSpace::LENGTH;
78         if (custom_vspace) {
79                 value->setEnabled(true);
80                 unit->setEnabled(true);
81                 string length = space.length().asString();
82                 lengthToWidgets(value, unit, length, default_unit);
83         } else {
84                 lengthToWidgets(value, unit, "", default_unit);
85                 value->setEnabled(false);
86                 unit->setEnabled(false);
87         }
88 }
89
90
91 VSpace setVSpaceFromWidgets(int spacing,
92                             QLineEdit * value,
93                             LengthCombo * unit,
94                             bool keep)
95 {
96         VSpace space = VSpace(VSpace::DEFSKIP);
97
98         switch (spacing) {
99         case 0:
100                 space = VSpace(VSpace::DEFSKIP);
101                 break;
102         case 1:
103                 space = VSpace(VSpace::SMALLSKIP);
104                 break;
105         case 2:
106                 space = VSpace(VSpace::MEDSKIP);
107                 break;
108         case 3:
109                 space = VSpace(VSpace::BIGSKIP);
110                 break;
111         case 4:
112                 space = VSpace(VSpace::VFILL);
113                 break;
114         case 5:
115                 space = VSpace(LyXGlueLength(
116                                       widgetsToLength(value, unit)));
117                 break;
118         }
119
120         space.setKeep(keep);
121         return space;
122 }
123
124 } // namespace anon
125
126
127 typedef QController<ControlVSpace, QView<QVSpaceDialog> > base_class;
128
129 QVSpace::QVSpace(Dialog & parent)
130         : base_class(parent, _("LyX: Vertical Space Settings"))
131 {}
132
133
134 void QVSpace::build_dialog()
135 {
136         // the tabbed folder
137         dialog_.reset(new QVSpaceDialog(this));
138
139         // Manage the ok, apply, restore and cancel/close buttons
140         bcview().setOK(dialog_->okPB);
141         bcview().setApply(dialog_->applyPB);
142         bcview().setCancel(dialog_->closePB);
143
144         // disable for read-only documents
145         bcview().addReadOnly(dialog_->spacingCO);
146         bcview().addReadOnly(dialog_->valueLE);
147         bcview().addReadOnly(dialog_->unitCO);
148         bcview().addReadOnly(dialog_->keepCB);
149
150         // remove the %-items from the unit choice
151         dialog_->unitCO->noPercents();
152 }
153
154
155 void QVSpace::apply()
156 {
157         // spacing
158         // If a vspace choice is "Length" but there's no text in
159         // the input field, do not insert a vspace at all.
160         if (dialog_->spacingCO->currentItem() == 6
161             && dialog_->valueLE->text().isEmpty())
162                 return;
163
164         VSpace const space =
165                 setVSpaceFromWidgets(dialog_->spacingCO->currentItem(),
166                                      dialog_->valueLE,
167                                      dialog_->unitCO,
168                                      dialog_->keepCB->isChecked());
169
170         controller().params() = space;
171 }
172
173
174 void QVSpace::update_contents()
175 {
176         setWidgetsFromVSpace(controller().params(),
177                              dialog_->spacingCO,
178                              dialog_->valueLE,
179                              dialog_->unitCO,
180                              dialog_->keepCB);
181 }