KDevelop API Documentation

bookmarkview.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2004 by Alexander Dymo                                  *
00003  *   cloudtemple@mksat.net                                                 *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
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 */*part*/)
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 //class BookmarkView
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 /*            dlg.nameEdit->setText(title);
00240             dlg.locationEdit->setURL(url);*/
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 */*e*/)
00277 {
00278     m_view->setFocus();
00279 }
00280 
00281 #include "bookmarkview.moc"
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 00:03:55 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003