#include <config.h>
#include "GuiEmbeddedFiles.h"
-#include "Qt2BC.h"
-
#include "debug.h"
+
namespace lyx {
namespace frontend {
+GuiEmbeddedFilesDialog::GuiEmbeddedFilesDialog
+ (ControlEmbeddedFiles & controller)
+ : controller_(controller)
+{
+ setupUi(this);
+ setWindowTitle("LyX: " + qt_("Embedded Files"));
+ updateView();
+}
-/////////////////////////////////////////////////////////////////////
-//
-// GuiEmbeddedFilesDialog
-//
-/////////////////////////////////////////////////////////////////////
-
-static QString const INVALID_COLOR = "gray";
-static QString const AUTO_COLOR = "green";
-static QString const EMBEDDED_COLOR = "black";
-static QString const EXTERNAL_COLOR = "blue";
-GuiEmbeddedFilesDialog::GuiEmbeddedFilesDialog(GuiEmbeddedFiles * form)
- : form_(form)
+void GuiEmbeddedFilesDialog::on_filesLW_itemChanged(QListWidgetItem* item)
{
- setupUi(this);
-
- form_->updateEmbeddedFiles();
-
- EmbeddedFiles const & files = form_->embeddedFiles();
- enableCB->setChecked(files.enabled());
- 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()));
- if (!it->valid())
- item->setTextColor(INVALID_COLOR);
- else if(it->status() == EmbeddedFile::AUTO)
- item->setTextColor(AUTO_COLOR);
- else if(it->status() == EmbeddedFile::EMBEDDED)
- item->setTextColor(EMBEDDED_COLOR);
- else
- item->setTextColor(EXTERNAL_COLOR);
- filesLW->addItem(item);
+ EmbeddedFiles & files = controller_.embeddedFiles();
+ if (item->checkState() == Qt::Checked) {
+ 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 {
+ 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());
}
- filesLW->setCurrentRow(0);
- //
- update();
}
void GuiEmbeddedFilesDialog::on_filesLW_itemSelectionChanged()
{
- EmbeddedFiles & files = form_->embeddedFiles();
-
QList<QListWidgetItem *> selection = filesLW->selectedItems();
+
+ if (selection.empty()) {
+ fullpathLE->setEnabled(false);
+ selectPB->setEnabled(false);
+ unselectPB->setEnabled(false);
+ extractPB->setEnabled(false);
+ updatePB->setEnabled(false);
+ return;
+ }
+
fullpathLE->setEnabled(selection.size() == 1);
-
- EmbeddedFile::STATUS mode = EmbeddedFile::NONE;
- // try to find a common mode, otherwise return NONE.
- for (QList<QListWidgetItem*>::iterator it = selection.begin();
- it != selection.end(); ++it) {
- if (selection.size() == 1)
- fullpathLE->setText(toqstr(files[filesLW->row(*it)].absFilename()));
- if (mode == EmbeddedFile::NONE) {
- mode = files[filesLW->row(*it)].status();
- continue;
- }
- if (mode != files[filesLW->row(*it)].status()) {
- mode = EmbeddedFile::NONE;
- break;
- }
+
+ // try to find a common embedding status
+ 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;
+ else
+ hasUnselected = true;
}
-
- autoRB->setChecked(mode == EmbeddedFile::AUTO);
- embeddedRB->setChecked(mode == EmbeddedFile::EMBEDDED);
- externalRB->setChecked(mode == EmbeddedFile::EXTERNAL);
- // go to the first selected item
- form_->goTo(files[filesLW->row(*selection.begin())]);
+ selectPB->setEnabled(hasUnselected);
+ unselectPB->setEnabled(hasSelected);
}
-void GuiEmbeddedFilesDialog::on_filesLW_itemDoubleClicked()
+void GuiEmbeddedFilesDialog::on_filesLW_itemClicked(QListWidgetItem* item)
{
- EmbeddedFiles & files = form_->embeddedFiles();
- QList<QListWidgetItem *> selection = filesLW->selectedItems();
- form_->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::update()
+void GuiEmbeddedFilesDialog::on_filesLW_itemDoubleClicked(QListWidgetItem* item)
{
- EmbeddedFiles const & files = form_->embeddedFiles();
-
- bool enabled = files.enabled();
- enableCB->setChecked(enabled);
- statusGB->setEnabled(enabled);
- filesLW->setEnabled(enabled);
- fullpathLE->setEnabled(enabled);
+ EmbeddedFiles & files = controller_.embeddedFiles();
+ controller_.view(files[filesLW->row(item)]);
}
-void GuiEmbeddedFilesDialog::on_addPB_clicked()
+void GuiEmbeddedFilesDialog::updateView()
{
- docstring const file = form_->browseFile();
- if (!file.empty()) {
- EmbeddedFiles & files = form_->embeddedFiles();
- files.registerFile(to_utf8(file), EmbeddedFile::EMBEDDED);
- }
+ filesLW->clear();
+ 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) {
+ 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->setFlags(flag);
+ if(it->embedded())
+ 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_extractPB_clicked()
+void GuiEmbeddedFilesDialog::on_selectPB_clicked()
{
- EmbeddedFiles const & files = form_->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)
- form_->extract(files[filesLW->row(*it)]);
+ it != selection.end(); ++it) {
+ (*it)->setCheckState(Qt::Checked);
+ controller_.setEmbed(files[filesLW->row(*it)], true, files.enabled());
+ }
+ controller_.dispatchMessage("Embedding files");
}
-void GuiEmbeddedFilesDialog::on_enableCB_toggled(bool enable)
+void GuiEmbeddedFilesDialog::on_unselectPB_clicked()
{
- // FIXME:
- //
- // When a embedded file is turned to disabled, it should save its
- // embedded files. Otherwise, embedded files will be lost!!!
- //
- form_->embeddedFiles().enable(enable);
- update();
- // immediately post the change to buffer (and bufferView)
- if (enable)
- form_->setMessage("Enable file embedding");
- else
- form_->setMessage("Disable file embedding");
- // update bufferView
- form_->dispatchParams();
+ 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, files.enabled());
+ }
+ controller_.dispatchMessage("Stop embedding files");
}
-void GuiEmbeddedFilesDialog::set_embedding_status(EmbeddedFile::STATUS status)
+void GuiEmbeddedFilesDialog::on_addPB_clicked()
{
- EmbeddedFiles & files = form_->embeddedFiles();
- QList<QListWidgetItem *> selection = filesLW->selectedItems();
- for (QList<QListWidgetItem*>::iterator it = selection.begin();
- it != selection.end(); ++it) {
- int row = filesLW->row(*it);
- // FIXME: mark buffer dirty
- if (status != files[row].status())
- files[row].setStatus(status);
- if(status == EmbeddedFile::AUTO)
- (*it)->setTextColor(AUTO_COLOR);
- else if(status == EmbeddedFile::EMBEDDED)
- (*it)->setTextColor(EMBEDDED_COLOR);
- else
- (*it)->setTextColor(EXTERNAL_COLOR);
+ docstring const file = controller_.browseFile();
+ if (!file.empty()) {
+ EmbeddedFiles & files = controller_.embeddedFiles();
+ files.registerFile(to_utf8(file), true);
}
- if (status == EmbeddedFile::AUTO)
- form_->setMessage("Switch to auto embedding");
- else if (status == EmbeddedFile::EMBEDDED)
- form_->setMessage("Switch to always embedding");
- else
- form_->setMessage("Switch to never embedding");
- autoRB->setChecked(status == EmbeddedFile::AUTO);
- embeddedRB->setChecked(status == EmbeddedFile::EMBEDDED);
- externalRB->setChecked(status == EmbeddedFile::EXTERNAL);
- // update bufferView
- form_->dispatchParams();
+ controller_.dispatchMessage("Add an embedded file");
}
-void GuiEmbeddedFilesDialog::on_autoRB_clicked()
+void GuiEmbeddedFilesDialog::on_extractPB_clicked()
{
- set_embedding_status(EmbeddedFile::AUTO);
+ 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)]);
+ // FIXME: collect extraction status and display a dialog
+ controller_.dispatchMessage("Extract embedded files");
}
-void GuiEmbeddedFilesDialog::on_embeddedRB_clicked()
+void GuiEmbeddedFilesDialog::on_updatePB_clicked()
{
- set_embedding_status(EmbeddedFile::EMBEDDED);
+ 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)]);
+ // FIXME: collect update status and display a dialog
+ controller_.dispatchMessage("Update embedded files from external file");
}
-void GuiEmbeddedFilesDialog::on_externalRB_clicked()
+
+void GuiEmbeddedFilesDialog::on_enableCB_toggled(bool enable)
{
- set_embedding_status(EmbeddedFile::EXTERNAL);
+ //
+ controller_.embeddedFiles().enable(enable);
+ // immediately post the change to buffer (and bufferView)
+ if (enable)
+ controller_.dispatchMessage("Enable file embedding");
+ else
+ controller_.dispatchMessage("Disable file embedding");
}