]> git.lyx.org Git - features.git/commitdiff
I have continued a bit on my track to do a real model view separation for the Citatio...
authorAbdelrazak Younes <younes@lyx.org>
Tue, 11 Apr 2006 08:26:43 +0000 (08:26 +0000)
committerAbdelrazak Younes <younes@lyx.org>
Tue, 11 Apr 2006 08:26:43 +0000 (08:26 +0000)
In frontend/qt4/Dialog.C, we use these class like this:

    } else if (name == "citation") {
        QCitation * ci = new QCitation(*dialog);
        dialog->setController(ci);
        dialog->setView(new QCitationDialog(*dialog, ci));
        dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);

Now, it should be possible to define another view like this:

    } else if (name == "citation-inline") {
        QCitation * ci = new QCitation(*dialog);
        dialog->setController(ci);
        dialog->setView(new QCitationInline(*dialog, ci));

All the citation functionalities are not there yet but the basic ones are there. There are still a few "intelligence" still to be transfered from the view to the dialog.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@13635 a592a061-630c-0410-9148-cb99ea01b6c8

src/frontends/qt4/Dialogs.C
src/frontends/qt4/QCitation.C
src/frontends/qt4/QCitation.h
src/frontends/qt4/QCitationDialog.C
src/frontends/qt4/QCitationDialog.h

index d3ef9a657e9aedb86d31ae8a1b261f01c8d02a01..128fc08a19ddaeddcac6de4897ca98422b3bf4ca 100644 (file)
@@ -53,6 +53,7 @@
 #include "QChanges.h"
 #include "QCharacter.h"
 #include "QCitation.h"
+#include "QCitationDialog.h"
 #include "QDocument.h"
 #include "QErrorList.h"
 #include "QERT.h"
@@ -173,8 +174,9 @@ Dialogs::DialogPtr Dialogs::build(string const & name)
                dialog->setView(new QCharacter(*dialog));
                dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
        } else if (name == "citation") {
-               dialog->setController(new ControlCitation(*dialog));
-               dialog->setView(new QCitation(*dialog));
+               QCitation * ci = new QCitation(*dialog);
+               dialog->setController(ci);
+               dialog->setView(new QCitationDialog(*dialog, ci));
                dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
        } else if (name == "document" || name == "preamble") {
 
index 7bdbad5386b57450ef4607ce594cb41a3dd8e4bc..22f53ce09410afd0855de2908e7aec4a41e4c55e 100644 (file)
@@ -11,8 +11,8 @@
 
 #include <config.h>
 
+#include "ControlCitation.h"
 #include "QCitation.h"
-#include "QCitationDialog.h"
 #include "Qt2BC.h"
 #include "qt_helpers.h"
 
@@ -32,16 +32,20 @@ using std::endl;
 using std::vector;
 using std::string;
 
-void toQStringList(QStringList & qlist, vector<string> const & v)
+
+QStringList toQStringList(vector<string> const & v)
 {
-       qlist.clear();
+       QStringList qlist;
+
        for (size_t i=0; i != v.size(); ++i) {
                if (v[i].empty())
                        continue;
                qlist.append(toqstr(v[i]));
        }
+       return qlist;
 }
 
+
 void toVector(vector<string> & v, const QStringList & qlist)
 {
        v.clear();
@@ -50,32 +54,40 @@ void toVector(vector<string> & v, const QStringList & qlist)
                v.push_back(fromqstr(qlist[i]));
 }
 
+
 namespace lyx {
 namespace frontend {
 
-typedef QController<ControlCitation, QView<QCitationDialog> > base_class;
-
 
 QCitation::QCitation(Dialog & parent)
-       : base_class(parent, _("Citation"))
+       : ControlCitation(parent)
 {
 }
 
 
-void QCitation::apply()
+void QCitation::apply(int const choice, bool const full, bool const force,
+                                         QString before, QString after)
 {
-       InsetCommandParams & params = controller().params();
-       dialog_->apply(params);
+//     InsetCommandParams & params = params();
+
+       vector<biblio::CiteStyle> const & styles =
+               ControlCitation::getCiteStyles();
+
+       string const command =
+               biblio::CitationStyle(styles[choice], full, force)
+               .asLatexStr();
+
+       params().setContents(fromqstr(selected_keys_.stringList().join(",")));
+       params().setSecOptions(fromqstr(before));
+       params().setOptions(fromqstr(after));
+       dispatchParams();
 
-       params.setContents(fromqstr(selected_keys_.stringList().join("'")));
 /*
        if (dialog().controller().isBufferDependent()) {
                if (!dialog().kernel().isBufferAvailable() ||
                    dialog().kernel().isBufferReadonly())
                        return;
        }
-
-       dialog().view().apply();
        dialog().controller().dispatchParams();
 
        if (dialog().controller().disconnectOnApply()) {
@@ -84,48 +96,42 @@ void QCitation::apply()
                dialog().view().update();
        }
 */
-//     dialog().ApplyButton();
-//     dialog().apply();
 }
 
 
-void QCitation::build_dialog()
+QString QCitation::textBefore()
 {
-       dialog_.reset(new QCitationDialog(this));
+       return toqstr(params().getSecOptions());
 }
 
 
-void QCitation::update_contents()
+QString QCitation::textAfter()
 {
-       QStringList keys;
+       return toqstr(params().getOptions());
+}
 
+
+void QCitation::updateModel()
+{
        // Make the list of all available bibliography keys
-       toQStringList(keys,
-               biblio::getKeys(controller().bibkeysInfo()));
+       QStringList keys = toQStringList(biblio::getKeys(bibkeysInfo()));
        available_keys_.setStringList(keys);
 
        // Ditto for the keys cited in this inset
-       QString str = toqstr(controller().params().getContents());
+       QString str = toqstr(params().getContents());
        if (!str.isEmpty()) {
                keys = str.split(",");
                selected_keys_.setStringList(keys);
        }
-
-       dialog_->update(controller().params());
-
-       bc().valid(isValid());
 }
 
-void QCitation::hide()
-{
-       QDialogView::hide();
-}
 
 bool QCitation::isValid()
 {
        return selected_keys_.rowCount() > 0;
 }
 
+
 QModelIndex QCitation::findKey(QString const & str, QModelIndex const & index) const
 {
        QStringList const avail = available_keys_.stringList();
@@ -135,6 +141,7 @@ QModelIndex QCitation::findKey(QString const & str, QModelIndex const & index) c
        return available_keys_.index(pos);
 }
 
+
 QModelIndex QCitation::findKey(QString const & str) const
 {
        cout << "Find text " << fromqstr(str) << endl;
@@ -150,10 +157,9 @@ QModelIndex QCitation::findKey(QString const & str) const
        return available_keys_.index(pos);
 }
 
+
 void QCitation::addKeys(QModelIndexList const & indexes)
 {
-       // = selectionModel->selectedIndexes();
-
        QModelIndex index;
 
        if (indexes.empty())
@@ -167,10 +173,9 @@ void QCitation::addKeys(QModelIndexList const & indexes)
        }
 
        selected_keys_.setStringList(keys);
-
-       changed();
 }
 
+
 void QCitation::deleteKeys(QModelIndexList const & indexes)
 {
        QModelIndex index;
@@ -187,10 +192,9 @@ void QCitation::deleteKeys(QModelIndexList const & indexes)
        }
 
        selected_keys_.setStringList(keys);
-
-       changed();
 }
 
+
 void QCitation::upKey(QModelIndexList const & indexes)
 {
        if (indexes.empty() || indexes.size() > 1)
@@ -203,10 +207,9 @@ void QCitation::upKey(QModelIndexList const & indexes)
        QStringList keys = selected_keys_.stringList();
        keys.swap(pos, pos-1);
        selected_keys_.setStringList(keys);
-
-       changed();
 }
 
+
 void QCitation::downKey(QModelIndexList const & indexes)
 {
        if (indexes.empty() || indexes.size() > 1)
@@ -219,8 +222,14 @@ void QCitation::downKey(QModelIndexList const & indexes)
        QStringList keys = selected_keys_.stringList();
        keys.swap(pos, pos+1);
        selected_keys_.setStringList(keys);
+}
+
+
+QStringList QCitation::citationStyles(int sel)
+{
+       string key = fromqstr(selected_keys_.stringList()[sel]);
 
-       changed();
+       return toQStringList(getCiteStrings(key));
 }
 
 } // namespace frontend
