John's KDE FormRef patch

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1015 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jürgen Vigna 2000-09-14 09:09:56 +00:00
parent dda41e40d3
commit 5cbcb0eddd
6 changed files with 670 additions and 3 deletions

View File

@ -8,6 +8,15 @@
(via an open call) are not requested to be named again on the (via an open call) are not requested to be named again on the
first save! first save!
2000-09-13 John Levon <moz@compsoc.man.ac.uk>
* src/frontends/kde/Makefile.am
* src/frontends/kde/FormRef.C
* src/frontends/kde/FormRef.h
* src/frontends/kde/formrefdialog.C
* src/frontends/kde/formrefdialog.h: implement
cross-ref dialog
2000-09-13 John Levon <moz@compsoc.man.ac.uk> 2000-09-13 John Levon <moz@compsoc.man.ac.uk>
* src/frontends/kde/formtocdialog.C * src/frontends/kde/formtocdialog.C

259
src/frontends/kde/FormRef.C Normal file
View File

@ -0,0 +1,259 @@
/*
* FormRef.C
* (C) 2000 LyX Team
* John Levon, moz@compsoc.man.ac.uk
*/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <config.h>
#include "Dialogs.h"
#include "FormRef.h"
#include "gettext.h"
#include "buffer.h"
#include "LyXView.h"
#include "lyxfunc.h"
#include "formrefdialog.h"
#include "debug.h"
FormRef::FormRef(LyXView *v, Dialogs *d)
: dialog_(0), lv_(v), d_(d), inset_(0), h_(0), u_(0), ih_(0),
sort(0), gotowhere(GOTOREF), type(REF), refs(0)
{
// let the dialog be shown
// This is a permanent connection so we won't bother
// storing a copy because we won't be disconnecting.
d->showRef.connect(slot(this, &FormRef::showRef));
d->createRef.connect(slot(this, &FormRef::createRef));
}
FormRef::~FormRef()
{
delete dialog_;
}
void FormRef::showRef(InsetCommand * const inset)
{
// FIXME: when could inset be 0 here ?
if (inset==0)
return;
inset_ = inset;
readonly = lv_->buffer()->isReadonly();
ih_ = inset_->hide.connect(slot(this,&FormRef::hide));
params = inset->params();
show();
}
void FormRef::createRef(string const & arg)
{
if (inset_)
close();
readonly = lv_->buffer()->isReadonly();
params.setFromString(arg);
show();
}
void FormRef::select(const char *text)
{
params.setContents(text);
lv_->getLyXFunc()->Dispatch(LFUN_REF_BACK);
gotowhere = GOTOREF;
dialog_->buttonGoto->setText(_("&Goto reference"));
dialog_->buttonGoto->setEnabled(true);
if (!readonly) {
dialog_->type->setEnabled(true);
dialog_->reference->setText(text);
dialog_->buttonOk->setEnabled(true);
}
}
void FormRef::set_sort(bool on)
{
if (on!=sort) {
sort=on;
dialog_->refs->clear();
updateRefs();
}
}
void FormRef::goto_ref()
{
switch (gotowhere) {
case GOTOREF:
lv_->getLyXFunc()->Dispatch(LFUN_REF_GOTO, params.getContents().c_str());
gotowhere=GOTOBACK;
dialog_->buttonGoto->setText(_("&Go back"));
break;
case GOTOBACK:
lv_->getLyXFunc()->Dispatch(LFUN_REF_BACK, params.getContents().c_str());
gotowhere=GOTOREF;
dialog_->buttonGoto->setText(_("&Goto reference"));
break;
}
}
void FormRef::updateRefs()
{
dialog_->refs->setAutoUpdate(false);
for (vector< string >::const_iterator iter = refs.begin();
iter != refs.end(); ++iter) {
if (sort)
dialog_->refs->inSort(iter->c_str());
else
dialog_->refs->insertItem(iter->c_str());
}
dialog_->refs->setAutoUpdate(true);
dialog_->refs->update();
}
void FormRef::update()
{
dialog_->reference->setText(params.getContents().c_str());
dialog_->refname->setText(params.getOptions().c_str());
if (params.getCmdName()=="prettyref") {
type = PRETTYREF;
dialog_->type->setCurrentItem(4);
} else if (params.getCmdName()=="pageref") {
type = PAGEREF;
dialog_->type->setCurrentItem(1);
} else if (params.getCmdName()=="vref") {
type = VREF;
dialog_->type->setCurrentItem(2);
} else if (params.getCmdName()=="vpageref") {
type = VPAGEREF;
dialog_->type->setCurrentItem(3);
} else {
type = REF;
dialog_->type->setCurrentItem(0);
}
dialog_->buttonGoto->setText(_("&Goto reference"));
gotowhere = GOTOREF;
dialog_->sort->setChecked(sort);
dialog_->refs->clear();
dialog_->type->setEnabled(false);
if (inset_) {
// FIXME: should totally remove and re-size dialog,
// but doesn't seem easily possible
dialog_->refs->hide();
dialog_->labelrefs->hide();
dialog_->sort->hide();
dialog_->buttonUpdate->hide();
dialog_->buttonGoto->setEnabled(true);
} else {
dialog_->refs->show();
dialog_->labelrefs->show();
dialog_->sort->show();
dialog_->buttonUpdate->show();
refs = lv_->buffer()->getLabelList();
if (!refs.empty())
dialog_->sort->setEnabled(true);
updateRefs();
}
if (params.getContents()=="") {
dialog_->buttonGoto->setEnabled(false);
dialog_->buttonOk->setEnabled(false);
} else {
dialog_->buttonGoto->setEnabled(true);
dialog_->buttonOk->setEnabled(true);
}
if (readonly) {
dialog_->type->setEnabled(false);
dialog_->buttonOk->setEnabled(false);
dialog_->buttonUpdate->setEnabled(false);
dialog_->buttonCancel->setText(_("&Close"));
} else {
dialog_->type->setEnabled(true);
dialog_->buttonUpdate->setEnabled(true);
dialog_->buttonCancel->setText(_("&Cancel"));
}
}
void FormRef::apply()
{
if (readonly)
return;
if (!lv_->view()->available())
return;
switch (dialog_->type->currentItem()) {
case 0:
params.setCmdName("ref");
break;
case 1:
params.setCmdName("pageref");
break;
case 2:
params.setCmdName("vref");
break;
case 3:
params.setCmdName("vpageref");
break;
case 4:
params.setCmdName("prettyref");
break;
default:
lyxerr[Debug::GUI] << "Unknown Ref Type" << endl;
}
params.setOptions(dialog_->refname->text());
if (inset_ != 0) {
if (params != inset_->params()) {
inset_->setParams(params);
lv_->view()->updateInset(inset_, true);
}
} else
lv_->getLyXFunc()->Dispatch(LFUN_REF_INSERT, params.getAsString().c_str());
}
void FormRef::show()
{
if (!dialog_)
dialog_ = new FormRefDialog(this, 0, _("LyX: Cross Reference"), false);
if (!dialog_->isVisible()) {
h_ = d_->hideBufferDependent.connect(slot(this, &FormRef::hide));
u_ = d_->updateBufferDependent.connect(slot(this, &FormRef::update));
}
dialog_->raise();
dialog_->setActiveWindow();
update();
dialog_->show();
}
void FormRef::close()
{
h_.disconnect();
u_.disconnect();
ih_.disconnect();
inset_ = 0;
}
void FormRef::hide()
{
dialog_->hide();
close();
}

