]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/FormCitation.C
Swap two printer related help messages.
[lyx.git] / src / frontends / xforms / FormCitation.C
index a79c6772b50069c3ddf4f72a6812cb2b883c35ba..a6694383f272e928eb4baab8a1cf597709f84cd8 100644 (file)
@@ -10,9 +10,6 @@
  */
 
 #include <config.h>
-
-#include FORMS_H_LOCATION
-
 #include <algorithm>
 
 #ifdef __GNUG__
 #include "lyxfunc.h"
 #include "support/filetools.h"
 
-using std::vector;
-using std::pair;
+using std::find;
 using std::max;
 using std::min;
-using std::find;
+using std::pair;
+using std::sort;
+using std::vector;
 
-static int min_wform;
 
 FormCitation::FormCitation(LyXView * lv, Dialogs * d)
-       : FormCommand(lv, d, _("Citation")), dialog_(0)
+       : FormCommand(lv, d, _("Citation"), new NoRepeatedApplyReadOnlyPolicy),
+         dialog_(0)
 {
        // let the dialog be shown
        // These are permanent connections so we won't bother
@@ -55,11 +53,18 @@ FormCitation::~FormCitation()
 
 FL_FORM * FormCitation::form() const
 {
-       if ( dialog_ ) return dialog_->form;
+       if (dialog_ ) return dialog_->form;
        return 0;
 }
 
 
+void FormCitation::connect()
+{
+       //fl_set_form_maxsize( dialog_->form, 3*minw_, minh_ );
+       FormCommand::connect();
+}
+
+
 void FormCitation::disconnect()
 {
        citekeys.clear();
@@ -73,24 +78,37 @@ void FormCitation::disconnect()
 void FormCitation::build()
 {
        dialog_ = build_citation();
-       min_wform = dialog_->form->w;
+
+       // Workaround dumb xforms sizing bug
+       minw_ = form()->w;
+       minh_ = form()->h;
+
+        // Manage the ok, apply, restore 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_.addReadOnly(dialog_->addBtn);
+       bc_.addReadOnly(dialog_->delBtn);
+       bc_.addReadOnly(dialog_->upBtn);
+       bc_.addReadOnly(dialog_->downBtn);
+       bc_.addReadOnly(dialog_->textBefore);
+       bc_.addReadOnly(dialog_->textAftr);
 }
 
 
-void FormCitation::update(bool switched)
+void FormCitation::update()
 {
-       if (switched) {
-               hide();
-               return;
-       }
-
        bibkeys.clear();
        bibkeysInfo.clear();
 
        vector<pair<string,string> > blist =
                lv_->buffer()->getBibkeyList();
+       sort(blist.begin(), blist.end());
 
-       for( unsigned int i = 0; i < blist.size(); ++i ) {
+       for (unsigned int i = 0; i < blist.size(); ++i) {
                bibkeys.push_back(blist[i].first);
                bibkeysInfo.push_back(blist[i].second);
        }
@@ -99,7 +117,7 @@ void FormCitation::update(bool switched)
        citekeys.clear();
        string tmp, keys( params.getContents() );
        keys = frontStrip( split(keys, tmp, ',') );
-       while( !tmp.empty() ) {
+       while (!tmp.empty()) {
                citekeys.push_back( tmp );
                keys = frontStrip( split(keys, tmp, ',') );
        }
@@ -123,6 +141,8 @@ void FormCitation::update(bool switched)
        setSize( size, bibPresent );
 
        fl_set_input( dialog_->textAftr, params.getOptions().c_str());
+
+       bc_.readOnly(lv_->buffer()->isReadonly());
 }
 
 
@@ -131,7 +151,7 @@ void FormCitation::updateBrowser( FL_OBJECT * browser,
 {
        fl_clear_browser( browser );
 
-       forunsigned int i = 0; i < keys.size(); ++i )
+       for (unsigned int i = 0; i < keys.size(); ++i )
                fl_add_browser_line( browser, keys[i].c_str());
 }
 
@@ -157,7 +177,7 @@ void FormCitation::setBibButtons( State status ) const
 
 void FormCitation::setCiteButtons( State status ) const
 {
-       switch( status ) {
+       switch (status) {
        case ON:
         {
                fl_activate_object( dialog_->delBtn );
@@ -165,7 +185,7 @@ void FormCitation::setCiteButtons( State status ) const
 
                int sel = fl_get_browser( dialog_->citeBrsr );
 
-               if ( sel != 1 ) {
+               if (sel != 1) {
                        fl_activate_object( dialog_->upBtn );
                        fl_set_object_lcol( dialog_->upBtn, FL_BLACK );
                } else {
@@ -173,7 +193,7 @@ void FormCitation::setCiteButtons( State status ) const
                        fl_set_object_lcol( dialog_->upBtn, FL_INACTIVE );
                }
 
-               if ( sel != fl_get_browser_maxline(dialog_->citeBrsr)) {
+               if (sel != fl_get_browser_maxline(dialog_->citeBrsr)) {
                        fl_activate_object( dialog_->downBtn );
                        fl_set_object_lcol( dialog_->downBtn, FL_BLACK );
                } else {
@@ -223,25 +243,20 @@ void FormCitation::setSize( int hbrsr, bool bibPresent ) const
        static int const htext  = dialog_->textAftr->h;
        static int const hok    = dialog_->button_ok->h;
 
-       int const wform = dialog_->form->w;
        int hform = dh1 + hbrsr + dh1;
-       if ( bibPresent ) hform += hinfo + dh1;
-       if ( natbib ) hform += hstyle + dh1 + htext + dh2;
+       if (bibPresent ) hform += hinfo + dh1;
+       if (natbib ) hform += hstyle + dh1 + htext + dh2;
        hform += htext + dh1 + hok + dh2;
 
-       bool const sizeSet = ( hform != dialog_->form->h );
-       if ( sizeSet ) fl_set_form_size( dialog_->form, wform, hform );
-
-       // No vertical resizing is allowed
-       // min_wform set in build()
-       fl_set_form_minsize( dialog_->form, min_wform,   hform );
-       fl_set_form_maxsize( dialog_->form, 3*min_wform, hform );
-
-       if ( !sizeSet ) return;
+       if (hform != minh_) {
+               minh_ = hform;
+               fl_set_form_size( dialog_->form, minw_, minh_ );
+       } else
+               return;
 
        int x = 0;
        int y = 0;
-       fl_set_object_geometry( dialog_->box, x, y, wform, hform );
+       fl_set_object_geometry( dialog_->box, x, y, minw_, minh_ );
 
        x = dialog_->citeBrsr->x;
        y += dh1; 
@@ -260,7 +275,7 @@ void FormCitation::setSize( int hbrsr, bool bibPresent ) const
 
        y = dh1 + hbrsr + dh1; // in position for next element
 
-       if ( bibPresent ) {
+       if (bibPresent) {
                x = dialog_->infoBrsr->x;
                fl_set_object_position( dialog_->infoBrsr, x, y );
                fl_show_object( dialog_->infoBrsr );
@@ -268,7 +283,7 @@ void FormCitation::setSize( int hbrsr, bool bibPresent ) const
        } else
                fl_hide_object( dialog_->infoBrsr );
 
-       if ( natbib ) {
+       if (natbib) {
                x = dialog_->style->x;
                fl_set_object_position( dialog_->style, x, y );
                fl_show_object( dialog_->style );
@@ -285,11 +300,15 @@ void FormCitation::setSize( int hbrsr, bool bibPresent ) const
        x = dialog_->textAftr->x;
        fl_set_object_position( dialog_->textAftr, x, y );
 
-       x = dialog_->button_ok->x;
        y += htext + dh1;
-       fl_set_object_position( dialog_->button_ok,       x, y );
+       x = dialog_->button_restore->x;
+       fl_set_object_position( dialog_->button_restore,     x, y );
+       x = dialog_->button_ok->x;
+       fl_set_object_position( dialog_->button_ok,     x, y );
+       x = dialog_->button_apply->x;
+       fl_set_object_position( dialog_->button_apply,  x, y );
        x = dialog_->button_cancel->x;
-       fl_set_object_position( dialog_->button_cancel,   x, y );
+       fl_set_object_position( dialog_->button_cancel, x, y );
 }
 
 
@@ -298,15 +317,16 @@ void FormCitation::setSize( int hbrsr, bool bibPresent ) const
 #endif
 bool FormCitation::input( FL_OBJECT *, long data )
 {
+       bool activate = false;
        State cb = static_cast<State>( data );
 
-       switch( cb ) {
+       switch (cb) {
        case BIBBRSR:
        {
                fl_deselect_browser( dialog_->citeBrsr );
                
                unsigned int sel = fl_get_browser( dialog_->bibBrsr );
-               if ( sel < 1 || sel > bibkeys.size() ) break;
+               if (sel < 1 || sel > bibkeys.size() ) break;
 
                // Put into infoBrsr the additional info associated with
                // the selected bibBrsr key
@@ -318,14 +338,14 @@ bool FormCitation::input( FL_OBJECT *, long data )
                vector<string>::iterator it =
                        find( citekeys.begin(), citekeys.end(), bibkeys[sel-1] );
 
-               if ( it != citekeys.end() ) {
+               if (it != citekeys.end()) {
                        int n = static_cast<int>( it - citekeys.begin() );
                        fl_select_browser_line( dialog_->citeBrsr, n+1 );
                        fl_set_browser_topline( dialog_->citeBrsr, n+1 );
                }
 
-               if ( !lv_->buffer()->isReadonly() ) {
-                       if ( it != citekeys.end() ) {
+               if (!lv_->buffer()->isReadonly()) {
+                       if (it != citekeys.end()) {
                                setBibButtons( OFF );
                                setCiteButtons( ON );
                        } else {
@@ -338,9 +358,9 @@ bool FormCitation::input( FL_OBJECT *, long data )
        case CITEBRSR:
        {
                unsigned int sel = fl_get_browser( dialog_->citeBrsr );
-               if ( sel < 1 || sel > citekeys.size() ) break;
+               if (sel < 1 || sel > citekeys.size() ) break;
 
-               if ( !lv_->buffer()->isReadonly() ) {
+               if (!lv_->buffer()->isReadonly()) {
                        setBibButtons( OFF );
                        setCiteButtons( ON );
                }
@@ -364,10 +384,10 @@ bool FormCitation::input( FL_OBJECT *, long data )
        break;
        case ADD:
        {
-               if ( lv_->buffer()->isReadonly() ) break;
+               if (lv_->buffer()->isReadonly() ) break;
 
                unsigned int sel = fl_get_browser( dialog_->bibBrsr );
-               if ( sel < 1 || sel > bibkeys.size() ) break;
+               if (sel < 1 || sel > bibkeys.size() ) break;
 
                // Add the selected bibBrsr key to citeBrsr
                fl_addto_browser( dialog_->citeBrsr,
@@ -379,14 +399,15 @@ bool FormCitation::input( FL_OBJECT *, long data )
 
                setBibButtons( OFF );
                setCiteButtons( ON );
+               activate = true;
        }
        break;
        case DELETE:
        {
-               if ( lv_->buffer()->isReadonly() ) break;
+               if (lv_->buffer()->isReadonly() ) break;
 
                unsigned int sel = fl_get_browser( dialog_->citeBrsr );
-               if ( sel < 1 || sel > citekeys.size() ) break;
+               if (sel < 1 || sel > citekeys.size() ) break;
 
                // Remove the selected key from citeBrsr
                fl_delete_browser_line( dialog_->citeBrsr, sel ) ;
@@ -394,14 +415,15 @@ bool FormCitation::input( FL_OBJECT *, long data )
 
                setBibButtons( ON );
                setCiteButtons( OFF );
+               activate = true;
        }
        break;
        case UP:
        {
-               if ( lv_->buffer()->isReadonly() ) break;
+               if (lv_->buffer()->isReadonly() ) break;
 
                unsigned int sel = fl_get_browser( dialog_->citeBrsr );
-               if ( sel < 2 || sel > citekeys.size() ) break;
+               if (sel < 2 || sel > citekeys.size() ) break;
 
                // Move the selected key up one line
                vector<string>::iterator it = citekeys.begin() + sel-1;
@@ -414,14 +436,15 @@ bool FormCitation::input( FL_OBJECT *, long data )
                fl_select_browser_line( dialog_->citeBrsr, sel-1 );
                citekeys.insert( it-1, tmp );
                setCiteButtons( ON );
+               activate = true;
        }
        break;
        case DOWN:
        {
-               if ( lv_->buffer()->isReadonly() ) break;
+               if (lv_->buffer()->isReadonly() ) break;
 
                unsigned int sel = fl_get_browser( dialog_->citeBrsr );
-               if ( sel < 1 || sel > citekeys.size()-1 ) break;
+               if (sel < 1 || sel > citekeys.size()-1 ) break;
 
                // Move the selected key down one line
                vector<string>::iterator it = citekeys.begin() + sel-1;
@@ -434,12 +457,13 @@ bool FormCitation::input( FL_OBJECT *, long data )
                fl_select_browser_line( dialog_->citeBrsr, sel+1 );
                citekeys.insert( it+1, tmp );
                setCiteButtons( ON );
+               activate = true;
        }
        break;
        default:
                break;
        }
-       return true;
+       return activate;
 }
 
 
@@ -448,7 +472,7 @@ void FormCitation::apply()
        if (lv_->buffer()->isReadonly()) return;
 
        string contents;
-       for(unsigned int i = 0; i < citekeys.size(); ++i) {
+       for (unsigned int i = 0; i < citekeys.size(); ++i) {
                if (i > 0) contents += ", ";
                contents += citekeys[i];
        }