namespace lyx {
namespace frontend {
-
-GuiEmbeddedFilesDialog::GuiEmbeddedFilesDialog(LyXView & lv)
- : GuiDialog(lv, "embedding")
+GuiEmbeddedFilesDialog::GuiEmbeddedFilesDialog
+ (ControlEmbeddedFiles & controller)
+ : controller_(controller)
{
setupUi(this);
- setController(new ControlEmbeddedFiles(*this));
- setViewTitle(_("Embedded Files"));
-
- //setView(new DockView<GuiEmbeddedFiles, GuiEmbeddedFilesDialog>(
- // *dialog, qef, &gui_view, _("Embedded Files"), Qt::RightDockWidgetArea));
-
- bc().setPolicy(ButtonPolicy::OkCancelPolicy);
-
+ setWindowTitle("LyX: " + qt_("Embedded Files"));
updateView();
}
-ControlEmbeddedFiles & GuiEmbeddedFilesDialog::controller() const
-{
- return static_cast<ControlEmbeddedFiles &>(Dialog::controller());
-}
-
-
void GuiEmbeddedFilesDialog::on_filesLW_itemChanged(QListWidgetItem* item)
{
- EmbeddedFiles & files = controller().embeddedFiles();
+ EmbeddedFiles & files = controller_.embeddedFiles();
if (item->checkState() == Qt::Checked) {
- controller().setEmbed(files[filesLW->row(item)], true);
- controller().dispatchMessage("Embed file " + fromqstr(item->text()));
+ if (files[filesLW->row(item)].embedded())
+ return;
+ // this should not be needed after EmbeddedFiles are updated correctly.
+ files.update();
+ controller_.setEmbed(files[filesLW->row(item)], true, files.enabled());
} else {
- controller().setEmbed(files[filesLW->row(item)], false);
- controller().dispatchMessage("Stop embedding file " + fromqstr(item->text()));
+ if (!files[filesLW->row(item)].embedded())
+ return;
+ // this should not be needed after EmbeddedFiles are updated correctly.
+ files.update();
+ controller_.setEmbed(files[filesLW->row(item)], false, files.enabled());
}
}
void GuiEmbeddedFilesDialog::on_filesLW_itemSelectionChanged()
{
- EmbeddedFiles & files = controller().embeddedFiles();
-
QList<QListWidgetItem *> selection = filesLW->selectedItems();
if (selection.empty()) {
fullpathLE->setEnabled(selection.size() == 1);
// try to find a common embedding status
- QList<QListWidgetItem*>::iterator it = selection.begin();
- QList<QListWidgetItem*>::iterator it_end = selection.end();
- // if the selection is not empty
- if (it != it_end) {
- int idx = filesLW->row(*it);
- fullpathLE->setText(toqstr(files[idx].absFilename()));
- controller().goTo(files[idx]);
- }
- // are the items all selected or unselected?
bool hasSelected = false;
bool hasUnselected = false;
+ QList<QListWidgetItem*>::iterator it = selection.begin();
+ QList<QListWidgetItem*>::iterator it_end = selection.end();
for (; it != it_end; ++it) {
if ((*it)->checkState() == Qt::Checked)
hasSelected = true;
}
-void GuiEmbeddedFilesDialog::on_filesLW_itemDoubleClicked()
+void GuiEmbeddedFilesDialog::on_filesLW_itemClicked(QListWidgetItem* item)
{
- EmbeddedFiles & files = controller().embeddedFiles();
- QList<QListWidgetItem *> selection = filesLW->selectedItems();
- controller().view(files[filesLW->row(*selection.begin())]);
+ EmbeddedFiles & files = controller_.embeddedFiles();
+ int idx = filesLW->row(item);
+ fullpathLE->setText(toqstr(files[idx].absFilename()));
+ if (files[idx].refCount() > 1) {
+ // if multiple insets are referred, click again will move
+ // to another inset
+ int k = item->data(Qt::UserRole).toInt();
+ controller_.goTo(files[idx], k);
+ k = (k + 1) % files[idx].refCount();
+ item->setData(Qt::UserRole, k);
+ // update label
+ QString label = toqstr(files[idx].inzipName())
+ + QString(" (%1/%2)").arg(k + 1).arg(files[idx].refCount());
+ item->setText(label);
+ } else
+ controller_.goTo(files[idx], 0);
+}
+
+
+void GuiEmbeddedFilesDialog::on_filesLW_itemDoubleClicked(QListWidgetItem* item)
+{
+ EmbeddedFiles & files = controller_.embeddedFiles();
+ controller_.view(files[filesLW->row(item)]);
}
void GuiEmbeddedFilesDialog::updateView()
{
filesLW->clear();
- //
- EmbeddedFiles const & files = controller().embeddedFiles();
+ EmbeddedFiles const & files = controller_.embeddedFiles();
EmbeddedFiles::EmbeddedFileList::const_iterator it = files.begin();
EmbeddedFiles::EmbeddedFileList::const_iterator it_end = files.end();
for (; it != it_end; ++it) {
- QListWidgetItem * item = new QListWidgetItem(toqstr(it->inzipName()));
+ QString label = toqstr(it->inzipName());
+ if (it->refCount() > 1)
+ label += " (1/" + QString::number(it->refCount()) + ")";
+ QListWidgetItem * item = new QListWidgetItem(label);
Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsSelectable;
if (it->valid())
flag |= Qt::ItemIsEnabled;
item->setCheckState(Qt::Checked);
else
item->setCheckState(Qt::Unchecked);
+ // index of the currently used ParConstIterator
+ item->setData(Qt::UserRole, 0);
filesLW->addItem(item);
}
}
void GuiEmbeddedFilesDialog::on_selectPB_clicked()
{
- EmbeddedFiles & files = controller().embeddedFiles();
+ EmbeddedFiles & files = controller_.embeddedFiles();
+ // this should not be needed after EmbeddedFiles are updated correctly.
+ files.update();
QList<QListWidgetItem *> selection = filesLW->selectedItems();
for (QList<QListWidgetItem*>::iterator it = selection.begin();
it != selection.end(); ++it) {
(*it)->setCheckState(Qt::Checked);
- controller().setEmbed(files[filesLW->row(*it)], true);
+ controller_.setEmbed(files[filesLW->row(*it)], true, files.enabled());
}
- controller().dispatchMessage("Embedding files");
+ controller_.dispatchMessage("Embedding files");
}
void GuiEmbeddedFilesDialog::on_unselectPB_clicked()
{
- EmbeddedFiles & files = controller().embeddedFiles();
+ EmbeddedFiles & files = controller_.embeddedFiles();
+ // this should not be needed after EmbeddedFiles are updated correctly.
+ files.update();
QList<QListWidgetItem *> selection = filesLW->selectedItems();
for (QList<QListWidgetItem*>::iterator it = selection.begin();
it != selection.end(); ++it) {
(*it)->setCheckState(Qt::Checked);
- controller().setEmbed(files[filesLW->row(*it)], false);
+ controller_.setEmbed(files[filesLW->row(*it)], false, files.enabled());
}
- controller().dispatchMessage("Stop embedding files");
+ controller_.dispatchMessage("Stop embedding files");
}
void GuiEmbeddedFilesDialog::on_addPB_clicked()
{
- docstring const file = controller().browseFile();
+ docstring const file = controller_.browseFile();
if (!file.empty()) {
- EmbeddedFiles & files = controller().embeddedFiles();
+ EmbeddedFiles & files = controller_.embeddedFiles();
files.registerFile(to_utf8(file), true);
}
- controller().dispatchMessage("Add an embedded file");
+ controller_.dispatchMessage("Add an embedded file");
}
void GuiEmbeddedFilesDialog::on_extractPB_clicked()
{
- EmbeddedFiles const & files = controller().embeddedFiles();
+ EmbeddedFiles const & files = controller_.embeddedFiles();
QList<QListWidgetItem *> selection = filesLW->selectedItems();
for (QList<QListWidgetItem*>::iterator it = selection.begin();
it != selection.end(); ++it)
- controller().extract(files[filesLW->row(*it)]);
+ controller_.extract(files[filesLW->row(*it)]);
// FIXME: collect extraction status and display a dialog
- controller().dispatchMessage("Extract embedded files");
+ controller_.dispatchMessage("Extract embedded files");
}
void GuiEmbeddedFilesDialog::on_updatePB_clicked()
{
- EmbeddedFiles const & files = controller().embeddedFiles();
+ EmbeddedFiles const & files = controller_.embeddedFiles();
QList<QListWidgetItem *> selection = filesLW->selectedItems();
for (QList<QListWidgetItem*>::iterator it = selection.begin();
it != selection.end(); ++it)
- controller().update(files[filesLW->row(*it)]);
+ controller_.update(files[filesLW->row(*it)]);
// FIXME: collect update status and display a dialog
- controller().dispatchMessage("Update embedded files from external file");
+ controller_.dispatchMessage("Update embedded files from external file");
}
void GuiEmbeddedFilesDialog::on_enableCB_toggled(bool enable)
{
//
- controller().embeddedFiles().enable(enable);
+ controller_.embeddedFiles().enable(enable);
// immediately post the change to buffer (and bufferView)
if (enable)
- controller().dispatchMessage("Enable file embedding");
+ controller_.dispatchMessage("Enable file embedding");
else
- controller().dispatchMessage("Disable file embedding");
+ controller_.dispatchMessage("Disable file embedding");
}