109
src/frontends/kde/FormRef.h Normal file
View File

@ -0,0 +1,109 @@
/* FormRef.h
* (C) 2000 LyX Team
* John Levon, moz@compsoc.man.ac.uk
*/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef FORMREF_H
#define FORMREF_H
#include "DialogBase.h"
#include "LString.h"
#include "support/utility.hpp"
#include "insets/insetcommand.h"
class Dialogs;
class LyXView;
class FormRefDialog;
class FormRef : public DialogBase, public noncopyable {
public:
/**@name Constructors and Destructors */
//@{
///
FormRef(LyXView *, Dialogs *);
///
~FormRef();
//@}
/// select a ref
void select(const char *);
/// set sort
void set_sort(bool);
/// goto a ref (or back)
void goto_ref();
/// update dialog
void update();
/// Apply changes
void apply();
/// close the connections
void close();
private:
enum Type {
REF, PAGEREF, VREF, VPAGEREF, PRETTYREF,
};
enum GotoType {
GOTOREF, GOTOBACK,
};
/// Create the dialog if necessary, update it and display it.
void show();
/// Hide the dialog.
void hide();
/// create a Reference inset
void createRef(string const &);
/// edit a Reference inset
void showRef(InsetCommand * const);
/// update the keys list
void updateRefs(void);
/// Real GUI implementation.
FormRefDialog * dialog_;
/// the LyXView we belong to
LyXView * lv_;
/** Which Dialogs do we belong to?
Used so we can get at the signals we have to connect to.
*/
Dialogs * d_;
/// pointer to the inset if any
InsetCommand * inset_;
/// insets params
InsetCommandParams params;
/// is the inset we are reading from a readonly buffer ?
bool readonly;
/// Hide connection.
Connection h_;
/// Update connection.
Connection u_;
/// Inset hide connection.
Connection ih_;
/// to sort or not to sort
bool sort;
/// where to go
GotoType gotowhere;
/// current type
Type type;
/// available references
std::vector< string > refs;
};
#endif

