lib

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 m_documentList->setShadeSortColumn(false);
94
95 KGuiItem openGItem(i18n("Use This Template"));
96 m_openButton->setGuiItem(openGItem);
97 m_documentList->header()->hide();
98 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
99 TQString fullTemplateName = cfgGrp.readPathEntry("FullTemplateName");
100 d->m_alwaysUseTemplate = cfgGrp.readPathEntry("AlwaysUseTemplate");
101 connect(m_alwaysUseCheckBox, TQ_SIGNAL(clicked()), this, TQ_SLOT(alwaysUseClicked()));
102 changePalette();
103
104 if(kapp) {
105 connect(kapp, TQ_SIGNAL(tdedisplayPaletteChanged()), this, TQ_SLOT(changePalette()));
106 }
107
108 TDEListViewItem* selectItem = 0;
109
110 for (KoTemplate* t = group->first(); t != 0L; t = group->next()) {
111 TDEListViewItem* item = new TDEListViewItem(m_documentList, t->name(), t->description(), t->file());
112 TQImage icon = t->loadPicture(instance).convertToImage();
113 icon = icon.smoothScale(64, 64, TQImage::ScaleMin);
114 icon.setAlphaBuffer(true);
115 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
116 item->setPixmap(0, TQPixmap(icon));
117 item->setPixmap(2, t->loadPicture(instance));
118
119 if(d->m_alwaysUseTemplate == t->file()) {
120 selectItem = item;
121 } else if(!selectItem && (t->file() == fullTemplateName)) {
122 selectItem = item;
123 }
124 }
125
126 connect(m_documentList, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
127 this, TQ_SLOT(selectionChanged(TQListViewItem*)));
128 connect(m_documentList, TQ_SIGNAL(doubleClicked(TQListViewItem*, const TQPoint&, int)),
129 this, TQ_SLOT(openTemplate(TQListViewItem*)));
130 connect(m_documentList, TQ_SIGNAL(returnPressed(TQListViewItem*)),
131 this, TQ_SLOT(openTemplate(TQListViewItem*)));
132 connect(m_openButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(openTemplate()));
133
134 if(selectItem) {
135 m_documentList->setSelected(selectItem, true);
136 d->m_selected = true;
137 } else {
138 m_documentList->setSelected(m_documentList->firstChild(), true);
139 }
140}
141
142KoTemplatesPane::~KoTemplatesPane()
143{
144 delete d;
145}
146
147void KoTemplatesPane::selectionChanged(TQListViewItem* item)
148{
149 if(item) {
150 m_openButton->setEnabled(true);
151 m_alwaysUseCheckBox->setEnabled(true);
152 m_titleLabel->setText(item->text(0));
153 m_previewLabel->setPixmap(*(item->pixmap(2)));
154 m_detailsLabel->setText(item->text(1));
155 m_alwaysUseCheckBox->setChecked(item->text(2) == d->m_alwaysUseTemplate);
156 } else {
157 m_openButton->setEnabled(false);
158 m_alwaysUseCheckBox->setEnabled(false);
159 m_alwaysUseCheckBox->setChecked(false);
160 m_titleLabel->setText(TQString());
161 m_previewLabel->setPixmap(TQPixmap());
162 }
163}
164
165void KoTemplatesPane::openTemplate()
166{
167 TQListViewItem* item = m_documentList->selectedItem();
168 openTemplate(item);
169}
170
171void KoTemplatesPane::openTemplate(TQListViewItem* item)
172{
173 if(item) {
174 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
175 cfgGrp.writePathEntry("FullTemplateName", item->text(2));
176 cfgGrp.writeEntry("LastReturnType", "Template");
177 cfgGrp.writeEntry("AlwaysUseTemplate", d->m_alwaysUseTemplate);
178 emit openTemplate(item->text(2));
179 }
180}
181
182void KoTemplatesPane::changePalette()
183{
184 TQPalette p = kapp ? kapp->palette() : palette();
185 p.setBrush(TQColorGroup::Base, p.brush(TQPalette::Normal, TQColorGroup::Background));
186 p.setColor(TQColorGroup::Text, p.color(TQPalette::Normal, TQColorGroup::Foreground));
187 m_detailsLabel->setPalette(p);
188}
189
191{
192 return d->m_selected;
193}
194
195void KoTemplatesPane::alwaysUseClicked()
196{
197 TQListViewItem* item = m_documentList->selectedItem();
198
199 if(!m_alwaysUseCheckBox->isChecked()) {
200 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
201 cfgGrp.writeEntry("AlwaysUseTemplate", TQString());
202 d->m_alwaysUseTemplate = TQString();
203 } else {
204 d->m_alwaysUseTemplate = item->text(2);
205 }
206
207 emit alwaysUseChanged(this, d->m_alwaysUseTemplate);
208}
209
210void KoTemplatesPane::changeAlwaysUseTemplate(KoTemplatesPane* sender, const TQString& alwaysUse)
211{
212 if(this == sender)
213 return;
214
215 TQListViewItem* item = m_documentList->selectedItem();
216
217 // If the old always use template is selected uncheck the checkbox
218 if(item && (item->text(2) == d->m_alwaysUseTemplate)) {
219 m_alwaysUseCheckBox->setChecked(false);
220 }
221
222 d->m_alwaysUseTemplate = alwaysUse;
223}
224
225bool KoTemplatesPane::eventFilter(TQObject* watched, TQEvent* e)
226{
227 if(watched == m_previewLabel) {
228 if(e->type() == TQEvent::MouseButtonDblClick) {
229 openTemplate();
230 }
231 }
232
233 if(watched == m_documentList) {
234 if((e->type() == TQEvent::Resize) && isShown()) {
235 emit splitterResized(this, m_splitter->sizes());
236 }
237 }
238
239 return false;
240}
241
242void KoTemplatesPane::resizeSplitter(KoDetailsPaneBase* sender, const TQValueList<int>& sizes)
243{
244 if(sender == this)
245 return;
246
247 m_splitter->setSizes(sizes);
248}
249
250
251class KoRecentDocumentsPanePrivate
252{
253 public:
254 KoRecentDocumentsPanePrivate()
255 : m_previewJob(0), m_instance(0)
256 {
257 }
258
259 ~KoRecentDocumentsPanePrivate()
260 {
261 if(m_previewJob)
262 m_previewJob->kill();
263 }
264
265 TDEIO::PreviewJob* m_previewJob;
266 TDEInstance* m_instance;
267};
268
269KoRecentDocumentsPane::KoRecentDocumentsPane(TQWidget* parent, TDEInstance* instance)
270 : KoDetailsPaneBase(parent, "RecentDocsPane")
271{
272 d = new KoRecentDocumentsPanePrivate;
273 d->m_instance = instance;
274 m_previewLabel->installEventFilter(this);
275 m_documentList->installEventFilter(this);
276 setFocusProxy(m_documentList);
277 KGuiItem openGItem(i18n("Open This Document"), "document-open");
278 m_openButton->setGuiItem(openGItem);
279 m_alwaysUseCheckBox->hide();
280 m_documentList->header()->hide();
281 m_documentList->setSorting(-1); // Disable sorting
282 changePalette();
283
284 if(kapp) {
285 connect(kapp, TQ_SIGNAL(tdedisplayPaletteChanged()), this, TQ_SLOT(changePalette()));
286 }
287
288 TQString oldGroup = instance->config()->group();
289 instance->config()->setGroup("RecentFiles");
290
291 int i = 0;
292 TQString value;
293 KFileItemList fileList;
294 fileList.setAutoDelete(false);
295
296 do {
297 TQString key = TQString("File%1").arg(i);
298 value = instance->config()->readPathEntry(key);
299
300 if(!value.isEmpty()) {
301 TQString path = value;
302 TQString name;
303
304 // Support for tdelibs-3.5's new RecentFiles format: name[url]
305 if(path.endsWith("]")) {
306 int pos = path.find("[");
307 name = path.mid(0, pos - 1);
308 path = path.mid(pos + 1, path.length() - pos - 2);
309 }
310
311 KURL url(path);
312
313 if(name.isEmpty())
314 name = url.filename();
315
316 if(!url.isLocalFile() || TQFile::exists(url.path())) {
317 KFileItem* fileItem = new KFileItem(KFileItem::Unknown, KFileItem::Unknown, url);
318 fileList.append(fileItem);
319 KoFileListItem* item = new KoFileListItem(m_documentList,
320 m_documentList->lastItem(), name, url.url(), fileItem);
321 //center all icons in 64x64 area
322 TQImage icon = fileItem->pixmap(64).convertToImage();
323 icon.setAlphaBuffer(true);
324 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
325 item->setPixmap(0, TQPixmap(icon));
326 item->setPixmap(2, fileItem->pixmap(128));
327 }
328 }
329
330 i++;
331 } while ( !value.isEmpty() || i<=10 );
332
333 instance->config()->setGroup( oldGroup );
334
335 connect(m_documentList, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
336 this, TQ_SLOT(selectionChanged(TQListViewItem*)));
337 connect(m_documentList, TQ_SIGNAL(clicked(TQListViewItem*)),
338 this, TQ_SLOT(selectionChanged(TQListViewItem*)));
339 connect(m_documentList, TQ_SIGNAL(doubleClicked(TQListViewItem*, const TQPoint&, int)),
340 this, TQ_SLOT(openFile(TQListViewItem*)));
341 connect(m_documentList, TQ_SIGNAL(returnPressed(TQListViewItem*)),
342 this, TQ_SLOT(openFile(TQListViewItem*)));
343 connect(m_openButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(openFile()));
344
345 m_documentList->setSelected(m_documentList->firstChild(), true);
346
347 d->m_previewJob = TDEIO::filePreview(fileList, 200, 200);
348
349 connect(d->m_previewJob, TQ_SIGNAL(result(TDEIO::Job*)), this, TQ_SLOT(previewResult(TDEIO::Job*)));
350 connect(d->m_previewJob, TQ_SIGNAL(gotPreview(const KFileItem*, const TQPixmap&)),
351 this, TQ_SLOT(updatePreview(const KFileItem*, const TQPixmap&)));
352}
353
354KoRecentDocumentsPane::~KoRecentDocumentsPane()
355{
356 delete d;
357}
358
359void KoRecentDocumentsPane::selectionChanged(TQListViewItem* item)
360{
361 if(item) {
362 m_openButton->setEnabled(true);
363 m_titleLabel->setText(item->text(0));
364 m_previewLabel->setPixmap(*(item->pixmap(2)));
365
366 if(static_cast<KoFileListItem*>(item)->fileItem()) {
367 KFileItem* fileItem = static_cast<KoFileListItem*>(item)->fileItem();
368 TQString details = "<center><table border=\"0\">";
369 details += i18n("File modification date and time. %1 is date time", "<tr><td><b>Modified:</b></td><td>%1</td></tr>")
370 .arg(fileItem->timeString(TDEIO::UDS_MODIFICATION_TIME));
371 details += i18n("File access date and time. %1 is date time", "<tr><td><b>Accessed:</b></td><td>%1</td></tr>")
372 .arg(fileItem->timeString(TDEIO::UDS_ACCESS_TIME));
373 details += "</table></center>";
374 m_detailsLabel->setText(details);
375 } else {
376 m_detailsLabel->setText(TQString());
377 }
378 } else {
379 m_openButton->setEnabled(false);
380 m_titleLabel->setText(TQString());
381 m_previewLabel->setPixmap(TQPixmap());
382 m_detailsLabel->setText(TQString());
383 }
384}
385
386void KoRecentDocumentsPane::openFile()
387{
388 TQListViewItem* item = m_documentList->selectedItem();
389 openFile(item);
390}
391
392void KoRecentDocumentsPane::openFile(TQListViewItem* item)
393{
394 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
395 cfgGrp.writeEntry("LastReturnType", "File");
396
397 if(item)
398 emit openFile(item->text(1));
399}
400
401void KoRecentDocumentsPane::previewResult(TDEIO::Job* job)
402{
403 if(d->m_previewJob == job)
404 d->m_previewJob = 0;
405}
406
407void KoRecentDocumentsPane::updatePreview(const KFileItem* fileItem, const TQPixmap& preview)
408{
409 if(preview.isNull()) {
410 return;
411 }
412
413 TQListViewItemIterator it(m_documentList);
414
415 while(it.current()) {
416 if(it.current()->text(1) == fileItem->url().url()) {
417 it.current()->setPixmap(2, preview);
418 TQImage icon = preview.convertToImage();
419 icon = icon.smoothScale(64, 64, TQImage::ScaleMin);
420 icon.setAlphaBuffer(true);
421 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
422 it.current()->setPixmap(0, TQPixmap(icon));
423
424 if(it.current()->isSelected()) {
425 m_previewLabel->setPixmap(preview);
426 }
427
428 break;
429 }
430
431 it++;
432 }
433}
434
435void KoRecentDocumentsPane::changePalette()
436{
437 TQPalette p = kapp ? kapp->palette() : palette();
438 p.setBrush(TQColorGroup::Base, p.brush(TQPalette::Normal, TQColorGroup::Background));
439 p.setColor(TQColorGroup::Text, p.color(TQPalette::Normal, TQColorGroup::Foreground));
440 m_detailsLabel->setPalette(p);
441}
442
443bool KoRecentDocumentsPane::eventFilter(TQObject* watched, TQEvent* e)
444{
445 if(watched == m_previewLabel) {
446 if(e->type() == TQEvent::MouseButtonDblClick) {
447 openFile();
448 }
449 }
450
451 if(watched == m_documentList) {
452 if((e->type() == TQEvent::Resize) && isShown()) {
453 emit splitterResized(this, m_splitter->sizes());
454 }
455 }
456
457 return false;
458}
459
460void KoRecentDocumentsPane::resizeSplitter(KoDetailsPaneBase* sender, const TQValueList<int>& sizes)
461{
462 if(sender == this)
463 return;
464
465 m_splitter->setSizes(sizes);
466}
467
468#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.
TDEListViewItem(TQListView *parent)