1 /* This file is part of the KDE project
2   Copyright (C) 2007, 2012 Dag Andersen <danders@get2net.dk>
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 
21 // clazy:excludeall=qstring-arg
22 #include "kptitemviewsettup.h"
23 #include "kptitemmodelbase.h"
24 #include "kptviewbase.h"
25 #include "kptdebug.h"
26 
27 #include "KoPageLayoutWidget.h"
28 
29 #include <QHeaderView>
30 #include <QPushButton>
31 
32 namespace KPlato
33 {
34 
Item(int column,const QString & text)35 ItemViewSettup::Item::Item(int column, const QString &text)
36     : QListWidgetItem(text),
37     m_column(column)
38 {
39 }
40 
column() const41 int ItemViewSettup::Item::column() const
42 {
43     return m_column;
44 }
45 
operator <(const QListWidgetItem & other) const46 bool ItemViewSettup::Item::operator<(const QListWidgetItem & other) const
47 {
48     return m_column < static_cast<const Item&>(other).column();
49 }
50 
51 //--------------------------
ItemViewSettup(TreeViewBase * view,bool includeColumn0,QWidget * parent)52 ItemViewSettup::ItemViewSettup(TreeViewBase *view, bool includeColumn0, QWidget *parent)
53     : QWidget(parent),
54     m_view(view),
55     m_includeColumn0(includeColumn0)
56 {
57     setupUi(this);
58 
59     stretchLastSection->setChecked(view->header()->stretchLastSection());
60 
61     QAbstractItemModel *model = view->model();
62 
63     QMap<int, Item*> map;
64     int c = includeColumn0 ? 0 : 1;
65     debugPlan<<includeColumn0<<c;
66     for (; c < model->columnCount(); ++c) {
67         Item *item = new Item(c, model->headerData(c, Qt::Horizontal).toString());
68         item->setToolTip(model->headerData(c, Qt::Horizontal, Qt::ToolTipRole).toString());
69         if (view->isColumnHidden(c)) {
70             selector->availableListWidget()->addItem(item);
71         } else {
72             map.insert(view->section(c), item);
73         }
74     }
75     foreach(Item *i, map) {
76         selector->selectedListWidget()->addItem(i);
77     }
78 
79     connect(stretchLastSection, &QCheckBox::stateChanged, this, &ItemViewSettup::slotChanged);
80 
81     connect(selector, &KActionSelector::added, this, &ItemViewSettup::slotChanged);
82     connect(selector, &KActionSelector::removed, this, &ItemViewSettup::slotChanged);
83     connect(selector, &KActionSelector::movedUp, this, &ItemViewSettup::slotChanged);
84     connect(selector, &KActionSelector::movedDown, this, &ItemViewSettup::slotChanged);
85 
86 }
87 
slotChanged()88 void ItemViewSettup::slotChanged()
89 {
90     emit enableButtonOk(true);
91 }
92 
slotOk()93 void ItemViewSettup::slotOk()
94 {
95     debugPlan;
96     QListWidget *lst = selector->availableListWidget();
97     for (int r = 0; r < lst->count(); ++r) {
98         int c = static_cast<Item*>(lst->item(r))->column();
99         m_view->hideColumn(c);
100     }
101     lst = selector->selectedListWidget();
102     for (int r = 0; r < lst->count(); ++r) {
103         int c = static_cast<Item*>(lst->item(r))->column();
104         m_view->mapToSection(c, r);
105         m_view->showColumn(c);
106     }
107     m_view->setStretchLastSection(stretchLastSection->isChecked());
108 }
109 
setDefault()110 void ItemViewSettup::setDefault()
111 {
112     debugPlan;
113     selector->availableListWidget()->clear();
114     selector->selectedListWidget()->clear();
115     QAbstractItemModel *model = m_view->model();
116     int c = m_includeColumn0 ? 0 : 1;
117     QList<int> def = m_view->defaultColumns();
118     for (; c < model->columnCount(); ++c) {
119         if (! def.contains(c)) {
120             Item *item = new Item(c, model->headerData(c, Qt::Horizontal).toString());
121             item->setToolTip(model->headerData(c, Qt::Horizontal, Qt::ToolTipRole).toString());
122             selector->availableListWidget()->addItem(item);
123         }
124     }
125     foreach (int i, def) {
126         Item *item = new Item(i, model->headerData(i, Qt::Horizontal).toString());
127         item->setToolTip(model->headerData(i, Qt::Horizontal, Qt::ToolTipRole).toString());
128         selector->selectedListWidget()->addItem(item);
129     }
130 }
131 
132 
133 //---------------------------
ItemViewSettupDialog(ViewBase * view,TreeViewBase * treeview,bool includeColumn0,QWidget * parent)134 ItemViewSettupDialog::ItemViewSettupDialog(ViewBase *view, TreeViewBase *treeview, bool includeColumn0, QWidget *parent)
135     : KPageDialog(parent),
136     m_view(view),
137     m_treeview(treeview),
138     m_pagelayout(0),
139     m_headerfooter(0)
140 {
141     setWindowTitle(i18n("View Settings"));
142     setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::RestoreDefaults);
143     button(QDialogButtonBox::Ok)->setDefault(true);
144 
145     button(QDialogButtonBox::RestoreDefaults)->setEnabled(! treeview->defaultColumns().isEmpty());
146 
147     m_panel = new ItemViewSettup(treeview, includeColumn0);
148     KPageWidgetItem *page = new KPageWidgetItem(m_panel, i18n("Tree View"));
149     page->setHeader(i18n("Tree View Column Configuration"));
150     addPage(page);
151     m_pageList.append(page);
152 
153     connect(this, &QDialog::accepted, this, &ItemViewSettupDialog::slotOk);
154     connect(this, &QDialog::accepted, m_panel, &ItemViewSettup::slotOk);
155     connect(button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, m_panel, &ItemViewSettup::setDefault);
156 }
157 
slotOk()158 void ItemViewSettupDialog::slotOk()
159 {
160     debugPlan<<m_view<<m_pagelayout<<m_headerfooter;
161     if (! m_view) {
162         return;
163     }
164     if (m_pagelayout) {
165         m_view->setPageLayout(m_pagelayout->pageLayout());
166     }
167     if (m_headerfooter) {
168         m_view->setPrintingOptions(m_headerfooter->options());
169     }
170 }
171 
insertWidget(int index,QWidget * widget,const QString & name,const QString & header)172 KPageWidgetItem *ItemViewSettupDialog::insertWidget(int index, QWidget *widget, const QString &name, const QString &header)
173 {
174     KPageWidgetItem *before = m_pageList.value(index);
175     KPageWidgetItem *page = new KPageWidgetItem(widget, name);
176     page->setHeader(header);
177     if (before) {
178         insertPage(before, page);
179         m_pageList.insert(index, page);
180     } else {
181         addPage(page);
182         m_pageList.append(page);
183     }
184     return page;
185 }
186 
addPrintingOptions(bool setAsCurrent)187 void ItemViewSettupDialog::addPrintingOptions(bool setAsCurrent)
188 {
189     if (! m_view) {
190         return;
191     }
192     QTabWidget *tab = new QTabWidget();
193     QWidget *w = ViewBase::createPageLayoutWidget(m_view);
194     tab->addTab(w, w->windowTitle());
195     m_pagelayout = w->findChild<KoPageLayoutWidget*>();
196     Q_ASSERT(m_pagelayout);
197 
198     m_headerfooter = ViewBase::createHeaderFooterWidget(m_view);
199     tab->addTab(m_headerfooter, m_headerfooter->windowTitle());
200 
201     KPageWidgetItem *itm = insertWidget(-1, tab, i18n("Printing"), i18n("Printing Options"));
202     if (setAsCurrent) {
203         setCurrentPage(itm);
204     }
205 }
206 
207 //-------------------------------
SplitItemViewSettupDialog(ViewBase * view,DoubleTreeViewBase * treeview,QWidget * parent)208 SplitItemViewSettupDialog::SplitItemViewSettupDialog(ViewBase *view, DoubleTreeViewBase *treeview, QWidget *parent)
209     : KPageDialog(parent),
210     m_view(view),
211     m_treeview(treeview),
212     m_pagelayout(0),
213     m_headerfooter(0)
214 {
215     setWindowTitle(i18n("View Settings"));
216     setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::RestoreDefaults);
217     button(QDialogButtonBox::Ok)->setDefault(true);
218 
219     bool nodef = treeview->masterView()->defaultColumns().isEmpty() || treeview->slaveView()->defaultColumns().isEmpty();
220     button(QDialogButtonBox::Ok)->setEnabled(! nodef);
221 
222     m_page1 = new ItemViewSettup(treeview->masterView(), true);
223     KPageWidgetItem *page = new KPageWidgetItem(m_page1, i18n("Main View"));
224     page->setHeader(i18n("Main View Column Configuration"));
225     addPage(page);
226     m_pageList.append(page);
227 
228     m_page2 = new ItemViewSettup(treeview->slaveView(), true);
229     page = new KPageWidgetItem(m_page2, i18n("Auxiliary View"));
230     page->setHeader(i18n("Auxiliary View Column Configuration"));
231     addPage(page);
232     m_pageList.append(page);
233 
234     //connect(m_page1, SIGNAL(enableButtonOk(bool)), this, SLOT(enableButtonOk(bool)));
235     //connect(m_page2, SIGNAL(enableButtonOk(bool)), this, SLOT(enableButtonOk(bool)));
236 
237     connect(this, &QDialog::accepted, this, &SplitItemViewSettupDialog::slotOk);
238     connect(this, &QDialog::accepted, m_page1, &ItemViewSettup::slotOk);
239     connect(this, &QDialog::accepted, m_page2, &ItemViewSettup::slotOk);
240     connect(button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, m_page1, &ItemViewSettup::setDefault);
241     connect(button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, m_page2, &ItemViewSettup::setDefault);
242 }
243 
slotOk()244 void SplitItemViewSettupDialog::slotOk()
245 {
246     debugPlan;
247     if (! m_view) {
248         return;
249     }
250     m_view->setPageLayout(m_pagelayout->pageLayout());
251     m_view->setPrintingOptions(m_headerfooter->options());
252 }
253 
insertWidget(int index,QWidget * widget,const QString & name,const QString & header)254 KPageWidgetItem *SplitItemViewSettupDialog::insertWidget(int index, QWidget *widget, const QString &name, const QString &header)
255 {
256     KPageWidgetItem *before = m_pageList.value(index);
257     KPageWidgetItem *page = new KPageWidgetItem(widget, name);
258     page->setHeader(header);
259     if (before) {
260         insertPage(before, page);
261         m_pageList.insert(index, page);
262     } else {
263         addPage(page);
264         m_pageList.append(page);
265     }
266     return page;
267 }
268 
addPrintingOptions(bool setAsCurrent)269 void SplitItemViewSettupDialog::addPrintingOptions(bool setAsCurrent)
270 {
271     if (! m_view) {
272         return;
273     }
274     QTabWidget *tab = new QTabWidget();
275     QWidget *w = ViewBase::createPageLayoutWidget(m_view);
276     tab->addTab(w, w->windowTitle());
277     m_pagelayout = w->findChild<KoPageLayoutWidget*>();
278     Q_ASSERT(m_pagelayout);
279     m_pagelayout->setPageLayout(m_view->pageLayout());
280 
281     m_headerfooter = ViewBase::createHeaderFooterWidget(m_view);
282     tab->addTab(m_headerfooter, m_headerfooter->windowTitle());
283     m_headerfooter->setOptions(m_view->printingOptions());
284 
285     KPageWidgetItem *itm = insertWidget(-1, tab, i18n("Printing"), i18n("Printing Options"));
286     if (setAsCurrent) {
287         setCurrentPage(itm);
288     }
289 }
290 
291 } //namespace KPlato
292