View File

@ -10,7 +10,8 @@ BUILTSOURCES = formcopyrightdialog_moc.C \
formurldialog_moc.C \ formurldialog_moc.C \
formindexdialog_moc.C \ formindexdialog_moc.C \
formcitationdialog_moc.C \ formcitationdialog_moc.C \
formtocdialog_moc.C formtocdialog_moc.C \
formrefdialog_moc.C
DISTCLEANFILES = $(BUILTSOURCES) *.orig *.rej *~ *.bak core DISTCLEANFILES = $(BUILTSOURCES) *.orig *.rej *~ *.bak core
@ -24,8 +25,6 @@ libkde_la_OBJADD = \
../xforms/form_preferences.lo \ ../xforms/form_preferences.lo \
../xforms/FormPrint.lo \ ../xforms/FormPrint.lo \
../xforms/form_print.lo \ ../xforms/form_print.lo \
../xforms/FormRef.lo \
../xforms/form_ref.lo \
../xforms/FormTabular.lo \ ../xforms/FormTabular.lo \
../xforms/form_tabular.lo \ ../xforms/form_tabular.lo \
../xforms/input_validators.lo \ ../xforms/input_validators.lo \
@ -61,6 +60,10 @@ libkde_la_SOURCES = \
FormToc.h \ FormToc.h \
formtocdialog.C \ formtocdialog.C \
formtocdialog.h \ formtocdialog.h \
FormRef.C \
FormRef.h \
formrefdialog.C \
formrefdialog.h \
$(BUILTSOURCES) $(BUILTSOURCES)
# These still have to be added. Sooner or later. ARRae-20000129 # These still have to be added. Sooner or later. ARRae-20000129
@ -106,3 +109,7 @@ formcitationdialog_moc.C: formcitationdialog.h
formtocdialog.C: formtocdialog_moc.C formtocdialog.C: formtocdialog_moc.C
formtocdialog_moc.C: formtocdialog.h formtocdialog_moc.C: formtocdialog.h
$(MOC) formtocdialog.h -o formtocdialog_moc.C $(MOC) formtocdialog.h -o formtocdialog_moc.C
formrefdialog.C: formrefdialog_moc.C
formrefdialog_moc.C: formrefdialog.h
$(MOC) formrefdialog.h -o formrefdialog_moc.C

View File

