]> 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 6c54e3f706e549eda93d10d0942264ae6b02f768..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
@@ -53,27 +51,51 @@ FormCitation::~FormCitation()
 }
 
 
-void FormCitation::clearStore()
+FL_FORM * FormCitation::form() const
+{
+       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();
        bibkeys.clear();
        bibkeysInfo.clear();
+
+       FormCommand::disconnect();
 }
 
 
 void FormCitation::build()
 {
        dialog_ = build_citation();
-       min_wform = dialog_->form->w;
-}
-
 
-FL_FORM * const FormCitation::form() const
-{
-       if( dialog_ ) // no need to test for dialog_->form
-               return dialog_->form;
-       else
-               return 0;
+       // 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);
 }
 
 
@@ -84,8 +106,9 @@ void FormCitation::update()
 
        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);
        }
@@ -94,7 +117,7 @@ void FormCitation::update()
        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, ',') );
        }
@@ -107,17 +130,19 @@ void FormCitation::update()
        setBibButtons( OFF );
        setCiteButtons( OFF );
 
-       int noKeys = max( bibkeys.size(), citekeys.size() );
+       int noKeys = static_cast<int>( max( bibkeys.size(), citekeys.size() ) );
 
        // Place bounds, so that 4 <= noKeys <= 10
-       noKeys = max( 4, min(10, noKeys) );
+       noKeys = max(4, min(10, noKeys) );
 
        // Re-size the form to accommodate the new browser size
        int size = 20 * noKeys;
        bool bibPresent = ( bibkeys.size() > 0 );
        setSize( size, bibPresent );
 
-       fl_set_input( dialog_->textAftr, params.getOptions().c_str() );
+       fl_set_input( dialog_->textAftr, params.getOptions().c_str());
+
+       bc_.readOnly(lv_->buffer()->isReadonly());
 }
 
 
@@ -126,8 +151,8 @@ void FormCitation::updateBrowser( FL_OBJECT * browser,
 {
        fl_clear_browser( browser );
 
-       forunsigned int i = 0; i < keys.size(); ++i )
-               fl_add_browser_line( browser, keys[i].c_str() );
+       for (unsigned int i = 0; i < keys.size(); ++i )
+               fl_add_browser_line( browser, keys[i].c_str());
 }
 
 
@@ -152,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 );
@@ -160,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 {
@@ -168,7 +193,7 @@ void FormCitation::setCiteButtons( State status ) const
                        fl_set_object_lcol( dialog_->upBtn, FL_INACTIVE );
                }
 
-               ifsel != 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 {
@@ -216,27 +241,22 @@ void FormCitation::setSize( int hbrsr, bool bibPresent ) const
        static int const hinfo  = dialog_->infoBrsr->h;
        static int const hstyle = dialog_->style->h;
        static int const htext  = dialog_->textAftr->h;
-       static int const hok    = dialog_->ok->h;
+       static int const hok    = dialog_->button_ok->h;
 
-       int const wform = dialog_->form->w;
        int hform = dh1 + hbrsr + dh1;
-       ifbibPresent ) hform += hinfo + dh1;
-       ifnatbib ) 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; 
@@ -255,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 );
@@ -263,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 );
@@ -280,47 +300,52 @@ void FormCitation::setSize( int hbrsr, bool bibPresent ) const
        x = dialog_->textAftr->x;
        fl_set_object_position( dialog_->textAftr, x, y );
 
-       x = dialog_->ok->x;
        y += htext + dh1;
-       fl_set_object_position( dialog_->ok,       x, y );
-       x = dialog_->cancel->x;
-       fl_set_object_position( dialog_->cancel,   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 );
 }
 
 
 #ifdef WITH_WARNINGS
 #warning convert this to use the buttoncontroller
 #endif
-bool FormCitation::input( long data )
+bool FormCitation::input( FL_OBJECT *, long data )
 {
-       State cb = static_cast<FormCitation::State>( 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 );
-               ifsel < 1 || sel > bibkeys.size() ) break;
+               if (sel < 1 || sel > bibkeys.size() ) break;
 
                // Put into infoBrsr the additional info associated with
                // the selected bibBrsr key
                fl_clear_browser( dialog_->infoBrsr );
                fl_add_browser_line( dialog_->infoBrsr,
-                                    bibkeysInfo[sel-1].c_str() );
+                                    bibkeysInfo[sel - 1].c_str() );
 
                // Highlight the selected bibBrsr key in citeBrsr if present
                vector<string>::iterator it =
                        find( citekeys.begin(), citekeys.end(), bibkeys[sel-1] );
 
