]> git.lyx.org Git - features.git/commitdiff
Rob's patch, part 1: the checked widget stuff.
authorAngus Leeming <leeming@lyx.org>
Tue, 22 Oct 2002 12:39:05 +0000 (12:39 +0000)
committerAngus Leeming <leeming@lyx.org>
Tue, 22 Oct 2002 12:39:05 +0000 (12:39 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@5467 a592a061-630c-0410-9148-cb99ea01b6c8

13 files changed:
src/frontends/controllers/ButtonController.tmpl
src/frontends/controllers/ButtonControllerBase.C
src/frontends/controllers/ButtonControllerBase.h
src/frontends/controllers/ChangeLog
src/frontends/controllers/ControlDialog.tmpl
src/frontends/controllers/ControlInset.tmpl
src/frontends/controllers/Makefile.am
src/frontends/xforms/ChangeLog
src/frontends/xforms/Makefile.am
src/frontends/xforms/checkedwidgets.C [new file with mode: 0644]
src/frontends/xforms/checkedwidgets.h [new file with mode: 0644]
src/frontends/xforms/xforms_helpers.C
src/frontends/xforms/xforms_helpers.h

index 72b88544441df4101e1fe753d1bbb5d5216d7dbe..024c4d2d43e850e07b0a41dfc6951889e9eea28b 100644 (file)
@@ -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 729c0a08522dbefb3e4802daecb9850fe8bdac4b..16226f73f99fcaa4f10fd5c9f38428877f301447 100644 (file)
 #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();
+
+       for (; it != end; ++it) {
+               valid &= (*it)->check();
+       }
+
+       // return valid status after checking ALL widgets
+       return valid;
+}
+
index 46dd059c07d2b5015e6920024bcbfc35499c2492..32afe73135ffd3c114a1849d82ed017c0abfe5f3 100644 (file)
 #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 a0c8c490f27c3a705a4c8f5415fd7c5f38daa3f6..0c75999144f957f6b6a8b847f1e59ce5a50b508d 100644 (file)
@@ -1,3 +1,21 @@
+2002-10-22  Angus Leeming  <leeming@lyx.org>
+
+       * 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  <larsbj@birdstep.com>
 
        * tex_helpers.C (rescanTexStyles): don't pop p
index 525338e8da176626ad58bb960f1d90281d75c29f..0ba97195d373c3e7dc6b5ac61ec5deb4f06b8cb6 100644 (file)
@@ -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 a4d80caf10d61acebdf232f1d8ba7e016b169461..19189579b1acb82a9d92a79438c1ff043fe97d65 100644 (file)
@@ -34,6 +34,9 @@ void ControlInset<Inset, Params>::showInset(Inset * inset)
 
        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 656c5c6bbbc0412fc1ee1b9e949053443cdfb60a..5e0108cf8774e361030e785f1ec2eda110e7655b 100644 (file)
@@ -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 0d036259bef3d214f4d95d39d8f22c6b50f96f0e..dce9503c495a5f85a10f710a0798942ed231da0d 100644 (file)
@@ -1,3 +1,14 @@
+2002-10-22  Angus Leeming  <leeming@lyx.org>
+
+       * 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  <larsbj@gullik.net>
 
        * xfont_loader.C (doLoad): typo
index e183d88d6da94bedab5d2f4665d3f499a4ef5d05..64713b513dd0c54103b30e9e1509bb6cef2d5c34 100644 (file)
@@ -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 \
diff --git a/src/frontends/xforms/checkedwidgets.C b/src/frontends/xforms/checkedwidgets.C
new file mode 100644 (file)
index 0000000..6de28cd
--- /dev/null
@@ -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;
+}
diff --git a/src/frontends/xforms/checkedwidgets.h b/src/frontends/xforms/checkedwidgets.h
new file mode 100644 (file)
index 0000000..ee75881
--- /dev/null
@@ -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 b6409a6aaaf248f1813125787f51f63841c75ef3..bf9ce980746c0140a399fbbd1ab0134215b7d790 100644 (file)
@@ -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 d2b227bcf970a6d1f5db2739f61ca2a49ef5b101..c413697f9e4d80defe1cfcd9a5c48316e925c7cb 100644 (file)
@@ -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);