next ones

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@20774 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2007-10-06 09:55:21 +00:00
parent 540a00cd02
commit 5629673a88
8 changed files with 228 additions and 306 deletions

View File

@ -1,172 +0,0 @@
/**
* \file ControlBibtex.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author John Levon
* \author Angus Leeming
* \author Herbert Voß
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "ControlBibtex.h"
#include "frontend_helpers.h"
#include "Buffer.h"
#include "BufferParams.h"
#include "LyXRC.h"
#include "gettext.h"
#include "support/FileFilterList.h"
#include "support/filetools.h"
#include "support/lstrings.h"
using std::pair;
using std::string;
using std::vector;
namespace lyx {
using support::contains;
using support::FileFilterList;
using support::onlyFilename;
using support::prefixIs;
using support::split;
namespace frontend {
ControlBibtex::ControlBibtex(Dialog & d)
: ControlCommand(d, "bibtex")
{}
docstring const ControlBibtex::browseBib(docstring const & in_name) const
{
// FIXME UNICODE
pair<docstring, docstring> dir1(_("Documents|#o#O"),
from_utf8(lyxrc.document_path));
FileFilterList const filter(_("BibTeX Databases (*.bib)"));
return browseRelFile(in_name, from_utf8(bufferFilepath()),
_("Select a BibTeX database to add"),
filter, false, dir1);
}
docstring const ControlBibtex::browseBst(docstring const & in_name) const
{
// FIXME UNICODE
pair<docstring, docstring> dir1(_("Documents|#o#O"),
from_utf8(lyxrc.document_path));
FileFilterList const filter(_("BibTeX Styles (*.bst)"));
return browseRelFile(in_name, from_utf8(bufferFilepath()),
_("Select a BibTeX style"), filter, false, dir1);
}
void ControlBibtex::getBibStyles(vector<string> & data) const
{
data.clear();
getTexFileList("bstFiles.lst", data);
// test, if we have a valid list, otherwise run rescan
if (data.empty()) {
rescanBibStyles();
getTexFileList("bstFiles.lst", data);
}
vector<string>::iterator it = data.begin();
vector<string>::iterator end = data.end();
for (; it != end; ++it) {
*it = onlyFilename(*it);
}
// sort on filename only (no path)
std::sort(data.begin(), data.end());
}
void ControlBibtex::getBibFiles(vector<string> & data) const
{
data.clear();
getTexFileList("bibFiles.lst", data);
// test, if we have a valid list, otherwise run rescan
if (data.empty()) {
rescanBibStyles();
getTexFileList("bibFiles.lst", data);
}
vector<string>::iterator it = data.begin();
vector<string>::iterator end = data.end();
for (; it != end; ++it) {
*it = onlyFilename(*it);
}
// sort on filename only (no path)
std::sort(data.begin(), data.end());
}
void ControlBibtex::rescanBibStyles() const
{
rescanTexStyles();
}
bool ControlBibtex::usingBibtopic() const
{
return buffer().params().use_bibtopic;
}
bool ControlBibtex::bibtotoc() const
{
return prefixIs(to_utf8(params()["options"]), "bibtotoc");
}
string const ControlBibtex::getStylefile() const
{
// the different bibtex packages have (and need) their
// own "plain" stylefiles
biblio::CiteEngine const engine = buffer().params().getEngine();
docstring defaultstyle;
switch (engine) {
case biblio::ENGINE_BASIC:
defaultstyle = from_ascii("plain");
break;
case biblio::ENGINE_NATBIB_AUTHORYEAR:
defaultstyle = from_ascii("plainnat");
break;
case biblio::ENGINE_NATBIB_NUMERICAL:
defaultstyle = from_ascii("plainnat");
break;
case biblio::ENGINE_JURABIB:
defaultstyle = from_ascii("jurabib");
break;
}
docstring bst = params()["options"];
if (bibtotoc()){
// bibstyle exists?
if (contains(bst, ',')) {
docstring bibtotoc = from_ascii("bibtotoc");
bst = split(bst, bibtotoc, ',');
} else
bst.erase();
}
// propose default style file for new insets
// existing insets might have (legally) no bst files
// (if the class already provides a style)
if (bst.empty() && params()["bibfiles"].empty())
bst = defaultstyle;
// FIXME UNICODE
return to_utf8(bst);
}
} // namespace frontend
} // namespace lyx

View File

@ -1,60 +0,0 @@
// -*- C++ -*-
/**
* \file ControlBibtex.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author John Levon
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*/
#ifndef CONTROLBIBTEX_H
#define CONTROLBIBTEX_H
#include "ControlCommand.h"
#include "support/docstring.h"
#include <vector>
namespace lyx {
namespace support { class FileFilterList; }
namespace frontend {
/** A controller for Bibtex dialogs.
*/
class ControlBibtex : public ControlCommand {
public:
///
ControlBibtex(Dialog &);
/// Browse for a .bib file
docstring const browseBib(docstring const & in_name) const;
/// Browse for a .bst file
docstring const browseBst(docstring const & in_name) const;
/// get the list of bst files
void getBibStyles(std::vector<std::string> & data) const;
/// get the list of bib files
void getBibFiles(std::vector<std::string> & data) const;
/// build filelists of all availabe bib/bst/cls/sty-files. done through
/// kpsewhich and an external script, saved in *Files.lst
void rescanBibStyles() const;
/// do we use bibtopic (for sectioned bibliography)?
bool usingBibtopic() const;
/// should we put the bibliography to the TOC?
bool bibtotoc() const;
/// which stylefile do we use?
std::string const getStylefile() const;
};
} // namespace frontend
} // namespace lyx
#endif // CONTROLBIBTEX_H

