KoDetailsPane.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2005 Peter Simonsson <psn@linux.se>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19#include "KoDetailsPane.h"
20
21#include <tqcheckbox.h>
22#include <tqlabel.h>
23#include <tqfile.h>
24#include <tqimage.h>
25#include <tqheader.h>
26#include <tqrect.h>
27#include <tqbrush.h>
28#include <tqpainter.h>
29#include <tqsimplerichtext.h>
30#include <tqevent.h>
31#include <tqsplitter.h>
32
33#include <tdeinstance.h>
34#include <tdelocale.h>
35#include <tdelistview.h>
36#include <kpushbutton.h>
37#include <tdeconfig.h>
38#include <kurl.h>
39#include <tdefileitem.h>
40#include <tdeio/previewjob.h>
41#include <kdebug.h>
42#include <ktextbrowser.h>
43#include <tdeapplication.h>
44
45#include "KoTemplates.h"
46
47class KoFileListItem : public TDEListViewItem
48{
49 public:
50 KoFileListItem(TDEListView* listView, TQListViewItem* after, const TQString& filename,
51 const TQString& fullPath, KFileItem* fileItem)
52 : TDEListViewItem(listView, after, filename, fullPath), m_fileItem(fileItem)
53 {
54 }
55
56 ~KoFileListItem()
57 {
58 delete m_fileItem;
59 }
60
61 KFileItem* fileItem() const
62 {
63 return m_fileItem;
64 }
65
66 private:
67 KFileItem* m_fileItem;
68};
69
70class KoTemplatesPanePrivate
71{
72 public:
73 KoTemplatesPanePrivate()
74 : m_instance(0), m_selected(false)
75 {
76 }
77
78 TDEInstance* m_instance;
79 bool m_selected;
80 TQString m_alwaysUseTemplate;
81};
82
83
84KoTemplatesPane::KoTemplatesPane(TQWidget* parent, TDEInstance* instance,
85 KoTemplateGroup *group, KoTemplate* /*defaultTemplate*/)
86 : KoDetailsPaneBase(parent, "TemplatesPane")
87{
88 d = new KoTemplatesPanePrivate;
89 d->m_instance = instance;
90 m_previewLabel->installEventFilter(this);
91 m_documentList->installEventFilter(this);
92 setFocusProxy(m_documentList);
93#if KDE_IS_VERSION(3,4,0)
94 m_documentList->setShadeSortColumn(false);
95#endif
96
97 KGuiItem openGItem(i18n("Use This Template"));
98 m_openButton->setGuiItem(openGItem);
99 m_documentList->header()->hide();
100 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
101 TQString fullTemplateName = cfgGrp.readPathEntry("FullTemplateName");
102 d->m_alwaysUseTemplate = cfgGrp.readPathEntry("AlwaysUseTemplate");
103 connect(m_alwaysUseCheckBox, TQ_SIGNAL(clicked()), this, TQ_SLOT(alwaysUseClicked()));
104 changePalette();
105
106 if(kapp) {
107 connect(kapp, TQ_SIGNAL(tdedisplayPaletteChanged()), this, TQ_SLOT(changePalette()));
108 }
109
110 TDEListViewItem* selectItem = 0;
111
112 for (KoTemplate* t = group->first(); t != 0L; t = group->next()) {
113 TDEListViewItem* item = new TDEListViewItem(m_documentList, t->name(), t->description(), t->file());
114 TQImage icon = t->loadPicture(instance).convertToImage();
115 icon = icon.smoothScale(64, 64, TQImage::ScaleMin);
116 icon.setAlphaBuffer(true);
117 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
118 item->setPixmap(0, TQPixmap(icon));
119 item->setPixmap(2, t->loadPicture(instance));
120
121 if(d->m_alwaysUseTemplate == t->file()) {
122 selectItem = item;
123 } else if(!selectItem && (t->file() == fullTemplateName)) {
124 selectItem = item;
125 }
126 }
127
128 connect(m_documentList, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
129 this, TQ_SLOT(selectionChanged(TQListViewItem*)));
130 connect(m_documentList, TQ_SIGNAL(doubleClicked(TQListViewItem*, const TQPoint&, int)),
131 this, TQ_SLOT(openTemplate(TQListViewItem*)));
132 connect(m_documentList, TQ_SIGNAL(returnPressed(TQListViewItem*)),
133 this, TQ_SLOT(openTemplate(TQListViewItem*)));
134 connect(m_openButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(openTemplate()));
135
136 if(selectItem) {
137 m_documentList->setSelected(selectItem, true);
138 d->m_selected = true;
139 } else {
140 m_documentList->setSelected(m_documentList->firstChild(), true);
141 }
142}
143
144KoTemplatesPane::~KoTemplatesPane()
145{
146 delete d;
147}
148
149void KoTemplatesPane::selectionChanged(TQListViewItem* item)
150{
151 if(item) {
152 m_openButton->setEnabled(true);
153 m_alwaysUseCheckBox->setEnabled(true);
154 m_titleLabel->setText(item->text(0));
155 m_previewLabel->setPixmap(*(item->pixmap(2)));
156 m_detailsLabel->setText(item->text(1));
157 m_alwaysUseCheckBox->setChecked(item->text(2) == d->m_alwaysUseTemplate);
158 } else {
159 m_openButton->setEnabled(false);
160 m_alwaysUseCheckBox->setEnabled(false);
161 m_alwaysUseCheckBox->setChecked(false);
162 m_titleLabel->setText(TQString());
163 m_previewLabel->setPixmap(TQPixmap());
164 }
165}
166
167void KoTemplatesPane::openTemplate()
168{
169 TQListViewItem* item = m_documentList->selectedItem();
170 openTemplate(item);
171}
172
173void KoTemplatesPane::openTemplate(TQListViewItem* item)
174{
175 if(item) {
176 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
177 cfgGrp.writePathEntry("FullTemplateName", item->text(2));
178 cfgGrp.writeEntry("LastReturnType", "Template");
179 cfgGrp.writeEntry("AlwaysUseTemplate", d->m_alwaysUseTemplate);
180 emit openTemplate(item->text(2));
181 }
182}
183
184void KoTemplatesPane::changePalette()
185{
186 TQPalette p = kapp ? kapp->palette() : palette();
187 p.setBrush(TQColorGroup::Base, p.brush(TQPalette::Normal, TQColorGroup::Background));
188 p.setColor(TQColorGroup::Text, p.color(TQPalette::Normal, TQColorGroup::Foreground));
189 m_detailsLabel->setPalette(p);
190}
191
193{
194 return d->m_selected;
195}
196
197void KoTemplatesPane::alwaysUseClicked()
198{
199 TQListViewItem* item = m_documentList->selectedItem();
200
201 if(!m_alwaysUseCheckBox->isChecked()) {
202 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
203 cfgGrp.writeEntry("AlwaysUseTemplate", TQString());
204 d->m_alwaysUseTemplate = TQString();
205 } else {
206 d->m_alwaysUseTemplate = item->text(2);
207 }
208
209 emit alwaysUseChanged(this, d->m_alwaysUseTemplate);
210}
211
212void KoTemplatesPane::changeAlwaysUseTemplate(KoTemplatesPane* sender, const TQString& alwaysUse)
213{
214 if(this == sender)
215 return;
216
217 TQListViewItem* item = m_documentList->selectedItem();
218
219 // If the old always use template is selected uncheck the checkbox
220 if(item && (item->text(2) == d->m_alwaysUseTemplate)) {
221 m_alwaysUseCheckBox->setChecked(false);
222 }
223
224 d->m_alwaysUseTemplate = alwaysUse;
225}
226
227bool KoTemplatesPane::eventFilter(TQObject* watched, TQEvent* e)
228{
229 if(watched == m_previewLabel) {
230 if(e->type() == TQEvent::MouseButtonDblClick) {
231 openTemplate();
232 }
233 }
234
235 if(watched == m_documentList) {
236 if((e->type() == TQEvent::Resize) && isShown()) {
237 emit splitterResized(this, m_splitter->sizes());
238 }
239 }
240
241 return false;
242}
243
244void KoTemplatesPane::resizeSplitter(KoDetailsPaneBase* sender, const TQValueList<int>& sizes)
245{
246 if(sender == this)
247 return;
248
249 m_splitter->setSizes(sizes);
250}
251
252
253class KoRecentDocumentsPanePrivate
254{
255 public:
256 KoRecentDocumentsPanePrivate()
257 : m_previewJob(0), m_instance(0)
258 {
259 }
260
261 ~KoRecentDocumentsPanePrivate()
262 {
263 if(m_previewJob)
264 m_previewJob->kill();
265 }
266
267 TDEIO::PreviewJob* m_previewJob;
268 TDEInstance* m_instance;
269};
270
271KoRecentDocumentsPane::KoRecentDocumentsPane(TQWidget* parent, TDEInstance* instance)
272 : KoDetailsPaneBase(parent, "RecentDocsPane")
273{
274 d = new KoRecentDocumentsPanePrivate;
275 d->m_instance = instance;
276 m_previewLabel->installEventFilter(this);
277 m_documentList->installEventFilter(this);
278 setFocusProxy(m_documentList);
279 KGuiItem openGItem(i18n("Open This Document"), "document-open");
280 m_openButton->setGuiItem(openGItem);
281 m_alwaysUseCheckBox->hide();
282 m_documentList->header()->hide();
283 m_documentList->setSorting(-1); // Disable sorting
284 changePalette();
285
286 if(kapp) {
287 connect(kapp, TQ_SIGNAL(tdedisplayPaletteChanged()), this, TQ_SLOT(changePalette()));
288 }
289
290 TQString oldGroup = instance->config()->group();
291 instance->config()->setGroup("RecentFiles");
292
293 int i = 0;
294 TQString value;
295 KFileItemList fileList;
296 fileList.setAutoDelete(false);
297
298 do {
299 TQString key = TQString("File%1").arg(i);
300 value = instance->config()->readPathEntry(key);
301
302 if(!value.isEmpty()) {
303 TQString path = value;
304 TQString name;
305
306 // Support for tdelibs-3.5's new RecentFiles format: name[url]
307 if(path.endsWith("]")) {
308 int pos = path.find("[");
309 name = path.mid(0, pos - 1);
310 path = path.mid(pos + 1, path.length() - pos - 2);
311 }
312
313 KURL url(path);
314
315 if(name.isEmpty())
316 name = url.filename();
317
318 if(!url.isLocalFile() || TQFile::exists(url.path())) {
319 KFileItem* fileItem = new KFileItem(KFileItem::Unknown, KFileItem::Unknown, url);
320 fileList.append(fileItem);
321 KoFileListItem* item = new KoFileListItem(m_documentList,
322 m_documentList->lastItem(), name, url.url(), fileItem);
323 //center all icons in 64x64 area
324 TQImage icon = fileItem->pixmap(64).convertToImage();
325 icon.setAlphaBuffer(true);
326 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
327 item->setPixmap(0, TQPixmap(icon));
328 item->setPixmap(2, fileItem->pixmap(128));
329 }
330 }
331
332 i++;
333 } while ( !value.isEmpty() || i<=10 );
334
335 instance->config()->setGroup( oldGroup );
336
337 connect(m_documentList, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
338 this, TQ_SLOT(selectionChanged(TQListViewItem*)));
339 connect(m_documentList, TQ_SIGNAL(clicked(TQListViewItem*)),
340 this, TQ_SLOT(selectionChanged(TQListViewItem*)));
341 connect(m_documentList, TQ_SIGNAL(doubleClicked(TQListViewItem*, const TQPoint&, int)),
342 this, TQ_SLOT(openFile(TQListViewItem*)));
343 connect(m_documentList, TQ_SIGNAL(returnPressed(TQListViewItem*)),
344 this, TQ_SLOT(openFile(TQListViewItem*)));
345 connect(m_openButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(openFile()));
346
347 m_documentList->setSelected(m_documentList->firstChild(), true);
348
349 d->m_previewJob = TDEIO::filePreview(fileList, 200, 200);
350
351 connect(d->m_previewJob, TQ_SIGNAL(result(TDEIO::Job*)), this, TQ_SLOT(previewResult(TDEIO::Job*)));
352 connect(d->m_previewJob, TQ_SIGNAL(gotPreview(const KFileItem*, const TQPixmap&)),
353 this, TQ_SLOT(updatePreview(const KFileItem*, const TQPixmap&)));
354}
355
356KoRecentDocumentsPane::~KoRecentDocumentsPane()
357{
358 delete d;
359}
360
361void KoRecentDocumentsPane::selectionChanged(TQListViewItem* item)
362{
363 if(item) {
364 m_openButton->setEnabled(true);
365 m_titleLabel->setText(item->text(0));
366 m_previewLabel->setPixmap(*(item->pixmap(2)));
367
368 if(static_cast<KoFileListItem*>(item)->fileItem()) {
369 KFileItem* fileItem = static_cast<KoFileListItem*>(item)->fileItem();
370 TQString details = "<center><table border=\"0\">";
371 details += i18n("File modification date and time. %1 is date time", "<tr><td><b>Modified:</b></td><td>%1</td></tr>")
372 .arg(fileItem->timeString(TDEIO::UDS_MODIFICATION_TIME));
373 details += i18n("File access date and time. %1 is date time", "<tr><td><b>Accessed:</b></td><td>%1</td></tr>")
374 .arg(fileItem->timeString(TDEIO::UDS_ACCESS_TIME));
375 details += "</table></center>";
376 m_detailsLabel->setText(details);
377 } else {
378 m_detailsLabel->setText(TQString());
379 }
380 } else {
381 m_openButton->setEnabled(false);
382 m_titleLabel->setText(TQString());
383 m_previewLabel->setPixmap(TQPixmap());
384 m_detailsLabel->setText(TQString());
385 }
386}
387
388void KoRecentDocumentsPane::openFile()
389{
390 TQListViewItem* item = m_documentList->selectedItem();
391 openFile(item);
392}
393
394void KoRecentDocumentsPane::openFile(TQListViewItem* item)
395{
396 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
397 cfgGrp.writeEntry("LastReturnType", "File");
398
399 if(item)
400 emit openFile(item->text(1));
401}
402
403void KoRecentDocumentsPane::previewResult(TDEIO::Job* job)
404{
405 if(d->m_previewJob == job)
406 d->m_previewJob = 0;
407}
408
409void KoRecentDocumentsPane::updatePreview(const KFileItem* fileItem, const TQPixmap& preview)
410{
411 if(preview.isNull()) {
412 return;
413 }
414
415 TQListViewItemIterator it(m_documentList);
416
417 while(it.current()) {
418 if(it.current()->text(1) == fileItem->url().url()) {
419 it.current()->setPixmap(2, preview);
420 TQImage icon = preview.convertToImage();
421 icon = icon.smoothScale(64, 64, TQImage::ScaleMin);
422 icon.setAlphaBuffer(true);
423 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
424 it.current()->setPixmap(0, TQPixmap(icon));
425
426 if(it.current()->isSelected()) {
427 m_previewLabel->setPixmap(preview);
428 }
429
430 break;
431 }
432
433 it++;
434 }
435}
436
437void KoRecentDocumentsPane::changePalette()
438{
439 TQPalette p = kapp ? kapp->palette() : palette();
440 p.setBrush(TQColorGroup::Base, p.brush(TQPalette::Normal, TQColorGroup::Background));
441 p.setColor(TQColorGroup::Text, p.color(TQPalette::Normal, TQColorGroup::Foreground));
442 m_detailsLabel->setPalette(p);
443}
444
445bool KoRecentDocumentsPane::eventFilter(TQObject* watched, TQEvent* e)
446{
447 if(watched == m_previewLabel) {
448 if(e->type() == TQEvent::MouseButtonDblClick) {
449 openFile();
450 }
451 }
452
453 if(watched == m_documentList) {
454 if((e->type() == TQEvent::Resize) && isShown()) {
455 emit splitterResized(this, m_splitter->sizes());
456 }
457 }
458
459 return false;
460}
461
462void KoRecentDocumentsPane::resizeSplitter(KoDetailsPaneBase* sender, const TQValueList<int>& sizes)
463{
464 if(sender == this)
465 return;
466
467 m_splitter->setSizes(sizes);
468}
469
470#include "KoDetailsPane.moc"
KoRecentDocumentsPane(TQWidget *parent, TDEInstance *instance)
Constructor.
This widget is the right-side part of the template opening widget.
void alwaysUseChanged(KoTemplatesPane *sender, const TQString &alwaysUse)
Emited when the always use checkbox is selected.
bool isSelected()
Returns true if a template in this group was the last one selected.
KoTemplatesPane(TQWidget *parent, TDEInstance *instance, KoTemplateGroup *group, KoTemplate *defaultTemplate)
Constructor.