-               if( it != citekeys.end() ) {
-                       int n = it - citekeys.begin();
+               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 {
@@ -333,9 +358,9 @@ bool FormCitation::input( long data )
        case CITEBRSR:
        {
                unsigned int sel = fl_get_browser( dialog_->citeBrsr );
-               ifsel < 1 || sel > citekeys.size() ) break;
+               if (sel < 1 || sel > citekeys.size() ) break;
 
-               if( !lv_->buffer()->isReadonly() ) {
+               if (!lv_->buffer()->isReadonly()) {
                        setBibButtons( OFF );
                        setCiteButtons( ON );
                }
@@ -345,7 +370,7 @@ bool FormCitation::input( long data )
                        find( bibkeys.begin(), bibkeys.end(), citekeys[sel-1] );
 
                if (it != bibkeys.end()) {
-                       int n = it - bibkeys.begin();
+                       int n = static_cast<int>( it - bibkeys.begin() );
                        fl_select_browser_line( dialog_->bibBrsr, n+1 );
                        fl_set_browser_topline( dialog_->bibBrsr, n+1 );
 
@@ -359,29 +384,30 @@ bool FormCitation::input( long data )
        break;
        case ADD:
        {
-               iflv_->buffer()->isReadonly() ) break;
+               if (lv_->buffer()->isReadonly() ) break;
 
                unsigned int sel = fl_get_browser( dialog_->bibBrsr );
-               ifsel < 1 || sel > bibkeys.size() ) break;
+               if (sel < 1 || sel > bibkeys.size() ) break;
 
                // Add the selected bibBrsr key to citeBrsr
                fl_addto_browser( dialog_->citeBrsr,
                                  bibkeys[sel-1].c_str() );
                citekeys.push_back( bibkeys[sel-1] );
 
-               int n = citekeys.size();
+               int n = static_cast<int>( citekeys.size() );
                fl_select_browser_line( dialog_->citeBrsr, n );
 
                setBibButtons( OFF );
                setCiteButtons( ON );
+               activate = true;
        }
        break;
        case DELETE:
        {
-               iflv_->buffer()->isReadonly() ) break;
+               if (lv_->buffer()->isReadonly() ) break;
 
                unsigned int sel = fl_get_browser( dialog_->citeBrsr );
-               ifsel < 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 ) ;
@@ -389,14 +415,15 @@ bool FormCitation::input( long data )
 
                setBibButtons( ON );
                setCiteButtons( OFF );
+               activate = true;
        }
        break;
        case UP:
        {
-               iflv_->buffer()->isReadonly() ) break;
+               if (lv_->buffer()->isReadonly() ) break;
 
                unsigned int sel = fl_get_browser( dialog_->citeBrsr );
-               ifsel < 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;
@@ -409,14 +436,15 @@ bool FormCitation::input( long data )
                fl_select_browser_line( dialog_->citeBrsr, sel-1 );
                citekeys.insert( it-1, tmp );
                setCiteButtons( ON );
+               activate = true;
        }
        break;
        case DOWN:
        {
-               iflv_->buffer()->isReadonly() ) break;
+               if (lv_->buffer()->isReadonly() ) break;
 
                unsigned int sel = fl_get_browser( dialog_->citeBrsr );
-               ifsel < 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;
@@ -429,21 +457,22 @@ bool FormCitation::input( 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;
 }
 
 
 void FormCitation::apply()
 {
-       if(lv_->buffer()->isReadonly()) return;
+       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];
        }
@@ -453,7 +482,7 @@ void FormCitation::apply()
 
        if (inset_ != 0) {
                // Only update if contents have changed
-               if(params != inset_->params()) {
+               if (params != inset_->params()) {
                        inset_->setParams(params);
                        lv_->view()->updateInset(inset_, true);
                }