#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:
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.
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_;
///
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;
///