]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/GuiEmbeddedFiles.cpp
This is the last of a series of patches that merges the layout modules development...
[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         if (controller_.isReadonly())
52                 return;
53
54         QList<QListWidgetItem *> selection = filesLW->selectedItems();
55
56         if (selection.empty()) {
57                 fullpathLE->setEnabled(false);
58                 selectPB->setEnabled(false);
59                 unselectPB->setEnabled(false);
60                 extractPB->setEnabled(false);
61                 updatePB->setEnabled(false);
62                 return;
63         }
64         
65         fullpathLE->setEnabled(selection.size() == 1);
66
67         // try to find a common embedding status
68         bool hasSelected = false;
69         bool hasUnselected = false;
70         QList<QListWidgetItem*>::iterator it = selection.begin(); 
71         QList<QListWidgetItem*>::iterator it_end = selection.end(); 
72         for (; it != it_end; ++it) {
73                 if ((*it)->checkState() == Qt::Checked)
74                         hasSelected = true;
75                 else
76                         hasUnselected = true;
77         }
78         selectPB->setEnabled(hasUnselected);
79         unselectPB->setEnabled(hasSelected);
80 }
81
82
83 void GuiEmbeddedFilesDialog::on_filesLW_itemClicked(QListWidgetItem* item)
84 {
85         EmbeddedFiles & files = controller_.embeddedFiles();
86         int idx = filesLW->row(item);
87         fullpathLE->setText(toqstr(files[idx].absFilename()));
88         if (files[idx].refCount() > 1) {
89                 // if multiple insets are referred, click again will move
90                 // to another inset
91                 int k = item->data(Qt::UserRole).toInt();
92                 controller_.goTo(files[idx], k);
93                 k = (k + 1) % files[idx].refCount();
94                 item->setData(Qt::UserRole, k);
95                 // update label
96                 QString label = toqstr(files[idx].inzipName())
97                         + QString(" (%1/%2)").arg(k + 1).arg(files[idx].refCount());
98                 item->setText(label);
99         } else if (files[idx].refCount() == 1)
100                 controller_.goTo(files[idx], 0);
101 }
102
103
104 void GuiEmbeddedFilesDialog::on_filesLW_itemDoubleClicked(QListWidgetItem* item)
105 {
106         EmbeddedFiles & files = controller_.embeddedFiles();
107         controller_.view(files[filesLW->row(item)]);
108 }
109
110
111 void GuiEmbeddedFilesDialog::updateView()
112 {
113         bool readOnly = controller_.isReadonly();
114         fullpathLE->setEnabled(!readOnly);
115         selectPB->setEnabled(!readOnly);
116         unselectPB->setEnabled(!readOnly);
117         addPB->setEnabled(!readOnly);
118         extractPB->setEnabled(!readOnly);
119         updatePB->setEnabled(!readOnly);
120         enableCB->setEnabled(!readOnly);
121         
122         filesLW->clear();
123         EmbeddedFiles const & files = controller_.embeddedFiles();
124         enableCB->setCheckState(files.enabled() ? Qt::Checked : Qt::Unchecked);
125         EmbeddedFiles::EmbeddedFileList::const_iterator it = files.begin();
126         EmbeddedFiles::EmbeddedFileList::const_iterator it_end = files.end();
127         for (; it != it_end; ++it) {
128                 QString label = toqstr(it->inzipName());
129                 if (it->refCount() > 1)
130                         label += " (1/" + QString::number(it->refCount()) + ")";
131                 QListWidgetItem * item = new QListWidgetItem(label);
132                 Qt::ItemFlags flag = Qt::ItemIsSelectable;
133                 if (!readOnly)
134                         flag |= Qt::ItemIsUserCheckable;
135                 if (it->valid())
136                         flag |= Qt::ItemIsEnabled;
137                 item->setFlags(flag);
138                 if(it->embedded())
139                         item->setCheckState(Qt::Checked);
140                 else
141                         item->setCheckState(Qt::Unchecked);
142                 // index of the currently used ParConstIterator
143                 item->setData(Qt::UserRole, 0);
144                 filesLW->addItem(item);
145         }
146 }
147
148
149 void GuiEmbeddedFilesDialog::on_selectPB_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)], true, files.enabled());
159         }
160         controller_.dispatchMessage("Embedding files");
161 }
162
163
164 void GuiEmbeddedFilesDialog::on_unselectPB_clicked()
165 {
166         EmbeddedFiles & files = controller_.embeddedFiles();
167         // this should not be needed after EmbeddedFiles are updated correctly.
168         files.update();
169         QList<QListWidgetItem *> selection = filesLW->selectedItems();
170         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
171                 it != selection.end(); ++it) {
172                 (*it)->setCheckState(Qt::Checked);
173                 controller_.setEmbed(files[filesLW->row(*it)], false, files.enabled());
174         }
175         controller_.dispatchMessage("Stop embedding files");
176 }
177
178
179 void GuiEmbeddedFilesDialog::on_addPB_clicked()
180 {
181         if (controller_.browseAndAddFile())
182                 updateView();
183 }
184
185
186 void GuiEmbeddedFilesDialog::on_extractPB_clicked()
187 {
188         EmbeddedFiles const & files = controller_.embeddedFiles();
189         QList<QListWidgetItem *> selection = filesLW->selectedItems();
190         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
191                 it != selection.end(); ++it)
192                 controller_.extract(files[filesLW->row(*it)]);
193         // FIXME: collect extraction status and display a dialog
194         controller_.dispatchMessage("Extract embedded files");
195 }
196
197
198 void GuiEmbeddedFilesDialog::on_updatePB_clicked()
199 {
200         EmbeddedFiles const & files = controller_.embeddedFiles();
201         QList<QListWidgetItem *> selection = filesLW->selectedItems();
202         for (QList<QListWidgetItem*>::iterator it = selection.begin(); 
203                 it != selection.end(); ++it)
204                 controller_.update(files[filesLW->row(*it)]);
205         // FIXME: collect update status and display a dialog
206         controller_.dispatchMessage("Update embedded files from external file");
207 }
208
209
210
211 void GuiEmbeddedFilesDialog::on_enableCB_toggled(bool enable)
212 {
213         controller_.setEmbedding(enable);
214 }
215
216
217 } // namespace frontend
218 } // namespace lyx
219
220 #include "GuiEmbeddedFiles_moc.cpp"