@ -0,0 +1,174 @@
/*
* formrefdialog.C
* (C) 2000 LyX Team
* John Levon, moz@compsoc.man.ac.uk
*/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "formrefdialog.h"
FormRefDialog::FormRefDialog(FormRef *form, QWidget *parent, const char *name, bool, WFlags)
: QDialog(parent,name,false), form_(form)
{
setCaption(name);
// widgets
refs = new QListBox(this);
refs->setMinimumSize(200,200);
labelrefs = new QLabel(this);
labelrefs->setText(_("Available References"));
labelrefs->setMargin(5);
labelrefs->setMinimumSize(labelrefs->sizeHint());
labelrefs->setMaximumSize(labelrefs->sizeHint());
refname = new QLineEdit(this);
refname->setMinimumSize(refname->sizeHint());
// FIXME: should user be able to edit this ? what's it for ? - jbl
refname->setFocusPolicy(QWidget::NoFocus);
reference = new QLineEdit(this);
reference->setMinimumSize(reference->sizeHint());
reference->setFocusPolicy(QWidget::NoFocus);
labelrefname = new QLabel(this);
labelrefname->setText(_("Name :"));
labelrefname->setMargin(5);
labelrefname->setMinimumSize(labelrefname->sizeHint());
labelrefname->setMaximumSize(labelrefname->sizeHint());
labelreference = new QLabel(this);
labelreference->setText(_("Reference :"));
labelreference->setMargin(5);
labelreference->setMinimumSize(labelreference->sizeHint());
labelreference->setMaximumSize(labelreference->sizeHint());
sort = new QCheckBox(this);
sort->setText(_("Sort"));
sort->setMinimumSize(sort->sizeHint());
sort->setMaximumSize(sort->sizeHint());
type = new QComboBox(this);
type->insertItem(_("Reference"));
type->insertItem(_("Page number"));
type->insertItem(_("Ref on page xxx"));
type->insertItem(_("on page xxx"));
type->insertItem(_("Pretty reference"));
type->setMinimumSize(type->sizeHint());
labeltype = new QLabel(this);
labeltype->setText(_("Reference Type"));
labeltype->setMargin(5);
labeltype->setMinimumSize(labeltype->sizeHint());
labeltype->setMaximumSize(labeltype->sizeHint());
buttonGoto = new QPushButton(this);
buttonGoto->setText(_("&Goto reference"));
buttonGoto->setMinimumSize(buttonGoto->sizeHint());
buttonGoto->setMaximumSize(buttonGoto->sizeHint());
buttonUpdate = new QPushButton(this);
buttonUpdate->setText(_("&Update"));
buttonUpdate->setMinimumSize(buttonUpdate->sizeHint());
buttonUpdate->setMaximumSize(buttonUpdate->sizeHint());
buttonOk = new QPushButton(this);
buttonOk->setText(_("&OK"));
buttonOk->setMinimumSize(buttonOk->sizeHint());
buttonOk->setMaximumSize(buttonOk->sizeHint());
buttonOk->setDefault(true);
buttonCancel = new QPushButton(this);
buttonCancel->setText(_("&Cancel"));
buttonCancel->setMinimumSize(buttonCancel->sizeHint());
buttonCancel->setMaximumSize(buttonCancel->sizeHint());
// tooltips
QToolTip::add(type,_("Reference as it appears in output"));
QToolTip::add(sort,_("Sort references in alphabetical order ?"));
// layouts
topLayout = new QHBoxLayout(this,10);
layout = new QVBoxLayout();
topLayout->addLayout(layout);
layout->addSpacing(10);
upperLayout = new QHBoxLayout();
layout->addLayout(upperLayout, 1);
browserLayout = new QVBoxLayout();
upperLayout->addLayout(browserLayout, 1);
browserLayout->addWidget(labelrefs, 0);
browserLayout->addWidget(refs, 1);
rightLayout = new QVBoxLayout();
upperLayout->addLayout(rightLayout, 1);
nameLayout = new QHBoxLayout();
rightLayout->addLayout(nameLayout, 0);
nameLayout->addWidget(labelrefname, 0);
nameLayout->addWidget(refname, 1);
rightLayout->addStretch(1);
referenceLayout = new QHBoxLayout();
rightLayout->addLayout(referenceLayout, 0);
referenceLayout->addWidget(labelreference, 0);
referenceLayout->addWidget(reference, 1);
rightLayout->addStretch(1);
rightLayout->addWidget(labeltype, 0);
rightLayout->addWidget(type, 0);
rightLayout->addStretch(1);
rightLayout->addWidget(buttonGoto, 1);
rightLayout->addStretch(1);
buttonLayout = new QHBoxLayout();
layout->addLayout(buttonLayout);
buttonLayout->addWidget(sort, 1);
buttonLayout->addStretch(1);
buttonLayout->addWidget(buttonUpdate, 1);
buttonLayout->addStretch(1);
buttonLayout->addWidget(buttonOk, 1);
buttonLayout->addStretch(2);
buttonLayout->addWidget(buttonCancel, 1);
buttonLayout->addStretch(1);
// connections
connect(refs, SIGNAL(highlighted(const char *)), this, SLOT(highlight_adaptor(const char *)));
connect(sort, SIGNAL(toggled(bool)), this, SLOT(sort_adaptor(bool)));
connect(buttonOk, SIGNAL(clicked()), this, SLOT(apply_adaptor()));
connect(buttonUpdate, SIGNAL(clicked()), this, SLOT(update_adaptor()));
connect(buttonGoto, SIGNAL(clicked()), this, SLOT(goto_adaptor()));
connect(buttonCancel, SIGNAL(clicked()), this, SLOT(close_adaptor()));
}
void FormRefDialog::closeEvent(QCloseEvent *e)
{
form_->close();
e->accept();
}
FormRefDialog::~FormRefDialog()
{
}

