]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/ButtonController.h
try this for distinguishing inner and outer tabs
[lyx.git] / src / frontends / xforms / ButtonController.h
index 17462efcf482e9d1d3c08be51c601ccbcd9aef5b..3b22b692ccb86965af0f59ef201540af0439638f 100644 (file)
 #include "ButtonPolicies.h"
 #include <list>
 
+#ifdef __GNUG__
+#pragma interface
+#endif
+
 /** General purpose button controller for up to four buttons.
     Controls the activation of the OK, Apply and Cancel buttons.
     Actually supports 4 buttons in all and it's up to the user to decide on
     the activation policy and which buttons correspond to which output of the
     state machine.
     @author Allan Rae <rae@lyx.org>
+    20001001 Switch from template implementation to taking Policy parameter.
+             Allows FormBase to provide a ButtonController for any dialog.
 */
-template <class Policy>
 class ButtonController : public noncopyable
 {
 public:
@@ -43,11 +48,12 @@ public:
            you can just assign "Cancel" to both labels.  Or even reuse this
            class for something completely different.
         */
-       ButtonController(char const * cancel, char const * close)
-               : bp_(), okay_(0), apply_(0), cancel_(0), undo_all_(0),
-                 read_only_(), cancel_label(cancel), close_label(close) {}
-       /// Somebody else owns the FL_OBJECTs we just manipulate them.
-       ~ButtonController() {}
+       ButtonController(ButtonPolicy * bp,
+                        char const * cancel, char const * close);
+
+       // Somebody else owns the FL_OBJECTs we just manipulate them.
+       // so? (Lgb)
+       //~ButtonController() {}
 
        /* Initialise Button Functions */
        /// Call refresh() when finished setting the buttons.
@@ -83,126 +89,42 @@ public:
                read_only_.erase(read_only_.begin(), read_only_.end());
        }
 
-       /* Action Functions */
        ///
-       void input(ButtonPolicy::SMInput in) {
-               bp_.input(in);
-               refresh();
+       void addDontTriggerChange(FL_OBJECT * obj) {
+               dont_trigger_change_.push_back(obj);
        }
        ///
-       void ok() {
-               input(ButtonPolicy::SMI_OKAY);
+       void eraseDontTriggerChange() {
+               dont_trigger_change_.clear();
        }
+
+       /* Action Functions */
+       /// force a refresh of the buttons
+       void refresh();
+
        ///
-       void apply() {
-               input(ButtonPolicy::SMI_APPLY);
-       }
+       void input(ButtonPolicy::SMInput in);
        ///
-       void cancel() {
-               input(ButtonPolicy::SMI_CANCEL);
-       }
+       void ok();
        ///
-       void undoAll() {
-               input(ButtonPolicy::SMI_UNDO_ALL);
-       }
+       void apply();
        ///
-       void hide() {
-               input(ButtonPolicy::SMI_HIDE);
-       }
+       void cancel();
+       ///
+       void undoAll();
+       ///
+       void hide();
        /// Passthrough function -- returns its input value
-       bool readOnly(bool ro = true) {
-               if (ro) {
-                       input(ButtonPolicy::SMI_READ_ONLY);
-               } else {
-                       input(ButtonPolicy::SMI_READ_WRITE);
-               }
-               return ro;
-       }
+       bool readOnly(bool ro = true);
        ///
-       void readWrite() {
-               read_only(false);
-       }
+       void readWrite();
        /// Passthrough function -- returns its input value
-       bool valid(bool v = true) { 
-               if (v) {
-                       input(ButtonPolicy::SMI_VALID);
-               } else {
-                       input(ButtonPolicy::SMI_INVALID);
-               }
-               return v;
-       }
+       bool valid(bool v = true, FL_OBJECT * obj = 0);
        ///
-       void invalid() {
-               valid(false);
-       }
-       /// force a refresh of the buttons
-       void refresh() {
-               if (okay_) {
-                       if (bp_.buttonStatus(ButtonPolicy::OKAY)) {
-                               fl_activate_object(okay_);
-                               fl_set_object_lcol(okay_, FL_BLACK);
-                       } else {
-                               fl_deactivate_object(okay_);
-                               fl_set_object_lcol(okay_, FL_INACTIVE);
-                       }
-               }
-               if (apply_) {
-                       if (bp_.buttonStatus(ButtonPolicy::APPLY)) {
-                               fl_activate_object(apply_);
-                               fl_set_object_lcol(apply_, FL_BLACK);
-                       } else {
-                               fl_deactivate_object(apply_);
-                               fl_set_object_lcol(apply_, FL_INACTIVE);
-                       }
-               }
-               if (undo_all_) {
-                       if (bp_.buttonStatus(ButtonPolicy::UNDO_ALL)) {
-                               fl_activate_object(undo_all_);
-                               fl_set_object_lcol(undo_all_, FL_BLACK);
-                       } else {
-                               fl_deactivate_object(undo_all_);
-                               fl_set_object_lcol(undo_all_,
-                                                  FL_INACTIVE);
-                       }
-               }
-               if (cancel_) {
-                       if (bp_.buttonStatus(ButtonPolicy::CANCEL)) {
-                               fl_set_object_label(cancel_,
-                                                   cancel_label);
-                       } else {
-                               fl_set_object_label(cancel_,
-                                                   close_label);
-                       }
-               }
-               if (!read_only_.empty()) {
-                       if (bp_.isReadOnly()) {
-                               std::list<FL_OBJECT *>::iterator
-                                       end = read_only_.end();
-                               for (std::list<FL_OBJECT *>::iterator
-                                    iter = read_only_.begin();
-                                    iter != end;
-                                    ++iter) {
-                                       fl_deactivate_object(*iter);
-                                       fl_set_object_lcol(*iter,
-                                                          FL_INACTIVE);
-                               }
-                       } else {
-                               std::list<FL_OBJECT *>::iterator
-                                       end = read_only_.end();
-                               for (std::list<FL_OBJECT *>::iterator
-                                    iter = read_only_.begin();
-                                    iter != end;
-                                    ++iter) {
-                                       fl_activate_object(*iter);
-                                       fl_set_object_lcol(*iter,
-                                                          FL_BLACK);
-                               }
-                       }
-               }
-       }
+       void invalid();
 private:
        ///
-       Policy bp_;
+       ButtonPolicy * bp_;
        ///
        FL_OBJECT * okay_;
        ///
@@ -213,6 +135,8 @@ private:
        FL_OBJECT * undo_all_;
        /// List of items to be deactivated when in one of the read-only states
        std::list<FL_OBJECT *> read_only_;
+       /// container of items that do not trigger a change in activation status
+       std::vector<FL_OBJECT *> dont_trigger_change_;
        ///
        char const * cancel_label;
        ///