#include "gettext.h" // _()
//#include "debug.h"
+using std::find;
+using std::vector;
ButtonController::ButtonController(ButtonPolicy * bp,
char const * cancel, char const * close)
: bp_(bp), okay_(0), apply_(0), cancel_(0), undo_all_(0),
- read_only_(), cancel_label(cancel), close_label(close)
+ read_only_(), trigger_change_(),
+ cancel_label(cancel), close_label(close)
{
Assert(bp);
}
}
-bool ButtonController::valid(bool v)
+bool ButtonController::valid(bool v, FL_OBJECT * obj)
{
- if (v) {
- input(ButtonPolicy::SMI_VALID);
+ if (obj && !trigger_change_.empty()) {
+ vector<FL_OBJECT *>::const_iterator cit =
+ find(trigger_change_.begin(), trigger_change_.end(),
+ obj);
+
+ // Only trigger a change if the obj is in the list
+ if (cit != trigger_change_.end()) {
+ if (v) {
+ input(ButtonPolicy::SMI_VALID);
+ } else {
+ input(ButtonPolicy::SMI_INVALID);
+ }
+ }
} else {
- input(ButtonPolicy::SMI_INVALID);
+ if (v) {
+ input(ButtonPolicy::SMI_VALID);
+ } else {
+ input(ButtonPolicy::SMI_INVALID);
+ }
}
+
return v;
}
read_only_.erase(read_only_.begin(), read_only_.end());
}
+ ///
+ void addTriggerChange(FL_OBJECT * obj) {
+ trigger_change_.push_back(obj);
+ }
+ ///
+ void eraseTriggerChange() {
+ trigger_change_.clear();
+ }
+
/* Action Functions */
/// force a refresh of the buttons
void refresh();
///
void readWrite();
/// Passthrough function -- returns its input value
- bool valid(bool v = true);
+ bool valid(bool v = true, FL_OBJECT * obj = 0);
///
void invalid();
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_;
+ /// List of items that will trigger a change in activation status.
+ std::vector<FL_OBJECT *> trigger_change_;
///
char const * cancel_label;
///
+2001-02-14 Angus Leeming <a.leeming@ic.ac.uk>
+
+ * ButtonController.[Ch] (addTriggerChange, eraseTriggerChange):
+ new methods.
+ (valid): method can now be passed an optional FL_OBJECT *. If it is, and
+ the vector of FL_OBJECT *s that can trigger a change in the button state
+ is not empty, then a change of state will occur only if the FL_OBJECT *
+ is present in this vector.
+
+ * FormBase.C (RestoreCB): call bc.undoAll() before restore(). Allows
+ the user to deactivate specific fields within restore().
+ (InputCB): pass the FL_OBJECT * to bc_.valid().
+
+ * FormCitation.C (build): create a vector of FL_OBJECT *s that can
+ trigger a change of state in the Ok,Apply buttons.
+ (update): bc_.readOnly() to the start of the method. Similar reasoning
+ to that for FormBase::RestoreCB, above.
+
2001-02-14 Angus Leeming <a.leeming@ic.ac.uk>
* FormBrowser.C: used OkCancelPolicy for ButtonController rather than
Assert(ob && ob->form);
FormBase * pre = static_cast<FormBase*>(ob->form->u_vdata);
Assert(ob);
- pre->bc_.valid(pre->input(ob, data));
+ pre->bc_.valid(pre->input(ob, data), ob);
}
Assert(ob && ob->form);
FormBase * pre = static_cast<FormBase*>(ob->form->u_vdata);
Assert(ob);
- pre->restore();
pre->bc_.undoAll();
+ pre->restore();
}
bc_.addReadOnly(dialog_->downBtn);
bc_.addReadOnly(dialog_->textBefore);
bc_.addReadOnly(dialog_->textAftr);
+
+ bc_.addTriggerChange(dialog_->addBtn);
+ bc_.addTriggerChange(dialog_->delBtn);
+ bc_.addTriggerChange(dialog_->upBtn);
+ bc_.addTriggerChange(dialog_->downBtn);
+ bc_.addTriggerChange(dialog_->textBefore);
+ bc_.addTriggerChange(dialog_->textAftr);
}
void FormCitation::update()
{
+ bc_.readOnly(lv_->buffer()->isReadonly());
+
bibkeys.clear();
bibkeysInfo.clear();
setSize( size, bibPresent );
fl_set_input( dialog_->textAftr, params.getOptions().c_str());
-
- bc_.readOnly(lv_->buffer()->isReadonly());
}