]> 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 158ca6c2a31702af4ee4da2e6d8e89699ea64cd0..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:
-       /**@name Constructors and Deconstructors */
-       //@{
        /** Constructor.
            The cancel/close label entries are _not_ managed within the class
            thereby allowing you to reassign at will and to use static labels.
@@ -44,158 +48,83 @@ 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() {}
 
-       /**@name Initialise Button Functions */
-       //@{
+       /* Initialise Button Functions */
        /// Call refresh() when finished setting the buttons.
-       void setOK(FL_OBJECT * obj)
-               { okay_ = obj; }
+       void setOK(FL_OBJECT * obj) {
+               okay_ = obj;
+       }
        ///
-       void setApply(FL_OBJECT * obj)
-               { apply_ = obj; }
+       void setApply(FL_OBJECT * obj) {
+               apply_ = obj;
+       }
        ///
-       void setCancel(FL_OBJECT * obj)
-               { cancel_ = obj; }
+       void setCancel(FL_OBJECT * obj) {
+               cancel_ = obj;
+       }
        ///
-       void setUndoAll(FL_OBJECT * obj)
-               { undo_all_ = obj; }
+       void setUndoAll(FL_OBJECT * obj) {
+               undo_all_ = obj;
+       }
        ///
-       void setCancelTrueLabel(char const * c)
-               { cancel_label = c; }
+       void setCancelTrueLabel(char const * c) {
+               cancel_label = c;
+       }
        ///
-       void setCancelFalseLabel(char const * c)
-               { close_label = c; }
+       void setCancelFalseLabel(char const * c) {
+               close_label = c;
+       }
        ///
-       void addReadOnly(FL_OBJECT * obj)
-               { read_only_.push_front(obj); }
+       void addReadOnly(FL_OBJECT * obj) {
+               read_only_.push_front(obj);
+       }
        ///
-       void eraseReadOnly()
-               { read_only_.erase(read_only_.begin(), read_only_.end()); }
-       //@}
+       void eraseReadOnly() {
+               read_only_.erase(read_only_.begin(), read_only_.end());
+       }
 
-       /**@name 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 read_only(bool ro = true)
-               {
-                       if (ro) {
-                               input(ButtonPolicy::SMI_READ_ONLY);
-                       } else {
-                               input(ButtonPolicy::SMI_READ_WRITE);
-                       }
-                       return ro;
-               }
-       ///
-       void read_write()
-               { read_only(false); }
+       bool readOnly(bool ro = true);
+       ///
+       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;
-               }
-       ///
-       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()) {
-                                       for (std::list<FL_OBJECT *>::iterator
-                                                    iter = read_only_.begin();
-                                            iter != read_only_.end();
-                                            ++iter) {
-                                               fl_deactivate_object(*iter);
-                                               fl_set_object_lcol(undo_all_,
-                                                                  FL_INACTIVE);
-                                       }
-                               } else {
-                                       for (std::list<FL_OBJECT *>::iterator
-                                                    iter = read_only_.begin();
-                                            iter != read_only_.end();
-                                            ++iter) {
-                                               fl_activate_object(undo_all_);
-                                               fl_set_object_lcol(undo_all_,
-                                                                  FL_BLACK);
-                                       }
-                               }
-                       }
-               }
-       //@}
+       bool valid(bool v = true, FL_OBJECT * obj = 0);
+       ///
+       void invalid();
 private:
        ///
-       Policy bp_;
-       /**@name Button Widgets */
-       //@{
+       ButtonPolicy * bp_;
        ///
        FL_OBJECT * okay_;
        ///
@@ -206,14 +135,12 @@ 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_;
-       //@}
-       /**@name Cancel/Close Button Labels */
-       //@{
+       /// container of items that do not trigger a change in activation status
+       std::vector<FL_OBJECT *> dont_trigger_change_;
        ///
        char const * cancel_label;
        ///
        char const * close_label;       
-       //@}
 };
 
 #endif