Add line for debugging
[kdevelopdvcssupport.git] / project / projectmodel.cpp
blob3cfa27bfeaf0322a58e6d646031c4f5af9d447ab
1 /* This file is part of KDevelop
2 Copyright 2005 Roberto Raggi <roberto@kdevelop.org>
3 Copyright 2007 Andreas Pakulat <apaku@gmx.de>
4 Copyright 2007 Aleix Pol <aleixpol@gmail.com>
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA.
22 #include "projectmodel.h"
24 #include <kmimetype.h>
25 #include <kiconloader.h>
26 #include <kicon.h>
27 #include <kio/global.h>
29 #include <QApplication>
30 #include <QPalette>
31 #include <QBrush>
32 #include <QColor>
33 #include <QFileInfo>
34 #include <kdebug.h>
36 #include <interfaces/iproject.h>
38 namespace KDevelop
41 class ProjectBaseItemPrivate
43 public:
44 ProjectBaseItemPrivate() : project(0) {}
45 IProject* project;
48 class ProjectFolderItemPrivate : public ProjectBaseItemPrivate
50 public:
51 KUrl m_url;
52 QString m_folderName;
53 bool m_isProjectRoot;
56 class ProjectBuildFolderItemPrivate : public ProjectFolderItemPrivate
58 public:
61 class ProjectFileItemPrivate : public ProjectBaseItemPrivate
63 public:
64 KUrl m_url;
65 QString m_fileName;
68 class ProjectTargetItemPrivate : public ProjectBaseItemPrivate
72 class WorkspaceItemPrivate
74 public:
75 QString name;
76 KSharedConfig::Ptr metadataConfig;
77 QString metadataDir;
80 class ProjectModelPrivate
84 ProjectBaseItem::ProjectBaseItem( IProject* project, const QString &name, QStandardItem *parent )
85 : QStandardItem( name ), d_ptr(new ProjectBaseItemPrivate)
87 Q_D(ProjectBaseItem);
88 d->project = project;
89 setParent( parent );
90 setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
93 ProjectBaseItem::ProjectBaseItem( ProjectBaseItemPrivate& dd)
94 : d_ptr(&dd)
96 setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
99 ProjectBaseItem::~ProjectBaseItem()
101 Q_D(ProjectBaseItem);
102 delete d;
105 IProject* ProjectBaseItem::project() const
107 Q_D(const ProjectBaseItem);
108 return d->project;
111 void ProjectBaseItem::setParent( QStandardItem* parent )
113 if( parent )
114 parent->setChild( parent->rowCount(), this );
117 void ProjectBaseItem::setIcon()
121 void ProjectBaseItem::add( ProjectBaseItem* item )
123 appendRow( item );
126 ProjectFolderItem *ProjectBaseItem::folder() const
128 return 0;
131 ProjectTargetItem *ProjectBaseItem::target() const
133 return 0;
136 ProjectFileItem *ProjectBaseItem::file() const
138 return 0;
141 QList<ProjectFolderItem*> ProjectBaseItem::folderList() const
143 QList<ProjectFolderItem*> lst;
144 for ( int i = 0; i < rowCount(); ++i )
146 QStandardItem* item = child( i );
147 if ( item->type() == Folder || item->type() == BuildFolder )
149 ProjectFolderItem *kdevitem = dynamic_cast<ProjectFolderItem*>( item );
150 if ( kdevitem )
151 lst.append( kdevitem );
155 return lst;
158 QList<ProjectTargetItem*> ProjectBaseItem::targetList() const
160 QList<ProjectTargetItem*> lst;
161 for ( int i = 0; i < rowCount(); ++i )
163 QStandardItem* item = child( i );
164 if ( item->type() == Target || item->type() == LibraryTarget ||
165 item->type() == ExecutableTarget || item->type() == TestTarget)
167 ProjectTargetItem *kdevitem = dynamic_cast<ProjectTargetItem*>( item );
168 if ( kdevitem )
169 lst.append( kdevitem );
173 return lst;
176 QList<ProjectTestTargetItem*> ProjectBaseItem::testList() const
178 QList<ProjectTestTargetItem*> lst;
179 for ( int i = 0; i < rowCount(); ++i )
181 QStandardItem* item = child( i );
182 if (item->type() == TestTarget)
184 ProjectTestTargetItem *kdevitem = dynamic_cast<ProjectTestTargetItem*>( item );
185 if ( kdevitem )
186 lst.append( kdevitem );
190 return lst;
193 QList<ProjectFileItem*> ProjectBaseItem::fileList() const
195 QList<ProjectFileItem*> lst;
196 for ( int i = 0; i < rowCount(); ++i )
198 QStandardItem* item = child( i );
199 if ( item->type() == File )
201 ProjectFileItem *kdevitem = dynamic_cast<ProjectFileItem*>( item );
202 if ( kdevitem )
203 lst.append( kdevitem );
207 return lst;
210 ProjectModel::ProjectModel( QObject *parent )
211 : QStandardItemModel( parent ), d(0)
215 ProjectModel::~ProjectModel()
219 ProjectBaseItem *ProjectModel::item( const QModelIndex &index ) const
221 return dynamic_cast<ProjectBaseItem*>( itemFromIndex( index ) );
224 void ProjectModel::resetModel()
226 reset();
229 void ProjectModel::fetchMore( const QModelIndex &parent )
231 QStandardItem *parentItem = itemFromIndex( parent );
232 if( !parentItem )
233 return;
234 int rowcount = parentItem->rowCount();
235 for( int i=0; i<rowcount; i++ )
237 ProjectBaseItem *childItem = dynamic_cast<ProjectBaseItem*>(parentItem->child(i));
238 if( childItem && childItem->icon().isNull() )
239 childItem->setIcon();
243 bool ProjectModel::canFetchMore( const QModelIndex & parent ) const
245 QStandardItem *parentItem = itemFromIndex( parent );
246 if( !parentItem )
247 return false;
248 return true;
252 ProjectFolderItem::ProjectFolderItem( IProject* project, const KUrl & dir, QStandardItem * parent )
253 : ProjectBaseItem( *new ProjectFolderItemPrivate )
255 Q_D(ProjectFolderItem);
256 d->project = project;
257 d->m_url = dir;
258 setParent(parent);
259 setText( dir.fileName() );
262 ProjectFolderItem::ProjectFolderItem( ProjectFolderItemPrivate& dd)
263 : ProjectBaseItem( dd )
267 ProjectFolderItem::~ProjectFolderItem()
271 ProjectFolderItem *ProjectFolderItem::folder() const
273 return const_cast<ProjectFolderItem*>(this);
276 int ProjectFolderItem::type() const
278 return ProjectBaseItem::Folder;
281 const KUrl& ProjectFolderItem::url( ) const
283 Q_D(const ProjectFolderItem);
284 return d->m_url;
287 const QString& ProjectFolderItem::folderName() const
289 Q_D(const ProjectFolderItem);
290 return d->m_folderName;
293 void ProjectFolderItem::setUrl( const KUrl& url )
295 Q_D(ProjectFolderItem);
296 d->m_url = url;
297 d->m_folderName = d->m_url.fileName();
298 setText( d->m_folderName );
301 void ProjectFolderItem::setIcon()
303 QStandardItem::setIcon( KIO::pixmapForUrl( url(), 0, KIconLoader::Small ) );
306 bool ProjectFolderItem::hasFileOrFolder(const QString& name) const
308 for ( int i = 0; i < rowCount(); ++i )
310 QStandardItem* item = child( i );
311 if ( ProjectFileItem* file = dynamic_cast<ProjectFileItem*>(item))
312 if (file->fileName() == name)
313 return true;
315 if ( ProjectFolderItem* folder = dynamic_cast<ProjectFolderItem*>(item))
316 if (folder->folderName() == name)
317 return true;
319 return false;
322 ProjectBuildFolderItem::ProjectBuildFolderItem( ProjectBuildFolderItemPrivate& dd )
323 : ProjectFolderItem( dd )
327 ProjectBuildFolderItem::ProjectBuildFolderItem( IProject* project, const KUrl &dir, QStandardItem *parent)
328 : ProjectFolderItem( *new ProjectBuildFolderItemPrivate )
330 Q_D(ProjectBuildFolderItem);
331 d->project = project;
332 setUrl( dir );
333 setParent( parent );
336 int ProjectBuildFolderItem::type() const
338 return ProjectBaseItem::BuildFolder;
341 void ProjectBuildFolderItem::setIcon()
343 QStandardItem::setIcon( KIcon("folder-development") );
346 void ProjectFolderItem::setProjectRoot(bool isRoot)
348 Q_D(ProjectFolderItem);
349 d->m_isProjectRoot=isRoot;
350 setText(project()->name());
353 bool ProjectFolderItem::isProjectRoot() const
355 Q_D(const ProjectFolderItem);
356 return d->m_isProjectRoot;
359 ProjectFileItem::ProjectFileItem( ProjectFileItemPrivate& dd)
360 : ProjectBaseItem(dd)
362 setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
365 ProjectFileItem::ProjectFileItem( IProject* project, const KUrl & file, QStandardItem * parent )
366 : ProjectBaseItem( *new ProjectFileItemPrivate )
368 Q_D(ProjectFileItem);
369 d->project = project;
370 d->m_url = file;
371 setText( file.fileName() );
372 setParent( parent );
373 setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
376 const KUrl & ProjectFileItem::url( ) const
378 Q_D(const ProjectFileItem);
379 return d->m_url;
382 const QString& ProjectFileItem::fileName() const
384 Q_D(const ProjectFileItem);
385 return d->m_fileName;
388 void ProjectFileItem::setUrl( const KUrl& url )
390 Q_D(ProjectFileItem);
391 d->m_url = url;
392 d->m_fileName = d->m_url.fileName();
395 int ProjectFileItem::type() const
397 return ProjectBaseItem::File;
400 ProjectFileItem *ProjectFileItem::file() const
402 return const_cast<ProjectFileItem*>( this );
405 void ProjectFileItem::setIcon()
407 QStandardItem::setIcon( KIO::pixmapForUrl( url(), 0, KIconLoader::Small ) );
410 ProjectTargetItem::ProjectTargetItem( ProjectTargetItemPrivate& dd)
411 : ProjectBaseItem( dd )
415 ProjectTargetItem::ProjectTargetItem( IProject* project, const QString &name, QStandardItem *parent )
416 : ProjectBaseItem( *new ProjectTargetItemPrivate )
418 Q_D(ProjectTargetItem);
419 d->project = project;
420 setText( name );
421 setParent( parent );
424 int ProjectTargetItem::type() const
426 return ProjectBaseItem::Target;
429 ProjectTargetItem *ProjectTargetItem::target() const
431 return const_cast<ProjectTargetItem*>( this );
434 void ProjectTargetItem::setIcon()
436 QStandardItem::setIcon( KIcon("system-run") );
439 ProjectExecutableTargetItem::ProjectExecutableTargetItem( IProject* project, const QString &name, QStandardItem *parent )
440 : ProjectTargetItem(project, name, parent)
443 int ProjectExecutableTargetItem::type() const
445 return ProjectBaseItem::ExecutableTarget;
448 ProjectLibraryTargetItem::ProjectLibraryTargetItem( IProject* project, const QString &name, QStandardItem *parent )
449 : ProjectTargetItem(project, name, parent)
452 int ProjectLibraryTargetItem::type() const
454 return ProjectBaseItem::LibraryTarget;
457 ProjectTestTargetItem::ProjectTestTargetItem( IProject* project, const QString &name, QStandardItem *parent )
458 : ProjectExecutableTargetItem(project, name, parent)
461 int ProjectTestTargetItem::type() const
463 return ProjectBaseItem::TestTarget;
468 #include "projectmodel.moc"