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 <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
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"