lib

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