KoOpenPane.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2005 Peter Simonsson <psn@linux.se>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#include "KoOpenPane.h"
21
22#include <tqvbox.h>
23#include <tqlayout.h>
24#include <tqheader.h>
25#include <tqwidgetstack.h>
26#include <tqlabel.h>
27#include <tqvaluelist.h>
28#include <tqimage.h>
29#include <tqpainter.h>
30#include <tqpen.h>
31
32#include <tdelocale.h>
33#include <tdefiledialog.h>
34#include <tdeinstance.h>
35#include <kpushbutton.h>
36#include <kiconloader.h>
37#include <kdebug.h>
38#include <tdelistview.h>
39
40#include "KoFilterManager.h"
41#include "KoTemplates.h"
42#include "KoDocument.h"
43#include "KoDetailsPane.h"
44#include "koDetailsPaneBase.h"
45
46#include <limits.h>
47
48class KoSectionListItem : public TQListViewItem
49{
50 public:
51 KoSectionListItem(TDEListView* listView, const TQString& name, int sortWeight, int widgetIndex = -1)
52 : TQListViewItem(listView, name), m_sortWeight(sortWeight), m_widgetIndex(widgetIndex)
53 {
54 }
55
56 virtual int compare(TQListViewItem* i, int, bool) const
57 {
58 KoSectionListItem* item = dynamic_cast<KoSectionListItem*>(i);
59
60 if(!item)
61 return 0;
62
63 return sortWeight() - item->sortWeight();
64 }
65
66 virtual void paintCell(TQPainter* p, const TQColorGroup& cg, int column, int width, int align)
67 {
68 if(widgetIndex() >= 0) {
69 TQListViewItem::paintCell(p, cg, column, width, align);
70 } else {
71 int ypos = (height() - 2) / 2;
72 TQPen pen(cg.foreground(), 2);
73 p->setPen(pen);
74 p->drawLine(0, ypos, width, ypos);
75 }
76 }
77
78 int sortWeight() const { return m_sortWeight; }
79 int widgetIndex() const { return m_widgetIndex; }
80
81 private:
82 int m_sortWeight;
83 int m_widgetIndex;
84};
85
86class KoOpenPanePrivate
87{
88 public:
89 KoOpenPanePrivate() :
90 m_instance(0)
91 {
92 }
93
94 TDEInstance* m_instance;
95};
96
97KoOpenPane::KoOpenPane(TQWidget *parent, TDEInstance* instance, const TQString& templateType)
98 : KoOpenPaneBase(parent, "OpenPane")
99{
100 d = new KoOpenPanePrivate;
101 d->m_instance = instance;
102
103 m_sectionList->header()->hide();
104 m_sectionList->setSorting(0);
105#if KDE_IS_VERSION(3,4,0)
106 m_sectionList->setShadeSortColumn(false);
107#endif
108 connect(m_sectionList, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
109 this, TQ_SLOT(selectionChanged(TQListViewItem*)));
110 connect(m_sectionList, TQ_SIGNAL(pressed(TQListViewItem*)),
111 this, TQ_SLOT(itemClicked(TQListViewItem*)));
112 connect(m_sectionList, TQ_SIGNAL(spacePressed(TQListViewItem*)),
113 this, TQ_SLOT(itemClicked(TQListViewItem*)));
114 connect(m_sectionList, TQ_SIGNAL(returnPressed(TQListViewItem*)),
115 this, TQ_SLOT(itemClicked(TQListViewItem*)));
116
117 KGuiItem openExistingGItem(i18n("Open Existing Document..."), "document-open");
118 m_openExistingButton->setGuiItem(openExistingGItem);
119 connect(m_openExistingButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(showOpenFileDialog()));
120
121 initRecentDocs();
122 initTemplates(templateType);
123
124 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(m_sectionList->selectedItem());
125
126 if(selectedItem) {
127 m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
128 }
129
130 TQValueList<int> sizes;
131 sizes << 20 << width() - 20;
132 m_splitter->setSizes(sizes);
133
134 // Set the sizes of the details pane splitters
135 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
136 sizes = cfgGrp.readIntListEntry("DetailsPaneSplitterSizes");
137 emit splitterResized(0, sizes);
138
139 connect(this, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)),
140 this, TQ_SLOT(saveSplitterSizes(KoDetailsPaneBase*, const TQValueList<int>&)));
141}
142
143KoOpenPane::~KoOpenPane()
144{
145 KoSectionListItem* item = dynamic_cast<KoSectionListItem*>(m_sectionList->selectedItem());
146
147 if(item) {
148 if(!dynamic_cast<KoDetailsPaneBase*>(m_widgetStack->widget(item->widgetIndex()))) {
149 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
150 cfgGrp.writeEntry("LastReturnType", "Custom");
151 }
152 }
153
154 delete d;
155}
156
157void KoOpenPane::showOpenFileDialog()
158{
160 KoFilterManager::Import, KoDocument::readExtraNativeMimeTypes());
161
162 KURL url = KFileDialog::getOpenURL(":OpenDialog", mimeFilter.join(" "), this);
163
164 if(!url.isEmpty()) {
165 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
166 cfgGrp.writeEntry("LastReturnType", "File");
167 emit openExistingFile(url.url());
168 }
169}
170
171void KoOpenPane::initRecentDocs()
172{
173 KoRecentDocumentsPane* recentDocPane = new KoRecentDocumentsPane(this, d->m_instance);
174 connect(recentDocPane, TQ_SIGNAL(openFile(const TQString&)), this, TQ_SIGNAL(openExistingFile(const TQString&)));
175 TQListViewItem* item = addPane(i18n("Recent Documents"), "document-open", recentDocPane, 0);
176 connect(recentDocPane, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)),
177 this, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)));
178 connect(this, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)),
179 recentDocPane, TQ_SLOT(resizeSplitter(KoDetailsPaneBase*, const TQValueList<int>&)));
180
181 KoSectionListItem* separator = new KoSectionListItem(m_sectionList, "", 1);
182 separator->setEnabled(false);
183
184 if(d->m_instance->config()->hasGroup("RecentFiles")) {
185 m_sectionList->setSelected(item, true);
186 }
187}
188
189void KoOpenPane::initTemplates(const TQString& templateType)
190{
191 TQListViewItem* selectItem = 0;
192 TQListViewItem* firstItem = 0;
193 const int templateOffset = 1000;
194
195 if(!templateType.isEmpty())
196 {
197 KoTemplateTree templateTree(templateType.local8Bit(), d->m_instance, true);
198
199 for (KoTemplateGroup *group = templateTree.first(); group != 0L; group = templateTree.next()) {
200 if (group->isHidden()) {
201 continue;
202 }
203
204 KoTemplatesPane* pane = new KoTemplatesPane(this, d->m_instance,
205 group, templateTree.defaultTemplate());
206 connect(pane, TQ_SIGNAL(openTemplate(const TQString&)), this, TQ_SIGNAL(openTemplate(const TQString&)));
207 connect(pane, TQ_SIGNAL(alwaysUseChanged(KoTemplatesPane*, const TQString&)),
208 this, TQ_SIGNAL(alwaysUseChanged(KoTemplatesPane*, const TQString&)));
209 connect(this, TQ_SIGNAL(alwaysUseChanged(KoTemplatesPane*, const TQString&)),
210 pane, TQ_SLOT(changeAlwaysUseTemplate(KoTemplatesPane*, const TQString&)));
211 connect(pane, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)),
212 this, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)));
213 connect(this, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)),
214 pane, TQ_SLOT(resizeSplitter(KoDetailsPaneBase*, const TQValueList<int>&)));
215 TQListViewItem* item = addPane(group->name(), group->first()->loadPicture(d->m_instance),
216 pane, group->sortingWeight() + templateOffset);
217
218 if(!firstItem) {
219 firstItem = item;
220 }
221
222 if(group == templateTree.defaultGroup()) {
223 firstItem = item;
224 }
225
226 if(pane->isSelected()) {
227 selectItem = item;
228 }
229 }
230 } else {
231 firstItem = m_sectionList->firstChild();
232 }
233
234 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
235
236 if(selectItem && (cfgGrp.readEntry("LastReturnType") == "Template")) {
237 m_sectionList->setSelected(selectItem, true);
238 } else if(!m_sectionList->selectedItem() && firstItem) {
239 m_sectionList->setSelected(firstItem, true);
240 }
241}
242
243void KoOpenPane::setCustomDocumentWidget(TQWidget *widget) {
244 Q_ASSERT(widget);
245 KoSectionListItem* separator = new KoSectionListItem(m_sectionList, "", INT_MAX-1);
246 separator->setEnabled(false);
247
248 TQListViewItem* item = addPane(i18n("Custom Document"), TQString(), widget, INT_MAX);
249
250 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
251
252 if(cfgGrp.readEntry("LastReturnType") == "Custom") {
253 m_sectionList->setSelected(item, true);
254 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(item);
255 m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
256 }
257}
258
259TQListViewItem* KoOpenPane::addPane(const TQString& title, const TQString& icon, TQWidget* widget, int sortWeight)
260{
261 return addPane(title, SmallIcon(icon, TDEIcon::SizeLarge, TDEIcon::DefaultState, d->m_instance),
262 widget, sortWeight);
263}
264
265TQListViewItem* KoOpenPane::addPane(const TQString& title, const TQPixmap& icon, TQWidget* widget, int sortWeight)
266{
267 if(!widget) {
268 return 0;
269 }
270
271 int id = m_widgetStack->addWidget(widget);
272 KoSectionListItem* listItem = new KoSectionListItem(m_sectionList, title, sortWeight, id);
273
274 if(!icon.isNull()) {
275 TQImage image = icon.convertToImage();
276
277 if((image.width() > 48) || (image.height() > 48)) {
278 image = image.smoothScale(48, 48, TQImage::ScaleMin);
279 }
280
281 image.setAlphaBuffer(true);
282 image = image.copy((image.width() - 48) / 2, (image.height() - 48) / 2, 48, 48);
283 listItem->setPixmap(0, TQPixmap(image));
284 }
285
286 return listItem;
287}
288
289void KoOpenPane::selectionChanged(TQListViewItem* item)
290{
291 KoSectionListItem* section = dynamic_cast<KoSectionListItem*>(item);
292
293 if(!item)
294 return;
295
296 m_headerLabel->setText(section->text(0));
297 m_widgetStack->raiseWidget(section->widgetIndex());
298}
299
300void KoOpenPane::saveSplitterSizes(KoDetailsPaneBase* /*sender*/, const TQValueList<int>& sizes)
301{
302 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
303 cfgGrp.writeEntry("DetailsPaneSplitterSizes", sizes);
304}
305
306void KoOpenPane::itemClicked(TQListViewItem* item)
307{
308 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(item);
309
310 if(selectedItem) {
311 m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
312 }
313}
314
315#include "KoOpenPane.moc"
static TQCString readNativeFormatMimeType(TDEInstance *instance=0)
Used by KoApplication, and by KoMainWindow, when no document exists yet.
static TQStringList readExtraNativeMimeTypes(TDEInstance *instance=0)
Used by KoMainWindow, when no document exists yet.
static TQStringList mimeFilter()
The same method as KoFilterManager::mimeFilter but suited for KoShell.
This widget is the recent doc part of the template opening widget.
This widget is the right-side part of the template opening widget.
bool isSelected()
Returns true if a template in this group was the last one selected.
const char * name(StdAction id)