index f41052dae6fb893789ec766fe8a7277ba96a8561..b018bc3a6d33a9a21a40acd9955d45c8dd123713 100644 (file)
 #ifndef QCITATION_H
 #define QCITATION_H
 
-#include "QDialogView.h"
+#include "ControlCitation.h"
 
 #include <QStringListModel>
 
 namespace lyx {
 namespace frontend {
 
-class ControlCitation;
-class QCitationDialog;
-
-
-class QCitation : public QController<ControlCitation, QView<QCitationDialog> >
+class QCitation : public ControlCitation
 {
 public:
-       friend class QCitationDialog;
        ///
        QCitation(Dialog &);
 
@@ -40,6 +35,9 @@ public:
        QStringListModel * found()
        { return &found_keys_; }
 
+       QString textBefore();
+       QString textAfter();
+
        QModelIndex findKey(QString const & str, QModelIndex const & index) const;
        QModelIndex findKey(QString const & str) const;
 
@@ -48,20 +46,19 @@ public:
        void upKey(QModelIndexList const & indexes);
        void downKey(QModelIndexList const & indexes);
 
-protected:
-       virtual bool isValid();
+       QStringList citationStyles(int sel);
 
-private:
+
+       virtual bool isValid();
 
        /// Set the Params variable for the Controller.
-       virtual void apply();
-       /// Build the dialog.
-       virtual void build_dialog();
-       /// Hide the dialog.
-       virtual void hide();
+       virtual void apply(int const choice, bool const full, bool const force,
+                                         QString before, QString After);
+
        /// Update dialog before/whilst showing it.
-       virtual void update_contents();
+       virtual void updateModel();
 
+private:       
        /// available keys
        QStringListModel available_keys_;
 
@@ -72,6 +69,47 @@ private:
        QStringListModel found_keys_;
 };
 
+
+/** A controller for Citation dialogs.
+ */
+/*
+class Citation {
+public:
+       ///
+       Citation();
+
+       ///
+       virtual bool initialiseParams(std::string const & data);
+
+       /// clean-up on hide.
+       virtual void clearParams();
+
+       /** Disconnect from the inset when the Apply button is pressed.
+        *  Allows easy insertion of multiple citations.
+        */
+/*     virtual bool disconnectOnApply() const { return true; }
+
+       /// Returns a reference to the map of stored keys
+       biblio::InfoMap const & bibkeysInfo() const;
+
+       ///
+       biblio::CiteEngine_enum getEngine() const;
+
+       /// Possible citations based on this key
+       std::vector<std::string> const getCiteStrings(std::string const & key) const;
+
+       /// available CiteStyle-s (depends on availability of Natbib/Jurabib)
+       static std::vector<biblio::CiteStyle> const & getCiteStyles() {
+               return citeStyles_;
+       }
+private:
+       /// The info associated with each key
+       biblio::InfoMap bibkeysInfo_;
+
+       ///
+       static std::vector<biblio::CiteStyle> citeStyles_;
+};
+*/
 } // namespace frontend
 } // namespace lyx
 
