last minute string fixes
[rekonq:nikhilms-mainline.git] / src / history / historypanel.cpp
1 /* ============================================================
2 *
3 * This file is a part of the rekonq project
4 *
5 * Copyright (C) 2009 by Domrachev Alexandr <alexandr.domrachev@gmail.com>
6 * Copyright (C) 2009-2010 by Andrea Diamantini <adjam7 at gmail dot com>
7 *
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2 of
12 * the License or (at your option) version 3 or any later version
13 * accepted by the membership of KDE e.V. (or its successor approved
14 * by the membership of KDE e.V.), which shall act as a proxy
15 * defined in Section 14 of version 3 of the license.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
24 *
25 * ============================================================ */
26
27
28 // Self Includes
29 #include "historypanel.h"
30 #include "historypanel.moc"
31
32 // Auto Includes
33 #include "rekonq.h"
34
35 // Local Includes
36 #include "application.h"
37 #include "historymodels.h"
38
39 // Qt Includes
40 #include <QtGui/QLabel>
41 #include <QtGui/QHBoxLayout>
42 #include <QtGui/QHeaderView>
43 #include <QtGui/QTreeView>
44
45
46 // KDE Includes
47 #include <KLineEdit>
48 #include <KLocalizedString>
49 #include <KMenu>
50 #include <KAction>
51 #include <KMessageBox>
52
53
54 HistoryPanel::HistoryPanel(const QString &title, QWidget *parent, Qt::WindowFlags flags)
55         : QDockWidget(title, parent, flags)
56         , m_treeView(new PanelTreeView(this))
57 {
58     setup();
59     setShown(ReKonfig::showHistoryPanel());
60 }
61
62
63 HistoryPanel::~HistoryPanel()
64 {
65     // Save side panel's state
66     ReKonfig::setShowHistoryPanel(!isHidden());
67 }
68
69
70 void HistoryPanel::setup()
71 {
72     setObjectName("historyPanel");
73     setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
74
75     QWidget *ui = new QWidget(this);
76
77     m_treeView->setUniformRowHeights(true);
78     m_treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
79     m_treeView->setTextElideMode(Qt::ElideMiddle);
80     m_treeView->setAlternatingRowColors(true);
81     m_treeView->header()->hide();
82
83     // add search bar
84     QHBoxLayout *hBoxLayout = new QHBoxLayout;
85     hBoxLayout->setContentsMargins(5, 0, 0, 0);
86     QLabel *searchLabel = new QLabel(i18n("Search:"));
87     hBoxLayout->addWidget(searchLabel);
88     KLineEdit *search = new KLineEdit;
89     search->setClearButtonShown(true);
90     hBoxLayout->addWidget(search);
91     QWidget *searchBar = new QWidget;
92     searchBar->setLayout(hBoxLayout);
93
94     // setup layout
95     QVBoxLayout *vBoxLayout = new QVBoxLayout;
96     vBoxLayout->setContentsMargins(0, 0, 0, 0);
97     vBoxLayout->addWidget(searchBar);
98     vBoxLayout->addWidget(m_treeView);
99
100     // add it to the UI
101     ui->setLayout(vBoxLayout);
102     setWidget(ui);
103
104     //-
105     HistoryManager *historyManager = Application::historyManager();
106     QAbstractItemModel *model = historyManager->historyTreeModel();
107
108     TreeProxyModel *treeProxyModel = new TreeProxyModel(this);
109     treeProxyModel->setSourceModel(model);
110     m_treeView->setModel(treeProxyModel);
111     m_treeView->setExpanded(treeProxyModel->index(0, 0), true);
112     m_treeView->header()->hideSection(1);
113     QFontMetrics fm(font());
114     int header = fm.width( QL1C('m') ) * 40;
115     m_treeView->header()->resizeSection(0, header);
116
117     connect(search, SIGNAL(textChanged(QString)), treeProxyModel, SLOT(setFilterFixedString(QString)));
118     connect(m_treeView, SIGNAL(contextMenuItemRequested(const QPoint &)), this, SLOT(contextMenuItem(const QPoint &)));
119     connect(m_treeView, SIGNAL(contextMenuGroupRequested(const QPoint &)), this, SLOT(contextMenuGroup(const QPoint &)));
120 }
121
122
123 void HistoryPanel::contextMenuItem(const QPoint &pos)
124 {
125     KMenu menu;
126     KAction* action;
127
128     action = new KAction(KIcon("tab-new"), i18n("Open"), this);
129     connect(action, SIGNAL(triggered()), m_treeView, SLOT(openInCurrentTab()));
130     menu.addAction(action);
131
132     action = new KAction(KIcon("tab-new"), i18n("Open in New Tab"), this);
133     connect(action, SIGNAL(triggered()), m_treeView, SLOT(openInNewTab()));
134     menu.addAction(action);
135
136     action = new KAction(KIcon("window-new"), i18n("Open in New Window"), this);
137     connect(action, SIGNAL(triggered()), m_treeView, SLOT(openInNewWindow()));
138     menu.addAction(action);
139
140     action = new KAction(KIcon("edit-copy"), i18n("Copy Link Address"), this);
141     connect(action, SIGNAL(triggered()), m_treeView, SLOT(copyToClipboard()));
142     menu.addAction(action);
143
144     menu.exec(m_treeView->mapToGlobal(pos));
145 }
146
147
148 void HistoryPanel::contextMenuGroup(const QPoint &pos)
149 {
150     KMenu menu;
151     KAction* action;
152
153     action = new KAction(KIcon("tab-new"), i18n("Open Folder in Tabs"), this);
154     connect(action, SIGNAL(triggered()), this, SLOT(openAll()));
155     menu.addAction(action);
156
157     menu.exec(m_treeView->mapToGlobal(pos));
158 }
159
160
161 void HistoryPanel::openAll()
162 {
163     QModelIndex index = m_treeView->currentIndex();
164     if (!index.isValid())
165         return;
166
167     QList<KUrl> allChild;
168
169     for (int i = 0; i < index.model()->rowCount(index); i++)
170         allChild << qVariantValue<KUrl>(index.child(i, 0).data(Qt::UserRole));
171
172     if (allChild.length() > 8)
173     {
174         if (!(KMessageBox::warningContinueCancel(this,
175                 i18n("You are about to open %1 tabs.\nAre you sure?",
176                      QString::number(allChild.length()))) == KMessageBox::Continue)
177            )
178             return;
179     }
180
181     for (int i = 0; i < allChild.length(); i++)
182         emit openUrl(allChild.at(i).url(), Rekonq::SettingOpenTab);
183 }
184