katefilelist.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "katefilelist.h"
00022 #include "katefilelist.moc"
00023
00024 #include "katedocmanager.h"
00025 #include "kateviewmanager.h"
00026 #include "katemainwindow.h"
00027
00028 #include <qapplication.h>
00029 #include <qpainter.h>
00030 #include <qpopupmenu.h>
00031
00032 #include <kiconloader.h>
00033 #include <klocale.h>
00034 #include <kglobalsettings.h>
00035 #include <kpassivepopup.h>
00036
00037 #include <kdebug.h>
00038 #include <kapplication.h>
00039
00040 KateFileList::KateFileList (KateDocManager *_docManager,
00041 KateViewManager *_viewManager,
00042 QWidget * parent, const char * name )
00043 : KListBox (parent, name)
00044 , m_sort( KateFileList::sortByName )
00045 {
00046 setFocusPolicy ((QWidget::FocusPolicy)0);
00047
00048 docManager = _docManager;
00049 viewManager = _viewManager;
00050 tooltip = new KFLToolTip( this );
00051
00052 for (uint i = 0; i < docManager->documents(); i++)
00053 {
00054 slotDocumentCreated (docManager->document(i));
00055 slotModChanged (docManager->document(i));
00056 }
00057
00058 connect(docManager,SIGNAL(documentCreated(Kate::Document *)),this,SLOT(slotDocumentCreated(Kate::Document *)));
00059 connect(docManager,SIGNAL(documentDeleted(uint)),this,SLOT(slotDocumentDeleted(uint)));
00060
00061
00062 connect(this,SIGNAL(executed(QListBoxItem *)),this,SLOT(slotActivateView(QListBoxItem *)));
00063 connect(this,SIGNAL(highlighted(QListBoxItem *)),this,SLOT(slotActivateView(QListBoxItem *)));
00064
00065 connect(viewManager,SIGNAL(viewChanged()), this,SLOT(slotViewChanged()));
00066
00067 connect(this,SIGNAL(contextMenuRequested ( QListBoxItem *, const QPoint & )), this,SLOT(slotMenu ( QListBoxItem *, const QPoint & )));
00068 }
00069
00070 KateFileList::~KateFileList ()
00071 {
00072 delete tooltip;
00073 }
00074
00075 void KateFileList::slotNextDocument()
00076 {
00077 int c = currentItem ();
00078
00079 if ((c == -1) || (count() == 0))
00080 return;
00081
00082 if (uint(c+1) < count())
00083 viewManager->activateView( ((KateFileListItem *)item(c+1))->documentNumber() );
00084 else
00085 viewManager->activateView( ((KateFileListItem *)item(0))->documentNumber() );
00086 }
00087
00088 void KateFileList::slotPrevDocument()
00089 {
00090 int c = currentItem ();
00091
00092 if ((c == -1) || (count() == 0))
00093 return;
00094
00095 if ((c-1) >= 0)
00096 viewManager->activateView( ((KateFileListItem *)item(c-1))->documentNumber() );
00097 else
00098 viewManager->activateView( ((KateFileListItem *)item(count()-1))->documentNumber() );
00099
00100 }
00101
00102 void KateFileList::slotDocumentCreated (Kate::Document *doc)
00103 {
00104 insertItem (new KateFileListItem (docManager, doc, doc->documentNumber(), doc->docName()) );
00105 connect(doc,SIGNAL(modStateChanged(Kate::Document *)),this,SLOT(slotModChanged(Kate::Document *)));
00106 connect(doc,SIGNAL(nameChanged(Kate::Document *)),this,SLOT(slotNameChanged(Kate::Document *)));
00107 connect(doc,SIGNAL(modifiedOnDisc(Kate::Document *, bool, unsigned char)),this,SLOT(slotModifiedOnDisc(Kate::Document *, bool, unsigned char)));
00108
00109 updateSort ();
00110 }
00111
00112 void KateFileList::slotDocumentDeleted (uint documentNumber)
00113 {
00114 for (uint i = 0; i < count(); i++)
00115 {
00116 if (((KateFileListItem *) item (i)) ->documentNumber() == documentNumber)
00117 {
00118 if (count() > 1)
00119 removeItem( i );
00120 else
00121 clear();
00122 }
00123 }
00124 }
00125
00126 void KateFileList::slotActivateView( QListBoxItem *item )
00127 {
00128 viewManager->activateView( ((KateFileListItem *)item)->documentNumber() );
00129 }
00130
00131 void KateFileList::slotModChanged (Kate::Document *doc)
00132 {
00133 if (!doc) return;
00134
00135 for (uint i = 0; i < count(); i++)
00136 {
00137 if (((KateFileListItem *) item (i)) ->documentNumber() == doc->documentNumber())
00138 {
00139 triggerUpdate(false);
00140 break;
00141 }
00142 }
00143 }
00144
00145 void KateFileList::slotModifiedOnDisc (Kate::Document *doc, bool, unsigned char r)
00146 {
00147 for (uint i = 0; i < count(); i++)
00148 {
00149 if (((KateFileListItem *) item (i)) ->documentNumber() == doc->documentNumber())
00150 {
00151 triggerUpdate(false);
00152 break;
00153 }
00154 }
00155
00156 if ( r != 0 )
00157 {
00158 QPixmap w( BarIcon("messagebox_warning", 32) );
00159 QString a;
00160 if ( r == 1 )
00161 a = i18n("The document<br><code>%1</code><br>was changed on disk by another process.");
00162 else if ( r == 2 )
00163 a = i18n("The document<br><code>%1</code><br>was created on disk by another process.");
00164 else if ( r == 3 )
00165 a = i18n("The document<br><code>%1</code><br>was deleted from disk by another process");
00166
00167
00168
00169
00170
00171 if ( ((KateMainWindow*)topLevelWidget())->notifyMod() )
00172 KPassivePopup::message( i18n("Warning"),
00173 a.arg( doc->url().prettyURL() ),
00174 w, topLevelWidget() );
00175 }
00176 }
00177
00178 void KateFileList::slotNameChanged (Kate::Document *doc)
00179 {
00180 if (!doc) return;
00181
00182 for (uint i = 0; i < count(); i++)
00183 {
00184 if (((KateFileListItem *) item (i)) ->documentNumber() == doc->documentNumber())
00185 {
00186
00187 QString c = doc -> docName();
00188 if (c.length() > 200)
00189 c = "..." + c.right(197);
00190
00191 ((KateFileListItem *)item(i))->setText(c);
00192
00193 triggerUpdate(false);
00194 break;
00195 }
00196 }
00197
00198 updateSort ();
00199 }
00200
00201 void KateFileList::slotViewChanged ()
00202 {
00203 if (!viewManager->activeView()) return;
00204
00205 Kate::View *view = viewManager->activeView();
00206
00207 for (uint i = 0; i < count(); i++)
00208 {
00209 if (((KateFileListItem *) item (i)) ->documentNumber() == ((Kate::Document *)view->getDoc())->documentNumber())
00210 {
00211 setCurrentItem (i);
00212 if ( !isSelected( item(i) ) )
00213 setSelected( i, true );
00214 break;
00215 }
00216 }
00217 }
00218
00219 void KateFileList::slotMenu ( QListBoxItem *item, const QPoint &p )
00220 {
00221 if (!item)
00222 return;
00223
00224 QPopupMenu *menu = (QPopupMenu*) ((viewManager->mainWindow())->factory()->container("filelist_popup", viewManager->mainWindow()));
00225
00226 if (menu)
00227 menu->exec(p);
00228 }
00229
00230 void KateFileList::tip( const QPoint &p, QRect &r, QString &str )
00231 {
00232 KateFileListItem *i = (KateFileListItem*)itemAt( p );
00233 r = itemRect( i );
00234 str = "";
00235
00236 if ( !i || !r.isValid() )
00237 return;
00238
00239 Kate::Document *doc = docManager->documentWithID(i->documentNumber());
00240
00241 if (!doc)
00242 return;
00243
00244 const KateDocumentInfo *info = docManager->documentInfo(doc);
00245
00246 if (info && info->modifiedOnDisc)
00247 {
00248 if (info->modifiedOnDiscReason == 1)
00249 str += i18n("<b>This file was changed (modified) on disc by another program!</b><br />");
00250 else if (info->modifiedOnDiscReason == 2)
00251 str += i18n("<b>This file was changed (created) on disc by another program!</b><br />");
00252 else if (info->modifiedOnDiscReason == 3)
00253 str += i18n("<b>This file was changed (deleted) on disc by another program!</b><br />");
00254 }
00255
00256 str += doc->url().prettyURL();
00257 }
00258
00259 KateFileListItem::KateFileListItem( KateDocManager *_docManager, Kate::Document *doc, uint documentNumber, const QString& text): QListBoxItem()
00260 {
00261 this->doc = doc;
00262 myDocID = documentNumber;
00263 docManager = _docManager;
00264 setText( text );
00265 }
00266
00267 KateFileListItem::~KateFileListItem()
00268 {
00269 }
00270
00271 uint KateFileListItem::documentNumber ()
00272 {
00273 return myDocID;
00274 }
00275
00276 void KateFileListItem::setText(const QString &text)
00277 {
00278 QListBoxItem::setText(text);
00279 }
00280
00281 int KateFileListItem::height( const QListBox* lb ) const
00282 {
00283 int h;
00284
00285 if ( text().isEmpty() )
00286 h = 16;
00287 else
00288 h = QMAX( 16, lb->fontMetrics().lineSpacing() + 1 );
00289
00290 return QMAX( h, QApplication::globalStrut().height() );
00291 }
00292
00293 int KateFileListItem::width( const QListBox* lb ) const
00294 {
00295 if ( text().isEmpty() )
00296 return QMAX( 16 + 6, QApplication::globalStrut().width() );
00297
00298 return QMAX( 16 + lb->fontMetrics().width( text() ) + 6, QApplication::globalStrut().width() );
00299 }
00300
00301 void KateFileListItem::paint( QPainter *painter )
00302 {
00303 static QPixmap noPm = SmallIcon ("null");
00304 static QPixmap modPm = SmallIcon("modified");
00305 static QPixmap discPm = SmallIcon("modonhd");
00306 static QPixmap modmodPm = SmallIcon("modmod");
00307
00308 const KateDocumentInfo *info = docManager->documentInfo (doc);
00309
00310 if (info && info->modifiedOnDisc)
00311 painter->drawPixmap( 3, 0, doc->isModified() ? modmodPm : discPm );
00312 else
00313 painter->drawPixmap( 3, 0, doc->isModified() ? modPm : noPm );
00314
00315 if ( !text().isEmpty() )
00316 {
00317 QFontMetrics fm = painter->fontMetrics();
00318
00319 int yPos;
00320
00321 if ( 16 < fm.height() )
00322 yPos = fm.ascent() + fm.leading()/2;
00323 else
00324 yPos = 16/2 - fm.height()/2 + fm.ascent();
00325
00326 painter->drawText( 16 + 4, yPos, text() );
00327 }
00328 }
00329
00331
00332
00333 KateFileList::KFLToolTip::KFLToolTip( QWidget *parent )
00334 : QToolTip( parent )
00335 {
00336 }
00337
00338 void KateFileList::KFLToolTip::maybeTip( const QPoint &p )
00339 {
00340 QString str;
00341 QRect r;
00342
00343 ((KateFileList*)parentWidget())->tip( p, r, str );
00344
00345 if( !str.isEmpty() && r.isValid() )
00346 tip( r, str );
00347 }
00348
00349 void KateFileList::setSortType (int s)
00350 {
00351 m_sort = s;
00352 updateSort ();
00353 }
00354
00355 void KateFileList::updateSort ()
00356 {
00357 if (m_sort == KateFileList::sortByName)
00358 sort ();
00359 }
This file is part of the documentation for kate Library Version 3.2.2.