00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "bookmarkview.h"
00021
00022 #include <qlayout.h>
00023 #include <qheader.h>
00024 #include <qlineedit.h>
00025 #include <qpoint.h>
00026
00027 #include <kstddirs.h>
00028 #include <klocale.h>
00029 #include <kdialog.h>
00030 #include <kpushbutton.h>
00031 #include <kurlrequester.h>
00032 #include <kpopupmenu.h>
00033 #include <kparts/part.h>
00034 #include <khtml_part.h>
00035 #include <dom/html_document.h>
00036
00037 #include <kdevpartcontroller.h>
00038 #include <kdevdocumentationplugin.h>
00039
00040 #include "documentation_part.h"
00041 #include "documentation_widget.h"
00042 #include "editbookmarkdlg.h"
00043 #include "docutils.h"
00044
00045 DocBookmarkManager::DocBookmarkManager(DocumentationPart *)
00046 :KBookmarkManager(locateLocal("data",
00047 "kdevdocumentation/bookmarks/bookmarks.xml"), false)
00048 {
00049 setEditorOptions(i18n("Documentation"), false);
00050 }
00051
00052 DocBookmarkOwner::DocBookmarkOwner(DocumentationPart *part)
00053 :KBookmarkOwner(), m_part(part)
00054 {
00055 }
00056
00057 void DocBookmarkOwner::openBookmarkURL(const QString &_url)
00058 {
00059 m_part->partController()->showDocument(KURL(_url));
00060 }
00061
00062 QString DocBookmarkOwner::currentURL() const
00063 {
00064 KParts::ReadOnlyPart *activePart = dynamic_cast<KParts::ReadOnlyPart*>(m_part->partController()->activePart());
00065 if (activePart)
00066 return activePart->url().url();
00067 else
00068 return QString::null;
00069 }
00070
00071 QString DocBookmarkOwner::currentTitle() const
00072 {
00073 KParts::ReadOnlyPart *activePart = dynamic_cast<KParts::ReadOnlyPart*>(m_part->partController()->activePart());
00074 if (activePart)
00075 {
00076 KHTMLPart *htmlPart = dynamic_cast<KHTMLPart*>(activePart);
00077 if (htmlPart)
00078 return htmlPart->htmlDocument().title().string();
00079 return activePart->url().prettyURL();
00080 }
00081 else
00082 return QString::null;
00083 }
00084
00085 class DocBookmarkItem: public DocumentationItem {
00086 public:
00087 DocBookmarkItem(Type type, KListView *parent, const QString &name)
00088 :DocumentationItem(type, parent, name)
00089 {
00090 }
00091 DocBookmarkItem(Type type, KListView *parent, DocumentationItem *after, const QString &name)
00092 :DocumentationItem(type, parent, after, name)
00093 {
00094 }
00095 DocBookmarkItem(Type type, DocumentationItem *parent, const QString &name)
00096 :DocumentationItem(type, parent, name)
00097 {
00098 }
00099 void setBookmark(const KBookmark &bm) { m_bm = bm; }
00100 KBookmark bookmark() const { return m_bm; }
00101
00102 private:
00103 KBookmark m_bm;
00104 };
00105
00106
00107
00108
00109
00110 BookmarkView::BookmarkView(DocumentationWidget *parent, const char *name)
00111 :QWidget(parent, name), m_widget(parent)
00112 {
00113 m_bmManager = new DocBookmarkManager(m_widget->part());
00114 m_bmOwner = new DocBookmarkOwner(m_widget->part());
00115
00116 QVBoxLayout *l = new QVBoxLayout(this, 0, KDialog::spacingHint());
00117 m_view = new KListView(this);
00118 m_view->addColumn(i18n("Title"));
00119 m_view->setSorting(-1);
00120 m_view->header()->hide();
00121 m_view->setResizeMode(QListView::AllColumns);
00122 l->addWidget(m_view);
00123 QHBoxLayout *l2 = new QHBoxLayout(l, KDialog::spacingHint());
00124 m_addButton = new KPushButton(i18n("Add"), this);
00125 m_editButton = new KPushButton(i18n("Edit"), this);
00126 m_removeButton = new KPushButton(i18n("Remove"), this);
00127 l2->addWidget(m_addButton);
00128 l2->addWidget(m_editButton);
00129 l2->addWidget(m_removeButton);
00130 l2->addItem(new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Fixed));
00131 l->addSpacing(2);
00132
00133 showBookmarks();
00134
00135 connect(m_view, SIGNAL(executed(QListViewItem*, const QPoint&, int )),
00136 this, SLOT(itemExecuted(QListViewItem*, const QPoint&, int )));
00137 connect(m_addButton, SIGNAL(pressed()), this, SLOT(addBookmark()));
00138 connect(m_editButton, SIGNAL(clicked()), this, SLOT(editBookmark()));
00139 connect(m_removeButton, SIGNAL(clicked()), this, SLOT(removeBookmark()));
00140
00141 connect(m_widget->part(), SIGNAL(bookmarkLocation(const QString&, const KURL& )),
00142 this, SLOT(addBookmark(const QString&, const KURL& )));
00143 connect(m_view, SIGNAL(mouseButtonPressed(int, QListViewItem*, const QPoint&, int )),
00144 this, SLOT(itemMouseButtonPressed(int, QListViewItem*, const QPoint&, int )));
00145 }
00146
00147 BookmarkView::~BookmarkView()
00148 {
00149 delete m_bmManager;
00150 delete m_bmOwner;
00151 }
00152
00153 void BookmarkView::showBookmarks()
00154 {
00155 const KBookmarkGroup &group = m_bmManager->root();
00156 DocBookmarkItem *item = 0;
00157 for (KBookmark bm = group.first(); !bm.isNull(); bm = group.next(bm))
00158 {
00159 if (item == 0)
00160 item = new DocBookmarkItem(DocumentationItem::Document, m_view, bm.fullText());
00161 else
00162 item = new DocBookmarkItem(DocumentationItem::Document, m_view, item, bm.fullText());
00163 item->setURL(bm.url());
00164 item->setBookmark(bm);
00165 }
00166 }
00167
00168 void BookmarkView::itemExecuted(QListViewItem *item, const QPoint &p, int col)
00169 {
00170 DocumentationItem *docItem = dynamic_cast<DocumentationItem*>(item);
00171 if (!docItem)
00172 return;
00173 m_widget->part()->partController()->showDocument(docItem->url());
00174 }
00175
00176 void BookmarkView::removeBookmark()
00177 {
00178 if (!m_view->currentItem())
00179 return;
00180 DocBookmarkItem *item = dynamic_cast<DocBookmarkItem*>(m_view->currentItem());
00181 m_bmManager->root().deleteBookmark(item->bookmark());
00182 m_bmManager->save();
00183 delete item;
00184 }
00185
00186 void BookmarkView::editBookmark()
00187 {
00188 if (!m_view->currentItem())
00189 return;
00190 DocBookmarkItem *item = dynamic_cast<DocBookmarkItem*>(m_view->currentItem());
00191 if (!item)
00192 return;
00193
00194 EditBookmarkDlg dlg(this);
00195 dlg.setCaption(i18n("Edit Bookmark"));
00196 dlg.nameEdit->setText(item->bookmark().fullText());
00197 dlg.locationEdit->setURL(item->bookmark().url().url());
00198 dlg.nameEdit->setFocus();
00199 if (dlg.exec())
00200 {
00201 item->bookmark().internalElement().namedItem("title").firstChild().toText().setData(dlg.nameEdit->text());
00202 item->bookmark().internalElement().setAttribute("href", KURL(dlg.locationEdit->url()).url());
00203 m_bmManager->save();
00204
00205 item->setText(0, item->bookmark().fullText());
00206 item->setURL(item->bookmark().url());
00207 }
00208 }
00209
00210 void BookmarkView::addBookmark()
00211 {
00212 QString title = m_bmOwner->currentTitle();
00213 QString url = m_bmOwner->currentURL();
00214
00215 KPopupMenu menu;
00216 bool useMenu = false;
00217 if (!title.isEmpty() && !url.isEmpty())
00218 {
00219 menu.insertItem(i18n("Current Document"), 1);
00220 menu.insertItem(i18n("Custom..."), 2);
00221 useMenu = true;
00222 }
00223 int mode = 2;
00224 if (useMenu)
00225 {
00226 m_addButton->setDown(true);
00227 mode = menu.exec(mapToGlobal(QPoint(m_addButton->x(), m_addButton->y()+m_addButton->height())));
00228 m_addButton->setDown(false);
00229 }
00230
00231 switch (mode)
00232 {
00233 case 1:
00234 addBookmark(title, url);
00235 break;
00236 case 2:
00237 EditBookmarkDlg dlg(this);
00238 dlg.setCaption(i18n("Add Bookmark"));
00239
00240
00241 dlg.nameEdit->setFocus();
00242 if (dlg.exec())
00243 addBookmark(dlg.nameEdit->text(), KURL(dlg.locationEdit->url()));
00244 m_addButton->setDown(false);
00245 break;
00246 }
00247 }
00248
00249 void BookmarkView::addBookmark(const QString &title, const KURL &url)
00250 {
00251 KBookmark bm = m_bmManager->root().addBookmark(m_bmManager, title, url);
00252 m_bmManager->save();
00253
00254 DocBookmarkItem *item = 0;
00255 if (m_view->lastItem())
00256 item = dynamic_cast<DocBookmarkItem*>(m_view->lastItem());
00257 if (item == 0)
00258 item = new DocBookmarkItem(DocumentationItem::Document, m_view, bm.fullText());
00259 else
00260 item = new DocBookmarkItem(DocumentationItem::Document, m_view, item, bm.fullText());
00261 item->setURL(bm.url());
00262 item->setBookmark(bm);
00263 }
00264
00265 void BookmarkView::itemMouseButtonPressed(int button, QListViewItem *item, const QPoint &pos, int c)
00266 {
00267 if ((button != Qt::RightButton) || (!item))
00268 return;
00269 DocumentationItem *docItem = dynamic_cast<DocumentationItem*>(item);
00270 if (!docItem)
00271 return;
00272
00273 DocUtils::docItemPopup(m_widget->part(), docItem, pos, false, true);
00274 }
00275
00276 void BookmarkView::focusInEvent(QFocusEvent *)
00277 {
00278 m_view->setFocus();
00279 }
00280
00281 #include "bookmarkview.moc"