F:/KPlato/koffice/libs/kofficecore/KoOpenPane.cpp

Aller à la documentation de ce fichier.
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 
00020 #include "KoOpenPane.h"
00021 
00022 #include <q3vbox.h>
00023 #include <QLayout>
00024 #include <q3header.h>
00025 #include <q3widgetstack.h>
00026 #include <QLabel>
00027 #include <q3valuelist.h>
00028 #include <QImage>
00029 #include <QPainter>
00030 #include <QPen>
00031 #include <QPixmap>
00032 #include <QSize>
00033 
00034 #include <klocale.h>
00035 #include <kfiledialog.h>
00036 #include <kinstance.h>
00037 #include <kpushbutton.h>
00038 #include <kiconloader.h>
00039 #include <kdebug.h>
00040 #include <k3listview.h>
00041 
00042 #include "KoFilterManager.h"
00043 #include "KoTemplates.h"
00044 #include "KoDocument.h"
00045 #include "KoDetailsPane.h"
00046 #include "KoTemplatesPane.h"
00047 #include "KoRecentDocumentsPane.h"
00048 #include "ui_koOpenPaneBase.h"
00049 
00050 #include <limits.h>
00051 
00052 class KoSectionListItem : public Q3ListViewItem
00053 {
00054   public:
00055     KoSectionListItem(K3ListView* listView, const QString& name, int sortWeight, int widgetIndex = -1)
00056       : Q3ListViewItem(listView, name), m_sortWeight(sortWeight), m_widgetIndex(widgetIndex)
00057     {
00058     }
00059 
00060     virtual int compare(Q3ListViewItem* i, int, bool) const
00061     {
00062       KoSectionListItem* item = dynamic_cast<KoSectionListItem*>(i);
00063 
00064       if(!item)
00065         return 0;
00066 
00067       return sortWeight() - item->sortWeight();
00068     }
00069 
00070     virtual void paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align)
00071     {
00072       if(widgetIndex() >= 0) {
00073         Q3ListViewItem::paintCell(p, cg, column, width, align);
00074       } else {
00075         int ypos = (height() - 2) / 2;
00076         QPen pen(cg.windowText(), 2);
00077         p->setPen(pen);
00078         p->drawLine(0, ypos, width, ypos);
00079       }
00080     }
00081 
00082     int sortWeight() const { return m_sortWeight; }
00083     int widgetIndex() const { return m_widgetIndex; }
00084 
00085   private:
00086     int m_sortWeight;
00087     int m_widgetIndex;
00088 };
00089 
00090 class KoOpenPanePrivate : public Ui_KoOpenPaneBase
00091 {
00092   public:
00093     KoOpenPanePrivate() :
00094       Ui_KoOpenPaneBase(),
00095       m_instance(0)
00096     {
00097     }
00098 
00099     KInstance* m_instance;
00100 };
00101 
00102 KoOpenPane::KoOpenPane(QWidget *parent, KInstance* instance, const QString& templateType)
00103   : QWidget(parent)
00104 {
00105   d = new KoOpenPanePrivate;
00106   d->m_instance = instance;
00107   d->setupUi(this);
00108 
00109   d->m_sectionList->header()->hide();
00110   d->m_sectionList->setSorting(0);
00111   connect(d->m_sectionList, SIGNAL(selectionChanged(Q3ListViewItem*)),
00112           this, SLOT(selectionChanged(Q3ListViewItem*)));
00113   connect(d->m_sectionList, SIGNAL(pressed(Q3ListViewItem*)),
00114           this, SLOT(itemClicked(Q3ListViewItem*)));
00115   connect(d->m_sectionList, SIGNAL(spacePressed(Q3ListViewItem*)),
00116           this, SLOT(itemClicked(Q3ListViewItem*)));
00117   connect(d->m_sectionList, SIGNAL(returnPressed(Q3ListViewItem*)),
00118           this, SLOT(itemClicked(Q3ListViewItem*)));
00119 
00120   KGuiItem openExistingGItem(i18n("Open Existing Document..."), "fileopen");
00121   d->m_openExistingButton->setGuiItem(openExistingGItem);
00122   connect(d->m_openExistingButton, SIGNAL(clicked()), this, SLOT(showOpenFileDialog()));
00123 
00124   initRecentDocs();
00125   initTemplates(templateType);
00126 
00127   KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(d->m_sectionList->selectedItem());
00128 
00129   if(selectedItem) {
00130     d->m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
00131   }
00132 
00133   QList<int> sizes;
00134   sizes << 20 << width() - 20;
00135   d->m_splitter->setSizes(sizes);
00136 
00137   // Set the sizes of the details pane splitters
00138   KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00139   sizes = cfgGrp.readEntry("DetailsPaneSplitterSizes", sizes);
00140   emit splitterResized(0, sizes);
00141 
00142   connect(this, SIGNAL(splitterResized(KoDetailsPane*, const QList<int>&)),
00143           this, SLOT(saveSplitterSizes(KoDetailsPane*, const QList<int>&)));
00144 }
00145 
00146 KoOpenPane::~KoOpenPane()
00147 {
00148   KoSectionListItem* item = dynamic_cast<KoSectionListItem*>(d->m_sectionList->selectedItem());
00149 
00150   if(item) {
00151     if(!qobject_cast<KoDetailsPane*>(d->m_widgetStack->widget(item->widgetIndex()))) {
00152       KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00153       cfgGrp.writeEntry("LastReturnType", "Custom");
00154     }
00155   }
00156 
00157   delete d;
00158 }
00159 
00160 void KoOpenPane::showOpenFileDialog()
00161 {
00162   const QStringList mimeFilter = KoFilterManager::mimeFilter(KoDocument::readNativeFormatMimeType(),
00163       KoFilterManager::Import, KoDocument::readExtraNativeMimeTypes());
00164 
00165   if (mimeFilter.isEmpty()) 
00166   {
00167       kDebug() << "No mime types found!\n";  
00168       return;
00169   }
00170   KUrl url = KFileDialog::getOpenUrl(KUrl("kfiledialog:///OpenDialog"), mimeFilter.join(" "), this);
00171 
00172   if(!url.isEmpty()) {
00173     KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00174     cfgGrp.writeEntry("LastReturnType", "File");
00175     emit openExistingFile(url);
00176   }
00177 }
00178 
00179 void KoOpenPane::initRecentDocs()
00180 {
00181   QString header = i18n("Recent Documents");
00182   KoRecentDocumentsPane* recentDocPane = new KoRecentDocumentsPane(this, d->m_instance, header);
00183   connect(recentDocPane, SIGNAL(openUrl(const KUrl&)), this, SIGNAL(openExistingFile(const KUrl&)));
00184   Q3ListViewItem* item = addPane(header, "fileopen", recentDocPane, 0);
00185   connect(recentDocPane, SIGNAL(splitterResized(KoDetailsPane*, const QList<int>&)),
00186           this, SIGNAL(splitterResized(KoDetailsPane*, const QList<int>&)));
00187   connect(this, SIGNAL(splitterResized(KoDetailsPane*, const QList<int>&)),
00188           recentDocPane, SLOT(resizeSplitter(KoDetailsPane*, const QList<int>&)));
00189 
00190   KoSectionListItem* separator = new KoSectionListItem(d->m_sectionList, "", 1);
00191   separator->setEnabled(false);
00192 
00193   if(d->m_instance->config()->hasGroup("RecentFiles")) {
00194     d->m_sectionList->setSelected(item, true);
00195   }
00196 
00197   updateSectionListMaxHeight();
00198 }
00199 
00200 void KoOpenPane::initTemplates(const QString& templateType)
00201 {
00202   Q3ListViewItem* selectItem = 0;
00203   Q3ListViewItem* firstItem = 0;
00204   const int templateOffset = 1000;
00205 
00206   if(!templateType.isEmpty())
00207   {
00208     KoTemplateTree templateTree(templateType.toLocal8Bit(), d->m_instance, true);
00209 
00210     for (KoTemplateGroup *group = templateTree.first(); group != 0L; group = templateTree.next()) {
00211       if (group->isHidden()) {
00212         continue;
00213       }
00214 
00215       KoTemplatesPane* pane = new KoTemplatesPane(this, d->m_instance, group->name(),
00216           group, templateTree.defaultTemplate());
00217       connect(pane, SIGNAL(openUrl(const KUrl&)), this, SIGNAL(openTemplate(const KUrl&)));
00218       connect(pane, SIGNAL(alwaysUseChanged(KoTemplatesPane*, const QString&)),
00219               this, SIGNAL(alwaysUseChanged(KoTemplatesPane*, const QString&)));
00220       connect(this, SIGNAL(alwaysUseChanged(KoTemplatesPane*, const QString&)),
00221               pane, SLOT(changeAlwaysUseTemplate(KoTemplatesPane*, const QString&)));
00222       connect(pane, SIGNAL(splitterResized(KoDetailsPane*, const QList<int>&)),
00223               this, SIGNAL(splitterResized(KoDetailsPane*, const QList<int>&)));
00224       connect(this, SIGNAL(splitterResized(KoDetailsPane*, const QList<int>&)),
00225               pane, SLOT(resizeSplitter(KoDetailsPane*, const QList<int>&)));
00226       Q3ListViewItem* item = addPane(group->name(), group->first()->loadPicture(d->m_instance),
00227                                     pane, group->sortingWeight() + templateOffset);
00228 
00229       if(!firstItem) {
00230         firstItem = item;
00231       }
00232 
00233       if(group == templateTree.defaultGroup()) {
00234         firstItem = item;
00235       }
00236 
00237       if(pane->isSelected()) {
00238         selectItem = item;
00239       }
00240     }
00241   } else {
00242     firstItem = d->m_sectionList->firstChild();
00243   }
00244 
00245   KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00246 
00247   if(selectItem && (cfgGrp.readEntry("LastReturnType") == "Template")) {
00248     d->m_sectionList->setSelected(selectItem, true);
00249   } else if(!d->m_sectionList->selectedItem() && firstItem) {
00250     d->m_sectionList->setSelected(firstItem, true);
00251   }
00252 
00253   updateSectionListMaxHeight();
00254 }
00255 
00256 void KoOpenPane::setCustomDocumentWidget(QWidget *widget) {
00257   Q_ASSERT(widget);
00258   KoSectionListItem* separator = new KoSectionListItem(d->m_sectionList, "", INT_MAX-1);
00259   separator->setEnabled(false);
00260 
00261   Q3ListViewItem* item = addPane(i18n("Custom Document"), QString::null, widget, INT_MAX);
00262 
00263   KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00264 
00265   if(cfgGrp.readEntry("LastReturnType") == "Custom") {
00266     d->m_sectionList->setSelected(item, true);
00267     KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(item);
00268     d->m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
00269   }
00270 
00271   updateSectionListMaxHeight();
00272 }
00273 
00274 Q3ListViewItem* KoOpenPane::addPane(const QString& title, const QString& icon, QWidget* widget, int sortWeight)
00275 {
00276   return addPane(title, SmallIcon(icon, K3Icon::SizeLarge, K3Icon::DefaultState, d->m_instance),
00277                  widget, sortWeight);
00278 }
00279 
00280 Q3ListViewItem* KoOpenPane::addPane(const QString& title, const QPixmap& icon, QWidget* widget, int sortWeight)
00281 {
00282   if(!widget) {
00283     return 0;
00284   }
00285 
00286   int id = d->m_widgetStack->addWidget(widget);
00287   KoSectionListItem* listItem = new KoSectionListItem(d->m_sectionList, title, sortWeight, id);
00288 
00289   if(!icon.isNull()) {
00290     QImage image = icon.toImage();
00291 
00292     if((image.width() > 48) || (image.height() > 48)) {
00293       image = image.scaled(48, 48, Qt::KeepAspectRatio, Qt::SmoothTransformation);
00294     }
00295 
00296     image.convertToFormat(QImage::Format_ARGB32);
00297     image = image.copy((image.width() - 48) / 2, (image.height() - 48) / 2, 48, 48);
00298     listItem->setPixmap(0, QPixmap::fromImage(image));
00299   }
00300 
00301   return listItem;
00302 }
00303 
00304 void KoOpenPane::selectionChanged(Q3ListViewItem* item)
00305 {
00306   KoSectionListItem* section = dynamic_cast<KoSectionListItem*>(item);
00307 
00308   if(!section)
00309     return;
00310 
00311   d->m_widgetStack->setCurrentIndex(section->widgetIndex());
00312 }
00313 
00314 void KoOpenPane::saveSplitterSizes(KoDetailsPane* sender, const QList<int>& sizes)
00315 {
00316   Q_UNUSED(sender);
00317   KConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
00318   cfgGrp.writeEntry("DetailsPaneSplitterSizes", sizes);
00319 }
00320 
00321 void KoOpenPane::itemClicked(Q3ListViewItem* item)
00322 {
00323   KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(item);
00324 
00325   if(selectedItem) {
00326     d->m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
00327   }
00328 }
00329 
00330 void KoOpenPane::updateSectionListMaxHeight()
00331 {
00332   Q3ListViewItemIterator it(d->m_sectionList);
00333   int totalHeight = 0;
00334 
00335   while(it.current()) {
00336     totalHeight += it.current()->height();
00337     ++it;
00338   }
00339 
00340   totalHeight += 4;
00341   QSize sizeHint = d->m_sectionList->sizeHint();
00342   d->m_sectionList->setFixedHeight(totalHeight);
00343 }
00344 
00345 #include "KoOpenPane.moc"

Généré le Wed Nov 22 23:41:03 2006 pour KPlato par  doxygen 1.5.1-p1