lib

KoDetailsPane.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 2005 Peter Simonsson <psn@linux.se>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
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* /*defaultTemplate*/)
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   // If the old always use template is selected uncheck the checkbox
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); // Disable sorting
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       // Support for kdelibs-3.5's new RecentFiles format: name[url]
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         //center all icons in 64x64 area
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"
KDE Home | KDE Accessibility Home | Description of Access Keys