*/
#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"), HIDE), dialog_(0)
+ : FormCommand(lv, d, _("Citation"), new NoRepeatedApplyReadOnlyPolicy),
+ dialog_(0)
{
// let the dialog be shown
// These are permanent connections so we won't bother
FL_FORM * FormCitation::form() const
{
- if ( dialog_ ) return dialog_->form;
+ if (dialog_ ) return dialog_->form;
return 0;
}
-void FormCitation::clearStore()
+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;
+
+ // 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, ',') );
}
setSize( size, bibPresent );
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 )
+ 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 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;
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_->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 );
}
#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
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 {
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 );
}
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,
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 true;
+ return activate;
}
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];
}