View File

@ -9,7 +9,6 @@ noinst_LTLIBRARIES = liblyxcontrollers.la
SOURCEFILES = \
Dialog.cpp \
ButtonPolicy.cpp \
ControlBibtex.cpp \
ControlBox.cpp \
ControlCharacter.cpp \
ControlChanges.cpp \
@ -37,7 +36,6 @@ SOURCEFILES = \
HEADERFILES = \
ButtonPolicy.h \
ControlBibtex.h \
ControlBox.h \
ControlCharacter.h \
ControlChanges.h \

View File

@ -16,9 +16,7 @@
#include "ButtonController.h"
#include "DialogView.h"
#include "DockView.h"
#include "GuiAbout.h"
#include "GuiBibitem.h"
#include "GuiBibtex.h"
#include "GuiBox.h"
#include "GuiChanges.h"
#include "GuiCharacter.h"
@ -154,11 +152,11 @@ Dialog * Dialogs::build(string const & name)
GuiViewBase & guiview = static_cast<GuiViewBase &>(lyxview_);
if (name == "aboutlyx") {
dialog = new GuiAboutDialog(lyxview_);
dialog = createGuiAbout(lyxview_);
} else if (name == "bibitem") {
dialog = new GuiBibitemDialog(lyxview_);
} else if (name == "bibtex") {
dialog = new GuiBibtexDialog(lyxview_);
dialog = createGuiBibtex(lyxview_);
} else if (name == "box") {
dialog = new GuiBoxDialog(lyxview_);
} else if (name == "branch") {

View File

@ -95,23 +95,12 @@ static QString version()
}
class ControlAbout : public Controller
{
public:
ControlAbout(Dialog & parent) : Controller(parent) {}
bool initialiseParams(std::string const &) { return true; }
void clearParams() {}
void dispatchParams() {}
bool isBufferDependent() const { return false; }
};
GuiAboutDialog::GuiAboutDialog(LyXView & lv)
: GuiDialog(lv, "aboutlyx")
GuiAbout::GuiAbout(LyXView & lv)
: GuiDialog(lv, "aboutlyx"), Controller(this)
{
setupUi(this);
setViewTitle(_("About LyX"));
setController(new ControlAbout(*this));
setController(this, false);
connect(closePB, SIGNAL(clicked()), this, SLOT(reject()));
@ -125,6 +114,10 @@ GuiAboutDialog::GuiAboutDialog(LyXView & lv)
creditsTB->setHtml(credits());
}
Dialog * createGuiAbout(LyXView & lv) { return new GuiAbout(lv); }
} // namespace frontend
} // namespace lyx

View File