View File

@ -0,0 +1,109 @@
/*
* formrefdialog.h
* (C) 2000 LyX Team
* John Levon, moz@compsoc.man.ac.uk
*/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef FORMREFDIALOG_H
#define FORMREFDIALOG_H
#include <config.h>
#include <gettext.h>
#include "FormRef.h"
#include <qdialog.h>
#include <qlayout.h>
#include <qcombobox.h>
#include <qcheckbox.h>
#include <qlistbox.h>
#include <qlabel.h>
#include <qtooltip.h>
#include <qlineedit.h>
#include <qpushbutton.h>
class FormRefDialog : public QDialog {
Q_OBJECT
public:
FormRefDialog(FormRef *form, QWidget *parent=0, const char *name=0,
bool modal=false, WFlags f=0);
~FormRefDialog();
// widgets
QListBox *refs;
QLabel *labelrefs;
QLineEdit *refname;
QLineEdit *reference;
QLabel *labelrefname;
QLabel *labelreference;
QCheckBox *sort;
QComboBox *type;
QLabel *labeltype;
QPushButton *buttonGoto;
QPushButton *buttonUpdate;
QPushButton *buttonOk;
QPushButton *buttonCancel;
protected:
void closeEvent(QCloseEvent *e);
private:
FormRef *form_;
// layouts
QHBoxLayout *topLayout;
QVBoxLayout *layout;
QHBoxLayout *upperLayout;
QVBoxLayout *browserLayout;
QVBoxLayout *rightLayout;
QHBoxLayout *nameLayout;
QHBoxLayout *referenceLayout;
QHBoxLayout *buttonLayout;
private slots:
/// adaptor to FormRef::select
void highlight_adaptor(const char *sel) {
form_->select(sel);
}
/// adaptor to FormRef::set_sort
void sort_adaptor(bool sort) {
form_->set_sort(sort);
}
/// adaptor to FormRef::gotoRef
void goto_adaptor(void) {
form_->goto_ref();
}
/// adaptor to FormRef::update
void update_adaptor(void) {
form_->update();
}
/// adaptor to FormRef::apply
void apply_adaptor(void) {
form_->apply();
form_->close();
hide();
}
/// adaptor to FormRef::close
void close_adaptor(void) {
form_->close();
hide();
}
};
#endif