*/
#include <config.h>
-
-#include FORMS_H_LOCATION
-
#include <algorithm>
#ifdef __GNUG__
#endif
-#include "gettext.h"
#include "Dialogs.h"
#include "FormCitation.h"
#include "LyXView.h"
#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)
{
- dialog_ = 0;
// let the dialog be shown
// These are permanent connections so we won't bother
// storing a copy because we won't be disconnecting.
}
-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);
}
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);
}
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, ',') );
}
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());
}
{
fl_clear_browser( browser );
- for( unsigned 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());
}
void FormCitation::setCiteButtons( State status ) const
{
- switch( status ) {
+ switch (status) {
case ON:
{
fl_activate_object( dialog_->delBtn );
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 {
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 {
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;
- 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;
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 );
} 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 );
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 );
}
-void FormCitation::input( long data )
+#ifdef WITH_WARNINGS
+#warning convert this to use the buttoncontroller
+#endif
+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 );
- 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
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 {
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 );
}
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 );
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,
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:
{
- 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 ) ;
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;
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;
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];
}
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);
}