I'm going to apply Rob's changes dialog by dialog, so that the changes
remain comprehensible.
The attached patch prepares the way by adding the "checked widget"
stuff to the button controller. It will have no effect on either frontend
as no dialog is using it yet.
Ok to apply?
Angus
Index: src/frontends/controllers/ButtonController.tmpl
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ButtonController.tmpl,v
retrieving revision 1.5
diff -u -p -r1.5 ButtonController.tmpl
--- src/frontends/controllers/ButtonController.tmpl 5 Sep 2002 15:14:20 -0000 1.5
+++ src/frontends/controllers/ButtonController.tmpl 22 Oct 2002 12:02:10 -0000
@@ -29,17 +29,22 @@ template <class Button, class Widget>
void GuiBC<Button, Widget>::refresh()
{
lyxerr[Debug::GUI] << "Calling BC refresh()" << std::endl;
-
+
+ bool const all_valid = checkWidgets();
+
if (okay_) {
- bool const enabled = bp().buttonStatus(ButtonPolicy::OKAY);
+ bool const enabled =
+ all_valid && bp().buttonStatus(ButtonPolicy::OKAY);
setButtonEnabled(okay_, enabled);
}
if (apply_) {
- bool const enabled = bp().buttonStatus(ButtonPolicy::APPLY);
+ bool const enabled =
+ all_valid && bp().buttonStatus(ButtonPolicy::APPLY);
setButtonEnabled(apply_, enabled);
}
if (restore_) {
- bool const enabled = bp().buttonStatus(ButtonPolicy::RESTORE);
+ bool const enabled =
+ all_valid && bp().buttonStatus(ButtonPolicy::RESTORE);
setButtonEnabled(restore_, enabled);
}
if (cancel_) {
Index: src/frontends/controllers/ButtonControllerBase.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ButtonControllerBase.C,v
retrieving revision 1.10
diff -u -p -r1.10 ButtonControllerBase.C
--- src/frontends/controllers/ButtonControllerBase.C 21 Oct 2002 17:38:08 -0000 1.10
+++ src/frontends/controllers/ButtonControllerBase.C 22 Oct 2002 12:02:10 -0000
@@ -18,6 +18,10 @@
#include "debug.h"
+CheckedWidget::~CheckedWidget()
+{}
+
+
ButtonControllerBase::ButtonControllerBase(string const & cancel,
string const & close)
: cancel_label_(cancel), close_label_(close)
@@ -98,3 +102,27 @@ void ButtonControllerBase::readWrite()
{
readOnly(false);
}
+
+
+void ButtonControllerBase::addCheckedWidget(CheckedWidget * ptr)
+{
+ if (ptr)
+ checked_widgets.push_back(checked_widget_ptr(ptr));
+}
+
+
+bool ButtonControllerBase::checkWidgets()
+{
+ bool valid = true;
+
+ checked_widget_list::const_iterator it = checked_widgets.begin();
+ checked_widget_list::const_iterator end = checked_widgets.end();
+
+ while (it != end) {
+ valid &= (*it++)->check();
+ }
+
+ // return valid status after checking ALL widgets
+ return valid;
+}
+
Index: src/frontends/controllers/ButtonControllerBase.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ButtonControllerBase.h,v
retrieving revision 1.10
diff -u -p -r1.10 ButtonControllerBase.h
--- src/frontends/controllers/ButtonControllerBase.h 21 Oct 2002 17:38:08 -0000 1.10
+++ src/frontends/controllers/ButtonControllerBase.h 22 Oct 2002 12:02:10 -0000
@@ -19,6 +19,21 @@
#include "ButtonPolicies.h"
#include "LString.h"
+#include <boost/shared_ptr.hpp>
+#include <list>
+
+struct CheckedWidget {
+ ///
+ virtual ~CheckedWidget();
+
+ /** Returns true if the widget is in a valid state.
+ * Might also change the visual appearance of the widget,
+ * to reflect this state.
+ */
+ virtual bool check() const = 0;
+};
+
+
/** Abstract base class for a ButtonController
* Controls the activation of the OK, Apply and Cancel buttons.
@@ -69,11 +84,23 @@ public:
void valid(bool = true);
///
void invalid();
+ ///
+ void addCheckedWidget(CheckedWidget * ptr);
+
protected:
///
string cancel_label_;
///
string close_label_;
+ ///
+ bool checkWidgets();
+
+private:
+ ///
+ typedef boost::shared_ptr<CheckedWidget> checked_widget_ptr;
+ typedef std::list<checked_widget_ptr> checked_widget_list;
+ ///
+ checked_widget_list checked_widgets;
};
#endif // BUTTONCONTROLLERBASE_H
Index: src/frontends/controllers/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ChangeLog,v
retrieving revision 1.238
diff -u -p -r1.238 ChangeLog
--- src/frontends/controllers/ChangeLog 21 Oct 2002 17:38:08 -0000 1.238
+++ src/frontends/controllers/ChangeLog 22 Oct 2002 12:02:11 -0000
@@ -1,3 +1,21 @@
+2002-10-22 Angus Leeming <[EMAIL PROTECTED]>
+
+ * Makefile.am (libcontrollers_la_SOURCES): arrange list into
+ alphabetical order once again.
+
+ * ButtonControllerBase.[Ch]: define an abstract base class CheckedWidget
+ Add a list of CheckedWidget ptrs to ButtonControllerBase
+ together with methods addCheckedWidget and checkWidgets to use it.
+
+ * ButtonController.tmpl (refresh): use the return value of
+ checkWidgets to control the activation state of the Ok, Apply, Restore
+ buttons.
+
+ * ControlDialog.tmpl (show, update):
+ * ControlInset.tmpl (showInset, update):
+ invoke ButtonController::refresh to ensure that the activation state of
+ the Ok, Apply buttons reflects the valid-state of the widgets.
+
2002-10-21 Lars Gullik Bj�nnes <[EMAIL PROTECTED]>
* tex_helpers.C (rescanTexStyles): don't pop p
Index: src/frontends/controllers/ControlDialog.tmpl
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ControlDialog.tmpl,v
retrieving revision 1.8
diff -u -p -r1.8 ControlDialog.tmpl
--- src/frontends/controllers/ControlDialog.tmpl 5 Sep 2002 15:14:21 -0000 1.8
+++ src/frontends/controllers/ControlDialog.tmpl 22 Oct 2002 12:02:11 -0000
@@ -45,6 +45,9 @@ void ControlDialog<Base>::show()
bc().readOnly(bufferIsReadonly());
view().show();
+
+ // The widgets may not be valid, so refresh the button controller
+ bc().refresh();
}
template <class Base>
@@ -61,6 +64,9 @@ void ControlDialog<Base>::update()
bc().readOnly(bufferIsReadonly());
view().update();
+
+ // The widgets may not be valid, so refresh the button controller
+ bc().refresh();
}
template <class Base>
Index: src/frontends/controllers/ControlInset.tmpl
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ControlInset.tmpl,v
retrieving revision 1.9
diff -u -p -r1.9 ControlInset.tmpl
--- src/frontends/controllers/ControlInset.tmpl 5 Sep 2002 15:14:21 -0000 1.9
+++ src/frontends/controllers/ControlInset.tmpl 22 Oct 2002 12:02:11 -0000
@@ -34,6 +34,9 @@ void ControlInset<Inset, Params>::showIn
connectInset(inset);
show(getParams(*inset));
+
+ // The widgets may not be valid, so refresh the button controller
+ bc().refresh();
}
@@ -91,6 +94,9 @@ void ControlInset<Inset, Params>::update
bc().readOnly(bufferIsReadonly());
view().update();
+
+ // The widgets may not be valid, so refresh the button controller
+ bc().refresh();
}
Index: src/frontends/controllers/Makefile.am
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/Makefile.am,v
retrieving revision 1.44
diff -u -p -r1.44 Makefile.am
--- src/frontends/controllers/Makefile.am 9 Oct 2002 08:59:01 -0000 1.44
+++ src/frontends/controllers/Makefile.am 22 Oct 2002 12:02:11 -0000
@@ -52,8 +52,6 @@ libcontrollers_la_SOURCES= \
ControlExternal.h \
ControlFloat.C \
ControlFloat.h \
- ControlWrap.C \
- ControlWrap.h \
ControlForks.C \
ControlForks.h \
ControlGraphics.C \
@@ -97,6 +95,8 @@ libcontrollers_la_SOURCES= \
ControlUrl.h \
ControlVCLog.C \
ControlVCLog.h \
+ ControlWrap.C \
+ ControlWrap.h \
GUI.h \
ViewBase.h \
helper_funcs.C \
Index: src/frontends/xforms/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/ChangeLog,v
retrieving revision 1.570
diff -u -p -r1.570 ChangeLog
--- src/frontends/xforms/ChangeLog 21 Oct 2002 19:58:41 -0000 1.570
+++ src/frontends/xforms/ChangeLog 22 Oct 2002 12:02:13 -0000
@@ -1,3 +1,14 @@
+2002-10-22 Angus Leeming <[EMAIL PROTECTED]>
+
+ * Makefile.am (libxforms_la_SOURCES): arrange list into alphabetical
+ order once again.
+ Add checkedwidgets.[Ch].
+
+ * checkedwidgets.[Ch]: new files, defining CheckedLyXLength and
+ CheckedGlueLength.
+
+ * xforms_helpers.[Ch] (isActive): new helper function.
+
2002-10-21 Lars Gullik Bj�nnes <[EMAIL PROTECTED]>
* xfont_loader.C (doLoad): typo
Index: src/frontends/xforms/Makefile.am
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/Makefile.am,v
retrieving revision 1.82
diff -u -p -r1.82 Makefile.am
--- src/frontends/xforms/Makefile.am 24 Sep 2002 18:20:25 -0000 1.82
+++ src/frontends/xforms/Makefile.am 22 Oct 2002 12:02:13 -0000
@@ -23,6 +23,8 @@ libxforms_la_SOURCES = \
forms_gettext.h \
bmtable.c \
bmtable.h \
+ checkedwidgets.C \
+ checkedwidgets.h \
combox.C \
combox.h \
input_validators.C \
@@ -85,8 +87,6 @@ libxforms_la_SOURCES = \
FormExternal.h \
FormFloat.C \
FormFloat.h \
- FormWrap.C \
- FormWrap.h \
FormForks.C \
FormForks.h \
FormGraphics.C \
@@ -147,6 +147,8 @@ libxforms_la_SOURCES = \
FormUrl.h \
FormVCLog.C \
FormVCLog.h \
+ FormWrap.C \
+ FormWrap.h \
LyXKeySymFactory.C \
LyXScreenFactory.C \
MathsCallbacks.h \
Index: src/frontends/xforms/checkedwidgets.C
===================================================================
RCS file: src/frontends/xforms/checkedwidgets.C
diff -N src/frontends/xforms/checkedwidgets.C
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/frontends/xforms/checkedwidgets.C 22 Oct 2002 12:02:13 -0000
@@ -0,0 +1,105 @@
+/**
+ * \file checkedwidgets.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Angus Leeming
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#include <config.h>
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include "checkedwidgets.h"
+#include "xforms_helpers.h"
+#include "lyxlength.h"
+#include "lyxgluelength.h"
+#include "support/LAssert.h"
+#include "support/lstrings.h"
+#include "LString.h"
+
+#include FORMS_H_LOCATION
+
+
+void addCheckedLyXLength(ButtonControllerBase & bc,
+ FL_OBJECT * input, FL_OBJECT * label)
+{
+ bc.addCheckedWidget(new CheckedLyXLength(input, label));
+}
+
+
+void addCheckedGlueLength(ButtonControllerBase & bc,
+ FL_OBJECT * input, FL_OBJECT * label)
+{
+ bc.addCheckedWidget(new CheckedGlueLength(input, label));
+}
+
+
+namespace {
+
+void setWidget(bool valid, FL_OBJECT * input, FL_OBJECT * label)
+{
+ // define color to mark invalid input
+ FL_COLOR const alert_col = FL_RED;
+
+ FL_COLOR const lcol = valid ? FL_LCOL : alert_col;
+ if (label->lcol != lcol && isActive(label)) {
+ fl_set_object_lcol(label, lcol);
+ }
+ if (input->lcol != lcol && isActive(input)) {
+ fl_set_object_lcol(input, lcol);
+ }
+
+ // set background color of input widget
+ FL_COLOR const icol1 = valid ? FL_INPUT_COL1 : alert_col;
+ FL_COLOR const icol2 = valid ? FL_INPUT_COL2 : alert_col;
+ if (input->col1 != icol1 || input->col2 != icol2) {
+ fl_set_object_color(input, icol1, icol2);
+ }
+}
+
+} // namespace anon
+
+
+CheckedLyXLength::CheckedLyXLength(FL_OBJECT * input, FL_OBJECT * label)
+ : input_(input), label_(label ? label : input)
+{
+ lyx::Assert(input && input->objclass == FL_INPUT);
+}
+
+
+bool CheckedLyXLength::check() const
+{
+ string const str = getString(input_);
+ bool const valid = !isActive(input_) || str.empty()
+ || isStrDbl(str) || isValidLength(str);
+
+ // set the color of label and input widget
+ setWidget(valid, input_, label_);
+
+ return valid;
+}
+
+
+CheckedGlueLength::CheckedGlueLength(FL_OBJECT * input, FL_OBJECT * label)
+ : input_(input), label_(label ? label : input)
+{
+ lyx::Assert(input && input->objclass == FL_INPUT);
+}
+
+
+bool CheckedGlueLength::check() const
+{
+ string const str = getString(input_);
+ bool const valid = !isActive(input_) || str.empty()
+ || isStrDbl(str) || isValidGlueLength(str);
+
+ // set the color of label and input widget
+ setWidget(valid, input_, label_);
+
+ return valid;
+}
Index: src/frontends/xforms/checkedwidgets.h
===================================================================
RCS file: src/frontends/xforms/checkedwidgets.h
diff -N src/frontends/xforms/checkedwidgets.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/frontends/xforms/checkedwidgets.h 22 Oct 2002 12:02:14 -0000
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+/**
+ * \file checkedwidgets.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Angus Leeming
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#ifndef CHECKEDWIDGETS_H
+#define CHECKEDWIDGETS_H
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include "ButtonControllerBase.h"
+#include "forms_fwd.h"
+
+void addCheckedLyXLength(ButtonControllerBase & bc,
+ FL_OBJECT * input, FL_OBJECT * label = 0);
+
+void addCheckedGlueLength(ButtonControllerBase & bc,
+ FL_OBJECT * input, FL_OBJECT * label = 0);
+
+class CheckedLyXLength : public CheckedWidget {
+public:
+ /** The label widget's label will be turned red if input
+ * does not make a valid LyXLength.
+ * If label == 0, then the label of input will be used.
+ */
+ CheckedLyXLength(FL_OBJECT * input, FL_OBJECT * label = 0);
+
+private:
+ ///
+ virtual bool check() const;
+
+ ///
+ FL_OBJECT * input_;
+ FL_OBJECT * label_;
+};
+
+
+class CheckedGlueLength : public CheckedWidget {
+public:
+ /** The label widget's label will be turned red if input
+ * does not make a valid LyXGlueLength.
+ * If label == 0, then the label of input will be used.
+ */
+ CheckedGlueLength(FL_OBJECT * input, FL_OBJECT * label = 0);
+
+private:
+ ///
+ virtual bool check() const;
+
+ ///
+ FL_OBJECT * input_;
+ FL_OBJECT * label_;
+};
+
+#endif // CHECKEDWIDGETS_H
Index: src/frontends/xforms/xforms_helpers.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/xforms_helpers.C,v
retrieving revision 1.50
diff -u -p -r1.50 xforms_helpers.C
--- src/frontends/xforms/xforms_helpers.C 9 Oct 2002 14:38:18 -0000 1.50
+++ src/frontends/xforms/xforms_helpers.C 22 Oct 2002 12:02:14 -0000
@@ -35,6 +35,12 @@ using std::ofstream;
using std::pair;
using std::vector;
+bool isActive(FL_OBJECT * ob)
+{
+ return ob && ob->active > 0;
+}
+
+
// Set an FL_OBJECT to activated or deactivated
void setEnabled(FL_OBJECT * ob, bool enable)
{
Index: src/frontends/xforms/xforms_helpers.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/xforms/xforms_helpers.h,v
retrieving revision 1.29
diff -u -p -r1.29 xforms_helpers.h
--- src/frontends/xforms/xforms_helpers.h 5 Sep 2002 15:14:23 -0000 1.29
+++ src/frontends/xforms/xforms_helpers.h 22 Oct 2002 12:02:14 -0000
@@ -32,6 +32,9 @@ string const choice_Length_All =
string const choice_Length_WithUnit =
"cm|mm|in|ex|em|pt|sp|bp|dd|pc|cc|mu"; // all with a Unit
+/// return the (in)active state of the object
+bool isActive(FL_OBJECT * ob);
+
/// Set an FL_OBJECT to activated or deactivated
void setEnabled(FL_OBJECT *, bool enable);