lib

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 m_sectionList->setShadeSortColumn(false);
106 connect(m_sectionList, TQ_SIGNAL(selectionChanged(TQListViewItem*)),
107 this, TQ_SLOT(selectionChanged(TQListViewItem*)));
108 connect(m_sectionList, TQ_SIGNAL(pressed(TQListViewItem*)),
109 this, TQ_SLOT(itemClicked(TQListViewItem*)));
110 connect(m_sectionList, TQ_SIGNAL(spacePressed(TQListViewItem*)),
111 this, TQ_SLOT(itemClicked(TQListViewItem*)));
112 connect(m_sectionList, TQ_SIGNAL(returnPressed(TQListViewItem*)),
113 this, TQ_SLOT(itemClicked(TQListViewItem*)));
114
115 KGuiItem openExistingGItem(i18n("Open Existing Document..."), "document-open");
116 m_openExistingButton->setGuiItem(openExistingGItem);
117 connect(m_openExistingButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(showOpenFileDialog()));
118
119 initRecentDocs();
120 initTemplates(templateType);
121
122 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(m_sectionList->selectedItem());
123
124 if(selectedItem) {
125 m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
126 }
127
128 TQValueList<int> sizes;
129 sizes << 20 << width() - 20;
130 m_splitter->setSizes(sizes);
131
132 // Set the sizes of the details pane splitters
133 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
134 sizes = cfgGrp.readIntListEntry("DetailsPaneSplitterSizes");
135 emit splitterResized(0, sizes);
136
137 connect(this, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)),
138 this, TQ_SLOT(saveSplitterSizes(KoDetailsPaneBase*, const TQValueList<int>&)));
139}
140
141KoOpenPane::~KoOpenPane()
142{
143 KoSectionListItem* item = dynamic_cast<KoSectionListItem*>(m_sectionList->selectedItem());
144
145 if(item) {
146 if(!dynamic_cast<KoDetailsPaneBase*>(m_widgetStack->widget(item->widgetIndex()))) {
147 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
148 cfgGrp.writeEntry("LastReturnType", "Custom");
149 }
150 }
151
152 delete d;
153}
154
155void KoOpenPane::showOpenFileDialog()
156{
158 KoFilterManager::Import, KoDocument::readExtraNativeMimeTypes());
159
160 KURL url = KFileDialog::getOpenURL(":OpenDialog", mimeFilter.join(" "), this);
161
162 if(!url.isEmpty()) {
163 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
164 cfgGrp.writeEntry("LastReturnType", "File");
165 emit openExistingFile(url.url());
166 }
167}
168
169void KoOpenPane::initRecentDocs()
170{
171 KoRecentDocumentsPane* recentDocPane = new KoRecentDocumentsPane(this, d->m_instance);
172 connect(recentDocPane, TQ_SIGNAL(openFile(const TQString&)), this, TQ_SIGNAL(openExistingFile(const TQString&)));
173 TQListViewItem* item = addPane(i18n("Recent Documents"), "document-open", recentDocPane, 0);
174 connect(recentDocPane, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)),
175 this, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)));
176 connect(this, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)),
177 recentDocPane, TQ_SLOT(resizeSplitter(KoDetailsPaneBase*, const TQValueList<int>&)));
178
179 KoSectionListItem* separator = new KoSectionListItem(m_sectionList, "", 1);
180 separator->setEnabled(false);
181
182 if(d->m_instance->config()->hasGroup("RecentFiles")) {
183 m_sectionList->setSelected(item, true);
184 }
185}
186
187void KoOpenPane::initTemplates(const TQString& templateType)
188{
189 TQListViewItem* selectItem = 0;
190 TQListViewItem* firstItem = 0;
191 const int templateOffset = 1000;
192
193 if(!templateType.isEmpty())
194 {
195 KoTemplateTree templateTree(templateType.local8Bit(), d->m_instance, true);
196
197 for (KoTemplateGroup *group = templateTree.first(); group != 0L; group = templateTree.next()) {
198 if (group->isHidden()) {
199 continue;
200 }
201
202 KoTemplatesPane* pane = new KoTemplatesPane(this, d->m_instance,
203 group, templateTree.defaultTemplate());
204 connect(pane, TQ_SIGNAL(openTemplate(const TQString&)), this, TQ_SIGNAL(openTemplate(const TQString&)));
205 connect(pane, TQ_SIGNAL(alwaysUseChanged(KoTemplatesPane*, const TQString&)),
206 this, TQ_SIGNAL(alwaysUseChanged(KoTemplatesPane*, const TQString&)));
207 connect(this, TQ_SIGNAL(alwaysUseChanged(KoTemplatesPane*, const TQString&)),
208 pane, TQ_SLOT(changeAlwaysUseTemplate(KoTemplatesPane*, const TQString&)));
209 connect(pane, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)),
210 this, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)));
211 connect(this, TQ_SIGNAL(splitterResized(KoDetailsPaneBase*, const TQValueList<int>&)),
212 pane, TQ_SLOT(resizeSplitter(KoDetailsPaneBase*, const TQValueList<int>&)));
213 TQListViewItem* item = addPane(group->name(), group->first()->loadPicture(d->m_instance),
214 pane, group->sortingWeight() + templateOffset);
215
216 if(!firstItem) {
217 firstItem = item;
218 }
219
220 if(group == templateTree.defaultGroup()) {
221 firstItem = item;
222 }
223
224 if(pane->isSelected()) {
225 selectItem = item;
226 }
227 }
228 } else {
229 firstItem = m_sectionList->firstChild();
230 }
231
232 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
233
234 if(selectItem && (cfgGrp.readEntry("LastReturnType") == "Template")) {
235 m_sectionList->setSelected(selectItem, true);
236 } else if(!m_sectionList->selectedItem() && firstItem) {
237 m_sectionList->setSelected(firstItem, true);
238 }
239}
240
241void KoOpenPane::setCustomDocumentWidget(TQWidget *widget) {
242 Q_ASSERT(widget);
243 KoSectionListItem* separator = new KoSectionListItem(m_sectionList, "", INT_MAX-1);
244 separator->setEnabled(false);
245
246 TQListViewItem* item = addPane(i18n("Custom Document"), TQString(), widget, INT_MAX);
247
248 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
249
250 if(cfgGrp.readEntry("LastReturnType") == "Custom") {
251 m_sectionList->setSelected(item, true);
252 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(item);
253 m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
254 }
255}
256
257TQListViewItem* KoOpenPane::addPane(const TQString& title, const TQString& icon, TQWidget* widget, int sortWeight)
258{
259 return addPane(title, SmallIcon(icon, TDEIcon::SizeLarge, TDEIcon::DefaultState, d->m_instance),
260 widget, sortWeight);
261}
262
263TQListViewItem* KoOpenPane::addPane(const TQString& title, const TQPixmap& icon, TQWidget* widget, int sortWeight)
264{
265 if(!widget) {
266 return 0;
267 }
268
269 int id = m_widgetStack->addWidget(widget);
270 KoSectionListItem* listItem = new KoSectionListItem(m_sectionList, title, sortWeight, id);
271
272 if(!icon.isNull()) {
273 TQImage image = icon.convertToImage();
274
275 if((image.width() > 48) || (image.height() > 48)) {
276 image = image.smoothScale(48, 48, TQImage::ScaleMin);
277 }
278
279 image.setAlphaBuffer(true);
280 image = image.copy((image.width() - 48) / 2, (image.height() - 48) / 2, 48, 48);
281 listItem->setPixmap(0, TQPixmap(image));
282 }
283
284 return listItem;
285}
286
287void KoOpenPane::selectionChanged(TQListViewItem* item)
288{
289 KoSectionListItem* section = dynamic_cast<KoSectionListItem*>(item);
290
291 if(!item)
292 return;
293
294 m_headerLabel->setText(section->text(0));
295 m_widgetStack->raiseWidget(section->widgetIndex());
296}
297
298void KoOpenPane::saveSplitterSizes(KoDetailsPaneBase* /*sender*/, const TQValueList<int>& sizes)
299{
300 TDEConfigGroup cfgGrp(d->m_instance->config(), "TemplateChooserDialog");
301 cfgGrp.writeEntry("DetailsPaneSplitterSizes", sizes);
302}
303
304void KoOpenPane::itemClicked(TQListViewItem* item)
305{
306 KoSectionListItem* selectedItem = static_cast<KoSectionListItem*>(item);
307
308 if(selectedItem) {
309 m_widgetStack->widget(selectedItem->widgetIndex())->setFocus();
310 }
311}
312
313#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.
bool isSelected()
Returns true if a template in this group was the last one selected.
const char * name(StdAction id)