]> 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 bd77914b85dbbfb2c10be9bcf3a58b6011e24740..a6694383f272e928eb4baab8a1cf597709f84cd8 100644 (file)
  */
 
 #include <config.h>
-#include "gettext.h"
-#include FORMS_H_LOCATION
-#include "BufferView.h"
+#include <algorithm>
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+
 #include "Dialogs.h"
 #include "FormCitation.h"
 #include "LyXView.h"
 #include "buffer.h"
 #include "form_citation.h"
 #include "lyxfunc.h"
-#include "xform_macros.h"
-#include "insets/insetcite.h"
 #include "support/filetools.h"
 
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
-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;
 
-C_RETURNCB(FormCitation, WMHideCB)
-C_GENERICCB(FormCitation, OKCB)
-C_GENERICCB(FormCitation, CancelCB)
-C_GENERICCB(FormCitation, InputCB)
 
 FormCitation::FormCitation(LyXView * lv, Dialogs * d)
-       : dialog_(0), lv_(lv), d_(d), u_(0), h_(0), ih_(0),
-         inset_(0), dialogIsOpen(false)
+       : FormCommand(lv, d, _("Citation"), new NoRepeatedApplyReadOnlyPolicy),
+         dialog_(0)
 {
        // let the dialog be shown
        // These are permanent connections so we won't bother
@@ -52,70 +47,55 @@ FormCitation::FormCitation(LyXView * lv, Dialogs * d)
 
 FormCitation::~FormCitation()
 {
-       free();
+       delete dialog_;
 }
 
 
-void FormCitation::build()
+FL_FORM * FormCitation::form() const
 {
-       dialog_ = build_citation();
+       if (dialog_ ) return dialog_->form;
+       return 0;
 }
 
 
-void FormCitation::showInset( InsetCitation * inset )
+void FormCitation::connect()
 {
-       if( dialogIsOpen || inset == 0 ) return;
-
-       inset_ = inset;
-       ih_ = inset_->hide.connect(slot(this, &FormCitation::hide));
-
-       textAfter = inset->getOptions();
-       updateCitekeys(inset->getContents());
-       show();
+       //fl_set_form_maxsize( dialog_->form, 3*minw_, minh_ );
+       FormCommand::connect();
 }
 
 
-void FormCitation::createInset( string const & arg )
+void FormCitation::disconnect()
 {
-       if( dialogIsOpen ) return;
-
-       string keys;
-       if (contains(arg, "|")) {
-               keys = token(arg, '|', 0);
-               textAfter = token(arg, '|', 1);
-       } else {
-               keys = arg;
-               textAfter.erase();
-       }
+       citekeys.clear();
+       bibkeys.clear();
+       bibkeysInfo.clear();
 
-       updateCitekeys(keys);
-       show();
+       FormCommand::disconnect();
 }
 
 
-void FormCitation::show()
+void FormCitation::build()
 {
-       if (!dialog_) {
-               build();
-               fl_set_form_atclose(dialog_->form_citation,
-                                   C_FormCitationWMHideCB, 0);
-       }
-
-       update();  // make sure its up-to-date
+       dialog_ = build_citation();
 
-       dialogIsOpen = true;
-       if (dialog_->form_citation->visible) {
-               fl_raise_form(dialog_->form_citation);
-       } else {
-               fl_show_form(dialog_->form_citation,
-                            FL_PLACE_MOUSE | FL_FREE_SIZE,
-                            FL_TRANSIENT,
-                            _("Citation"));
-               u_ = d_->updateBufferDependent.
-                        connect(slot(this, &FormCitation::update));
-               h_ = d_->hideBufferDependent.
-                        connect(slot(this, &FormCitation::hide));
-       }
+       // 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);
 }
 
 
@@ -126,17 +106,23 @@ 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);
        }
-
        blist.clear();
 
-       fl_freeze_form( dialog_->form_citation );
+       citekeys.clear();
+       string tmp, keys( params.getContents() );
+       keys = frontStrip( split(keys, tmp, ',') );
+       while (!tmp.empty()) {
+               citekeys.push_back( tmp );
+               keys = frontStrip( split(keys, tmp, ',') );
+       }
 
-       updateBrowser( dialog_->bibBrsr, bibkeys );
+       updateBrowser( dialog_->bibBrsr,  bibkeys );
        updateBrowser( dialog_->citeBrsr, citekeys );
        fl_clear_browser( dialog_->infoBrsr );
 
@@ -144,33 +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 <= 15
-       noKeys = max( 4, min(15, noKeys) );
+       // Place bounds, so that 4 <= noKeys <= 10
+       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, textAfter.c_str() );
-
-       fl_unfreeze_form( dialog_->form_citation );
-}
-
-
-void FormCitation::updateCitekeys( string const & keysIn )
-{
-       citekeys.clear();
+       fl_set_input( dialog_->textAftr, params.getOptions().c_str());
 
-       string tmp;
-       string keys = keysIn;
-       keys = frontStrip( split(keys, tmp, ',') );
-       while( !tmp.empty() ) {
-               citekeys.push_back( tmp );
-               keys = frontStrip( split(keys, tmp, ',') );
-       }
+       bc_.readOnly(lv_->buffer()->isReadonly());
 }
 
 
