00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include "kateprojecttreeview.h"
00023
#include "kateprojecttreeview.moc"
00024
00025
#include "kateprojectdirview.h"
00026
#include "katemainwindow.h"
00027
00028
#include <kapplication.h>
00029
#include <klocale.h>
00030
#include <kiconloader.h>
00031
#include <kmimetype.h>
00032
#include <klineedit.h>
00033
00034
#include <kdebug.h>
00035
00036
#include <qlabel.h>
00037
#include <qheader.h>
00038
#include <qpopupmenu.h>
00039
#include <qevent.h>
00040
00041
00042
00043 KateProjectTreeViewItem::KateProjectTreeViewItem (QDict<KateProjectTreeViewItem> *dict, KateProjectTreeView * parent,
Kate::Project *prj,
const QString &name,
const QString &fullname,
bool dir)
00044 : KListViewItem (parent)
00045 {
00046 m_name = name;
00047 m_fullName = fullname;
00048 m_dir = dir;
00049 m_project = prj;
00050 m_dict = dict;
00051
00052 init ();
00053 }
00054
00055 KateProjectTreeViewItem::KateProjectTreeViewItem (QDict<KateProjectTreeViewItem> *dict, KateProjectTreeViewItem * parent,
Kate::Project *prj,
const QString &name,
const QString &fullname,
bool dir)
00056 : KListViewItem (parent)
00057 {
00058 m_name = name;
00059 m_fullName = fullname;
00060 m_dir = dir;
00061 m_project = prj;
00062 m_dict = dict;
00063
00064 init ();
00065 }
00066
00067 KateProjectTreeViewItem::~KateProjectTreeViewItem ()
00068 {
00069
if (m_dir)
00070 m_dict->remove(QString(
"/")+m_fullName);
00071 }
00072
00073
void KateProjectTreeViewItem::init ()
00074 {
00075
if (m_dir)
00076 m_dict->insert(QString(
"/")+m_fullName,
this);
00077
00078
if (m_dir)
00079 setPixmap (0, KMimeType::mimeType(
"inode/directory")->pixmap( KIcon::Small ));
00080
else
00081 setPixmap (0, KMimeType::findByPath (m_project->dir() + QString (
"/") + m_fullName)->pixmap (KIcon::Small, KIcon::SizeSmall));
00082
00083 setText (0, m_name);
00084 }
00085
00086
int KateProjectTreeViewItem::compare ( QListViewItem *i,
int,
bool )
const
00087
{
00088 KateProjectTreeViewItem *item = (KateProjectTreeViewItem *) i;
00089
00090
if ((m_name == item->m_name) && (m_dir == item->m_dir))
00091
return 0;
00092
00093
if (m_dir == 0)
00094 {
00095
if (item->m_dir == 1)
00096
return 1;
00097
00098
if (m_name < item->m_name)
00099
return -1;
00100
else
00101
return 1;
00102 }
00103
else
00104 {
00105
if (item->m_dir == 0)
00106
return -1;
00107
00108
if (m_name < item->m_name)
00109
return -1;
00110
else
00111
return 1;
00112 }
00113 }
00114
00115
00116
00117 KateProjectTreeView::KateProjectTreeView (
Kate::Project *project, KateMainWindow *mainwin, QWidget *parent) : KListView (parent)
00118 {
00119 m_project = project;
00120 m_mainWin = mainwin;
00121
00122 m_dirDict.setAutoDelete (
false);
00123
00124 setSelectionModeExt( KListView::Single );
00125 setRootIsDecorated (
false);
00126 setAlternateBackground (viewport()->colorGroup().base());
00127
00128 header()->setStretchEnabled (
true);
00129 addColumn(i18n(
"Project: ") + m_project->name());
00130 header()->hide ();
00131
00132 KateProjectTreeViewItem *item =
new KateProjectTreeViewItem (&m_dirDict,
this, m_project, i18n(
"Project Folder"), QString::null,
true);
00133 addDir (item, QString::null);
00134
00135 setOpen (item,
true);
00136
00137 connect(
this,SIGNAL(doubleClicked(QListViewItem *,
const QPoint &,
int)),
this,SLOT(slotDoubleClicked(QListViewItem *,
const QPoint &,
int)));
00138 connect(
this, SIGNAL(returnPressed(QListViewItem*)), SLOT(execute(QListViewItem*)) );
00139 connect(
this, SIGNAL( contextMenuRequested( QListViewItem *,
const QPoint& ,
int ) ),
00140
this, SLOT( slotContextMenuRequested( QListViewItem *,
const QPoint &,
int ) ) );
00141
00142 connect (m_project, SIGNAL (dirsAdded (
const QString &,
const QStringList &)),
this, SLOT (dirsAdded (
const QString &,
const QStringList &)));
00143 connect (m_project, SIGNAL (filesAdded (
const QString &,
const QStringList &)),
this, SLOT (filesAdded (
const QString &,
const QStringList &)));
00144 connect (m_project, SIGNAL (dirsRemoved (
const QString &,
const QStringList &)),
this, SLOT (dirsRemoved (
const QString &,
const QStringList &)));
00145 connect (m_project, SIGNAL (filesRemoved (
const QString &,
const QStringList &)),
this, SLOT (filesRemoved (
const QString &,
const QStringList &)));
00146 }
00147
00148 KateProjectTreeView::~KateProjectTreeView ()
00149 {
00150 }
00151
00152
void KateProjectTreeView::addDir (KateProjectTreeViewItem *parent,
const QString &dir)
00153 {
00154 QString base = dir;
00155
00156
if (!dir.isNull())
00157 base += QString (
"/");
00158
00159 QStringList dirs = m_project->dirs (dir);
00160
00161
for (uint z=0; z < dirs.count(); z++)
00162 {
00163 KateProjectTreeViewItem *item =
new KateProjectTreeViewItem (&m_dirDict, parent, m_project, dirs[z], base + dirs[z],
true);
00164 addDir (item, base + dirs[z]);
00165 }
00166
00167 QStringList files = m_project->files (dir);
00168
00169
for (uint z=0; z < files.count(); z++)
00170 {
00171
new KateProjectTreeViewItem (&m_dirDict, parent, m_project, files[z], base + files[z],
false);
00172 }
00173 }
00174
00175
void KateProjectTreeView::slotDoubleClicked( QListViewItem *i,
const QPoint &,
int )
00176 {
00177 execute( i );
00178 }
00179
00180
void KateProjectTreeView::execute( QListViewItem *i )
00181 {
00182 KateProjectTreeViewItem *item = (KateProjectTreeViewItem *) i;
00183
00184
if (!item)
00185
return;
00186
00187
if (item->isDir())
00188 item->setOpen (!item->isOpen());
00189
else
00190 m_mainWin->viewManager()->openURL (KURL (m_project->dir() + QString (
"/") + item->fullName()));
00191 }
00192
00193
void KateProjectTreeView::dirsAdded (
const QString &dir,
const QStringList &dirs)
00194 {
00195 KateProjectTreeViewItem *item = m_dirDict [QString(
"/")+dir];
00196
00197
if (!item)
00198
return;
00199
00200 QString fullname = dir;
00201
if (!fullname.isNull())
00202 fullname += QString (
"/");
00203
00204
for (uint z=0; z < dirs.size(); z++)
00205 {
00206
00207 KateProjectTreeViewItem *i =
new KateProjectTreeViewItem (&m_dirDict, item, m_project, dirs[z], fullname + dirs[z],
true);
00208 addDir (i, fullname+dirs[z]);
00209 }
00210
00211
if (dir.isEmpty())
00212 item->setOpen (
true);
00213 }
00214
00215
void KateProjectTreeView::dirsRemoved (
const QString &dir,
const QStringList &dirs)
00216 {
00217 KateProjectTreeViewItem *item = m_dirDict [QString(
"/")+dir];
00218
00219
if (!item)
00220
return;
00221
00222 QPtrList<KateProjectTreeViewItem> l;
00223 l.setAutoDelete (
true);
00224
00225 KateProjectTreeViewItem *myChild = (KateProjectTreeViewItem *) item->firstChild();
00226
while( myChild )
00227 {
00228
if (dirs.findIndex (myChild->name()) != -1)
00229 l.append (myChild);
00230
00231 myChild = (KateProjectTreeViewItem *) myChild->nextSibling();
00232 }
00233 }
00234
00235
void KateProjectTreeView::filesAdded (
const QString &dir,
const QStringList &files)
00236 {
00237 KateProjectTreeViewItem *item = m_dirDict [QString(
"/")+dir];
00238
00239
if (!item)
00240
return;
00241
00242 QString fullname = dir;
00243
if (!fullname.isNull())
00244 fullname += QString (
"/");
00245
00246
for (uint z=0; z < files.size(); z++)
00247 {
00248
new KateProjectTreeViewItem (&m_dirDict, item, m_project, files[z], fullname + files[z],
false);
00249 }
00250
00251
if (dir.isEmpty())
00252 item->setOpen (
true);
00253 }
00254
00255
void KateProjectTreeView::filesRemoved (
const QString &dir,
const QStringList &files)
00256 {
00257 KateProjectTreeViewItem *item = m_dirDict [QString(
"/")+dir];
00258
00259
if (!item)
00260
return;
00261
00262 QPtrList<KateProjectTreeViewItem> l;
00263 l.setAutoDelete (
true);
00264
00265 KateProjectTreeViewItem *myChild = (KateProjectTreeViewItem *) item->firstChild();
00266
while( myChild )
00267 {
00268
if (files.findIndex (myChild->name()) != -1)
00269 l.append (myChild);
00270
00271 myChild = (KateProjectTreeViewItem *) myChild->nextSibling();
00272 }
00273 }
00274
00275
void KateProjectTreeView::slotContextMenuRequested ( QListViewItem * item,
const QPoint & pos,
int )
00276 {
00277
if (!item)
00278
return;
00279
00280 KateProjectTreeViewItem *i = (KateProjectTreeViewItem *) item;
00281
00282 QPopupMenu *menu =
new QPopupMenu (
this);
00283
00284
if (i->isDir())
00285 menu->insertItem (i18n(
"Add Folders/Files..."),
this, SLOT(addIt()));
00286
00287
if (!i->fullName().isNull())
00288 menu->insertItem (i->isDir() ? i18n(
"Remove Folder") : i18n(
"Remove File"), this, SLOT(removeIt()));
00289
00290 menu->exec(pos);
00291 }
00292
00293
void KateProjectTreeView::removeIt ()
00294 {
00295 KateProjectTreeViewItem *item = (KateProjectTreeViewItem *) selectedItem();
00296
00297
if (!item)
00298
return;
00299
00300
if (item->fullName().isNull())
00301
return;
00302
00303 QString dir = ((KateProjectTreeViewItem *) item->parent())->fullName();
00304 QStringList liste (item->name());
00305
00306
if (item->isDir())
00307 m_project->removeDirs (dir, liste);
00308
else
00309 m_project->removeFiles (dir, liste);
00310 }
00311
00312
void KateProjectTreeView::addIt ()
00313 {
00314 KateProjectTreeViewItem *item = (KateProjectTreeViewItem *) selectedItem();
00315
00316
if (!item)
00317
return;
00318
00319
if (item->isDir())
00320 KateProjectDirView::addDialog (m_project, item->fullName(),
this);
00321 }
00322
00323
00324
00325 KateProjectTreeViewContainer::KateProjectTreeViewContainer(
00326
Kate::Project *project, KateMainWindow *mainwin,
00327 QWidget *parent,
const char *name )
00328 : QVBox( parent, name )
00329 {
00330
00331 QHBox *b =
new QHBox(
this,
"quickfind entry" );
00332 QLabel *l =
new QLabel( i18n(
"F&ind:"), b );
00333 m_leQF =
new KLineEdit( b );
00334 m_leQF->installEventFilter(
this );
00335 l->setBuddy( m_leQF );
00336 connect( m_leQF, SIGNAL(textChanged(
const QString &)),
00337 SLOT(qfTextChanged(
const QString &)) );
00338
00339
00340 m_tree =
new KateProjectTreeView( project, mainwin,
this );
00341 }
00342
00343 KateProjectTreeViewContainer::~KateProjectTreeViewContainer()
00344 {
00345 }
00346
00347 KateProjectTreeView *KateProjectTreeViewContainer::tree()
00348 {
00349
return m_tree;
00350 }
00351
00352
void KateProjectTreeViewContainer::qfTextChanged(
const QString &t )
00353 {
00354 QListViewItem *i ( m_tree->currentItem() );
00355
if ( ! i ) i = m_tree->firstChild();
00356
00357
if (!i)
00358
return;
00359
00360
bool found (
false );
00361 QListViewItemIterator it ( i );
00362
00363
00364
while ( it.current() )
00365 {
00366
if ( it.current()->text(0).startsWith( t ) )
00367 {
00368 found =
true;
00369
break;
00370 }
00371 ++it;
00372 }
00373
00374
if ( ! found )
00375 {
00376 QListViewItemIterator it ( i );
00377
while ( it.current() )
00378 {
00379
if ( it.current()->text(0).startsWith( t ) )
00380 {
00381 found =
true;
00382
break;
00383 }
00384 --it;
00385 }
00386 }
00387
if ( it.current() )
00388 {
00389 i = it.current();
00390
if ( i->parent() && ! i->parent()->isOpen() )
00391 i->parent()->setOpen(
true );
00392 m_tree->ensureItemVisible( i );
00393
00394 m_tree->setCurrentItem( i );
00395 m_tree->setSelected(i,
true);
00396 }
00397 oldtext = t;
00398 }
00399
00400
bool KateProjectTreeViewContainer::eventFilter( QObject *o, QEvent *e )
00401 {
00402
if ( o == m_leQF )
00403 {
00404
if ( e->type() == QEvent::KeyPress &&
00405 ( ((QKeyEvent*)e)->key() == Qt::Key_Return ||
00406 ((QKeyEvent*)e)->key() == Qt::Key_Enter ) )
00407 {
00408
return kapp->sendEvent( m_tree, e );
00409 }
00410
if ( e->type() == QEvent::KeyPress &&
00411 ((QKeyEvent*)e)->key() == Qt::Key_Tab )
00412 {
00413 m_tree->setFocus();
00414
return true;
00415 }
00416 }
00417
return QVBox::eventFilter( o, e );
00418 }
00419
00420