1 /***************************************************************************
2 * Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at> *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
9 * This program 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 *
12 * GNU General Public License for more details. *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
18 ***************************************************************************/
20 #include "bookmarkssidebarpage.h"
22 #include <q3listbox.h>
27 #include <Q3VBoxLayout>
28 #include <QPaintEvent>
32 #include <kbookmark.h>
33 #include <kbookmarkmanager.h>
34 #include <kmessagebox.h>
35 #include <kiconloader.h>
38 #include "dolphinsettings.h"
39 #include "editbookmarkdialog.h"
41 BookmarksSidebarPage::BookmarksSidebarPage(QWidget
* parent
) :
44 Q3VBoxLayout
* layout
= new Q3VBoxLayout(this);
45 m_bookmarksList
= new BookmarksListBox(this);
46 m_bookmarksList
->setPaletteBackgroundColor(palette().brush(QPalette::Background
).color());
48 layout
->addWidget(m_bookmarksList
);
49 connect(m_bookmarksList
, SIGNAL(mouseButtonClicked(int, Q3ListBoxItem
*, const QPoint
&)),
50 this, SLOT(slotMouseButtonClicked(int, Q3ListBoxItem
*)));
51 connect(m_bookmarksList
, SIGNAL(contextMenuRequested(Q3ListBoxItem
*, const QPoint
&)),
52 this, SLOT(slotContextMenuRequested(Q3ListBoxItem
*, const QPoint
&)));
54 KBookmarkManager
* manager
= DolphinSettings::instance().bookmarkManager();
55 connect(manager
, SIGNAL(changed(const QString
&, const QString
&)),
56 this, SLOT(updateBookmarks()));
61 BookmarksSidebarPage::~BookmarksSidebarPage()
65 void BookmarksSidebarPage::setUrl(const KUrl
& url
)
67 if (!m_url
.equals(url
, KUrl::CompareWithoutTrailingSlash
)) {
69 adjustSelection(m_url
);
73 void BookmarksSidebarPage::updateBookmarks()
75 m_bookmarksList
->clear();
77 KIconLoader iconLoader
;
79 KBookmarkGroup root
= DolphinSettings::instance().bookmarkManager()->root();
80 KBookmark bookmark
= root
.first();
81 while (!bookmark
.isNull()) {
82 QPixmap
icon(iconLoader
.loadIcon(bookmark
.icon(),
85 BookmarkItem
* item
= new BookmarkItem(icon
, bookmark
.text());
86 m_bookmarksList
->insertItem(item
);
88 bookmark
= root
.next(bookmark
);
92 void BookmarksSidebarPage::slotMouseButtonClicked(int button
, Q3ListBoxItem
* item
)
94 if ((button
!= Qt::LeftButton
) || (item
== 0)) {
98 const int index
= m_bookmarksList
->index(item
);
99 KBookmark bookmark
= DolphinSettings::instance().bookmark(index
);
100 emit
changeUrl(bookmark
.url());
103 void BookmarksSidebarPage::slotContextMenuRequested(Q3ListBoxItem
* item
,
106 const int insertID
= 1;
107 const int editID
= 2;
108 const int deleteID
= 3;
111 KMenu
* popup
= new KMenu();
113 QAction
*action
= popup
->addAction(SmallIcon("document-new"), i18n("Add Bookmark..."));
114 action
->setData(addID
);
117 QAction
*action
= popup
->addAction(SmallIcon("document-new"), i18n("Insert Bookmark..."));
118 action
->setData(insertID
);
119 action
= popup
->addAction(SmallIcon("edit"), i18n("Edit..."));
120 action
->setData(editID
);
121 action
= popup
->addAction(SmallIcon("edit-delete"), i18n("Delete"));
122 action
->setData(deleteID
);
126 KBookmarkManager
* manager
= DolphinSettings::instance().bookmarkManager();
127 KBookmarkGroup root
= manager
->root();
128 const int index
= m_bookmarksList
->index(m_bookmarksList
->selectedItem());
129 QAction
*result
= popup
->exec(pos
);
132 switch(result
->data().toInt()) {
134 KBookmark newBookmark
= EditBookmarkDialog::getBookmark(i18n("Insert Bookmark"),
138 if (!newBookmark
.isNull()) {
139 root
.addBookmark(manager
, newBookmark
);
141 KBookmark prevBookmark
= DolphinSettings::instance().bookmark(index
- 1);
142 root
.moveItem(newBookmark
, prevBookmark
);
145 // insert bookmark at first position (is a little bit tricky as KBookmarkGroup
146 // only allows to move items after existing items)
147 KBookmark firstBookmark
= root
.first();
148 root
.moveItem(newBookmark
, firstBookmark
);
149 root
.moveItem(firstBookmark
, newBookmark
);
151 manager
->emitChanged(root
);
157 KBookmark oldBookmark
= DolphinSettings::instance().bookmark(index
);
158 KBookmark newBookmark
= EditBookmarkDialog::getBookmark(i18n("Edit Bookmark"),
162 if (!newBookmark
.isNull()) {
163 root
.addBookmark(manager
, newBookmark
);
164 root
.moveItem(newBookmark
, oldBookmark
);
165 root
.deleteBookmark(oldBookmark
);
166 manager
->emitChanged(root
);
172 KBookmark bookmark
= DolphinSettings::instance().bookmark(index
);
173 root
.deleteBookmark(bookmark
);
174 manager
->emitChanged(root
);
179 KBookmark bookmark
= EditBookmarkDialog::getBookmark(i18n("Add Bookmark"),
183 if (!bookmark
.isNull()) {
184 root
.addBookmark(manager
, bookmark
);
185 manager
->emitChanged(root
);
197 void BookmarksSidebarPage::adjustSelection(const KUrl
& url
)
199 // TODO (remarked in dolphin/TODO): the following code is quite equal
200 // to BookmarkSelector::updateSelection().
202 KBookmarkGroup root
= DolphinSettings::instance().bookmarkManager()->root();
203 KBookmark bookmark
= root
.first();
206 int selectedIndex
= -1;
208 // Search the bookmark which is equal to the Url or at least is a parent Url.
209 // If there are more than one possible parent Url candidates, choose the bookmark
210 // which covers the bigger range of the Url.
212 while (!bookmark
.isNull()) {
213 const KUrl bookmarkUrl
= bookmark
.url();
214 if (bookmarkUrl
.isParentOf(url
)) {
215 const int length
= bookmarkUrl
.prettyUrl().length();
216 if (length
> maxLength
) {
221 bookmark
= root
.next(bookmark
);
225 const bool block
= m_bookmarksList
->signalsBlocked();
226 m_bookmarksList
->blockSignals(true);
227 if (selectedIndex
< 0) {
228 // no bookmark matches, hence deactivate any selection
229 const int currentIndex
= m_bookmarksList
->index(m_bookmarksList
->selectedItem());
230 m_bookmarksList
->setSelected(currentIndex
, false);
233 // select the bookmark which is part of the current Url
234 m_bookmarksList
->setSelected(selectedIndex
, true);
236 m_bookmarksList
->blockSignals(block
);
239 BookmarksListBox::BookmarksListBox(QWidget
* parent
) :
243 BookmarksListBox::~BookmarksListBox()
247 void BookmarksListBox::paintEvent(QPaintEvent
* /* event */)
249 // don't invoke QListBox::paintEvent(event) to prevent
250 // that any kind of frame is drawn
253 BookmarkItem::BookmarkItem(const QPixmap
& pixmap
, const QString
& text
) :
254 Q3ListBoxPixmap(pixmap
, text
)
258 BookmarkItem::~BookmarkItem()
262 int BookmarkItem::height(const Q3ListBox
* listBox
) const
264 return Q3ListBoxPixmap::height(listBox
) + 8;
267 #include "bookmarkssidebarpage.moc"