@@ -179,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());
 }
 
 
@@ -205,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 );
@@ -213,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 {
@@ -221,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 {
@@ -248,86 +220,132 @@ void FormCitation::setCiteButtons( State status ) const
 }
 
 
-void FormCitation::setSize( int brsrHeight, bool bibPresent ) const
+void FormCitation::setSize( int hbrsr, bool bibPresent ) const
 {
-       int const infoHeight  = 110;
-       int const otherHeight = 140;
-       brsrHeight = max( brsrHeight, 175 );
-       int formHeight = brsrHeight + otherHeight;
-
-       if( bibPresent ) formHeight += infoHeight + 30;
-       fl_set_form_size( dialog_->form_citation, 430, formHeight );
-
-       // No resizing is alowed in the y-direction
-       fl_set_form_minsize( dialog_->form_citation, 430, formHeight );
-       fl_set_form_maxsize( dialog_->form_citation, 1000, formHeight );
-
-       int ypos = 0;
-       fl_set_object_geometry( dialog_->box,      0,   ypos, 430, formHeight );
-       ypos += 30;
-       fl_set_object_geometry( dialog_->citeBrsr, 10,  ypos, 180, brsrHeight );
-       fl_set_object_geometry( dialog_->bibBrsr,  240, ypos, 180, brsrHeight );
-
-       fl_set_object_position( dialog_->addBtn,  200, ypos );
-       ypos += 35;
-       fl_set_object_position( dialog_->delBtn,  200, ypos );
-       ypos += 35;
-       fl_set_object_position( dialog_->upBtn,   200, ypos );
-       ypos += 35;
-       fl_set_object_position( dialog_->downBtn, 200, ypos );
-
-       ypos = brsrHeight+30; // base of Citation/Bibliography browsers
-
-       // awaiting natbib support
-       fl_hide_object( dialog_->style );
-
-       if( bibPresent ) {
-               ypos += 30;
-               fl_set_object_position( dialog_->infoBrsr, 10, ypos );
+       bool const natbib = false; // will eventually be input
+       hbrsr = max( hbrsr, 175 ); // limit max size of cite/bib brsrs
+
+       // dh1, dh2, dh3 are the vertical separation between elements.
+       // These can be specified because the browser height is fixed
+       // so they are not changed by dynamic resizing
+       static int const dh1 = 30; // top of form to top of cite/bib brsrs;
+                                  // bottom of cite/bib brsrs to top of info;
+                                  // bottom of info to top next element;
+                                  // bottom of style to top textBefore;
+                                  // bottom of text to top ok/cancel buttons.
+       static int const dh2 = 10; // bottom of textBefore to top textAftr;
+                                  // bottom of ok/cancel buttons to bottom form
+       static int const dh3 = 5;  // spacing between add/delete/... buttons.
+
+       int const wbrsr  = dialog_->citeBrsr->w;
+       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_->button_ok->h;
+
+       int hform = dh1 + hbrsr + dh1;
+       if (bibPresent ) hform += hinfo + dh1;
+       if (natbib ) hform += hstyle + dh1 + htext + dh2;
+       hform += htext + dh1 + hok + dh2;
+
+       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, minw_, minh_ );
+
+       x = dialog_->citeBrsr->x;
+       y += dh1; 
+       fl_set_object_geometry( dialog_->citeBrsr, x, y, wbrsr, hbrsr );
+       x = dialog_->bibBrsr->x;
+       fl_set_object_geometry( dialog_->bibBrsr,  x, y, wbrsr, hbrsr );
+
+       x = dialog_->addBtn->x;
+       fl_set_object_position( dialog_->addBtn,  x, y );
+       y += dh3 + dialog_->addBtn->h;
+       fl_set_object_position( dialog_->delBtn,  x, y );
+       y += dh3 + dialog_->delBtn->h;
+       fl_set_object_position( dialog_->upBtn,   x, y );
+       y += dh3 + dialog_->upBtn->h;
+       fl_set_object_position( dialog_->downBtn, x, y );
+
+       y = dh1 + hbrsr + dh1; // in position for next element
+
+       if (bibPresent) {
+               x = dialog_->infoBrsr->x;
+               fl_set_object_position( dialog_->infoBrsr, x, y );
                fl_show_object( dialog_->infoBrsr );
-               ypos += infoHeight;
-       }
-       else
+               y += hinfo + dh1;
+       } else
                fl_hide_object( dialog_->infoBrsr );
 
-       ypos += 20;
-       // awaiting natbib support
-       fl_hide_object( dialog_->textBefore );
+       if (natbib) {
+               x = dialog_->style->x;
+               fl_set_object_position( dialog_->style, x, y );
+               fl_show_object( dialog_->style );
+               x = dialog_->textBefore->x;
+               y += hstyle + dh1;
+               fl_set_object_position( dialog_->textBefore, x, y );
+               fl_show_object( dialog_->textBefore );
+               y += htext + dh2;
+       } else {
+               fl_hide_object( dialog_->style );
+               fl_hide_object( dialog_->textBefore );
+       }
 
-       fl_set_object_position( dialog_->textAftr, 100, ypos );
-       fl_set_object_position( dialog_->ok,       230, ypos+50 );
-       fl_set_object_position( dialog_->cancel,   330, ypos+50 );
+       x = dialog_->textAftr->x;
+       fl_set_object_position( dialog_->textAftr, x, y );
+
+       y += htext + dh1;
+       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 );
 }
 
 
