00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "KoDetailsPane.h"
00020
00021 #include <qcheckbox.h>
00022 #include <qlabel.h>
00023 #include <qfile.h>
00024 #include <qimage.h>
00025 #include <qheader.h>
00026 #include <qrect.h>
00027 #include <qbrush.h>
00028 #include <qpainter.h>
00029 #include <qsimplerichtext.h>
00030 #include <qevent.h>
00031 #include <qsplitter.h>
00032
00033 #include <kinstance.h>
00034 #include <klocale.h>
00035 #include <klistview.h>
00036 #include <kpushbutton.h>
00037 #include <kconfig.h>
00038 #include <kurl.h>
00039 #include <kfileitem.h>
00040 #include <kio/previewjob.h>
00041 #include <kdebug.h>
00042 #include <ktextbrowser.h>
00043 #include <kapplication.h>
00044
00045 #include "KoTemplates.h"
00046
00047 class KoFileListItem : public KListViewItem
00048 {
00049 public:
00050 KoFileListItem(KListView* listView, QListViewItem* after, const QString& filename,
00051 const QString& fullPath, KFileItem* fileItem)
00052 : KListViewItem(listView, after, filename, fullPath), m_fileItem(fileItem)
00053 {
00054 }
00055
00056 ~KoFileListItem()
00057 {
00058 delete m_fileItem;
00059 }
00060
00061 KFileItem* fileItem() const
00062 {
00063 return m_fileItem;
00064 }
00065
00066 private:
00067 KFileItem* m_fileItem;
00068 };
00069
00070 class KoTemplatesPanePrivate
00071 {
00072 public:
00073 KoTemplatesPanePrivate()
00074 : m_instance(0), m_selected(false)
00075 {
00076 }
00077
00078 KInstance* m_instance;
00079 bool m_selected;
00080 QString m_alwaysUseTemplate;
00081 };
00082
00083
00084 KoTemplatesPane::KoTemplatesPane(QWidget* parent, KInstance* instance,
00085 KoTemplateGroup *group, KoTemplate* )
00086 : KoDetailsPaneBase(parent, "TemplatesPane")
00087 {
00088 d = new KoTemplatesPanePrivate;
00089 d->m_instance = instance;
00090 m_previewLabel->installEventFilter(this);
00091 m_documentList->installEventFilter(this);
00092 setFocusProxy(m_documentList);
00093 #if KDE_IS_VERSION(3,4,0)
00094 m_documentList->setShadeSortColumn(false);
00095 #endif
00096
00097 KGuiItem openGItem(i18n("Use This Template"));
00098 m_openButton->setGuiItem(openGItem);
00099 m_documentList->header()->hide();
00100 KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00101 QString fullTemplateName = cfgGrp.readPathEntry("FullTemplateName");
00102 d->m_alwaysUseTemplate = cfgGrp.readPathEntry("AlwaysUseTemplate");
00103 connect(m_alwaysUseCheckBox, SIGNAL(clicked()), this, SLOT(alwaysUseClicked()));
00104 changePalette();
00105
00106 if(kapp) {
00107 connect(kapp, SIGNAL(kdisplayPaletteChanged()), this, SLOT(changePalette()));
00108 }
00109
00110 KListViewItem* selectItem = 0;
00111
00112 for (KoTemplate* t = group->first(); t != 0L; t = group->next()) {
00113 KListViewItem* item = new KListViewItem(m_documentList, t->name(), t->description(), t->file());
00114 QImage icon = t->loadPicture(instance).convertToImage();
00115 icon = icon.smoothScale(64, 64, QImage::ScaleMin);
00116 icon.setAlphaBuffer(true);
00117 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
00118 item->setPixmap(0, QPixmap(icon));
00119 item->setPixmap(2, t->loadPicture(instance));
00120
00121 if(d->m_alwaysUseTemplate == t->file()) {
00122 selectItem = item;
00123 } else if(!selectItem && (t->file() == fullTemplateName)) {
00124 selectItem = item;
00125 }
00126 }
00127
00128 connect(m_documentList, SIGNAL(selectionChanged(QListViewItem*)),
00129 this, SLOT(selectionChanged(QListViewItem*)));
00130 connect(m_documentList, SIGNAL(doubleClicked(QListViewItem*, const QPoint&, int)),
00131 this, SLOT(openTemplate(QListViewItem*)));
00132 connect(m_documentList, SIGNAL(returnPressed(QListViewItem*)),
00133 this, SLOT(openTemplate(QListViewItem*)));
00134 connect(m_openButton, SIGNAL(clicked()), this, SLOT(openTemplate()));
00135
00136 if(selectItem) {
00137 m_documentList->setSelected(selectItem, true);
00138 d->m_selected = true;
00139 } else {
00140 m_documentList->setSelected(m_documentList->firstChild(), true);
00141 }
00142 }
00143
00144 KoTemplatesPane::~KoTemplatesPane()
00145 {
00146 delete d;
00147 }
00148
00149 void KoTemplatesPane::selectionChanged(QListViewItem* item)
00150 {
00151 if(item) {
00152 m_openButton->setEnabled(true);
00153 m_alwaysUseCheckBox->setEnabled(true);
00154 m_titleLabel->setText(item->text(0));
00155 m_previewLabel->setPixmap(*(item->pixmap(2)));
00156 m_detailsLabel->setText(item->text(1));
00157 m_alwaysUseCheckBox->setChecked(item->text(2) == d->m_alwaysUseTemplate);
00158 } else {
00159 m_openButton->setEnabled(false);
00160 m_alwaysUseCheckBox->setEnabled(false);
00161 m_alwaysUseCheckBox->setChecked(false);
00162 m_titleLabel->setText(QString::null);
00163 m_previewLabel->setPixmap(QPixmap());
00164 }
00165 }
00166
00167 void KoTemplatesPane::openTemplate()
00168 {
00169 QListViewItem* item = m_documentList->selectedItem();
00170 openTemplate(item);
00171 }
00172
00173 void KoTemplatesPane::openTemplate(QListViewItem* item)
00174 {
00175 if(item) {
00176 KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00177 cfgGrp.writePathEntry("FullTemplateName", item->text(2));
00178 cfgGrp.writeEntry("LastReturnType", "Template");
00179 cfgGrp.writeEntry("AlwaysUseTemplate", d->m_alwaysUseTemplate);
00180 emit openTemplate(item->text(2));
00181 }
00182 }
00183
00184 void KoTemplatesPane::changePalette()
00185 {
00186 QPalette p = kapp ? kapp->palette() : palette();
00187 p.setBrush(QColorGroup::Base, p.brush(QPalette::Normal, QColorGroup::Background));
00188 p.setColor(QColorGroup::Text, p.color(QPalette::Normal, QColorGroup::Foreground));
00189 m_detailsLabel->setPalette(p);
00190 }
00191
00192 bool KoTemplatesPane::isSelected()
00193 {
00194 return d->m_selected;
00195 }
00196
00197 void KoTemplatesPane::alwaysUseClicked()
00198 {
00199 QListViewItem* item = m_documentList->selectedItem();
00200
00201 if(!m_alwaysUseCheckBox->isChecked()) {
00202 KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00203 cfgGrp.writeEntry("AlwaysUseTemplate", QString::null);
00204 d->m_alwaysUseTemplate = QString::null;
00205 } else {
00206 d->m_alwaysUseTemplate = item->text(2);
00207 }
00208
00209 emit alwaysUseChanged(this, d->m_alwaysUseTemplate);
00210 }
00211
00212 void KoTemplatesPane::changeAlwaysUseTemplate(KoTemplatesPane* sender, const QString& alwaysUse)
00213 {
00214 if(this == sender)
00215 return;
00216
00217 QListViewItem* item = m_documentList->selectedItem();
00218
00219
00220 if(item && (item->text(2) == d->m_alwaysUseTemplate)) {
00221 m_alwaysUseCheckBox->setChecked(false);
00222 }
00223
00224 d->m_alwaysUseTemplate = alwaysUse;
00225 }
00226
00227 bool KoTemplatesPane::eventFilter(QObject* watched, QEvent* e)
00228 {
00229 if(watched == m_previewLabel) {
00230 if(e->type() == QEvent::MouseButtonDblClick) {
00231 openTemplate();
00232 }
00233 }
00234
00235 if(watched == m_documentList) {
00236 if((e->type() == QEvent::Resize) && isShown()) {
00237 emit splitterResized(this, m_splitter->sizes());
00238 }
00239 }
00240
00241 return false;
00242 }
00243
00244 void KoTemplatesPane::resizeSplitter(KoDetailsPaneBase* sender, const QValueList<int>& sizes)
00245 {
00246 if(sender == this)
00247 return;
00248
00249 m_splitter->setSizes(sizes);
00250 }
00251
00252
00253 class KoRecentDocumentsPanePrivate
00254 {
00255 public:
00256 KoRecentDocumentsPanePrivate()
00257 : m_previewJob(0), m_instance(0)
00258 {
00259 }
00260
00261 ~KoRecentDocumentsPanePrivate()
00262 {
00263 if(m_previewJob)
00264 m_previewJob->kill();
00265 }
00266
00267 KIO::PreviewJob* m_previewJob;
00268 KInstance* m_instance;
00269 };
00270
00271 KoRecentDocumentsPane::KoRecentDocumentsPane(QWidget* parent, KInstance* instance)
00272 : KoDetailsPaneBase(parent, "RecentDocsPane")
00273 {
00274 d = new KoRecentDocumentsPanePrivate;
00275 d->m_instance = instance;
00276 m_previewLabel->installEventFilter(this);
00277 m_documentList->installEventFilter(this);
00278 setFocusProxy(m_documentList);
00279 KGuiItem openGItem(i18n("Open This Document"), "fileopen");
00280 m_openButton->setGuiItem(openGItem);
00281 m_alwaysUseCheckBox->hide();
00282 m_documentList->header()->hide();
00283 m_documentList->setSorting(-1);
00284 changePalette();
00285
00286 if(kapp) {
00287 connect(kapp, SIGNAL(kdisplayPaletteChanged()), this, SLOT(changePalette()));
00288 }
00289
00290 QString oldGroup = instance->config()->group();
00291 instance->config()->setGroup("RecentFiles");
00292
00293 int i = 0;
00294 QString value;
00295 KFileItemList fileList;
00296 fileList.setAutoDelete(false);
00297
00298 do {
00299 QString key = QString("File%1").arg(i);
00300 value = instance->config()->readPathEntry(key);
00301
00302 if(!value.isEmpty()) {
00303 QString path = value;
00304 QString name;
00305
00306
00307 if(path.endsWith("]")) {
00308 int pos = path.find("[");
00309 name = path.mid(0, pos - 1);
00310 path = path.mid(pos + 1, path.length() - pos - 2);
00311 }
00312
00313 KURL url(path);
00314
00315 if(name.isEmpty())
00316 name = url.filename();
00317
00318 if(!url.isLocalFile() || QFile::exists(url.path())) {
00319 KFileItem* fileItem = new KFileItem(KFileItem::Unknown, KFileItem::Unknown, url);
00320 fileList.append(fileItem);
00321 KoFileListItem* item = new KoFileListItem(m_documentList,
00322 m_documentList->lastItem(), name, url.url(), fileItem);
00323
00324 QImage icon = fileItem->pixmap(64).convertToImage();
00325 icon.setAlphaBuffer(true);
00326 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
00327 item->setPixmap(0, QPixmap(icon));
00328 item->setPixmap(2, fileItem->pixmap(128));
00329 }
00330 }
00331
00332 i++;
00333 } while ( !value.isEmpty() || i<=10 );
00334
00335 instance->config()->setGroup( oldGroup );
00336
00337 connect(m_documentList, SIGNAL(selectionChanged(QListViewItem*)),
00338 this, SLOT(selectionChanged(QListViewItem*)));
00339 connect(m_documentList, SIGNAL(clicked(QListViewItem*)),
00340 this, SLOT(selectionChanged(QListViewItem*)));
00341 connect(m_documentList, SIGNAL(doubleClicked(QListViewItem*, const QPoint&, int)),
00342 this, SLOT(openFile(QListViewItem*)));
00343 connect(m_documentList, SIGNAL(returnPressed(QListViewItem*)),
00344 this, SLOT(openFile(QListViewItem*)));
00345 connect(m_openButton, SIGNAL(clicked()), this, SLOT(openFile()));
00346
00347 m_documentList->setSelected(m_documentList->firstChild(), true);
00348
00349 d->m_previewJob = KIO::filePreview(fileList, 200, 200);
00350
00351 connect(d->m_previewJob, SIGNAL(result(KIO::Job*)), this, SLOT(previewResult(KIO::Job*)));
00352 connect(d->m_previewJob, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)),
00353 this, SLOT(updatePreview(const KFileItem*, const QPixmap&)));
00354 }
00355
00356 KoRecentDocumentsPane::~KoRecentDocumentsPane()
00357 {
00358 delete d;
00359 }
00360
00361 void KoRecentDocumentsPane::selectionChanged(QListViewItem* item)
00362 {
00363 if(item) {
00364 m_openButton->setEnabled(true);
00365 m_titleLabel->setText(item->text(0));
00366 m_previewLabel->setPixmap(*(item->pixmap(2)));
00367
00368 if(static_cast<KoFileListItem*>(item)->fileItem()) {
00369 KFileItem* fileItem = static_cast<KoFileListItem*>(item)->fileItem();
00370 QString details = "<center><table border=\"0\">";
00371 details += i18n("File modification date and time. %1 is date time", "<tr><td><b>Modified:</b></td><td>%1</td></tr>")
00372 .arg(fileItem->timeString(KIO::UDS_MODIFICATION_TIME));
00373 details += i18n("File access date and time. %1 is date time", "<tr><td><b>Accessed:</b></td><td>%1</td></tr>")
00374 .arg(fileItem->timeString(KIO::UDS_ACCESS_TIME));
00375 details += "</table></center>";
00376 m_detailsLabel->setText(details);
00377 } else {
00378 m_detailsLabel->setText(QString::null);
00379 }
00380 } else {
00381 m_openButton->setEnabled(false);
00382 m_titleLabel->setText(QString::null);
00383 m_previewLabel->setPixmap(QPixmap());
00384 m_detailsLabel->setText(QString::null);
00385 }
00386 }
00387
00388 void KoRecentDocumentsPane::openFile()
00389 {
00390 QListViewItem* item = m_documentList->selectedItem();
00391 openFile(item);
00392 }
00393
00394 void KoRecentDocumentsPane::openFile(QListViewItem* item)
00395 {
00396 KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00397 cfgGrp.writeEntry("LastReturnType", "File");
00398
00399 if(item)
00400 emit openFile(item->text(1));
00401 }
00402
00403 void KoRecentDocumentsPane::previewResult(KIO::Job* job)
00404 {
00405 if(d->m_previewJob == job)
00406 d->m_previewJob = 0;
00407 }
00408
00409 void KoRecentDocumentsPane::updatePreview(const KFileItem* fileItem, const QPixmap& preview)
00410 {
00411 if(preview.isNull()) {
00412 return;
00413 }
00414
00415 QListViewItemIterator it(m_documentList);
00416
00417 while(it.current()) {
00418 if(it.current()->text(1) == fileItem->url().url()) {
00419 it.current()->setPixmap(2, preview);
00420 QImage icon = preview.convertToImage();
00421 icon = icon.smoothScale(64, 64, QImage::ScaleMin);
00422 icon.setAlphaBuffer(true);
00423 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
00424 it.current()->setPixmap(0, QPixmap(icon));
00425
00426 if(it.current()->isSelected()) {
00427 m_previewLabel->setPixmap(preview);
00428 }
00429
00430 break;
00431 }
00432
00433 it++;
00434 }
00435 }
00436
00437 void KoRecentDocumentsPane::changePalette()
00438 {
00439 QPalette p = kapp ? kapp->palette() : palette();
00440 p.setBrush(QColorGroup::Base, p.brush(QPalette::Normal, QColorGroup::Background));
00441 p.setColor(QColorGroup::Text, p.color(QPalette::Normal, QColorGroup::Foreground));
00442 m_detailsLabel->setPalette(p);
00443 }
00444
00445 bool KoRecentDocumentsPane::eventFilter(QObject* watched, QEvent* e)
00446 {
00447 if(watched == m_previewLabel) {
00448 if(e->type() == QEvent::MouseButtonDblClick) {
00449 openFile();
00450 }
00451 }
00452
00453 if(watched == m_documentList) {
00454 if((e->type() == QEvent::Resize) && isShown()) {
00455 emit splitterResized(this, m_splitter->sizes());
00456 }
00457 }
00458
00459 return false;
00460 }
00461
00462 void KoRecentDocumentsPane::resizeSplitter(KoDetailsPaneBase* sender, const QValueList<int>& sizes)
00463 {
00464 if(sender == this)
00465 return;
00466
00467 m_splitter->setSizes(sizes);
00468 }
00469
00470 #include "KoDetailsPane.moc"