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 ProjectExecutableTargetItem
*ProjectBaseItem::executable() const
141 ProjectFileItem
*ProjectBaseItem::file() const
146 QList
<ProjectFolderItem
*> ProjectBaseItem::folderList() const
148 QList
<ProjectFolderItem
*> lst
;
149 for ( int i
= 0; i
< rowCount(); ++i
)
151 QStandardItem
* item
= child( i
);
152 if ( item
->type() == Folder
|| item
->type() == BuildFolder
)
154 ProjectFolderItem
*kdevitem
= dynamic_cast<ProjectFolderItem
*>( item
);
156 lst
.append( kdevitem
);
163 QList
<ProjectTargetItem
*> ProjectBaseItem::targetList() const
165 QList
<ProjectTargetItem
*> lst
;
166 for ( int i
= 0; i
< rowCount(); ++i
)
168 QStandardItem
* item
= child( i
);
169 if ( item
->type() == Target
|| item
->type() == LibraryTarget
||
170 item
->type() == ExecutableTarget
)
172 ProjectTargetItem
*kdevitem
= dynamic_cast<ProjectTargetItem
*>( item
);
174 lst
.append( kdevitem
);
181 QList
<ProjectFileItem
*> ProjectBaseItem::fileList() const
183 QList
<ProjectFileItem
*> lst
;
184 for ( int i
= 0; i
< rowCount(); ++i
)
186 QStandardItem
* item
= child( i
);
187 if ( item
->type() == File
)
189 ProjectFileItem
*kdevitem
= dynamic_cast<ProjectFileItem
*>( item
);
191 lst
.append( kdevitem
);
198 ProjectModel::ProjectModel( QObject
*parent
)
199 : QStandardItemModel( parent
), d(0)
203 ProjectModel::~ProjectModel()
207 ProjectBaseItem
*ProjectModel::item( const QModelIndex
&index
) const
209 return dynamic_cast<ProjectBaseItem
*>( itemFromIndex( index
) );
212 void ProjectModel::resetModel()
217 void ProjectModel::fetchMore( const QModelIndex
&parent
)
219 QStandardItem
*parentItem
= itemFromIndex( parent
);
222 int rowcount
= parentItem
->rowCount();
223 for( int i
=0; i
<rowcount
; i
++ )
225 ProjectBaseItem
*childItem
= dynamic_cast<ProjectBaseItem
*>(parentItem
->child(i
));
226 if( childItem
&& childItem
->icon().isNull() )
227 childItem
->setIcon();
231 bool ProjectModel::canFetchMore( const QModelIndex
& parent
) const
233 QStandardItem
*parentItem
= itemFromIndex( parent
);
240 ProjectFolderItem::ProjectFolderItem( IProject
* project
, const KUrl
& dir
, QStandardItem
* parent
)
241 : ProjectBaseItem( *new ProjectFolderItemPrivate
)
243 Q_D(ProjectFolderItem
);
244 d
->project
= project
;
247 setText( dir
.fileName() );
250 ProjectFolderItem::ProjectFolderItem( ProjectFolderItemPrivate
& dd
)
251 : ProjectBaseItem( dd
)
255 ProjectFolderItem::~ProjectFolderItem()
259 ProjectFolderItem
*ProjectFolderItem::folder() const
261 return const_cast<ProjectFolderItem
*>(this);
264 int ProjectFolderItem::type() const
266 return ProjectBaseItem::Folder
;
269 const KUrl
& ProjectFolderItem::url( ) const
271 Q_D(const ProjectFolderItem
);
275 const QString
& ProjectFolderItem::folderName() const
277 Q_D(const ProjectFolderItem
);
278 return d
->m_folderName
;
281 void ProjectFolderItem::setUrl( const KUrl
& url
)
283 Q_D(ProjectFolderItem
);
285 d
->m_folderName
= d
->m_url
.fileName();
286 setText( d
->m_folderName
);
289 void ProjectFolderItem::setIcon()
291 QStandardItem::setIcon( KIO::pixmapForUrl( url(), 0, KIconLoader::Small
) );
294 bool ProjectFolderItem::hasFileOrFolder(const QString
& name
) const
296 for ( int i
= 0; i
< rowCount(); ++i
)
298 QStandardItem
* item
= child( i
);
299 if ( ProjectFileItem
* file
= dynamic_cast<ProjectFileItem
*>(item
))
300 if (file
->fileName() == name
)
303 if ( ProjectFolderItem
* folder
= dynamic_cast<ProjectFolderItem
*>(item
))
304 if (folder
->folderName() == name
)
310 ProjectBuildFolderItem::ProjectBuildFolderItem( ProjectBuildFolderItemPrivate
& dd
)
311 : ProjectFolderItem( dd
)
315 ProjectBuildFolderItem::ProjectBuildFolderItem( IProject
* project
, const KUrl
&dir
, QStandardItem
*parent
)
316 : ProjectFolderItem( *new ProjectBuildFolderItemPrivate
)
318 Q_D(ProjectBuildFolderItem
);
319 d
->project
= project
;
324 int ProjectBuildFolderItem::type() const
326 return ProjectBaseItem::BuildFolder
;
329 void ProjectBuildFolderItem::setIcon()
331 QStandardItem::setIcon( KIcon("folder-development") );
334 void ProjectFolderItem::setProjectRoot(bool isRoot
)
336 Q_D(ProjectFolderItem
);
337 d
->m_isProjectRoot
=isRoot
;
338 setText(project()->name());
341 bool ProjectFolderItem::isProjectRoot() const
343 Q_D(const ProjectFolderItem
);
344 return d
->m_isProjectRoot
;
347 ProjectFileItem::ProjectFileItem( ProjectFileItemPrivate
& dd
)
348 : ProjectBaseItem(dd
)
350 setFlags( Qt::ItemIsEnabled
| Qt::ItemIsSelectable
| Qt::ItemIsEditable
);
353 ProjectFileItem::ProjectFileItem( IProject
* project
, const KUrl
& file
, QStandardItem
* parent
)
354 : ProjectBaseItem( *new ProjectFileItemPrivate
)
356 Q_D(ProjectFileItem
);
357 d
->project
= project
;
359 setText( file
.fileName() );
361 setFlags( Qt::ItemIsEnabled
| Qt::ItemIsSelectable
| Qt::ItemIsEditable
);
364 const KUrl
& ProjectFileItem::url( ) const
366 Q_D(const ProjectFileItem
);
370 const QString
& ProjectFileItem::fileName() const
372 Q_D(const ProjectFileItem
);
373 return d
->m_fileName
;
376 void ProjectFileItem::setUrl( const KUrl
& url
)
378 Q_D(ProjectFileItem
);
380 d
->m_fileName
= d
->m_url
.fileName();
383 int ProjectFileItem::type() const
385 return ProjectBaseItem::File
;
388 ProjectFileItem
*ProjectFileItem::file() const
390 return const_cast<ProjectFileItem
*>( this );
393 void ProjectFileItem::setIcon()
395 QStandardItem::setIcon( KIO::pixmapForUrl( url(), 0, KIconLoader::Small
) );
398 ProjectTargetItem::ProjectTargetItem( ProjectTargetItemPrivate
& dd
)
399 : ProjectBaseItem( dd
)
403 ProjectTargetItem::ProjectTargetItem( IProject
* project
, const QString
&name
, QStandardItem
*parent
)
404 : ProjectBaseItem( *new ProjectTargetItemPrivate
)
406 Q_D(ProjectTargetItem
);
407 d
->project
= project
;
412 int ProjectTargetItem::type() const
414 return ProjectBaseItem::Target
;
417 ProjectTargetItem
*ProjectTargetItem::target() const
419 return const_cast<ProjectTargetItem
*>( this );
422 void ProjectTargetItem::setIcon()
424 QStandardItem::setIcon( KIcon("system-run") );
427 ProjectExecutableTargetItem::ProjectExecutableTargetItem( IProject
* project
, const QString
&name
, QStandardItem
*parent
)
428 : ProjectTargetItem(project
, name
, parent
)
431 ProjectExecutableTargetItem
*ProjectExecutableTargetItem::executable() const
433 return const_cast<ProjectExecutableTargetItem
*>( this );
436 int ProjectExecutableTargetItem::type() const
438 return ProjectBaseItem::ExecutableTarget
;
441 ProjectLibraryTargetItem::ProjectLibraryTargetItem( IProject
* project
, const QString
&name
, QStandardItem
*parent
)
442 : ProjectTargetItem(project
, name
, parent
)
445 int ProjectLibraryTargetItem::type() const
447 return ProjectBaseItem::LibraryTarget
;
452 #include "projectmodel.moc"