-void FormCitation::input( State cb )
+#ifdef WITH_WARNINGS
+#warning convert this to use the buttoncontroller
+#endif
+bool FormCitation::input( FL_OBJECT *, long data )
 {
-       switch( cb ) {
+       bool activate = false;
+       State cb = static_cast<State>( data );
+
+       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 {
@@ -340,9 +358,9 @@ void FormCitation::input( State cb )
        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 );
                }
@@ -352,7 +370,7 @@ void FormCitation::input( State cb )
                        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 );
 
@@ -366,29 +384,30 @@ void FormCitation::input( State cb )
        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 ) ;
@@ -396,14 +415,15 @@ void FormCitation::input( State cb )
 
                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;
@@ -416,14 +436,15 @@ void FormCitation::input( State cb )
                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;
@@ -436,99 +457,37 @@ void FormCitation::input( State cb )
                fl_select_browser_line( dialog_->citeBrsr, sel+1 );
                citekeys.insert( it+1, tmp );
                setCiteButtons( ON );
+               activate = true;
        }
        break;
        default:
                break;
        }
+       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];
        }
 
-       textAfter = fl_get_input(dialog_->textAftr);
-
-       if( inset_ != 0 )
-       {
-               inset_->setContents( contents );
-               inset_->setOptions( textAfter );
-               lv_->view()->updateInset( inset_, true );
-       } else {
-               InsetCommandParams p( "cite", contents, textAfter );
-               lv_->getLyXFunc()->Dispatch( LFUN_INSERT_CITATION,
-                                            p.getAsString().c_str() );
-       }
-}
-
-
-void FormCitation::hide()
-{
-       if (dialog_
-           && dialog_->form_citation
-           && dialog_->form_citation->visible) {
-               fl_hide_form(dialog_->form_citation);
-               u_.disconnect();
-               h_.disconnect();
-       }
-
-       // free up the dialog for another inset
-       inset_ = 0;
-       ih_.disconnect();
-       dialogIsOpen = false;
-}
-
+       params.setContents(contents);
+       params.setOptions(fl_get_input(dialog_->textAftr));
 
-void FormCitation::free()
-{
-       // we don't need to delete u and h here because
-       // hide() does that after disconnecting.
-       if (dialog_) {
-               if (dialog_->form_citation
-                   && dialog_->form_citation->visible) {
-                       hide();
+       if (inset_ != 0) {
+               // Only update if contents have changed
+               if (params != inset_->params()) {
+                       inset_->setParams(params);
+                       lv_->view()->updateInset(inset_, true);
                }
-               fl_free_form(dialog_->form_citation);
-               delete dialog_;
-               dialog_ = 0;
+       } else {
+               lv_->getLyXFunc()->Dispatch(LFUN_CITATION_INSERT,
+                                           params.getAsString());
        }
 }
-
-
-int FormCitation::WMHideCB(FL_FORM * form, void *)
-{
-       // Ensure that the signals (u and h) are disconnected even if the
-       // window manager is used to close the dialog.
-       FormCitation * pre = static_cast<FormCitation*>(form->u_vdata);
-       pre->hide();
-       return FL_CANCEL;
-}
-
-
-void FormCitation::OKCB(FL_OBJECT * ob, long)
-{
-       FormCitation * pre = static_cast<FormCitation*>(ob->form->u_vdata);
-       pre->apply();
-       pre->hide();
-}
-
-
-void FormCitation::CancelCB(FL_OBJECT * ob, long)
-{
-       FormCitation * pre = static_cast<FormCitation*>(ob->form->u_vdata);
-       pre->hide();
-}
-
-
-void FormCitation::InputCB(FL_OBJECT * ob, long data)
-{
-       FormCitation * pre = static_cast<FormCitation*>(ob->form->u_vdata);
-       pre->input( static_cast<FormCitation::State>(data) );
-}