@ -18,13 +18,19 @@
namespace lyx {
namespace frontend {
class GuiAboutDialog : public GuiDialog, public Ui::AboutUi
class GuiAbout : public GuiDialog, public Ui::AboutUi, public Controller
{
Q_OBJECT
public:
// Constructor
GuiAboutDialog(LyXView & lv);
GuiAbout(LyXView & lv);
// Controller stuff
bool initialiseParams(std::string const &) { return true; }
void clearParams() {}
void dispatchParams() {}
bool isBufferDependent() const { return false; }
};
} // namespace frontend

View File

@ -5,6 +5,7 @@
*
* \author John Levon
* \author Herbert Voß
* \author Angus Leeming
* \author Jürgen Spitzmüller
*
* Full author contact details are available in file CREDITS.
@ -14,16 +15,23 @@
#include "GuiBibtex.h"
#include "Buffer.h"
#include "BufferParams.h"
#include "debug.h"
#include "ui_BibtexAddUi.h"
#include "qt_helpers.h"
#include "Validator.h"
#include "LyXRC.h"
#include "gettext.h"
#include "ControlBibtex.h"
#include "ButtonPolicy.h"
#include "support/filetools.h" // changeExtension
#include "support/lstrings.h"
#include "support/FileFilterList.h"
#include "frontend_helpers.h"
#include <QPushButton>
#include <QListWidget>
@ -31,29 +39,30 @@
#include <QCloseEvent>
#include <QLineEdit>
#include "debug.h"
#include "support/filetools.h"
#include "support/lstrings.h"
using std::vector;
using std::pair;
using std::string;
using std::vector;
namespace lyx {
namespace frontend {
using support::changeExtension;
using support::contains;
using support::FileFilterList;
using support::onlyFilename;
using support::prefixIs;
using support::split;
using support::trim;
GuiBibtexDialog::GuiBibtexDialog(LyXView & lv)
: GuiDialog(lv, "bibtex")
GuiBibtex::GuiBibtex(LyXView & lv)
: GuiDialog(lv, "bibtex"), ControlCommand(*this, "bibtex")
{
setupUi(this);
setViewTitle( _("BibTeX Bibliography"));
setController(new ControlBibtex(*this));
setController(this, false);
QDialog::setModal(true);
@ -65,7 +74,7 @@ GuiBibtexDialog::GuiBibtexDialog(LyXView & lv)
this, SLOT(browsePressed()));
connect(deletePB, SIGNAL(clicked()),
this, SLOT(deletePressed()));
connect(styleCB, SIGNAL(editTextChanged(const QString &)),
connect(styleCB, SIGNAL(editTextChanged(QString)),
this, SLOT(change_adaptor()));
connect(databaseLW, SIGNAL(itemSelectionChanged()),
this, SLOT(databaseChanged()));
@ -111,13 +120,7 @@ GuiBibtexDialog::GuiBibtexDialog(LyXView & lv)
}
ControlBibtex & GuiBibtexDialog::controller()
{
return static_cast<ControlBibtex &>(GuiDialog::controller());
}
void GuiBibtexDialog::bibEDChanged()
void GuiBibtex::bibEDChanged()
{
// Indicate to the button controller that the contents have
// changed. The actual test of validity is carried out by
@ -126,15 +129,15 @@ void GuiBibtexDialog::bibEDChanged()
}
void GuiBibtexDialog::change_adaptor()
void GuiBibtex::change_adaptor()
{
changed();
}
void GuiBibtexDialog::browsePressed()
void GuiBibtex::browsePressed()
{
docstring const file = controller().browseBst(docstring());
docstring const file = browseBst(docstring());
if (!file.empty()) {
// FIXME UNICODE
@ -158,9 +161,9 @@ void GuiBibtexDialog::browsePressed()
}
void GuiBibtexDialog::browseBibPressed()
void GuiBibtex::browseBibPressed()
{
docstring const file = trim(controller().browseBib(docstring()));
docstring const file = trim(browseBib(docstring()));
if (!file.empty()) {
// FIXME UNICODE
@ -182,14 +185,14 @@ void GuiBibtexDialog::browseBibPressed()
}
void GuiBibtexDialog::addPressed()
void GuiBibtex::addPressed()
{
add_bc_.setValid(false);
add_->exec();
}
void GuiBibtexDialog::addDatabase()
void GuiBibtex::addDatabase()
{
int const sel = add_->bibLW->currentRow();
docstring const file = trim(qstring_to_ucs4(add_->bibED->text()));
@ -223,7 +226,7 @@ void GuiBibtexDialog::addDatabase()
}
void GuiBibtexDialog::deletePressed()
void GuiBibtex::deletePressed()
{
databaseLW->takeItem(databaseLW->currentRow());
changed();
@ -231,32 +234,32 @@ void GuiBibtexDialog::deletePressed()
void GuiBibtexDialog::databaseChanged()
void GuiBibtex::databaseChanged()
{
deletePB->setEnabled(!controller().isBufferReadonly() && databaseLW->currentRow() != -1);
deletePB->setEnabled(!isBufferReadonly() && databaseLW->currentRow() != -1);
}
void GuiBibtexDialog::availableChanged()
void GuiBibtex::availableChanged()
{
add_bc_.setValid(true);
}
void GuiBibtexDialog::closeEvent(QCloseEvent *e)
void GuiBibtex::closeEvent(QCloseEvent *e)
{
slotClose();
e->accept();
}
void GuiBibtexDialog::updateContents()
void GuiBibtex::updateContents()
{
bool bibtopic = controller().usingBibtopic();
bool bibtopic = usingBibtopic();
databaseLW->clear();
docstring bibs(controller().params()["bibfiles"]);
docstring bibs = params()["bibfiles"];
docstring bib;
while (!bibs.empty()) {
@ -269,19 +272,19 @@ void GuiBibtexDialog::updateContents()
add_->bibLW->clear();
vector<string> bib_str;
controller().getBibFiles(bib_str);
getBibFiles(bib_str);
for (vector<string>::const_iterator it = bib_str.begin();
it != bib_str.end(); ++it) {
string bibItem(changeExtension(*it, ""));
add_->bibLW->addItem(toqstr(bibItem));
}
string bibstyle(controller().getStylefile());
string bibstyle = getStylefile();
bibtocCB->setChecked(controller().bibtotoc() && !bibtopic);
bibtocCB->setChecked(bibtotoc() && !bibtopic);
bibtocCB->setEnabled(!bibtopic);
docstring btprint(controller().params()["btprint"]);
docstring btprint(params()["btprint"]);
int btp = 0;
if (btprint == "btPrintNotCited")
btp = 1;
@ -296,7 +299,7 @@ void GuiBibtexDialog::updateContents()
int item_nr(-1);
vector<string> str;
controller().getBibStyles(str);
getBibStyles(str);
for (vector<string>::const_iterator it = str.begin();
it != str.end(); ++it) {
string item(changeExtension(*it, ""));
@ -317,7 +320,7 @@ void GuiBibtexDialog::updateContents()
}
void GuiBibtexDialog::applyView()
void GuiBibtex::applyView()
{
docstring dbs = qstring_to_ucs4(databaseLW->item(0)->text());
@ -327,22 +330,22 @@ void GuiBibtexDialog::applyView()
dbs += qstring_to_ucs4(databaseLW->item(i)->text());
}
controller().params()["bibfiles"] = dbs;
params()["bibfiles"] = dbs;
docstring const bibstyle(qstring_to_ucs4(styleCB->currentText()));
bool const bibtotoc(bibtocCB->isChecked());
if (bibtotoc && (!bibstyle.empty())) {
// both bibtotoc and style
controller().params()["options"] = "bibtotoc," + bibstyle;
params()["options"] = "bibtotoc," + bibstyle;
} else if (bibtotoc) {
// bibtotoc and no style
controller().params()["options"] = from_ascii("bibtotoc");
params()["options"] = from_ascii("bibtotoc");
} else {
// only style. An empty one is valid, because some
// documentclasses have an own \bibliographystyle{}
// command!
controller().params()["options"] = bibstyle;
params()["options"] = bibstyle;
}
// bibtopic allows three kinds of sections:
@ -353,26 +356,153 @@ void GuiBibtexDialog::applyView()
switch (btp) {
case 0:
controller().params()["btprint"] = from_ascii("btPrintCited");
params()["btprint"] = from_ascii("btPrintCited");
break;
case 1:
controller().params()["btprint"] = from_ascii("btPrintNotCited");
params()["btprint"] = from_ascii("btPrintNotCited");
break;
case 2:
controller().params()["btprint"] = from_ascii("btPrintAll");
params()["btprint"] = from_ascii("btPrintAll");
break;
}
if (!controller().usingBibtopic())
controller().params()["btprint"] = docstring();
if (!usingBibtopic())
params()["btprint"] = docstring();
}
bool GuiBibtexDialog::isValid()
bool GuiBibtex::isValid()
{
return databaseLW->count() != 0;
}
docstring const GuiBibtex::browseBib(docstring const & in_name) const
{
// FIXME UNICODE
pair<docstring, docstring> dir1(_("Documents|#o#O"),
from_utf8(lyxrc.document_path));
FileFilterList const filter(_("BibTeX Databases (*.bib)"));
return browseRelFile(in_name, from_utf8(bufferFilepath()),
_("Select a BibTeX database to add"),
filter, false, dir1);
}
docstring const GuiBibtex::browseBst(docstring const & in_name) const
{
// FIXME UNICODE
pair<docstring, docstring> dir1(_("Documents|#o#O"),
from_utf8(lyxrc.document_path));
FileFilterList const filter(_("BibTeX Styles (*.bst)"));
return browseRelFile(in_name, from_utf8(bufferFilepath()),
_("Select a BibTeX style"), filter, false, dir1);
}
void GuiBibtex::getBibStyles(vector<string> & data) const
{
data.clear();
getTexFileList("bstFiles.lst", data);
// test, if we have a valid list, otherwise run rescan
if (data.empty()) {
rescanBibStyles();
getTexFileList("bstFiles.lst", data);
}
vector<string>::iterator it = data.begin();
vector<string>::iterator end = data.end();
for (; it != end; ++it) {
*it = onlyFilename(*it);
}
// sort on filename only (no path)
std::sort(data.begin(), data.end());
}
void GuiBibtex::getBibFiles(vector<string> & data) const
{
data.clear();
getTexFileList("bibFiles.lst", data);
// test, if we have a valid list, otherwise run rescan
if (data.empty()) {
rescanBibStyles();
getTexFileList("bibFiles.lst", data);
}
vector<string>::iterator it = data.begin();
vector<string>::iterator end = data.end();
for (; it != end; ++it) {
*it = onlyFilename(*it);
}
// sort on filename only (no path)
std::sort(data.begin(), data.end());
}
void GuiBibtex::rescanBibStyles() const
{
rescanTexStyles();
}
bool GuiBibtex::usingBibtopic() const
{
return buffer().params().use_bibtopic;
}
bool GuiBibtex::bibtotoc() const
{
return prefixIs(to_utf8(params()["options"]), "bibtotoc");
}
string const GuiBibtex::getStylefile() const
{
// the different bibtex packages have (and need) their
// own "plain" stylefiles
biblio::CiteEngine const engine = buffer().params().getEngine();
docstring defaultstyle;
switch (engine) {
case biblio::ENGINE_BASIC:
defaultstyle = from_ascii("plain");
break;
case biblio::ENGINE_NATBIB_AUTHORYEAR:
defaultstyle = from_ascii("plainnat");
break;
case biblio::ENGINE_NATBIB_NUMERICAL:
defaultstyle = from_ascii("plainnat");
break;
case biblio::ENGINE_JURABIB:
defaultstyle = from_ascii("jurabib");
break;
}
docstring bst = params()["options"];
if (bibtotoc()){
// bibstyle exists?
if (contains(bst, ',')) {
docstring bibtotoc = from_ascii("bibtotoc");
bst = split(bst, bibtotoc, ',');
} else
bst.erase();
}
// propose default style file for new insets
// existing insets might have (legally) no bst files
// (if the class already provides a style)
if (bst.empty() && params()["bibfiles"].empty())
bst = defaultstyle;
// FIXME UNICODE
return to_utf8(bst);
}
Dialog * createGuiBibtex(LyXView & lv) { return new GuiBibtex(lv); }
} // namespace frontend
} // namespace lyx

View File

@ -5,6 +5,7 @@
* Licence details can be found in the file COPYING.
*
* \author John Levon
* \author Angus Leeming
*
* Full author contact details are available in file CREDITS.
*/
@ -13,12 +14,20 @@
#define GUIBIBTEX_H
#include "GuiDialog.h"
#include "ControlBibtex.h"
#include "ButtonController.h"
#include "ui_BibtexUi.h"
#include "ui_BibtexAddUi.h"
#include "ControlCommand.h"
#include "support/docstring.h"
#include <vector>
namespace lyx {
namespace support { class FileFilterList; }
namespace frontend {
class GuiBibtexAddDialog : public QDialog, public Ui::BibtexAddUi
@ -32,12 +41,12 @@ public:
};
class GuiBibtexDialog : public GuiDialog, public Ui::BibtexUi
class GuiBibtex : public GuiDialog, public Ui::BibtexUi, public ControlCommand
{
Q_OBJECT
public:
GuiBibtexDialog(LyXView & lv);
GuiBibtex(LyXView & lv);
private Q_SLOTS:
void change_adaptor();
@ -55,7 +64,7 @@ private:
private:
/// parent controller
ControlBibtex & controller();
Controller & controller() { return *this; }
///
virtual bool isValid();
/// Apply changes
@ -63,6 +72,26 @@ private:
/// update
virtual void updateContents();
/// Browse for a .bib file
docstring const browseBib(docstring const & in_name) const;
/// Browse for a .bst file
docstring const browseBst(docstring const & in_name) const;
/// get the list of bst files
void getBibStyles(std::vector<std::string> & data) const;
/// get the list of bib files
void getBibFiles(std::vector<std::string> & data) const;
/// build filelists of all availabe bib/bst/cls/sty-files. done through
/// kpsewhich and an external script, saved in *Files.lst
void rescanBibStyles() const;
/// do we use bibtopic (for sectioned bibliography)?
bool usingBibtopic() const;
/// should we put the bibliography to the TOC?
bool bibtotoc() const;
/// which stylefile do we use?
std::string const getStylefile() const;
///
GuiBibtexAddDialog * add_;
///