index 00ccde360d14059e828717a67333073a6ed79cbb..7bb6cbba742d7038e9426fa3f253394a70896273 100644 (file)
@@ -42,49 +42,32 @@ using support::trim;
 
 namespace frontend {
 
-void updateBrowser(Q3ListBox * browser,
-                             vector<string> const & keys)
-{
-       browser->clear();
 
-       for (vector<string>::const_iterator it = keys.begin();
-               it < keys.end(); ++it) {
-               string const key = trim(*it);
-               // FIXME: why the .empty() test ?
-               if (!key.empty())
-                       browser->insertItem(toqstr(key));
-       }
-}
-
-QCitationDialog::QCitationDialog(QCitation * form)
-       : form_(form)
+QCitationDialog::QCitationDialog(Dialog & dialog, QCitation * form)
+       : Dialog::View(dialog, "Citation"), form_(form)
 {
        setupUi(this);
 
-/*     connect(restorePB, SIGNAL(clicked()),
-               form, SLOT(slotRestore()));
-       connect(okPB, SIGNAL(clicked()),
-               form, SLOT(slotOK()));
-       connect(applyPB, SIGNAL(clicked()),
-               form, SLOT(slotApply()));
-       connect(closePB, SIGNAL(clicked()),
-               form, SLOT(slotClose()));
-*/
+       setCaption(toqstr("LyX: " + getTitle()));
+
+/*
+
        // Manage the ok, apply, restore and cancel/close buttons
-       form_->bcview().setOK(okPB);
-       form_->bcview().setApply(applyPB);
-       form_->bcview().setCancel(closePB);
-       form_->bcview().setRestore(restorePB);
-
-       form_->bcview().addReadOnly(addPB);
-       form_->bcview().addReadOnly(deletePB);
-       form_->bcview().addReadOnly(upPB);
-       form_->bcview().addReadOnly(downPB);
-       form_->bcview().addReadOnly(citationStyleCO);
-       form_->bcview().addReadOnly(forceuppercaseCB);
-       form_->bcview().addReadOnly(fulllistCB);
-       form_->bcview().addReadOnly(textBeforeED);
-       form_->bcview().addReadOnly(textAfterED);
+       bcview().setOK(okPB);
+       bcview().setApply(applyPB);
+       bcview().setCancel(closePB);
+       bcview().setRestore(restorePB);
+
+       bcview().addReadOnly(addPB);
+       bcview().addReadOnly(deletePB);
+       bcview().addReadOnly(upPB);
+       bcview().addReadOnly(downPB);
+       bcview().addReadOnly(citationStyleCO);
+       bcview().addReadOnly(forceuppercaseCB);
+       bcview().addReadOnly(fulllistCB);
+       bcview().addReadOnly(textBeforeED);
+       bcview().addReadOnly(textAfterED);
+*/
 
        selectedLV->setModel(form_->selected());
        availableLV->setModel(form_->available());
@@ -99,7 +82,7 @@ QCitationDialog::QCitationDialog(QCitation * form)
 
 
 //     find_ = new QCitationFind(form_, this);
-
+       
 //     connect(selectedLV, SIGNAL(doubleClicked(const QModelIndex & index)),
 //             form_, SLOT(on_okPB_clicked()));//SLOT(slotOK()));
 }
@@ -108,73 +91,78 @@ QCitationDialog::~QCitationDialog()
 {
 }
 
+void QCitationDialog::apply()
+{
+       int  const choice = std::max(0, citationStyleCO->currentItem());
+       bool const full  = fulllistCB->isChecked();
+       bool const force = forceuppercaseCB->isChecked();
+
+       QString const before = textBeforeED->text();
+       QString const after = textAfterED->text();
+
+       form_->apply(choice, full, force, before, after);
+}
+
 
-void QCitationDialog::on_okPB_clicked()
+void QCitationDialog::hide()
 {
-       form_->apply();
        accept();
 }
 
-void QCitationDialog::on_cancelPB_clicked()
+
+void QCitationDialog::show()
 {
-       reject();
+       QDialog::show();
 }
 
-void QCitationDialog::on_applyPB_clicked()
+
+bool QCitationDialog::isVisible() const
 {
-       form_->apply();
+       return QDialog::isVisible();
 }
 
-void QCitationDialog::on_restorePB_clicked()
+void QCitationDialog::on_okPB_clicked()
 {
-       form_->update_contents();
+       apply();
+       accept();
 }
 
-void QCitationDialog::apply(InsetCommandParams & params)
+void QCitationDialog::on_cancelPB_clicked()
 {
-       vector<biblio::CiteStyle> const & styles =
-               ControlCitation::getCiteStyles();
-
-       int  const choice = std::max(0, citationStyleCO->currentItem());
-       bool const full  = fulllistCB->isChecked();
-       bool const force = forceuppercaseCB->isChecked();
-
-       string const command =
-               biblio::CitationStyle(styles[choice], full, force)
-               .asLatexStr();
-
-       params.setCmdName(command);
-
-       string const before = fromqstr(textBeforeED->text());
-       params.setSecOptions(before);
-
-       string const after = fromqstr(textAfterED->text());
-       params.setOptions(after);
+       accept();
+//     reject();
+}
 
-       style_ = choice;
+void QCitationDialog::on_applyPB_clicked()
+{
+       apply();
 }
 
+void QCitationDialog::on_restorePB_clicked()
+{
+       update();
+       bc().valid(form_->isValid() );
+}
 
-void QCitationDialog::update(InsetCommandParams const & params)
+void QCitationDialog::update()
 {
+       form_->updateModel();
+
        // No keys have been selected yet, so...
        infoML->document()->clear();
        setButtons();
 
-       textBeforeED->setText(
-               toqstr(params.getSecOptions()));
-       textAfterED->setText(
-               toqstr(params.getOptions()));
+       textBeforeED->setText(form_->textBefore());
+       textAfterED->setText(form_->textAfter());
 
        fillStyles();
        updateStyle();
-
-//     find_->update();
 }
 
 void QCitationDialog::updateStyle()
 {
-       biblio::CiteEngine const engine = form_->controller().getEngine();
+       biblio::CiteEngine const engine = form_->getEngine();
        bool const natbib_engine =
                engine == biblio::ENGINE_NATBIB_AUTHORYEAR ||
                engine == biblio::ENGINE_NATBIB_NUMERICAL;
@@ -184,7 +172,7 @@ void QCitationDialog::updateStyle()
        forceuppercaseCB->setEnabled(natbib_engine);
        textBeforeED->setEnabled(!basic_engine);
 
-       string const & command = form_->controller().params().getCmdName();
+       string const & command = form_->params().getCmdName();
 
        // Find the style of the citekeys
        vector<biblio::CiteStyle> const & styles =
@@ -199,6 +187,7 @@ void QCitationDialog::updateStyle()
                citationStyleCO->setCurrentItem(style_);
        else
                citationStyleCO->setCurrentItem(0);
+
        fulllistCB->setChecked(false);
        forceuppercaseCB->setChecked(false);
 
@@ -213,39 +202,31 @@ void QCitationDialog::updateStyle()
 
 void QCitationDialog::fillStyles()
 {
-       if (citekeys.empty()) {
-               citationStyleCO->setEnabled(false);
-               citationStyleLA->setEnabled(false);
-               return;
-       }
-
        int const orig = citationStyleCO->currentItem();
 
        citationStyleCO->clear();
 
        QStringList selected_keys = form_->selected()->stringList();
-       if (selected_keys.empty())
+       if (selected_keys.empty()) {
+               citationStyleCO->setEnabled(false);
+               citationStyleLA->setEnabled(false);
                return;
+       }
 
        if (selectedLV->selectionModel()->selectedIndexes().empty())
                return;
-
+       
        int curr = selectedLV->selectionModel()->selectedIndexes()[0].row();//selectedLV->currentItem();
 
-       string key = fromqstr(selected_keys[curr]);
-
-       vector<string> const & sty = form_->controller().getCiteStrings(key);
+       QStringList sty = form_->citationStyles(curr);
 
-       biblio::CiteEngine const engine = form_->controller().getEngine();
-       bool const basic_engine = engine == biblio::ENGINE_BASIC;
+       bool const basic_engine = 
+               (form_->getEngine() == biblio::ENGINE_BASIC);
 
-       citationStyleCO->setEnabled(!sty.empty() && !basic_engine);
-       citationStyleLA->setEnabled(!sty.empty() && !basic_engine);
+       citationStyleCO->setEnabled(!sty.isEmpty() && !basic_engine);
+       citationStyleLA->setEnabled(!sty.isEmpty() && !basic_engine);
 
-       for (vector<string>::const_iterator it = sty.begin();
-               it != sty.end(); ++it) {
-               citationStyleCO->insertItem(toqstr(*it));
-       }
+       citationStyleCO->insertItems(0, sty);
 
        if (orig != -1 && orig < citationStyleCO->count())
                citationStyleCO->setCurrentItem(orig);
@@ -254,14 +235,14 @@ void QCitationDialog::fillStyles()
 
 void QCitationDialog::setButtons()
 {
-       if (form_->readOnly())
-               return;
+//     if (form_->readOnly())
+//             return;
 
        int const row_count = selectedLV->model()->rowCount();
 
        int sel_nr=-1;
        if (! selectedLV->selectionModel()->selectedIndexes().empty()) {
-               sel_nr =
+               sel_nr = 
                selectedLV->selectionModel()->selectedIndexes()[0].row();
        }
 
@@ -292,11 +273,12 @@ void QCitationDialog::on_selectedLV_currentChanged(Q3ListBoxItem*)
 void QCitationDialog::on_addPB_clicked()
 {
        form_->addKeys(availableLV->selectionModel()->selectedIndexes());
+       changed();
 }
 
 void QCitationDialog::on_deletePB_clicked()
 {
-       form_->addKeys(selectedLV->selectionModel()->selectedIndexes());
+       form_->deleteKeys(selectedLV->selectionModel()->selectedIndexes());
        changed();
 }
 
@@ -339,6 +321,20 @@ void QCitationDialog::changed()
 }
 
 
+void updateBrowser(Q3ListBox * browser,
+                             vector<string> const & keys)
+{
+       browser->clear();
+
+       for (vector<string>::const_iterator it = keys.begin();
+               it < keys.end(); ++it) {
+               string const key = trim(*it);
+               // FIXME: why the .empty() test ?
+               if (!key.empty())
+                       browser->insertItem(toqstr(key));
+       }
+}
+
 
 QCitationFind::QCitationFind(QCitation * form, QWidget * parent, Qt::WFlags f)
 : form_(form), QDialog(parent, f)
@@ -419,7 +415,7 @@ void QCitationFind::find(biblio::Direction dir)
 {
 /*     QStringList bibkeys = form_->available()->stringList();
 
-       biblio::InfoMap const & theMap = form_->controller().bibkeysInfo();
+       biblio::InfoMap const & theMap = form_->bibkeysInfo();
 
        biblio::Search const type = searchTypeCB->isChecked()
                ? biblio::REGEX : biblio::SIMPLE;
index 668f5b4c21f209ba5f6bae5d18446d06e681b1be..85eb750da7d836f68ed6d1eb0f561e8606a7f5f6 100644 (file)
@@ -12,6 +12,8 @@
 #ifndef QCITATIONDIALOG_H
 #define QCITATIONDIALOG_H
 
+#include "Dialog.h"
+
 #include "ui/QCitationUi.h"
 #include "ui/QCitationFindUi.h"
 #include "controllers/biblio.h"
@@ -30,23 +32,37 @@ namespace frontend {
 class QCitation;
 class QCitationFind;
 
-class QCitationDialog : public QDialog, public Ui::QCitationUi {
+class QCitationDialog: public QDialog, public Ui::QCitationUi, public Dialog::View {
        Q_OBJECT
 
 public:
-       QCitationDialog(QCitation * form);
+       QCitationDialog(Dialog &, QCitation * form );
+
+       //QCitationDialog(QCitation * form);
+
+       virtual ~QCitationDialog();
+
+       virtual void apply();
 
-       ~QCitationDialog();
+       /// Hide the dialog from sight
+       void hide();
 
-       void update(InsetCommandParams const & params);
-       void apply(InsetCommandParams & params);
+       /// Redraw the dialog (e.g. if the colors have been remapped).
+       void redraw() {}
 
-//     virtual bool isValid();
+       /// Create the dialog if necessary, update it and display it.
+       void show();
+
+       /// Update the display of the dialog whilst it is still visible.
+       void update();
+
+       /// \return true if the dialog is visible.
+       bool isVisible() const;
 
 protected slots:
 
 //     void on_selectedLB_currentChanged(Q3ListBoxItem*);
-
+       
        void on_okPB_clicked();
        void on_cancelPB_clicked();
        void on_restorePB_clicked();