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 2008 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 "projectmanagerview.h"
24 #include <QtCore/QDebug>
25 #include <QtGui/QHeaderView>
26 #include <QtGui/QVBoxLayout>
27 #include <QtGui/QHBoxLayout>
28 #include <QtGui/QStandardItem>
29 #include <QtGui/QStackedWidget>
30 #include <QtGui/QToolButton>
32 #include <kxmlguiwindow.h>
33 #include <kiconloader.h>
38 #include <kactioncollection.h>
40 #include <kfadewidgeteffect.h>
41 #include <kcombobox.h>
43 #include <interfaces/icore.h>
44 #include <interfaces/iprojectcontroller.h>
45 #include <interfaces/iuicontroller.h>
46 #include <interfaces/idocumentcontroller.h>
47 #include <interfaces/iproject.h>
48 #include <project/interfaces/ibuildsystemmanager.h>
49 #include <project/interfaces/iprojectbuilder.h>
50 #include <project/projectmodel.h>
52 #include "tests/common/modeltest.h"
53 #include "projectproxymodel.h"
54 #include "projectbuildsetwidget.h"
55 #include "projectmanagerviewplugin.h"
56 #include "projecttreeview.h"
57 #include "proxyselectionmodel.h"
59 using namespace KDevelop
;
61 class ProjectManagerPrivate
64 ProjectManagerViewPlugin
*mplugin
;
65 ProjectTreeView
*m_projectOverview
;
66 ProjectBuildSetWidget
* m_buildView
;
67 KComboBox
* m_detailSwitcher
;
68 // KLineEdit* m_filters;
69 QStackedWidget
* m_detailStack
;
70 QStringList m_cachedFileList
;
71 QToolButton
* hideDetailsButton
;
72 ProjectProxyModel
* m_modelFilter
;
74 void fileDirty( const QString
&fileName
)
78 void fileCreated( const QString
&fileName
)
82 void fileDeleted( const QString
&fileName
)
87 void openUrl( const KUrl
& url
)
89 mplugin
->core()->documentController()->openDocument( url
);
92 /*void filtersChanged()
94 m_modelFilter->setFilterWildcard(m_filters->text());
98 ProjectManagerView::ProjectManagerView( ProjectManagerViewPlugin
*plugin
, QWidget
*parent
)
100 d(new ProjectManagerPrivate
)
102 setWindowTitle(i18n("Projects"));
104 m_syncAction
= new KAction(this);
105 m_syncAction
->setShortcutContext(Qt::WidgetWithChildrenShortcut
);
106 m_syncAction
->setText(i18n("Locate Current Document"));
107 m_syncAction
->setToolTip(i18n("Locates the current document in the project tree and selects it."));
108 m_syncAction
->setIcon(KIcon("dirsync"));
109 connect(m_syncAction
, SIGNAL(triggered(bool)), this, SLOT(locateCurrentDocument()));
110 addAction(m_syncAction
);
114 QVBoxLayout
*vbox
= new QVBoxLayout( this );
115 vbox
->setMargin( 0 );
117 d
->m_projectOverview
= new ProjectTreeView( plugin
, this );
118 d
->m_projectOverview
->setWhatsThis( i18n( "Project Overview" ) );
119 vbox
->addWidget( d
->m_projectOverview
, 3 );
120 connect(d
->m_projectOverview
, SIGNAL(activateUrl(const KUrl
&)), this, SLOT(openUrl(const KUrl
&)));
122 // d->m_filters = new KLineEdit(this);
123 // d->m_filters->setClearButtonShown(true);
124 // connect(d->m_filters, SIGNAL(returnPressed()), this, SLOT(filtersChanged()));
125 // vbox->addWidget( d->m_filters );
127 QHBoxLayout
* hbox
= new QHBoxLayout();
128 vbox
->addLayout( hbox
, 0 );
130 d
->m_detailSwitcher
= new KComboBox( false, this );
131 d
->m_detailSwitcher
->insertItem( 0, i18n( "Buildset" ) );
132 hbox
->addWidget( d
->m_detailSwitcher
);
134 d
->hideDetailsButton
= new QToolButton( this );
135 d
->hideDetailsButton
->setIcon( KIcon( "arrow-down-double.png" ) );
136 connect( d
->hideDetailsButton
, SIGNAL( clicked() ),
137 this, SLOT( switchDetailView() ) );
138 hbox
->addWidget( d
->hideDetailsButton
);
140 d
->m_detailStack
= new QStackedWidget( this );
141 vbox
->addWidget( d
->m_detailStack
, 1 );
143 connect( d
->m_detailSwitcher
, SIGNAL( activated( int ) ),
144 d
->m_detailStack
, SLOT( setCurrentIndex( int ) ) );
146 d
->m_buildView
= new ProjectBuildSetWidget( this, d
->m_detailStack
);
147 // d->m_buildView->setItemDelegate( delegate );
148 d
->m_buildView
->setWhatsThis( i18n( "Build Items:" ) );
149 d
->m_detailStack
->insertWidget( 0, d
->m_buildView
);
151 QStandardItemModel
*overviewModel
= d
->mplugin
->core()->projectController()->projectModel();
152 d
->m_modelFilter
= new ProjectProxyModel( this );
153 d
->m_modelFilter
->setSourceModel(overviewModel
);
154 d
->m_modelFilter
->setDynamicSortFilter(true);
155 d
->m_projectOverview
->setModel( d
->m_modelFilter
);
156 d
->m_projectOverview
->setSortingEnabled(true);
157 d
->m_projectOverview
->sortByColumn( 0, Qt::AscendingOrder
);
158 d
->m_projectOverview
->setSelectionModel( new ProxySelectionModel( d
->m_projectOverview
, ICore::self()->projectController()->projectSelectionModel(), this ) );
159 // d->m_projectOverview->setModel( overviewModel );c
160 setWindowIcon( SmallIcon( "kdevelop" ) ); //FIXME
161 setWindowTitle( i18n( "Project Manager" ) );
162 setWhatsThis( i18n( "Project Manager" ) );
163 connect( d
->m_projectOverview
->selectionModel(), SIGNAL(selectionChanged( const QItemSelection
&, const QItemSelection
&) ),
164 this, SLOT(selectionChanged() ) );
166 connect( KDevelop::ICore::self()->documentController(), SIGNAL(documentClosed(KDevelop::IDocument
*) ),
167 SLOT(updateSyncAction()));
168 connect( KDevelop::ICore::self()->documentController(), SIGNAL(documentOpened(KDevelop::IDocument
*) ),
169 SLOT(updateSyncAction()));
172 void ProjectManagerView::selectionChanged()
174 d
->m_buildView
->selectionChanged();
177 void ProjectManagerView::updateSyncAction()
179 m_syncAction
->setEnabled( !KDevelop::ICore::self()->documentController()->openDocuments().isEmpty() );
182 ProjectManagerView::~ProjectManagerView()
187 ProjectManagerViewPlugin
*ProjectManagerView::plugin() const
192 QList
<KDevelop::ProjectBaseItem
*> ProjectManagerView::selectedItems() const
194 QList
<KDevelop::ProjectBaseItem
*> items
;
195 foreach( const QModelIndex
&idx
, d
->m_projectOverview
->selectionModel()->selectedIndexes() )
197 KDevelop::ProjectBaseItem
* item
=
198 d
->mplugin
->core()->projectController()->projectModel()->item( d
->m_modelFilter
->mapToSource(idx
) );
202 kDebug(9511) << "adding an unknown item";
207 void ProjectManagerView::switchDetailView()
209 KFadeWidgetEffect
* animation
= new KFadeWidgetEffect( this );
210 if( d
->m_detailStack
->isHidden() )
212 d
->hideDetailsButton
->setIcon( KIcon( "arrow-down-double" ) );
213 d
->m_detailStack
->show();
217 d
->hideDetailsButton
->setIcon( KIcon( "arrow-up-double" ) );
218 d
->m_detailStack
->hide();
223 void ProjectManagerView::locateCurrentDocument()
225 KDevelop::IDocument
*doc
= ICore::self()->documentController()->activeDocument();
227 foreach (IProject
* proj
, ICore::self()->projectController()->projects()) {
228 foreach (KDevelop::ProjectFileItem
* item
, proj
->filesForUrl(doc
->url())) {
229 QModelIndex index
= d
->m_modelFilter
->indexFromItem(item
);
230 if (index
.isValid()) {
231 d
->m_projectOverview
->setCurrentIndex(index
);
232 d
->m_projectOverview
->expand(index
);
233 d
->m_projectOverview
->scrollTo(index
);
240 #include "projectmanagerview.moc"