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