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>
27 #include <kio/global.h>
29 #include <QApplication>
36 #include <interfaces/iproject.h>
41 class ProjectBaseItemPrivate
44 ProjectBaseItemPrivate() : project(0) {}
48 class ProjectFolderItemPrivate
: public ProjectBaseItemPrivate
56 class ProjectBuildFolderItemPrivate
: public ProjectFolderItemPrivate
61 class ProjectFileItemPrivate
: public ProjectBaseItemPrivate
68 class ProjectTargetItemPrivate
: public ProjectBaseItemPrivate
72 class WorkspaceItemPrivate
76 KSharedConfig::Ptr metadataConfig
;
80 class ProjectModelPrivate
84 ProjectBaseItem::ProjectBaseItem( IProject
* project
, const QString
&name
, QStandardItem
*parent
)
85 : QStandardItem( name
), d_ptr(new ProjectBaseItemPrivate
)
90 setFlags( Qt::ItemIsEnabled
| Qt::ItemIsSelectable
| Qt::ItemIsEditable
);
93 ProjectBaseItem::ProjectBaseItem( ProjectBaseItemPrivate
& dd
)
96 setFlags( Qt::ItemIsEnabled
| Qt::ItemIsSelectable
| Qt::ItemIsEditable
);
99 ProjectBaseItem::~ProjectBaseItem()
101 Q_D(ProjectBaseItem
);
105 IProject
* ProjectBaseItem::project() const
107 Q_D(const ProjectBaseItem
);
111 void ProjectBaseItem::setParent( QStandardItem
* parent
)
114 parent
->setChild( parent
->rowCount(), this );
117 void ProjectBaseItem::setIcon()
121 void ProjectBaseItem::add( ProjectBaseItem
* item
)
126 ProjectFolderItem
*ProjectBaseItem::folder() const
131 ProjectTargetItem
*ProjectBaseItem::target() const
136 ProjectFileItem
*ProjectBaseItem::file() const
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
);
151 lst
.append( kdevitem
);
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
);
169 lst
.append( kdevitem
);
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
);
186 lst
.append( kdevitem
);
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
);
203 lst
.append( kdevitem
);
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()
229 void ProjectModel::fetchMore( const QModelIndex
&parent
)
231 QStandardItem
*parentItem
= itemFromIndex( parent
);
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
);
252 ProjectFolderItem::ProjectFolderItem( IProject
* project
, const KUrl
& dir
, QStandardItem
* parent
)
253 : ProjectBaseItem( *new ProjectFolderItemPrivate
)
255 Q_D(ProjectFolderItem
);
256 d
->project
= project
;
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
);
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
);
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
)
315 if ( ProjectFolderItem
* folder
= dynamic_cast<ProjectFolderItem
*>(item
))
316 if (folder
->folderName() == name
)
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
;
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
;
371 setText( file
.fileName() );
373 setFlags( Qt::ItemIsEnabled
| Qt::ItemIsSelectable
| Qt::ItemIsEditable
);
376 const KUrl
& ProjectFileItem::url( ) const
378 Q_D(const ProjectFileItem
);
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
);
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
;
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"