]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/GuiEmbeddedFiles.cpp
fc8c112d3eaf27ad083095a46069ab3e11dfdc17
[lyx.git] / src / frontends / qt4 / GuiEmbeddedFiles.cpp
1 /**
2  * \file GuiEmbeddedFiles.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Bo Peng
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 #include "GuiEmbeddedFiles.h"
14 #include "debug.h"
15
16
17 namespace lyx {
18 namespace frontend {
19
20 GuiEmbeddedFilesDialog::GuiEmbeddedFilesDialog
21                 (ControlEmbeddedFiles & controller)
22         : controller_(controller)
23 {
24         setupUi(this);
25         setWindowTitle("LyX: " + qt_("Embedded Files"));
26         updateView();
27 }
28
29
30 void GuiEmbeddedFilesDialog::on_filesLW_itemChanged(QListWidgetItem* item)
31 {
32         EmbeddedFiles & files = controller_.embeddedFiles();
33         if (item->checkState() == Qt::Checked) {
34                 if (files[filesLW->row(item)].embedded())
35                         return;
36                 // this should not be needed after EmbeddedFiles are updated correctly.
37                 files.update();
38                 controller_.setEmbed(files[filesLW->row(item)], true, files.enabled());
39         } else {
40                 if (!files[filesLW->row(item)].embedded())
41                         return;
42                 // this should not be needed after EmbeddedFiles are updated correctly.
43                 files.update();
44                 controller_.setEmbed(files[filesLW->row(item)], false, files.enabled());
45         }
46 }
47
48
49 void GuiEmbeddedFilesDialog::on_filesLW_itemSelectionChanged()
50 {
51         QList<QListWidgetItem *> selection = filesLW->selectedItems();
52
53         if (selection.empty()) {
54                 fullpathLE->setEnabled(false);
55                 selectPB->setEnabled(false);
56                 unselectPB->setEnabled(false);
57                 extractPB->setEnabled(false);
58                 updatePB->setEnabled(false);
59                 return;
60         }
61         
62         fullpathLE->setEnabled(selection.size() == 1);
63
64         // try to find a common embedding status
65         bool hasSelected = false;
66         bool hasUnselected = false;
67         QList<QListWidgetItem*>::iterator it = selection.begin(); 
68         QList<QListWidgetItem*>::iterator it_end = selection.end(); 
69         for (; it != it_end; ++it) {
70                 if ((*it)->checkState() == Qt::Checked)
71                         hasSelected = true;
72                 else
73                         hasUnselected = true;
74         }
75         selectPB->setEnabled(hasUnselected);
76         unselectPB->setEnabled(hasSelected);
77 }
78
79
80 void GuiEmbeddedFilesDialog::on_filesLW_itemClicked(QListWidgetItem* item)
81 {
82         EmbeddedFiles & files = controller_.embeddedFiles();
83         int idx = filesLW->row(item);
84         fullpathLE->setText(toqstr(files[idx].absFilename()));
85         if (files[idx].refCount() > 1) {
86                 // if multiple insets are referred, click again will move
87                 // to another inset
88                 int k = item->data(Qt::UserRole).toInt();
89                 controller_.goTo(files[idx], k);
90                 k = (k + 1) % files[idx].refCount();
91                 item->setData(Qt::UserRole, k);
92                 // update label
93                 QString label = toqstr(files[idx].inzipName())
94                         + QString(" (%1/%2)").arg(k + 1).arg(files[idx].refCount());
95                 item->setText(label);
96         } else
97                 controller_.goTo(files[idx], 0);
98 }
99
100
101 void GuiEmbeddedFilesDialog::on_filesLW_itemDoubleClicked(QListWidgetItem* item)
102 {
103         EmbeddedFiles & files = controller_.embeddedFiles();
104         controller_.view(files[filesLW->row(item)]);
105 }
106
107
108 void GuiEmbeddedFilesDialog::updateView()
109 {
110         filesLW->clear();
111         EmbeddedFiles const & files = controller_.embeddedFiles();
112         EmbeddedFiles::EmbeddedFileList::const_iterator it = files.begin();
113         EmbeddedFiles::EmbeddedFileList::const_iterator it_end = files.end();
114         for (; it != it_end; ++it) {
115                 QString label = toqstr(it->inzipName());
116                 if (it->refCount() > 1)
117                         label += " (1/" + QString::number(it->refCount()) + ")";
118                 QListWidgetItem * item = new QListWidgetItem(label);
119                 Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsSelectable;
120                 if (it->valid())
121                         flag |= Qt::ItemIsEnabled;
122                 item->setFlags(flag);
123                 if(it->embedded())
124                         item->setCheckState(Qt::Checked);
125                 else
126                         item->setCheckState(Qt::Unchecked);
127                 // index of the currently used ParConstIterator
128                 item->setData(Qt::UserRole, 0);
129                 filesLW->addItem(item);
130         }
131 }
132
133
134 void GuiEmbeddedFilesDialog::on_selectPB_clicked()
135 {
136         EmbeddedFiles & files = controller_.embeddedFiles();
137         // this should not be needed after EmbeddedFiles are updated correctly.
138         files.update();
139         QList<QListWidgetItem *> selection = filesLW->selectedItems();
140         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
141                 it != selection.end(); ++it) {
142                 (*it)->setCheckState(Qt::Checked);
143                 controller_.setEmbed(files[filesLW->row(*it)], true, files.enabled());
144         }
145         controller_.dispatchMessage("Embedding files");
146 }
147
148
149 void GuiEmbeddedFilesDialog::on_unselectPB_clicked()
150 {
151         EmbeddedFiles & files = controller_.embeddedFiles();
152         // this should not be needed after EmbeddedFiles are updated correctly.
153         files.update();
154         QList<QListWidgetItem *> selection = filesLW->selectedItems();
155         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
156                 it != selection.end(); ++it) {
157                 (*it)->setCheckState(Qt::Checked);
158                 controller_.setEmbed(files[filesLW->row(*it)], false, files.enabled());
159         }
160         controller_.dispatchMessage("Stop embedding files");
161 }
162
163
164 void GuiEmbeddedFilesDialog::on_addPB_clicked()
165 {
166         docstring const file = controller_.browseFile();
167         if (!file.empty()) {
168                 EmbeddedFiles & files = controller_.embeddedFiles();
169                 files.registerFile(to_utf8(file), true);
170         }
171         controller_.dispatchMessage("Add an embedded file");
172 }
173
174
175 void GuiEmbeddedFilesDialog::on_extractPB_clicked()
176 {
177         EmbeddedFiles const & files = controller_.embeddedFiles();
178         QList<QListWidgetItem *> selection = filesLW->selectedItems();
179         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
180                 it != selection.end(); ++it)
181                 controller_.extract(files[filesLW->row(*it)]);
182         // FIXME: collect extraction status and display a dialog
183         controller_.dispatchMessage("Extract embedded files");
184 }
185
186
187 void GuiEmbeddedFilesDialog::on_updatePB_clicked()
188 {
189         EmbeddedFiles const & files = controller_.embeddedFiles();
190         QList<QListWidgetItem *> selection = filesLW->selectedItems();
191         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
192                 it != selection.end(); ++it)
193                 controller_.update(files[filesLW->row(*it)]);
194         // FIXME: collect update status and display a dialog
195         controller_.dispatchMessage("Update embedded files from external file");
196 }
197
198
199
200 void GuiEmbeddedFilesDialog::on_enableCB_toggled(bool enable)
201 {
202         //
203         controller_.embeddedFiles().enable(enable);
204         // immediately post the change to buffer (and bufferView)
205         if (enable)
206                 controller_.dispatchMessage("Enable file embedding");
207         else
208                 controller_.dispatchMessage("Disable file embedding");
209 }
210
211
212 } // namespace frontend
213 } // namespace lyx
214
215 #include "GuiEmbeddedFiles_moc.cpp"