]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/FormRef.C
Bugfixes: checkboxes to radiobuttons (from J�rgen S) and remove a little
[lyx.git] / src / frontends / xforms / FormRef.C
index 7e245bb14f846906e488106f175a1095213f42d5..3dae84746825294d9d607bcbbf5c7ffbb5394cf1 100644 (file)
 #include "form_ref.h"
 #include "xforms_helpers.h"
 #include "insets/insetref.h"
-
-/*
-#include "Dialogs.h"
-#include "FormRef.h"
-#include "LyXView.h"
-#include "buffer.h"
-#include "form_ref.h"
-#include "lyxfunc.h"
-*/
+#include "helper_funcs.h" // getStringFromVector
+#include "support/lstrings.h" // frontStrip, strip
 
 using std::find;
 using std::max;
@@ -51,52 +44,74 @@ void FormRef::build()
 {
        dialog_.reset(build_ref());
 
-       for (int i = 0; !InsetRef::types[i].latex_name.empty(); ++i)
-               fl_addto_choice(dialog_->type,
+       for (int i = 0; !InsetRef::types[i].latex_name.empty(); ++i)
+               fl_addto_choice(dialog_->choice_type,
                                _(InsetRef::types[i].gui_name.c_str()));
 
        // Force the user to use the browser to change refs.
-       fl_deactivate_object(dialog_->ref);
+       fl_deactivate_object(dialog_->input_ref);
 
-        // Manage the ok and cancel/close buttons
+       // Manage the ok and cancel/close buttons
        bc().setOK(dialog_->button_ok);
        bc().setApply(dialog_->button_apply);
        bc().setCancel(dialog_->button_cancel);
-       bc().setUndoAll(dialog_->button_restore);
-       bc().refresh();
+       bc().setRestore(dialog_->button_restore);
+
+       bc().addReadOnly(dialog_->button_update);
+       bc().addReadOnly(dialog_->input_name);
+       bc().addReadOnly(dialog_->input_ref);
 }
 
 
 void FormRef::update()
 {
-       fl_set_input(dialog_->ref,
+       fl_set_input(dialog_->input_ref,
                     controller().params().getContents().c_str());
-       fl_set_input(dialog_->name,
+       fl_set_input(dialog_->input_name,
                     controller().params().getOptions().c_str());
-       fl_set_choice(dialog_->type, 
+       fl_set_choice(dialog_->choice_type, 
                      InsetRef::getType(controller().params().getCmdName()) + 1);
 
        at_ref_ = false;
-       fl_set_object_label(dialog_->button_go, _("Goto reference"));
+       fl_set_object_label(dialog_->button_go, _("Go to reference"));
 
        // Name is irrelevant to LaTeX/Literate documents
        if (controller().docType() == ControlRef::LATEX ||
            controller().docType() == ControlRef::LITERATE) {
-               setEnabled(dialog_->name, false);
+               setEnabled(dialog_->input_name, false);
        } else {
-               setEnabled(dialog_->name, true);
+               setEnabled(dialog_->input_name, true);
        }
 
        // type is irrelevant to LinuxDoc/DocBook.
        if (controller().docType() == ControlRef::LINUXDOC ||
            controller().docType() == ControlRef::DOCBOOK) {
-               fl_set_choice(dialog_->type, 1);
-               setEnabled(dialog_->type, false);
+               fl_set_choice(dialog_->choice_type, 1);
+               setEnabled(dialog_->choice_type, false);
        } else {
-               setEnabled(dialog_->type, true);
+               setEnabled(dialog_->choice_type, true);
+       }
+
+       // Get the available buffers
+       vector<string> const buffers = controller().getBufferList();
+       vector<string> const choice_buffers =
+               getVectorFromChoice(dialog_->choice_buffer);
+       
+       // If different from the current contents of the choice, then update it
+       if (buffers != choice_buffers) {
+               // create a string of entries " entry1 | entry2 | entry3 "
+               // with which to initialise the xforms choice object.
+               string const choice =
+                       " " + getStringFromVector(buffers, " | ") + " ";
+
+               fl_clear_choice(dialog_->choice_buffer);
+               fl_addto_choice(dialog_->choice_buffer, choice.c_str());
+
+               fl_set_choice(dialog_->choice_buffer,
+                             controller().getBufferNum() + 1);
        }
 
-       refs_ = controller().getLabelList();
+       refs_ = controller().getLabelList(string());
        updateBrowser(refs_);
 }
 
@@ -104,49 +119,57 @@ void FormRef::update()
 void FormRef::updateBrowser(vector<string> const & akeys) const
 {
        vector<string> keys(akeys);
-       if (fl_get_button(dialog_->sort))
+       if (fl_get_button(dialog_->check_sort))
                sort(keys.begin(), keys.end());
 
-       fl_clear_browser(dialog_->browser);
+       vector<string> browser_keys =
+               getVectorFromBrowser(dialog_->browser_refs);
+
+       if (browser_keys == keys)
+               return;
+
+       fl_clear_browser(dialog_->browser_refs);
        for (vector<string>::const_iterator it = keys.begin();
             it != keys.end(); ++it)
-               fl_add_browser_line(dialog_->browser, it->c_str());
+               fl_add_browser_line(dialog_->browser_refs, it->c_str());
 
        if (keys.empty()) {
-               fl_add_browser_line(dialog_->browser,
+               fl_add_browser_line(dialog_->browser_refs,
                                    _("*** No labels found in document ***"));
        
-               setEnabled(dialog_->browser, false);
-               setEnabled(dialog_->sort,    false);
+               setEnabled(dialog_->browser_refs, false);
+               setEnabled(dialog_->check_sort,   false);
 
-               fl_set_input(dialog_->ref, "");
+               fl_set_input(dialog_->input_ref, "");
        } else {
-               setEnabled(dialog_->browser, true);
-               setEnabled(dialog_->sort,    true);
+               setEnabled(dialog_->browser_refs, true);
+               setEnabled(dialog_->check_sort,   true);
 
-               string ref = fl_get_input(dialog_->ref);
-               vector<string>::const_iterator cit =
-                       find(keys.begin(), keys.end(), ref);
+               string ref = fl_get_input(dialog_->input_ref);
+               vector<string>::const_iterator cit = (ref.empty())
+                       ? keys.begin()
+                       : find(keys.begin(), keys.end(), ref);
                if (cit == keys.end()) {
-                       cit = keys.begin();
-                       fl_set_input(dialog_->ref, cit->c_str());
-               } else if (ref.empty())
-                       fl_set_input(dialog_->ref, cit->c_str());
-
-               int const i = static_cast<int>(cit - keys.begin());
-               fl_set_browser_topline(dialog_->browser, max(i-5, 1));
-               fl_select_browser_line(dialog_->browser, i+1);
+                       fl_deselect_browser(dialog_->browser_refs);
+               } else {
+                       if (ref.empty())
+                               fl_set_input(dialog_->input_ref, cit->c_str());
+
+                       int const i = static_cast<int>(cit - keys.begin());
+                       fl_set_browser_topline(dialog_->browser_refs, max(i-5, 1));
+                       fl_select_browser_line(dialog_->browser_refs, i+1);
+               }
        }
 }
 
 
 void FormRef::apply()
 {
-       int const type = fl_get_choice(dialog_->type) - 1;
+       int const type = fl_get_choice(dialog_->choice_type) - 1;
        controller().params().setCmdName(InsetRef::getName(type));
 
-       controller().params().setOptions(fl_get_input(dialog_->name));
-       controller().params().setContents(fl_get_input(dialog_->ref));
+       controller().params().setOptions(fl_get_input(dialog_->input_name));
+       controller().params().setContents(fl_get_input(dialog_->input_ref));
 }
 
 
@@ -162,47 +185,52 @@ ButtonPolicy::SMInput FormRef::input(FL_OBJECT * ob, long)
 
                at_ref_ = !at_ref_;
                if (at_ref_) {
-                       controller().gotoRef(fl_get_input(dialog_->ref));
+                       controller().gotoRef(fl_get_input(dialog_->input_ref));
                        fl_set_object_label(dialog_->button_go, _("Go back"));
                } else {
                        controller().gotoBookmark();
                        fl_set_object_label(dialog_->button_go,
-                                           _("Goto reference"));
+                                           _("Go to reference"));
                }
 
-       } else if (ob == dialog_->browser) {
+       } else if (ob == dialog_->browser_refs) {
 
-               unsigned int sel = fl_get_browser(dialog_->browser);
+               unsigned int sel = fl_get_browser(dialog_->browser_refs);
                if (sel < 1 || sel > refs_.size())
                        return ButtonPolicy::SMI_NOOP;
 
                if (!controller().isReadonly()) {
-                       string s = fl_get_browser_line(dialog_->browser, sel);
-                       fl_set_input(dialog_->ref, s.c_str());
+                       string s = fl_get_browser_line(dialog_->browser_refs, sel);
+                       fl_set_input(dialog_->input_ref, s.c_str());
                }
 
                if (at_ref_)
                        controller().gotoBookmark();
                at_ref_ = false;
-               fl_set_object_label(dialog_->button_go, _("Goto reference"));
+               fl_set_object_label(dialog_->button_go, _("Go to reference"));
 
-               setEnabled(dialog_->type,      true);
+               setEnabled(dialog_->choice_type,      true);
                setEnabled(dialog_->button_go, true);
-               fl_set_object_lcol(dialog_->ref, FL_BLACK);
+               fl_set_object_lcol(dialog_->input_ref, FL_BLACK);
 
        } else if (ob == dialog_->button_update || 
-                  ob == dialog_->sort) {
-
-               if (ob == dialog_->button_update)
-                       refs_ = controller().getLabelList();
+                  ob == dialog_->check_sort ||
+                  ob == dialog_->choice_buffer) {
+
+               if (ob == dialog_->button_update ||
+                   ob == dialog_->choice_buffer) {
+                       string const name =
+                               frontStrip(strip(fl_get_choice_text(dialog_->choice_buffer)));
+                       refs_ = controller().getLabelList(name);
+               }
 
                fl_freeze_form(form());
                updateBrowser(refs_);
                fl_unfreeze_form(form());
 
-       } else if (ob == dialog_->type) {
+       } else if (ob == dialog_->choice_type) {
 
-               int const type = fl_get_choice(dialog_->type) - 1;
+               int const type = fl_get_choice(dialog_->choice_type) - 1;
                if (controller().params().getCmdName() ==
                    InsetRef::getName(type)) {
                        activate = ButtonPolicy::SMI_NOOP;