Even though the last alpha was .91 this one is going to be 82 as I'd like to have...
[kdevelopdvcssupport.git] / plugins / projectmanagerview / projectmanagerview.cpp
blob0aee448af0b0f6f3562662eddcb73ea3905655d0
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>
34 #include <kmenu.h>
35 #include <kdebug.h>
36 #include <kurl.h>
37 #include <klocale.h>
38 #include <kactioncollection.h>
39 #include <kaction.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
63 public:
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 )
76 Q_UNUSED(fileName)
78 void fileCreated( const QString &fileName )
80 Q_UNUSED(fileName)
82 void fileDeleted( const QString &fileName )
84 Q_UNUSED(fileName)
87 void openUrl( const KUrl& url )
89 mplugin->core()->documentController()->openDocument( url );
92 /*void filtersChanged()
94 m_modelFilter->setFilterWildcard(m_filters->text());
95 }*/
98 ProjectManagerView::ProjectManagerView( ProjectManagerViewPlugin *plugin, QWidget *parent )
99 : 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);
111 updateSyncAction();
113 d->mplugin = plugin;
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() ) );
165 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()
184 delete d;
187 ProjectManagerViewPlugin *ProjectManagerView::plugin() const
189 return d->mplugin;
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) );
199 if( item )
200 items << item;
201 else
202 kDebug(9511) << "adding an unknown item";
204 return items;
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();
215 else
217 d->hideDetailsButton->setIcon( KIcon( "arrow-up-double" ) );
218 d->m_detailStack->hide();
220 animation->start();
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);
234 return;
240 #include "projectmanagerview.moc"