00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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* , 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"