00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <qdict.h>
00013 #include <qheader.h>
00014 #include <qtooltip.h>
00015 #include <qpair.h>
00016 #include <qstylesheet.h>
00017
00018 #include <kparts/part.h>
00019 #include <klibloader.h>
00020 #include <kurl.h>
00021 #include <kdebug.h>
00022 #include <kiconloader.h>
00023 #include <kpopupmenu.h>
00024 #include <klocale.h>
00025
00026 #include <kdevpartcontroller.h>
00027 #include <kdevcore.h>
00028
00029
00030 #include "bookmarks_part.h"
00031 #include "bookmarks_widget.h"
00032 #include "bookmarks_config.h"
00033
00034 namespace
00035 {
00036
00037
00038 static const char* const bookmark_xpm[]={
00039 "12 12 4 1",
00040 "b c #808080",
00041 "a c #000080",
00042 "# c #0000ff",
00043 ". c None",
00044 "........###.",
00045 ".......#...a",
00046 "......#.##.a",
00047 ".....#.#..aa",
00048 "....#.#...a.",
00049 "...#.#.a.a..",
00050 "..#.#.a.a...",
00051 ".#.#.a.a....",
00052 "#.#.a.a.....",
00053 "#.#a.a......",
00054 "#...a.......",
00055 ".aaa........"};
00056
00057 }
00058
00059 class BookmarkItem : public QListViewItem
00060 {
00061 public:
00062 BookmarkItem( QListView * parent, KURL const & url )
00063 : QListViewItem( parent, url.fileName() ),
00064 _url( url ), _line( -1 ), _isBookmark( false )
00065 {}
00066
00067 BookmarkItem( QListViewItem * parent, KURL const & url, QPair<int,QString> mark )
00068 : QListViewItem( parent, QString::number( mark.first +1 ).rightJustify( 5 ) ),
00069 _url( url ), _line( mark.first ), _isBookmark( true )
00070 {
00071 BookmarksWidget * lv = static_cast<BookmarksWidget*>( listView() );
00072 BookmarksConfig::CodeLineType codeline = lv->config()->codeline();
00073
00074 if ( codeline == BookmarksConfig::Never )
00075 {
00076 return;
00077 }
00078
00079 if ( codeline == BookmarksConfig::Token )
00080 {
00081 if ( mark.second.startsWith( lv->config()->token() ) )
00082 {
00083 setText( 0, text( 0 ) + " " + mark.second );
00084 }
00085 return;
00086 }
00087
00088 setText( 0, text( 0 ) + " " + mark.second );
00089 }
00090
00091 KURL url()
00092 {
00093 return _url;
00094 }
00095 int line()
00096 {
00097 return _line;
00098 }
00099
00100 QString tipText()
00101 {
00102 if ( _isBookmark )
00103 {
00104 BookmarksWidget * w = static_cast<BookmarksWidget*> ( listView() );
00105 QStringList list = w->getContext( _url, _line );
00106
00107 QString code = "<qt><table><tr><td><pre>";
00108 for ( uint i = 0; i < list.count(); i++)
00109 {
00110 QString temp = QStyleSheet::escape( list[i] );
00111
00112 if ( i == (list.count() / 2) )
00113 {
00114 temp = "<b>" + temp + "</b>";
00115 }
00116 code += temp + "\n";
00117 }
00118 code += "</pre></td></tr></table></qt>";
00119
00120 return code;
00121 }
00122 else
00123 {
00124 return _url.prettyURL();
00125 }
00126 }
00127
00128 bool isBookmark()
00129 {
00130 return _isBookmark;
00131 }
00132
00133 private:
00134 KURL _url;
00135 int _line;
00136 bool _isBookmark;
00137 QString _code;
00138
00139 };
00140
00141 BookmarksWidget::BookmarksWidget(BookmarksPart *part)
00142 : KListView(0, "bookmarks widget"), QToolTip( viewport() ),
00143 _part( part )
00144
00145 {
00146 addColumn( QString::null );
00147 header()->hide();
00148 setRootIsDecorated( true );
00149 setResizeMode( QListView::LastColumn );
00150
00151 connect( this, SIGNAL( executed( QListViewItem * ) ), this, SLOT( itemClicked( QListViewItem * ) ) );
00152 connect( this, SIGNAL( returnPressed( QListViewItem * ) ), this, SLOT( itemClicked( QListViewItem * ) ) );
00153 connect( this, SIGNAL( contextMenuRequested ( QListViewItem *, const QPoint & , int ) ),
00154 this, SLOT( popupMenu(QListViewItem *, const QPoint & , int ) ) );
00155 }
00156
00157
00158 BookmarksWidget::~BookmarksWidget()
00159 {}
00160
00161 void BookmarksWidget::maybeTip(const QPoint &p)
00162 {
00163
00164
00165 if ( ! _part->config()->toolTip() ) return;
00166
00167 BookmarkItem * item = dynamic_cast<BookmarkItem*>( itemAt( p ) );
00168 QRect r = itemRect( item );
00169
00170 if ( item && r.isValid() )
00171 {
00172 tip( r, item->tipText() );
00173 }
00174 }
00175
00176 void BookmarksWidget::update( QDict<EditorData> const & map )
00177 {
00178
00179
00180 QListView::clear();
00181
00182 QDictIterator<EditorData> it( map );
00183 while ( it.current() )
00184 {
00185 if ( ! it.current()->marks.isEmpty() )
00186 {
00187 createURL( it.current() );
00188 }
00189 ++it;
00190 }
00191 }
00192
00193 void BookmarksWidget::updateURL( EditorData * data )
00194 {
00195
00196
00197
00198 removeURL( data->url );
00199
00200
00201 createURL( data );
00202 }
00203
00204 void BookmarksWidget::createURL( EditorData * data )
00205 {
00206
00207
00208 if ( data )
00209 {
00210 QListViewItem * file = new BookmarkItem( this, data->url );
00211 file->setOpen( true );
00212 file->setPixmap( 0, SmallIcon( "document" ) );
00213
00214 QValueListIterator< QPair<int,QString> > it = data->marks.begin();
00215 while ( it != data->marks.end() )
00216 {
00217 QListViewItem * item = new BookmarkItem( file, data->url, *it );
00218 item->setPixmap( 0, QPixmap((const char**)bookmark_xpm) );
00219 ++it;
00220 }
00221 }
00222 }
00223
00224 bool BookmarksWidget::removeURL( KURL const & url )
00225 {
00226
00227
00228 QListViewItem * item = firstChild();
00229 while ( item )
00230 {
00231 BookmarkItem * bm = static_cast<BookmarkItem*>(item);
00232 if ( bm->url() == url )
00233 {
00234 delete item;
00235 return true;
00236 }
00237 item = item->nextSibling();
00238 }
00239 return false;
00240 }
00241
00242 void BookmarksWidget::doEmitRemoveBookMark()
00243 {
00244
00245
00246 if ( _selectedItem->isBookmark() )
00247 {
00248 emit removeBookmarkForURL( _selectedItem->url(), _selectedItem->line() );
00249 }
00250 else
00251 {
00252 emit removeAllBookmarksForURL( _selectedItem->url() );
00253 }
00254 }
00255
00256 void BookmarksWidget::popupMenu( QListViewItem * item, const QPoint & p, int )
00257 {
00258
00259
00260 if ( item )
00261 {
00262 _selectedItem = static_cast<BookmarkItem *>(item);
00263
00264 KPopupMenu popup;
00265
00266 if ( _selectedItem->isBookmark() )
00267 {
00268 popup.insertTitle( _selectedItem->url().fileName() + i18n(", line ")
00269 + QString::number( _selectedItem->line() +1 ) );
00270
00271 popup.insertItem( i18n("Remove This Bookmark"), this, SLOT( doEmitRemoveBookMark() ) );
00272 }
00273 else
00274 {
00275 popup.insertTitle( _selectedItem->url().fileName() + i18n( ", All" ) );
00276 popup.insertItem( i18n("Remove These Bookmarks"), this, SLOT( doEmitRemoveBookMark() ) );
00277 }
00278
00279 popup.insertSeparator();
00280
00281 popup.insertItem( i18n( "Collapse All" ), this, SLOT(collapseAll()) );
00282 popup.insertItem( i18n( "Expand All" ), this, SLOT(expandAll()) );
00283
00284 popup.exec(p);
00285 }
00286
00287 }
00288
00289 void BookmarksWidget::itemClicked( QListViewItem * clickedItem )
00290 {
00291
00292
00293 if ( ! clickedItem )
00294 return;
00295
00296 BookmarkItem * item = static_cast<BookmarkItem*>( clickedItem );
00297 _part->partController()->editDocument( item->url(), item->line() );
00298
00299 }
00300
00301 BookmarksConfig * BookmarksWidget::config( )
00302 {
00303 return _part->config();
00304 }
00305
00306 QStringList BookmarksWidget::getContext( KURL const & url, unsigned int line )
00307 {
00308 return _part->getContext( url, line, config()->context() );
00309 }
00310
00311 void BookmarksWidget::collapseAll( )
00312 {
00313 QListViewItem * it = firstChild();
00314 while( it )
00315 {
00316 it->setOpen( false );
00317 it = it->nextSibling();
00318 }
00319 }
00320
00321 void BookmarksWidget::expandAll( )
00322 {
00323 QListViewItem * it = firstChild();
00324 while( it )
00325 {
00326 it->setOpen( true );
00327 it = it->nextSibling();
00328 }
00329 }
00330
00331
00332 #include "bookmarks_widget.moc"
00333
00334