]> git.lyx.org Git - lyx.git/blob - src/frontends/gtk/GParagraph.C
some tabular fixes for the problems reported by Helge
[lyx.git] / src / frontends / gtk / GParagraph.C
1 /**
2  * \file GParagraph.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author John Spray
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 // Too hard to make concept checks work with this file
14 #ifdef _GLIBCXX_CONCEPT_CHECKS
15 #undef _GLIBCXX_CONCEPT_CHECKS
16 #endif
17 #ifdef _GLIBCPP_CONCEPT_CHECKS
18 #undef _GLIBCPP_CONCEPT_CHECKS
19 #endif
20
21 #include "GParagraph.h"
22 #include "ghelpers.h"
23
24 #include "ControlParagraph.h"
25 #include "controllers/helper_funcs.h"
26
27 #include "ParagraphParameters.h"
28 #include "Spacing.h"
29 #include "support/lstrings.h"
30
31 using std::string;
32
33
34 namespace lyx {
35
36 namespace frontend {
37
38 namespace {
39
40 } // namespace anon
41
42
43 GParagraph::GParagraph(Dialog & parent)
44         : GViewCB<ControlParagraph, GViewGladeB>(parent, _("Paragraph Settings"), false)
45 {}
46
47 void GParagraph::doBuild()
48 {
49         string const gladeName = findGladeFile("paragraph");
50         xml_ = Gnome::Glade::Xml::create(gladeName);
51
52         xml_->get_widget("LineSpacing", spacingspin_);
53         xml_->get_widget("DefaultLineSpacing", defaultspacingcheck_);
54         xml_->get_widget("MaxLabelWidth", maxlabelwidthentry_);
55         xml_->get_widget("Indent", indentcheck_);
56         xml_->get_widget("AlignBlock", blockradio_);
57         xml_->get_widget("AlignLeft", leftradio_);
58         xml_->get_widget("AlignRight", rightradio_);
59         xml_->get_widget("AlignCenter", centerradio_);
60
61         // Manage the Close button
62         Gtk::Button * button;
63         xml_->get_widget("Close", button);
64         setCancel(button);
65
66         // Make the main hbox sensitive to readonly
67         Gtk::Widget * controlbox;
68         xml_->get_widget("ControlBox", controlbox);
69         bcview().addReadOnly(controlbox);
70
71         spacingadj_ = spacingspin_->get_adjustment();
72
73         defaultspacingcheck_->signal_toggled().connect(
74                 sigc::mem_fun(*this, &GParagraph::onDefaultSpacingToggled));
75         indentcheck_->signal_toggled().connect(
76                 sigc::mem_fun(*this, &GParagraph::onIndentToggled));
77         spacingadj_->signal_value_changed().connect(
78                 sigc::mem_fun(*this, &GParagraph::onSpacingChanged));
79         maxlabelwidthentry_->signal_changed().connect(
80                 sigc::mem_fun(*this, &GParagraph::onMaxLabelWidthChanged));
81
82         blockradio_->signal_toggled().connect(
83                 sigc::mem_fun(*this, &GParagraph::onAlignToggled));
84         leftradio_->signal_toggled().connect(
85                 sigc::mem_fun(*this, &GParagraph::onAlignToggled));
86         rightradio_->signal_toggled().connect(
87                 sigc::mem_fun(*this, &GParagraph::onAlignToggled));
88         centerradio_->signal_toggled().connect(
89                 sigc::mem_fun(*this, &GParagraph::onAlignToggled));
90 }
91
92
93 void GParagraph::update()
94 {
95         // label width
96         string const labelwidth = controller().params().labelWidthString();
97         maxlabelwidthentry_->set_text(labelwidth);
98         maxlabelwidthentry_->set_sensitive(
99                 labelwidth != _("Senseless with this layout!"));
100
101         // alignment
102         LyXAlignment const current_alignment = controller().params().align();
103         switch (current_alignment) {
104                 case LYX_ALIGN_BLOCK:
105                         blockradio_->set_active(true);
106                         break;
107                 case LYX_ALIGN_LEFT:
108                         leftradio_->set_active(true);
109                         break;
110                 case LYX_ALIGN_RIGHT:
111                         rightradio_->set_active(true);
112                         break;
113                 case LYX_ALIGN_CENTER:
114                         centerradio_->set_active(true);
115                         break;
116                 default:
117                         // LYX_ALIGN_SPECIAL or so?  Don't ask, don't tell.
118                         centerradio_->set_active(false);
119                         blockradio_->set_active(false);
120                         rightradio_->set_active(false);
121                         leftradio_->set_active(false);
122         }
123
124         // Find out which alignments options are available
125         LyXAlignment alignpos = controller().alignPossible();
126         blockradio_->set_sensitive(bool(alignpos & LYX_ALIGN_BLOCK));
127         centerradio_->set_sensitive(bool(alignpos & LYX_ALIGN_CENTER));
128         leftradio_->set_sensitive(bool(alignpos & LYX_ALIGN_LEFT));
129         rightradio_->set_sensitive(bool(alignpos & LYX_ALIGN_RIGHT));
130
131         // We give the user a checkbox with an affirmative description, so
132         // invert the setting
133         indentcheck_->set_active(!controller().params().noindent());
134
135         // linespacing
136         Spacing const space = controller().params().spacing();
137
138         // This emits the toggled signal, setting up sensitivities
139         defaultspacingcheck_->set_active(
140                 space.getSpace() == Spacing::Default);
141
142         spacingadj_->set_value(space.getValue());
143 }
144
145
146 void GParagraph::onDefaultSpacingToggled()
147 {
148         if (defaultspacingcheck_->get_active()) {
149                 spacingspin_->set_sensitive(false);
150                 Spacing const spacing(Spacing::Default, spacingadj_->get_value());
151                 controller().params().spacing(spacing);
152         }       else {
153                 spacingspin_->set_sensitive(true);
154                 Spacing const spacing(Spacing::Other, spacingadj_->get_value());
155                 controller().params().spacing(spacing);
156         }
157         controller().dispatchParams();
158 }
159
160
161 void GParagraph::onIndentToggled()
162 {
163         controller().params().noindent(!indentcheck_->get_active());
164         controller().dispatchParams();
165 }
166
167
168 void GParagraph::onSpacingChanged()
169 {
170         Spacing const spacing(Spacing::Other, spacingadj_->get_value());
171         controller().params().spacing(spacing);
172         controller().dispatchParams();
173 }
174
175
176 void GParagraph::onMaxLabelWidthChanged()
177 {
178         controller().params().labelWidthString(
179                 maxlabelwidthentry_->get_text());
180         controller().dispatchParams();
181 }
182
183
184 void GParagraph::onAlignToggled()
185 {
186         if (blockradio_->get_active())
187                 controller().params().align(LYX_ALIGN_BLOCK);
188         else if (leftradio_->get_active())
189                 controller().params().align(LYX_ALIGN_LEFT);
190         else if (rightradio_->get_active())
191                 controller().params().align(LYX_ALIGN_RIGHT);
192         else if (centerradio_->get_active())
193                 controller().params().align(LYX_ALIGN_CENTER);
194
195         controller().dispatchParams();
196 }
197
198
199 } // namespace frontend
200 } // namespace lyx