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 QString dontShow = "imperial";
00111
00112 if(KGlobal::locale()->measureSystem() == KLocale::Imperial) {
00113 dontShow = "metric";
00114 }
00115
00116 KListViewItem* selectItem = 0;
00117
00118 for (KoTemplate* t = group->first(); t != 0L; t = group->next()) {
00119 if(t->isHidden() || (t->measureSystem() == dontShow))
00120 continue;
00121
00122 KListViewItem* item = new KListViewItem(m_documentList, t->name(), t->description(), t->file());
00123 QImage icon = t->loadPicture(instance).convertToImage();
00124 icon = icon.smoothScale(64, 64, QImage::ScaleMin);
00125 icon.setAlphaBuffer(true);
00126 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
00127 item->setPixmap(0, QPixmap(icon));
00128 item->setPixmap(2, t->loadPicture(instance));
00129
00130 if(d->m_alwaysUseTemplate == t->file()) {
00131 selectItem = item;
00132 } else if(!selectItem && (t->file() == fullTemplateName)) {
00133 selectItem = item;
00134 }
00135 }
00136
00137 connect(m_documentList, SIGNAL(selectionChanged(QListViewItem*)),
00138 this, SLOT(selectionChanged(QListViewItem*)));
00139 connect(m_documentList, SIGNAL(doubleClicked(QListViewItem*, const QPoint&, int)),
00140 this, SLOT(openTemplate(QListViewItem*)));
00141 connect(m_documentList, SIGNAL(returnPressed(QListViewItem*)),
00142 this, SLOT(openTemplate(QListViewItem*)));
00143 connect(m_openButton, SIGNAL(clicked()), this, SLOT(openTemplate()));
00144
00145 if(selectItem) {
00146 m_documentList->setSelected(selectItem, true);
00147 d->m_selected = true;
00148 } else {
00149 m_documentList->setSelected(m_documentList->firstChild(), true);
00150 }
00151 }
00152
00153 KoTemplatesPane::~KoTemplatesPane()
00154 {
00155 delete d;
00156 }
00157
00158 void KoTemplatesPane::selectionChanged(QListViewItem* item)
00159 {
00160 if(item) {
00161 m_openButton->setEnabled(true);
00162 m_alwaysUseCheckBox->setEnabled(true);
00163 m_titleLabel->setText(item->text(0));
00164 m_previewLabel->setPixmap(*(item->pixmap(2)));
00165 m_detailsLabel->setText(item->text(1));
00166 m_alwaysUseCheckBox->setChecked(item->text(2) == d->m_alwaysUseTemplate);
00167 } else {
00168 m_openButton->setEnabled(false);
00169 m_alwaysUseCheckBox->setEnabled(false);
00170 m_alwaysUseCheckBox->setChecked(false);
00171 m_titleLabel->setText(QString::null);
00172 m_previewLabel->setPixmap(QPixmap());
00173 }
00174 }
00175
00176 void KoTemplatesPane::openTemplate()
00177 {
00178 QListViewItem* item = m_documentList->selectedItem();
00179 openTemplate(item);
00180 }
00181
00182 void KoTemplatesPane::openTemplate(QListViewItem* item)
00183 {
00184 if(item) {
00185 KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00186 cfgGrp.writePathEntry("FullTemplateName", item->text(2));
00187 cfgGrp.writeEntry("LastReturnType", "Template");
00188 cfgGrp.writeEntry("AlwaysUseTemplate", d->m_alwaysUseTemplate);
00189 emit openTemplate(item->text(2));
00190 }
00191 }
00192
00193 void KoTemplatesPane::changePalette()
00194 {
00195 QPalette p = kapp ? kapp->palette() : palette();
00196 p.setBrush(QColorGroup::Base, p.brush(QPalette::Normal, QColorGroup::Background));
00197 p.setColor(QColorGroup::Text, p.color(QPalette::Normal, QColorGroup::Foreground));
00198 m_detailsLabel->setPalette(p);
00199 }
00200
00201 bool KoTemplatesPane::isSelected()
00202 {
00203 return d->m_selected;
00204 }
00205
00206 void KoTemplatesPane::alwaysUseClicked()
00207 {
00208 QListViewItem* item = m_documentList->selectedItem();
00209
00210 if(!m_alwaysUseCheckBox->isChecked()) {
00211 KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00212 cfgGrp.writeEntry("AlwaysUseTemplate", QString::null);
00213 d->m_alwaysUseTemplate = QString::null;
00214 } else {
00215 d->m_alwaysUseTemplate = item->text(2);
00216 }
00217
00218 emit alwaysUseChanged(this, d->m_alwaysUseTemplate);
00219 }
00220
00221 void KoTemplatesPane::changeAlwaysUseTemplate(KoTemplatesPane* sender, const QString& alwaysUse)
00222 {
00223 if(this == sender)
00224 return;
00225
00226 QListViewItem* item = m_documentList->selectedItem();
00227
00228
00229 if(item && (item->text(2) == d->m_alwaysUseTemplate)) {
00230 m_alwaysUseCheckBox->setChecked(false);
00231 }
00232
00233 d->m_alwaysUseTemplate = alwaysUse;
00234 }
00235
00236 bool KoTemplatesPane::eventFilter(QObject* watched, QEvent* e)
00237 {
00238 if(watched == m_previewLabel) {
00239 if(e->type() == QEvent::MouseButtonDblClick) {
00240 openTemplate();
00241 }
00242 }
00243
00244 if(watched == m_documentList) {
00245 if((e->type() == QEvent::Resize) && isShown()) {
00246 emit splitterResized(this, m_splitter->sizes());
00247 }
00248 }
00249
00250 return false;
00251 }
00252
00253 void KoTemplatesPane::resizeSplitter(KoDetailsPaneBase* sender, const QValueList<int>& sizes)
00254 {
00255 if(sender == this)
00256 return;
00257
00258 m_splitter->setSizes(sizes);
00259 }
00260
00261
00262 class KoRecentDocumentsPanePrivate
00263 {
00264 public:
00265 KoRecentDocumentsPanePrivate()
00266 : m_previewJob(0), m_instance(0)
00267 {
00268 }
00269
00270 ~KoRecentDocumentsPanePrivate()
00271 {
00272 if(m_previewJob)
00273 m_previewJob->kill();
00274 }
00275
00276 KIO::PreviewJob* m_previewJob;
00277 KInstance* m_instance;
00278 };
00279
00280 KoRecentDocumentsPane::KoRecentDocumentsPane(QWidget* parent, KInstance* instance)
00281 : KoDetailsPaneBase(parent, "RecentDocsPane")
00282 {
00283 d = new KoRecentDocumentsPanePrivate;
00284 d->m_instance = instance;
00285 m_previewLabel->installEventFilter(this);
00286 m_documentList->installEventFilter(this);
00287 setFocusProxy(m_documentList);
00288 KGuiItem openGItem(i18n("Open This Document"), "fileopen");
00289 m_openButton->setGuiItem(openGItem);
00290 m_alwaysUseCheckBox->hide();
00291 m_documentList->header()->hide();
00292 m_documentList->setSorting(-1);
00293 changePalette();
00294
00295 if(kapp) {
00296 connect(kapp, SIGNAL(kdisplayPaletteChanged()), this, SLOT(changePalette()));
00297 }
00298
00299 QString oldGroup = instance->config()->group();
00300 instance->config()->setGroup("RecentFiles");
00301
00302 int i = 0;
00303 QString value;
00304 KFileItemList fileList;
00305 fileList.setAutoDelete(false);
00306
00307 do {
00308 QString key = QString("File%1").arg(i);
00309 value = instance->config()->readPathEntry(key);
00310
00311 if(!value.isEmpty()) {
00312 QString path = value;
00313 QString name;
00314
00315
00316 if(path.endsWith("]")) {
00317 int pos = path.find("[");
00318 name = path.mid(0, pos - 1);
00319 path = path.mid(pos + 1, path.length() - pos - 2);
00320 }
00321
00322 KURL url(path);
00323
00324 if(name.isEmpty())
00325 name = url.filename();
00326
00327 if(!url.isLocalFile() || QFile::exists(url.path())) {
00328 KFileItem* fileItem = new KFileItem(KFileItem::Unknown, KFileItem::Unknown, url);
00329 fileList.append(fileItem);
00330 KoFileListItem* item = new KoFileListItem(m_documentList,
00331 m_documentList->lastItem(), name, url.url(), fileItem);
00332
00333 QImage icon = fileItem->pixmap(64).convertToImage();
00334 icon.setAlphaBuffer(true);
00335 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
00336 item->setPixmap(0, QPixmap(icon));
00337 item->setPixmap(2, fileItem->pixmap(128));
00338 }
00339 }
00340
00341 i++;
00342 } while ( !value.isEmpty() || i<=10 );
00343
00344 instance->config()->setGroup( oldGroup );
00345
00346 connect(m_documentList, SIGNAL(selectionChanged(QListViewItem*)),
00347 this, SLOT(selectionChanged(QListViewItem*)));
00348 connect(m_documentList, SIGNAL(clicked(QListViewItem*)),
00349 this, SLOT(selectionChanged(QListViewItem*)));
00350 connect(m_documentList, SIGNAL(doubleClicked(QListViewItem*, const QPoint&, int)),
00351 this, SLOT(openFile(QListViewItem*)));
00352 connect(m_documentList, SIGNAL(returnPressed(QListViewItem*)),
00353 this, SLOT(openFile(QListViewItem*)));
00354 connect(m_openButton, SIGNAL(clicked()), this, SLOT(openFile()));
00355
00356 m_documentList->setSelected(m_documentList->firstChild(), true);
00357
00358 d->m_previewJob = KIO::filePreview(fileList, 200, 200);
00359
00360 connect(d->m_previewJob, SIGNAL(result(KIO::Job*)), this, SLOT(previewResult(KIO::Job*)));
00361 connect(d->m_previewJob, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)),
00362 this, SLOT(updatePreview(const KFileItem*, const QPixmap&)));
00363 }
00364
00365 KoRecentDocumentsPane::~KoRecentDocumentsPane()
00366 {
00367 delete d;
00368 }
00369
00370 void KoRecentDocumentsPane::selectionChanged(QListViewItem* item)
00371 {
00372 if(item) {
00373 m_openButton->setEnabled(true);
00374 m_titleLabel->setText(item->text(0));
00375 m_previewLabel->setPixmap(*(item->pixmap(2)));
00376
00377 if(static_cast<KoFileListItem*>(item)->fileItem()) {
00378 KFileItem* fileItem = static_cast<KoFileListItem*>(item)->fileItem();
00379 QString details = "<center><table border=\"0\">";
00380 details += i18n("File modification date and time. %1 is date time", "<tr><td><b>Modified:</b></td><td>%1</td></tr>")
00381 .arg(fileItem->timeString(KIO::UDS_MODIFICATION_TIME));
00382 details += i18n("File access date and time. %1 is date time", "<tr><td><b>Accessed:</b></td><td>%1</td></tr>")
00383 .arg(fileItem->timeString(KIO::UDS_ACCESS_TIME));
00384 details += "</table></center>";
00385 m_detailsLabel->setText(details);
00386 } else {
00387 m_detailsLabel->setText(QString::null);
00388 }
00389 } else {
00390 m_openButton->setEnabled(false);
00391 m_titleLabel->setText(QString::null);
00392 m_previewLabel->setPixmap(QPixmap());
00393 m_detailsLabel->setText(QString::null);
00394 }
00395 }
00396
00397 void KoRecentDocumentsPane::openFile()
00398 {
00399 QListViewItem* item = m_documentList->selectedItem();
00400 openFile(item);
00401 }
00402
00403 void KoRecentDocumentsPane::openFile(QListViewItem* item)
00404 {
00405 KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00406 cfgGrp.writeEntry("LastReturnType", "File");
00407
00408 if(item)
00409 emit openFile(item->text(1));
00410 }
00411
00412 void KoRecentDocumentsPane::previewResult(KIO::Job* job)
00413 {
00414 if(d->m_previewJob == job)
00415 d->m_previewJob = 0;
00416 }
00417
00418 void KoRecentDocumentsPane::updatePreview(const KFileItem* fileItem, const QPixmap& preview)
00419 {
00420 if(preview.isNull()) {
00421 return;
00422 }
00423
00424 QListViewItemIterator it(m_documentList);
00425
00426 while(it.current()) {
00427 if(it.current()->text(1) == fileItem->url().url()) {
00428 it.current()->setPixmap(2, preview);
00429 QImage icon = preview.convertToImage();
00430 icon = icon.smoothScale(64, 64, QImage::ScaleMin);
00431 icon.setAlphaBuffer(true);
00432 icon = icon.copy((icon.width() - 64) / 2, (icon.height() - 64) / 2, 64, 64);
00433 it.current()->setPixmap(0, QPixmap(icon));
00434
00435 if(it.current()->isSelected()) {
00436 m_previewLabel->setPixmap(preview);
00437 }
00438
00439 break;
00440 }
00441
00442 it++;
00443 }
00444 }
00445
00446 void KoRecentDocumentsPane::changePalette()
00447 {
00448 QPalette p = kapp ? kapp->palette() : palette();
00449 p.setBrush(QColorGroup::Base, p.brush(QPalette::Normal, QColorGroup::Background));
00450 p.setColor(QColorGroup::Text, p.color(QPalette::Normal, QColorGroup::Foreground));
00451 m_detailsLabel->setPalette(p);
00452 }
00453
00454 bool KoRecentDocumentsPane::eventFilter(QObject* watched, QEvent* e)
00455 {
00456 if(watched == m_previewLabel) {
00457 if(e->type() == QEvent::MouseButtonDblClick) {
00458 openFile();
00459 }
00460 }
00461
00462 if(watched == m_documentList) {
00463 if((e->type() == QEvent::Resize) && isShown()) {
00464 emit splitterResized(this, m_splitter->sizes());
00465 }
00466 }
00467
00468 return false;
00469 }
00470
00471 void KoRecentDocumentsPane::resizeSplitter(KoDetailsPaneBase* sender, const QValueList<int>& sizes)
00472 {
00473 if(sender == this)
00474 return;
00475
00476 m_splitter->setSizes(sizes);
00477 }
00478
00479 #include "KoDetailsPane.moc"