]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/GuiEmbeddedFiles.cpp
Embedding: use a vector to store multiple ParConstIterator of multiple insets referri...
[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 #include "support/convert.h"
16
17 using std::string;
18
19 namespace lyx {
20
21 namespace frontend {
22
23
24 GuiEmbeddedFilesDialog::GuiEmbeddedFilesDialog(LyXView & lv)
25         : GuiDialog(lv, "embedding")
26 {
27         setupUi(this);
28         setController(new ControlEmbeddedFiles(*this));
29         setViewTitle(_("Embedded Files"));
30
31         //setView(new DockView<GuiEmbeddedFiles, GuiEmbeddedFilesDialog>(
32         //              *dialog, qef, &gui_view, _("Embedded Files"), Qt::RightDockWidgetArea));
33         
34         bc().setPolicy(ButtonPolicy::OkCancelPolicy);
35
36         updateView();
37 }
38
39
40 ControlEmbeddedFiles & GuiEmbeddedFilesDialog::controller() const
41 {
42         return static_cast<ControlEmbeddedFiles &>(Dialog::controller());
43 }
44
45
46 void GuiEmbeddedFilesDialog::on_filesLW_itemChanged(QListWidgetItem* item)
47 {
48         EmbeddedFiles & files = controller().embeddedFiles();
49         if (item->checkState() == Qt::Checked) {
50                 if (files[filesLW->row(item)].embedded())
51                         return;
52                 controller().setEmbed(files[filesLW->row(item)], true);
53                 controller().dispatchMessage("Embed file " + fromqstr(item->text()));
54         } else {
55                 if (!files[filesLW->row(item)].embedded())
56                         return;
57                 controller().setEmbed(files[filesLW->row(item)], false);
58                 controller().dispatchMessage("Stop embedding file " + fromqstr(item->text()));
59         }
60 }
61
62
63 void GuiEmbeddedFilesDialog::on_filesLW_itemSelectionChanged()
64 {
65         EmbeddedFiles & files = controller().embeddedFiles();
66
67         QList<QListWidgetItem *> selection = filesLW->selectedItems();
68
69         if (selection.empty()) {
70                 fullpathLE->setEnabled(false);
71                 selectPB->setEnabled(false);
72                 unselectPB->setEnabled(false);
73                 extractPB->setEnabled(false);
74                 updatePB->setEnabled(false);
75                 return;
76         }
77         
78         fullpathLE->setEnabled(selection.size() == 1);
79
80         // try to find a common embedding status
81         bool hasSelected = false;
82         bool hasUnselected = false;
83         QList<QListWidgetItem*>::iterator it = selection.begin(); 
84         QList<QListWidgetItem*>::iterator it_end = selection.end(); 
85         for (; it != it_end; ++it) {
86                 if ((*it)->checkState() == Qt::Checked)
87                         hasSelected = true;
88                 else
89                         hasUnselected = true;
90         }
91         selectPB->setEnabled(hasUnselected);
92         unselectPB->setEnabled(hasSelected);
93 }
94
95
96 void GuiEmbeddedFilesDialog::on_filesLW_itemClicked(QListWidgetItem* item)
97 {
98         EmbeddedFiles & files = controller().embeddedFiles();
99         int idx = filesLW->row(item);
100         fullpathLE->setText(toqstr(files[idx].absFilename()));
101         if (files[idx].refCount() > 1) {
102                 // if multiple insets are referred, click again will move
103                 // to another inset
104                 int k = item->data(Qt::UserRole).toInt();
105                 controller().goTo(files[idx], k);
106                 k = (k + 1) % files[idx].refCount();
107                 item->setData(Qt::UserRole, k);
108                 // update label
109                 string label = files[idx].inzipName() + " ("
110                         + convert<string>(k + 1)  + "/"
111                         + convert<string>(files[idx].refCount()) + ")";
112                 item->setText(toqstr(label));
113         } else
114                 controller().goTo(files[idx], 0);
115 }
116
117
118 void GuiEmbeddedFilesDialog::on_filesLW_itemDoubleClicked(QListWidgetItem* item)
119 {
120         EmbeddedFiles & files = controller().embeddedFiles();
121         controller().view(files[filesLW->row(item)]);
122 }
123
124
125 void GuiEmbeddedFilesDialog::updateView()
126 {
127         filesLW->clear();
128         //
129         EmbeddedFiles const & files = controller().embeddedFiles();
130         EmbeddedFiles::EmbeddedFileList::const_iterator it = files.begin();
131         EmbeddedFiles::EmbeddedFileList::const_iterator it_end = files.end();
132         for (; it != it_end; ++it) {
133                 string label = it->inzipName();
134                 if (it->refCount() > 1)
135                         label += " (1/" + convert<string>(it->refCount()) + ")";
136                 QListWidgetItem * item = new QListWidgetItem(toqstr(label));
137                 Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsSelectable;
138                 if (it->valid())
139                         flag |= Qt::ItemIsEnabled;
140                 item->setFlags(flag);
141                 if(it->embedded())
142                         item->setCheckState(Qt::Checked);
143                 else
144                         item->setCheckState(Qt::Unchecked);
145                 // index of the currently used ParConstIterator
146                 item->setData(Qt::UserRole, 0);
147                 filesLW->addItem(item);
148         }
149 }
150
151
152 void GuiEmbeddedFilesDialog::on_selectPB_clicked()
153 {
154         EmbeddedFiles & files = controller().embeddedFiles();
155         QList<QListWidgetItem *> selection = filesLW->selectedItems();
156         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
157                 it != selection.end(); ++it) {
158                 (*it)->setCheckState(Qt::Checked);
159                 controller().setEmbed(files[filesLW->row(*it)], true);
160         }
161         controller().dispatchMessage("Embedding files");
162 }
163
164
165 void GuiEmbeddedFilesDialog::on_unselectPB_clicked()
166 {
167         EmbeddedFiles & files = controller().embeddedFiles();
168         QList<QListWidgetItem *> selection = filesLW->selectedItems();
169         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
170                 it != selection.end(); ++it) {
171                 (*it)->setCheckState(Qt::Checked);
172                 controller().setEmbed(files[filesLW->row(*it)], false);
173         }
174         controller().dispatchMessage("Stop embedding files");
175 }
176
177
178 void GuiEmbeddedFilesDialog::on_addPB_clicked()
179 {
180         docstring const file = controller().browseFile();
181         if (!file.empty()) {
182                 EmbeddedFiles & files = controller().embeddedFiles();
183                 files.registerFile(to_utf8(file), true);
184         }
185         controller().dispatchMessage("Add an embedded file");
186 }
187
188
189 void GuiEmbeddedFilesDialog::on_extractPB_clicked()
190 {
191         EmbeddedFiles const & files = controller().embeddedFiles();
192         QList<QListWidgetItem *> selection = filesLW->selectedItems();
193         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
194                 it != selection.end(); ++it)
195                 controller().extract(files[filesLW->row(*it)]);
196         // FIXME: collect extraction status and display a dialog
197         controller().dispatchMessage("Extract embedded files");
198 }
199
200
201 void GuiEmbeddedFilesDialog::on_updatePB_clicked()
202 {
203         EmbeddedFiles const & files = controller().embeddedFiles();
204         QList<QListWidgetItem *> selection = filesLW->selectedItems();
205         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
206                 it != selection.end(); ++it)
207                 controller().update(files[filesLW->row(*it)]);
208         // FIXME: collect update status and display a dialog
209         controller().dispatchMessage("Update embedded files from external file");
210 }
211
212
213
214 void GuiEmbeddedFilesDialog::on_enableCB_toggled(bool enable)
215 {
216         //
217         controller().embeddedFiles().enable(enable);
218         // immediately post the change to buffer (and bufferView)
219         if (enable)
220                 controller().dispatchMessage("Enable file embedding");
221         else
222                 controller().dispatchMessage("Disable file embedding");
223 }
224
225
226 } // namespace frontend
227 } // namespace lyx
228
229 #include "GuiEmbeddedFiles_moc.cpp"