2011-03-04 12:15:18 +01:00
/**************************************************************************
* *
* * This file is part of Qt Creator
* *
* * Copyright ( c ) 2011 Nokia Corporation and / or its subsidiary ( - ies ) .
* *
* * Author : Andreas Hartmetz , KDAB ( andreas . hartmetz @ kdab . com )
* *
2011-04-13 08:42:33 +02:00
* * Contact : Nokia Corporation ( info @ qt . nokia . com )
2011-03-04 12:15:18 +01:00
* *
* *
* * GNU Lesser General Public License Usage
* *
2011-04-13 08:42:33 +02:00
* * This file may be used under the terms of the GNU Lesser General Public
* * License version 2.1 as published by the Free Software Foundation and
* * appearing in the file LICENSE . LGPL included in the packaging of this file .
* * Please review the following information to ensure the GNU Lesser General
* * Public License version 2.1 requirements will be met :
* * http : //www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
2011-03-04 12:15:18 +01:00
* *
* * In addition , as a special exception , Nokia gives you certain additional
2011-04-13 08:42:33 +02:00
* * rights . These rights are described in the Nokia Qt LGPL Exception
2011-03-04 12:15:18 +01:00
* * version 1.1 , included in the file LGPL_EXCEPTION . txt in this package .
* *
2011-04-13 08:42:33 +02:00
* * Other Usage
* *
* * Alternatively , this file may be used in accordance with the terms and
* * conditions contained in a signed written agreement between you and Nokia .
* *
2011-03-04 12:15:18 +01:00
* * If you have questions regarding the use of this file , please contact
* * Nokia at qt - info @ nokia . com .
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "analyzermanager.h"
2011-04-04 14:39:28 +02:00
# include "analyzerconstants.h"
2011-03-04 12:15:18 +01:00
# include "analyzerplugin.h"
# include "analyzerruncontrol.h"
2011-04-04 14:39:28 +02:00
# include "analyzerruncontrolfactory.h"
2011-03-04 12:15:18 +01:00
# include "analyzeroptionspage.h"
2011-03-10 16:11:20 +01:00
# include "analyzeroutputpane.h"
2011-04-04 14:39:28 +02:00
# include "analyzerstartparameters.h"
# include "analyzerutils.h"
# include "ianalyzertool.h"
# include "startremotedialog.h"
2011-03-04 12:15:18 +01:00
# include <coreplugin/actionmanager/command.h>
# include <coreplugin/findplaceholder.h>
# include <coreplugin/minisplitter.h>
# include <coreplugin/modemanager.h>
# include <coreplugin/navigationwidget.h>
# include <coreplugin/outputpane.h>
# include <coreplugin/rightpane.h>
# include <coreplugin/actionmanager/actionmanager.h>
# include <coreplugin/actionmanager/actioncontainer.h>
# include <coreplugin/icore.h>
# include <coreplugin/uniqueidmanager.h>
2011-03-08 13:56:52 +01:00
# include <coreplugin/coreconstants.h>
# include <coreplugin/editormanager/editormanager.h>
# include <coreplugin/imode.h>
2011-03-04 12:15:18 +01:00
# include <projectexplorer/projectexplorerconstants.h>
# include <projectexplorer/projectexplorer.h>
# include <projectexplorer/project.h>
# include <projectexplorer/runconfiguration.h>
# include <projectexplorer/buildconfiguration.h>
# include <projectexplorer/iprojectmanager.h>
# include <projectexplorer/target.h>
# include <extensionsystem/iplugin.h>
# include <utils/fancymainwindow.h>
# include <utils/styledbar.h>
# include <utils/qtcassert.h>
2011-03-15 14:18:41 +01:00
# include <utils/checkablemessagebox.h>
2011-03-16 13:49:28 +01:00
# include <utils/statuslabel.h>
2011-04-04 14:39:28 +02:00
# include <utils/ssh/sshconnection.h>
2011-03-04 12:15:18 +01:00
# include <cmakeprojectmanager/cmakeprojectconstants.h>
# include <qt4projectmanager/qt4projectmanagerconstants.h>
2011-03-08 13:56:52 +01:00
# include <QtCore/QVariant>
# include <QtCore/QDebug>
# include <QtGui/QHBoxLayout>
# include <QtGui/QVBoxLayout>
# include <QtGui/QDockWidget>
# include <QtGui/QAction>
# include <QtGui/QMenu>
# include <QtGui/QMenuBar>
# include <QtGui/QToolButton>
# include <QtGui/QComboBox>
# include <QtGui/QStackedWidget>
# include <QtGui/QDialog>
# include <QtGui/QApplication>
# include <QtGui/QLabel>
# include <QtGui/QCheckBox>
# include <QtGui/QDialogButtonBox>
2011-03-15 14:18:41 +01:00
# include <QtGui/QMainWindow>
2011-04-04 14:39:28 +02:00
# include <QtGui/QPushButton>
2011-03-04 12:15:18 +01:00
using namespace Core ;
using namespace Analyzer ;
using namespace Analyzer : : Internal ;
namespace Analyzer {
namespace Internal {
2011-03-08 13:56:52 +01:00
class DockWidgetEventFilter : public QObject
{
Q_OBJECT
public :
explicit DockWidgetEventFilter ( QObject * parent = 0 ) : QObject ( parent ) { }
signals :
void widgetResized ( ) ;
protected :
virtual bool eventFilter ( QObject * obj , QEvent * event ) ;
} ;
2011-03-04 12:15:18 +01:00
bool DockWidgetEventFilter : : eventFilter ( QObject * obj , QEvent * event )
{
switch ( event - > type ( ) ) {
case QEvent : : Resize :
case QEvent : : ZOrderChange :
emit widgetResized ( ) ;
break ;
default :
break ;
}
return QObject : : eventFilter ( obj , event ) ;
}
// AnalyzerMode ////////////////////////////////////////////////////
2011-03-08 13:56:52 +01:00
class AnalyzerMode : public Core : : IMode
{
Q_OBJECT
public :
AnalyzerMode ( QObject * parent = 0 )
: Core : : IMode ( parent )
2011-04-13 13:00:30 +02:00
{
setContext ( Core : : Context (
Core : : Constants : : C_EDITORMANAGER ,
Constants : : C_ANALYZEMODE ,
Core : : Constants : : C_NAVIGATION_PANE ) ) ;
2011-04-13 16:09:04 +02:00
setDisplayName ( tr ( " Analyze " ) ) ;
setIcon ( QIcon ( " :/images/analyzer_mode.png " ) ) ;
setPriority ( Constants : : P_MODE_ANALYZE ) ;
setId ( QLatin1String ( Constants : : MODE_ANALYZE ) ) ;
setType ( Core : : Constants : : MODE_EDIT_TYPE ) ;
2011-04-13 13:00:30 +02:00
}
2011-03-08 13:56:52 +01:00
~ AnalyzerMode ( )
{
// Make sure the editor manager does not get deleted.
if ( m_widget ) {
delete m_widget ;
m_widget = 0 ;
}
Core : : EditorManager : : instance ( ) - > setParent ( 0 ) ;
}
} ;
2011-03-04 12:15:18 +01:00
} // namespace Internal
} // namespace Analyzer
// AnalyzerManagerPrivate ////////////////////////////////////////////////////
class AnalyzerManager : : AnalyzerManagerPrivate
{
public :
AnalyzerManagerPrivate ( AnalyzerManager * qq ) ;
~ AnalyzerManagerPrivate ( ) ;
2011-03-04 16:00:03 +01:00
/**
* After calling this , a proper instance of Core : : IMore is initialized
* It is delayed since an analyzer mode makes no sense without analyzer tools
*
* \ note Call this before adding a tool to the manager
*/
void delayedInit ( ) ;
2011-03-04 12:15:18 +01:00
void setupActions ( ) ;
2011-03-10 16:11:20 +01:00
QWidget * createModeContents ( ) ;
QWidget * createModeMainWindow ( ) ;
2011-04-04 14:39:28 +02:00
bool showPromptDialog ( const QString & title ,
const QString & text ,
const QString & stopButtonText ,
const QString & cancelButtonText ) const ;
2011-03-04 12:15:18 +01:00
2011-03-04 16:00:01 +01:00
void addDock ( IAnalyzerTool * tool , Qt : : DockWidgetArea area , QDockWidget * dockWidget ) ;
2011-03-04 12:15:18 +01:00
void startTool ( ) ;
AnalyzerManager * q ;
AnalyzerMode * m_mode ;
2011-03-10 16:11:20 +01:00
AnalyzerOutputPane * m_outputpane ;
2011-03-04 12:15:18 +01:00
AnalyzerRunControlFactory * m_runControlFactory ;
ProjectExplorer : : RunControl * m_currentRunControl ;
Utils : : FancyMainWindow * m_mainWindow ;
2011-04-04 14:39:28 +02:00
QList < IAnalyzerTool * > m_tools ;
2011-03-04 12:15:18 +01:00
QActionGroup * m_toolGroup ;
QAction * m_startAction ;
2011-04-04 14:39:28 +02:00
QAction * m_startRemoteAction ;
2011-03-04 12:15:18 +01:00
QAction * m_stopAction ;
2011-04-04 13:03:45 +02:00
ActionContainer * m_menu ;
2011-03-04 12:15:18 +01:00
QComboBox * m_toolBox ;
2011-04-04 14:39:28 +02:00
QStackedWidget * m_controlsWidget ;
2011-03-04 12:15:18 +01:00
ActionContainer * m_viewsMenu ;
2011-03-16 13:49:28 +01:00
Utils : : StatusLabel * m_statusLabel ;
2011-04-04 14:39:28 +02:00
typedef QPair < Qt : : DockWidgetArea , QDockWidget * > ToolWidgetPair ;
2011-03-04 16:00:01 +01:00
typedef QList < ToolWidgetPair > ToolWidgetPairList ;
2011-04-04 14:39:28 +02:00
QMap < IAnalyzerTool * , ToolWidgetPairList > m_toolWidgets ;
2011-03-04 12:15:18 +01:00
DockWidgetEventFilter * m_resizeEventFilter ;
QMap < IAnalyzerTool * , QSettings * > m_defaultSettings ;
2011-03-04 16:00:01 +01:00
// list of dock widgets to prevent memory leak
typedef QWeakPointer < QDockWidget > DockPtr ;
QList < DockPtr > m_dockWidgets ;
2011-03-04 16:00:03 +01:00
2011-04-04 14:39:28 +02:00
bool m_restartOnStop ;
2011-03-04 16:00:03 +01:00
bool m_initialized ;
2011-03-04 12:15:18 +01:00
} ;
AnalyzerManager : : AnalyzerManagerPrivate : : AnalyzerManagerPrivate ( AnalyzerManager * qq ) :
q ( qq ) ,
m_mode ( 0 ) ,
2011-03-10 16:11:20 +01:00
m_outputpane ( 0 ) ,
2011-03-04 12:15:18 +01:00
m_runControlFactory ( 0 ) ,
m_currentRunControl ( 0 ) ,
m_mainWindow ( 0 ) ,
m_toolGroup ( 0 ) ,
m_startAction ( 0 ) ,
2011-04-04 14:39:28 +02:00
m_startRemoteAction ( 0 ) ,
2011-03-04 12:15:18 +01:00
m_stopAction ( 0 ) ,
m_menu ( 0 ) ,
2011-03-10 16:11:20 +01:00
m_toolBox ( new QComboBox ) ,
2011-04-04 14:39:28 +02:00
m_controlsWidget ( new QStackedWidget ) ,
2011-03-04 12:15:18 +01:00
m_viewsMenu ( 0 ) ,
2011-03-16 13:49:28 +01:00
m_statusLabel ( new Utils : : StatusLabel ) ,
2011-03-04 12:15:18 +01:00
m_resizeEventFilter ( new DockWidgetEventFilter ( qq ) ) ,
2011-04-04 14:39:28 +02:00
m_restartOnStop ( false ) ,
2011-03-04 16:00:03 +01:00
m_initialized ( false )
2011-03-04 12:15:18 +01:00
{
2011-03-10 16:11:20 +01:00
m_toolBox - > setObjectName ( QLatin1String ( " AnalyzerManagerToolBox " ) ) ;
2011-03-04 12:15:18 +01:00
m_runControlFactory = new AnalyzerRunControlFactory ( ) ;
2011-04-13 10:39:47 +02:00
q - > registerRunControlFactory ( m_runControlFactory ) ;
2011-03-04 12:15:18 +01:00
2011-03-10 16:11:20 +01:00
connect ( m_toolBox , SIGNAL ( currentIndexChanged ( int ) ) ,
q , SLOT ( toolSelected ( int ) ) ) ;
2011-03-04 12:15:18 +01:00
setupActions ( ) ;
}
AnalyzerManager : : AnalyzerManagerPrivate : : ~ AnalyzerManagerPrivate ( )
{
2011-03-04 16:00:01 +01:00
// as we have to setParent(0) on dock widget that are not selected,
// we keep track of all and make sure we don't leak any
foreach ( const DockPtr & ptr , m_dockWidgets ) {
if ( ptr )
delete ptr . data ( ) ;
}
2011-03-04 12:15:18 +01:00
}
2011-04-13 10:39:47 +02:00
void AnalyzerManager : : registerRunControlFactory ( ProjectExplorer : : IRunControlFactory * factory )
{
AnalyzerPlugin : : instance ( ) - > addAutoReleasedObject ( factory ) ;
connect ( factory , SIGNAL ( runControlCreated ( Analyzer : : AnalyzerRunControl * ) ) ,
this , SLOT ( runControlCreated ( Analyzer : : AnalyzerRunControl * ) ) ) ;
}
2011-03-04 12:15:18 +01:00
void AnalyzerManager : : AnalyzerManagerPrivate : : setupActions ( )
{
Core : : ICore * core = Core : : ICore : : instance ( ) ;
Core : : ActionManager * am = core - > actionManager ( ) ;
Core : : ActionContainer * mtools = am - > actionContainer ( ProjectExplorer : : Constants : : M_DEBUG ) ;
2011-04-04 13:03:45 +02:00
m_menu = am - > createMenu ( Constants : : M_DEBUG_ANALYZER ) ;
2011-04-04 14:39:28 +02:00
const Core : : Context globalcontext ( Core : : Constants : : C_GLOBAL ) ;
Core : : Command * command = 0 ;
// add separator before Analyzer menu
QAction * act = new QAction ( m_menu ) ;
act - > setSeparator ( true ) ;
command = am - > registerAction ( act , " Analyzer.Action.Sep " , globalcontext ) ;
mtools - > addAction ( command ) ;
2011-03-04 12:15:18 +01:00
// Menus
2011-04-04 13:03:45 +02:00
m_menu - > menu ( ) - > setTitle ( tr ( " Start &Analyzer " ) ) ;
m_menu - > menu ( ) - > setEnabled ( true ) ;
m_menu - > appendGroup ( Constants : : G_ANALYZER_STARTSTOP ) ;
m_menu - > appendGroup ( Constants : : G_ANALYZER_TOOLS ) ;
mtools - > addMenu ( m_menu ) ;
2011-03-04 12:15:18 +01:00
m_toolGroup = new QActionGroup ( m_menu ) ;
connect ( m_toolGroup , SIGNAL ( triggered ( QAction * ) ) ,
q , SLOT ( toolSelected ( QAction * ) ) ) ;
m_startAction = new QAction ( tr ( " Start " ) , m_menu ) ;
2011-04-04 14:39:28 +02:00
m_startAction - > setIcon ( QIcon ( Constants : : ANALYZER_CONTROL_START_ICON ) ) ;
command = am - > registerAction ( m_startAction ,
2011-03-04 12:15:18 +01:00
Constants : : START , globalcontext ) ;
2011-04-04 13:03:45 +02:00
m_menu - > addAction ( command , Constants : : G_ANALYZER_STARTSTOP ) ;
2011-03-04 12:15:18 +01:00
connect ( m_startAction , SIGNAL ( triggered ( ) ) , q , SLOT ( startTool ( ) ) ) ;
2011-04-04 14:39:28 +02:00
m_startRemoteAction = new QAction ( tr ( " Start Remote " ) , m_menu ) ;
///FIXME: get an icon for this
// m_startRemoteAction->setIcon(QIcon(QLatin1String(":/images/analyzer_start_remote_small.png")));
command = am - > registerAction ( m_startRemoteAction ,
Constants : : STARTREMOTE , globalcontext ) ;
2011-04-04 13:03:45 +02:00
m_menu - > addAction ( command , Constants : : G_ANALYZER_STARTSTOP ) ;
2011-04-04 14:39:28 +02:00
connect ( m_startRemoteAction , SIGNAL ( triggered ( ) ) , q , SLOT ( startToolRemote ( ) ) ) ;
2011-03-04 12:15:18 +01:00
m_stopAction = new QAction ( tr ( " Stop " ) , m_menu ) ;
m_stopAction - > setEnabled ( false ) ;
2011-04-04 14:39:28 +02:00
m_stopAction - > setIcon ( QIcon ( Constants : : ANALYZER_CONTROL_STOP_ICON ) ) ;
2011-03-04 12:15:18 +01:00
command = am - > registerAction ( m_stopAction , Constants : : STOP , globalcontext ) ;
2011-04-04 13:03:45 +02:00
m_menu - > addAction ( command , Constants : : G_ANALYZER_STARTSTOP ) ;
2011-03-04 12:15:18 +01:00
connect ( m_stopAction , SIGNAL ( triggered ( ) ) , q , SLOT ( stopTool ( ) ) ) ;
2011-04-04 13:03:45 +02:00
QAction * separatorAction = new QAction ( m_menu ) ;
separatorAction - > setSeparator ( true ) ;
command = am - > registerAction ( separatorAction , Constants : : ANALYZER_TOOLS_SEPARATOR , globalcontext ) ;
m_menu - > addAction ( command , Constants : : G_ANALYZER_TOOLS ) ;
2011-03-04 12:15:18 +01:00
m_viewsMenu = am - > actionContainer ( Core : : Id ( Core : : Constants : : M_WINDOW_VIEWS ) ) ;
}
2011-03-04 16:00:03 +01:00
void AnalyzerManager : : AnalyzerManagerPrivate : : delayedInit ( )
{
if ( m_initialized )
return ;
2011-04-04 14:39:28 +02:00
m_mode = new AnalyzerMode ( q ) ;
m_mode - > setWidget ( createModeContents ( ) ) ;
AnalyzerPlugin : : instance ( ) - > addAutoReleasedObject ( m_mode ) ;
2011-03-04 16:00:03 +01:00
m_initialized = true ;
}
2011-03-10 16:11:20 +01:00
QWidget * AnalyzerManager : : AnalyzerManagerPrivate : : createModeContents ( )
2011-03-04 12:15:18 +01:00
{
// right-side window with editor, output etc.
MiniSplitter * mainWindowSplitter = new MiniSplitter ;
2011-03-10 16:11:20 +01:00
mainWindowSplitter - > addWidget ( createModeMainWindow ( ) ) ;
2011-03-04 12:15:18 +01:00
mainWindowSplitter - > addWidget ( new OutputPanePlaceHolder ( m_mode , mainWindowSplitter ) ) ;
mainWindowSplitter - > setStretchFactor ( 0 , 10 ) ;
mainWindowSplitter - > setStretchFactor ( 1 , 0 ) ;
mainWindowSplitter - > setOrientation ( Qt : : Vertical ) ;
// navigation + right-side window
MiniSplitter * splitter = new MiniSplitter ;
splitter - > addWidget ( new NavigationWidgetPlaceHolder ( m_mode ) ) ;
splitter - > addWidget ( mainWindowSplitter ) ;
splitter - > setStretchFactor ( 0 , 0 ) ;
splitter - > setStretchFactor ( 1 , 1 ) ;
return splitter ;
}
static QToolButton * toolButton ( QAction * action )
{
QToolButton * button = new QToolButton ;
button - > setDefaultAction ( action ) ;
return button ;
}
2011-03-10 16:11:20 +01:00
QWidget * AnalyzerManager : : AnalyzerManagerPrivate : : createModeMainWindow ( )
{
2011-03-04 12:15:18 +01:00
m_mainWindow = new Utils : : FancyMainWindow ( ) ;
2011-03-10 16:11:20 +01:00
m_mainWindow - > setObjectName ( QLatin1String ( " AnalyzerManagerMainWindow " ) ) ;
2011-03-04 12:15:18 +01:00
connect ( m_mainWindow , SIGNAL ( resetLayout ( ) ) ,
q , SLOT ( resetLayout ( ) ) ) ;
m_mainWindow - > setDocumentMode ( true ) ;
m_mainWindow - > setDockNestingEnabled ( true ) ;
m_mainWindow - > setDockActionsVisible ( ModeManager : : instance ( ) - > currentMode ( ) - > id ( ) = =
Constants : : MODE_ANALYZE ) ;
QBoxLayout * editorHolderLayout = new QVBoxLayout ;
editorHolderLayout - > setMargin ( 0 ) ;
editorHolderLayout - > setSpacing ( 0 ) ;
QWidget * editorAndFindWidget = new QWidget ;
editorAndFindWidget - > setLayout ( editorHolderLayout ) ;
editorHolderLayout - > addWidget ( new EditorManagerPlaceHolder ( m_mode ) ) ;
editorHolderLayout - > addWidget ( new FindToolBarPlaceHolder ( editorAndFindWidget ) ) ;
MiniSplitter * documentAndRightPane = new MiniSplitter ;
documentAndRightPane - > addWidget ( editorAndFindWidget ) ;
documentAndRightPane - > addWidget ( new RightPanePlaceHolder ( m_mode ) ) ;
documentAndRightPane - > setStretchFactor ( 0 , 1 ) ;
documentAndRightPane - > setStretchFactor ( 1 , 0 ) ;
2011-04-04 14:39:28 +02:00
Utils : : StyledBar * analyzeToolBar = new Utils : : StyledBar ;
analyzeToolBar - > setProperty ( " topBorder " , true ) ;
QHBoxLayout * analyzeToolBarLayout = new QHBoxLayout ( analyzeToolBar ) ;
analyzeToolBarLayout - > setMargin ( 0 ) ;
analyzeToolBarLayout - > setSpacing ( 0 ) ;
QToolButton * startButton = toolButton ( m_startAction ) ;
QMenu * startMenu = new QMenu ;
startMenu - > addAction ( m_startAction ) ;
startMenu - > addAction ( m_startRemoteAction ) ;
startButton - > setMenu ( startMenu ) ;
analyzeToolBarLayout - > addWidget ( startButton ) ;
analyzeToolBarLayout - > addWidget ( toolButton ( m_stopAction ) ) ;
analyzeToolBarLayout - > addWidget ( new Utils : : StyledSeparator ) ;
analyzeToolBarLayout - > addWidget ( m_toolBox ) ;
analyzeToolBarLayout - > addWidget ( m_controlsWidget ) ;
analyzeToolBarLayout - > addWidget ( m_statusLabel ) ;
analyzeToolBarLayout - > addStretch ( ) ;
QDockWidget * dock = new QDockWidget ( tr ( " Analyzer Toolbar " ) ) ;
dock - > setObjectName ( QLatin1String ( " Analyzer Toolbar " ) ) ;
dock - > setWidget ( analyzeToolBar ) ;
dock - > setFeatures ( QDockWidget : : NoDockWidgetFeatures ) ;
dock - > setProperty ( " managed_dockwidget " , QLatin1String ( " true " ) ) ;
dock - > setAllowedAreas ( Qt : : BottomDockWidgetArea ) ;
// hide title bar
dock - > setTitleBarWidget ( new QWidget ( dock ) ) ;
m_mainWindow - > addDockWidget ( Qt : : BottomDockWidgetArea , dock ) ;
m_mainWindow - > setToolBarDockWidget ( dock ) ;
2011-03-04 12:15:18 +01:00
QWidget * centralWidget = new QWidget ;
m_mainWindow - > setCentralWidget ( centralWidget ) ;
QVBoxLayout * centralLayout = new QVBoxLayout ( centralWidget ) ;
centralWidget - > setLayout ( centralLayout ) ;
centralLayout - > setMargin ( 0 ) ;
centralLayout - > setSpacing ( 0 ) ;
centralLayout - > addWidget ( documentAndRightPane ) ;
centralLayout - > setStretch ( 0 , 1 ) ;
centralLayout - > setStretch ( 1 , 0 ) ;
return m_mainWindow ;
}
void AnalyzerManager : : AnalyzerManagerPrivate : : addDock ( IAnalyzerTool * tool , Qt : : DockWidgetArea area ,
QDockWidget * dockWidget )
{
2011-04-04 14:39:28 +02:00
QTC_ASSERT ( tool = = q - > currentTool ( ) , return )
2011-03-04 12:15:18 +01:00
dockWidget - > setParent ( m_mainWindow ) ;
m_mainWindow - > addDockWidget ( area , dockWidget ) ;
Context globalContext ( Core : : Constants : : C_GLOBAL ) ;
ActionManager * am = ICore : : instance ( ) - > actionManager ( ) ;
QAction * toggleViewAction = dockWidget - > toggleViewAction ( ) ;
toggleViewAction - > setText ( dockWidget - > windowTitle ( ) ) ;
Command * cmd = am - > registerAction ( toggleViewAction , QString ( " Analyzer. " + dockWidget - > objectName ( ) ) ,
globalContext ) ;
cmd - > setAttribute ( Command : : CA_Hide ) ;
m_viewsMenu - > addAction ( cmd ) ;
// just add the dock below the toolbar by default
m_mainWindow - > splitDockWidget ( m_mainWindow - > toolBarDockWidget ( ) , dockWidget ,
Qt : : Vertical ) ;
dockWidget - > show ( ) ;
}
2011-04-04 14:39:28 +02:00
bool buildTypeAccepted ( IAnalyzerTool : : ToolMode toolMode ,
2011-03-04 12:15:18 +01:00
ProjectExplorer : : BuildConfiguration : : BuildType buildType )
{
if ( toolMode = = IAnalyzerTool : : AnyMode )
return true ;
else if ( buildType = = ProjectExplorer : : BuildConfiguration : : Unknown )
return true ;
else if ( buildType = = ProjectExplorer : : BuildConfiguration : : Debug & &
toolMode = = IAnalyzerTool : : DebugMode )
return true ;
else if ( buildType = = ProjectExplorer : : BuildConfiguration : : Release & &
toolMode = = IAnalyzerTool : : ReleaseMode )
return true ;
else
return false ;
}
2011-04-04 14:39:28 +02:00
bool AnalyzerManager : : AnalyzerManagerPrivate : : showPromptDialog ( const QString & title ,
const QString & text ,
const QString & stopButtonText ,
const QString & cancelButtonText ) const
{
Utils : : CheckableMessageBox messageBox ( Core : : ICore : : instance ( ) - > mainWindow ( ) ) ;
messageBox . setWindowTitle ( title ) ;
messageBox . setText ( text ) ;
messageBox . setStandardButtons ( QDialogButtonBox : : Yes | QDialogButtonBox : : Cancel ) ;
if ( ! stopButtonText . isEmpty ( ) )
messageBox . button ( QDialogButtonBox : : Yes ) - > setText ( stopButtonText ) ;
if ( ! cancelButtonText . isEmpty ( ) )
messageBox . button ( QDialogButtonBox : : Cancel ) - > setText ( cancelButtonText ) ;
messageBox . setDefaultButton ( QDialogButtonBox : : Yes ) ;
messageBox . setCheckBoxVisible ( false ) ;
messageBox . exec ( ) ; ;
return messageBox . clickedStandardButton ( ) = = QDialogButtonBox : : Yes ;
}
2011-03-04 12:15:18 +01:00
void AnalyzerManager : : AnalyzerManagerPrivate : : startTool ( )
{
2011-04-04 14:39:28 +02:00
QTC_ASSERT ( q - > currentTool ( ) , return ) ;
2011-04-04 15:00:18 +02:00
// make sure mode is shown
q - > showMode ( ) ;
2011-03-04 12:15:18 +01:00
ProjectExplorer : : ProjectExplorerPlugin * pe = ProjectExplorer : : ProjectExplorerPlugin : : instance ( ) ;
// ### not sure if we're supposed to check if the RunConFiguration isEnabled
2011-03-29 14:45:21 +02:00
ProjectExplorer : : Project * pro = pe - > startupProject ( ) ;
const ProjectExplorer : : RunConfiguration * runConfig = 0 ;
ProjectExplorer : : BuildConfiguration : : BuildType buildType = ProjectExplorer : : BuildConfiguration : : Unknown ;
if ( pro ) {
if ( const ProjectExplorer : : Target * target = pro - > activeTarget ( ) ) {
runConfig = target - > activeRunConfiguration ( ) ;
// Build configuration is 0 for QML projects.
if ( const ProjectExplorer : : BuildConfiguration * buildConfig = target - > activeBuildConfiguration ( ) )
buildType = buildConfig - > buildType ( ) ;
}
}
if ( ! runConfig | | ! runConfig - > isEnabled ( ) )
2011-03-04 12:15:18 +01:00
return ;
2011-04-04 14:39:28 +02:00
// check if there already is an analyzer run
if ( m_currentRunControl ) {
// ask if user wants to restart the analyzer
const QString msg = tr ( " <html><head/><body><center><i>%1</i> is still running. You have to quit the Analyzer before being able to run another instance.<center/> "
" <center>Force it to quit?</center></body></html> " ) . arg ( m_currentRunControl - > displayName ( ) ) ;
bool stopRequested = showPromptDialog ( tr ( " Analyzer Still Running " ) , msg ,
tr ( " Stop active run " ) , tr ( " Keep Running " ) ) ;
if ( ! stopRequested )
return ; // no restart, keep it running, do nothing
// user selected to stop the active run. stop it, activate restart on stop
m_restartOnStop = true ;
q - > stopTool ( ) ;
return ;
}
2011-03-04 12:15:18 +01:00
IAnalyzerTool : : ToolMode toolMode = q - > currentTool ( ) - > mode ( ) ;
// check the project for whether the build config is in the correct mode
// if not, notify the user and urge him to use the correct mode
2011-04-04 14:39:28 +02:00
if ( ! buildTypeAccepted ( toolMode , buildType ) )
2011-03-04 12:15:18 +01:00
{
const QString & toolName = q - > currentTool ( ) - > displayName ( ) ;
2011-04-04 14:39:28 +02:00
const QString & toolMode = IAnalyzerTool : : modeString ( q - > currentTool ( ) - > mode ( ) ) ;
2011-03-04 12:15:18 +01:00
const QString currentMode = buildType = = ProjectExplorer : : BuildConfiguration : : Debug ? tr ( " Debug " ) : tr ( " Release " ) ;
QSettings * settings = Core : : ICore : : instance ( ) - > settings ( ) ;
2011-03-15 14:18:41 +01:00
const QString configKey = QLatin1String ( Constants : : MODE_ANALYZE ) + QLatin1Char ( ' / ' ) + QLatin1String ( " AnalyzeCorrectMode " ) ;
2011-03-04 12:15:18 +01:00
int ret ;
if ( settings - > contains ( configKey ) ) {
ret = settings - > value ( configKey , QDialog : : Accepted ) . toInt ( ) ;
} else {
2011-03-15 14:18:41 +01:00
const QString title = tr ( " Run %1 in %2 Mode? " ) . arg ( toolName ) . arg ( currentMode ) ;
const QString message = tr ( " <html><head/><body><p>You are trying to run the tool '%1' on an application in %2 mode. "
" The tool is designed to be used in %3 mode.</p><p> "
" Do you want to continue and run it in %2 mode?</p></body></html> " ) .
arg ( toolName ) . arg ( currentMode ) . arg ( toolMode ) ;
const QString checkBoxText = tr ( " &Do not ask again " ) ;
bool checkBoxSetting = false ;
const QDialogButtonBox : : StandardButton button =
Utils : : CheckableMessageBox : : question ( Core : : ICore : : instance ( ) - > mainWindow ( ) , title , message , checkBoxText ,
& checkBoxSetting , QDialogButtonBox : : Yes | QDialogButtonBox : : Cancel ,
QDialogButtonBox : : Cancel ) ;
ret = button = = QDialogButtonBox : : Yes ? QDialog : : Accepted : QDialog : : Rejected ;
if ( checkBoxSetting & & ret = = QDialog : : Accepted )
2011-03-04 12:15:18 +01:00
settings - > setValue ( configKey , ret ) ;
}
if ( ret = = QDialog : : Rejected )
return ;
}
pe - > runProject ( pro , Constants : : MODE_ANALYZE ) ;
2011-04-04 14:39:28 +02:00
q - > updateRunActions ( ) ;
2011-03-04 12:15:18 +01:00
}
2011-04-04 14:39:28 +02:00
2011-03-04 12:15:18 +01:00
// AnalyzerManager ////////////////////////////////////////////////////
AnalyzerManager * AnalyzerManager : : m_instance = 0 ;
2011-03-11 11:01:51 +01:00
AnalyzerManager : : AnalyzerManager ( AnalyzerOutputPane * op , QObject * parent ) :
2011-03-04 12:15:18 +01:00
QObject ( parent ) ,
d ( new AnalyzerManagerPrivate ( this ) )
{
m_instance = this ;
2011-03-10 16:11:20 +01:00
d - > m_outputpane = op ;
2011-03-04 12:15:18 +01:00
2011-04-04 14:39:28 +02:00
connect ( ModeManager : : instance ( ) , SIGNAL ( currentModeChanged ( Core : : IMode * ) ) ,
this , SLOT ( modeChanged ( Core : : IMode * ) ) ) ;
2011-03-04 12:15:18 +01:00
ProjectExplorer : : ProjectExplorerPlugin * pe = ProjectExplorer : : ProjectExplorerPlugin : : instance ( ) ;
connect ( pe , SIGNAL ( updateRunActions ( ) ) ,
this , SLOT ( updateRunActions ( ) ) ) ;
}
AnalyzerManager : : ~ AnalyzerManager ( )
{
delete d ;
}
2011-03-04 16:00:03 +01:00
bool AnalyzerManager : : isInitialized ( ) const
{
return d - > m_initialized ;
}
2011-03-04 12:15:18 +01:00
void AnalyzerManager : : shutdown ( )
{
2011-04-04 14:39:28 +02:00
saveToolSettings ( currentTool ( ) ) ;
2011-03-04 12:15:18 +01:00
}
AnalyzerManager * AnalyzerManager : : instance ( )
{
return m_instance ;
}
void AnalyzerManager : : modeChanged ( IMode * mode )
{
2011-03-29 14:48:58 +02:00
if ( ! d - > m_mainWindow )
return ;
2011-03-04 16:00:03 +01:00
const bool makeVisible = mode - > id ( ) = = Constants : : MODE_ANALYZE ;
if ( ! makeVisible )
return ;
d - > m_mainWindow - > setDockActionsVisible ( makeVisible ) ;
2011-03-04 12:15:18 +01:00
}
2011-03-04 16:00:01 +01:00
void AnalyzerManager : : selectTool ( IAnalyzerTool * tool )
2011-03-04 12:15:18 +01:00
{
QTC_ASSERT ( d - > m_tools . contains ( tool ) , return ) ;
toolSelected ( d - > m_tools . indexOf ( tool ) ) ;
}
void AnalyzerManager : : toolSelected ( int idx )
{
static bool selectingTool = false ;
if ( selectingTool )
return ;
selectingTool = true ;
2011-03-04 16:00:01 +01:00
IAnalyzerTool * oldTool = currentTool ( ) ;
2011-04-04 14:39:28 +02:00
if ( oldTool ! = 0 ) {
2011-03-04 12:15:18 +01:00
saveToolSettings ( oldTool ) ;
ActionManager * am = ICore : : instance ( ) - > actionManager ( ) ;
foreach ( const AnalyzerManagerPrivate : : ToolWidgetPair & widget , d - > m_toolWidgets . value ( oldTool ) ) {
QAction * toggleViewAction = widget . second - > toggleViewAction ( ) ;
am - > unregisterAction ( toggleViewAction , QString ( " Analyzer. " + widget . second - > objectName ( ) ) ) ;
d - > m_mainWindow - > removeDockWidget ( widget . second ) ;
///NOTE: QMainWindow (and FancyMainWindow) just look at @c findChildren<QDockWidget*>()
///if we don't do this, all kind of havoc might happen, including:
///- improper saveState/restoreState
///- improper list of qdockwidgets in popup menu
///- ...
widget . second - > setParent ( 0 ) ;
}
}
d - > m_toolGroup - > actions ( ) . at ( idx ) - > setChecked ( true ) ;
d - > m_toolBox - > setCurrentIndex ( idx ) ;
2011-04-04 14:39:28 +02:00
d - > m_controlsWidget - > setCurrentIndex ( idx ) ;
2011-03-04 12:15:18 +01:00
2011-03-04 16:00:01 +01:00
IAnalyzerTool * newTool = currentTool ( ) ;
2011-04-04 14:39:28 +02:00
foreach ( const AnalyzerManagerPrivate : : ToolWidgetPair & widget , d - > m_toolWidgets . value ( newTool ) ) {
d - > addDock ( newTool , widget . first , widget . second ) ;
2011-03-04 12:15:18 +01:00
}
2011-04-04 14:39:28 +02:00
loadToolSettings ( newTool ) ;
2011-03-10 16:11:20 +01:00
d - > m_outputpane - > setTool ( newTool ) ;
2011-03-04 12:15:18 +01:00
2011-04-04 14:39:28 +02:00
updateRunActions ( ) ;
2011-03-04 12:15:18 +01:00
selectingTool = false ;
2011-04-04 15:56:34 +02:00
emit currentToolChanged ( newTool ) ;
2011-03-04 12:15:18 +01:00
}
void AnalyzerManager : : toolSelected ( QAction * action )
{
toolSelected ( d - > m_toolGroup - > actions ( ) . indexOf ( action ) ) ;
}
void AnalyzerManager : : addTool ( IAnalyzerTool * tool )
{
2011-03-04 16:00:03 +01:00
d - > delayedInit ( ) ; // be sure that there is a valid IMode instance
2011-03-04 12:15:18 +01:00
Internal : : AnalyzerPlugin * plugin = Internal : : AnalyzerPlugin : : instance ( ) ;
QAction * action = new QAction ( tool - > displayName ( ) , d - > m_toolGroup ) ;
action - > setData ( d - > m_tools . count ( ) ) ;
action - > setCheckable ( true ) ;
2011-04-04 13:03:45 +02:00
ActionManager * am = Core : : ICore : : instance ( ) - > actionManager ( ) ;
QString actionId = QString ( Constants : : ANALYZER_TOOLS ) + QString : : number ( d - > m_toolGroup - > actions ( ) . count ( ) ) ;
Core : : Command * command = am - > registerAction ( action , actionId , Core : : Context ( Core : : Constants : : C_GLOBAL ) ) ;
d - > m_menu - > addAction ( command , Constants : : G_ANALYZER_TOOLS ) ;
2011-03-04 12:15:18 +01:00
d - > m_toolGroup - > setVisible ( d - > m_toolGroup - > actions ( ) . count ( ) > 1 ) ;
d - > m_tools . append ( tool ) ;
d - > m_toolBox - > addItem ( tool - > displayName ( ) ) ;
2011-04-04 14:39:28 +02:00
// populate controls widget
QWidget * controlWidget = tool - > createControlWidget ( ) ; // might be 0
d - > m_controlsWidget - > addWidget ( controlWidget ? controlWidget : AnalyzerUtils : : createDummyWidget ( ) ) ;
2011-03-10 16:11:20 +01:00
d - > m_toolBox - > setEnabled ( d - > m_toolBox - > count ( ) > 1 ) ;
2011-03-04 12:15:18 +01:00
if ( currentTool ( ) ! = tool )
selectTool ( tool ) ; // the first tool gets selected automatically due to signal emission from toolbox
2011-04-04 14:39:28 +02:00
2011-03-04 12:15:18 +01:00
tool - > initialize ( plugin ) ;
2011-04-04 14:39:28 +02:00
QSettings * defaultSettings = new QSettings ( this ) ;
d - > m_defaultSettings [ tool ] = defaultSettings ;
d - > m_mainWindow - > saveSettings ( defaultSettings ) ;
loadToolSettings ( tool ) ;
2011-03-04 12:15:18 +01:00
}
QDockWidget * AnalyzerManager : : createDockWidget ( IAnalyzerTool * tool , const QString & title ,
QWidget * widget , Qt : : DockWidgetArea area )
{
2011-04-04 14:39:28 +02:00
QTC_ASSERT ( ! widget - > objectName ( ) . isEmpty ( ) , return 0 ; ) ;
2011-03-04 12:15:18 +01:00
QDockWidget * dockWidget = d - > m_mainWindow - > addDockForWidget ( widget ) ;
2011-03-04 16:00:01 +01:00
d - > m_dockWidgets < < AnalyzerManagerPrivate : : DockPtr ( dockWidget ) ;
2011-03-04 12:15:18 +01:00
dockWidget - > setWindowTitle ( title ) ;
d - > m_toolWidgets [ tool ] < < qMakePair ( area , dockWidget ) ;
dockWidget - > installEventFilter ( d - > m_resizeEventFilter ) ;
d - > addDock ( tool , area , dockWidget ) ;
return dockWidget ;
}
IAnalyzerTool * AnalyzerManager : : currentTool ( ) const
{
if ( ! d - > m_toolGroup - > checkedAction ( ) ) {
return 0 ;
}
2011-03-04 16:00:03 +01:00
return d - > m_tools . value ( d - > m_toolGroup - > checkedAction ( ) - > data ( ) . toInt ( ) ) ;
2011-03-04 12:15:18 +01:00
}
QList < IAnalyzerTool * > AnalyzerManager : : tools ( ) const
{
return d - > m_tools ;
}
void AnalyzerManager : : startTool ( )
{
d - > startTool ( ) ;
}
2011-04-04 14:39:28 +02:00
void AnalyzerManager : : startToolRemote ( )
{
StartRemoteDialog dlg ;
if ( dlg . exec ( ) ! = QDialog : : Accepted )
return ;
AnalyzerStartParameters params ;
params . connParams = dlg . sshParams ( ) ;
params . debuggee = dlg . executable ( ) ;
params . debuggeeArgs = dlg . arguments ( ) ;
params . displayName = dlg . executable ( ) ;
params . startMode = StartRemote ;
params . workingDirectory = dlg . workingDirectory ( ) ;
AnalyzerRunControl * rc = createAnalyzer ( params ) ;
QTC_ASSERT ( rc , return ) ;
ProjectExplorer : : ProjectExplorerPlugin : : instance ( ) - > startRunControl ( rc , Constants : : MODE_ANALYZE ) ;
}
2011-03-04 12:15:18 +01:00
void AnalyzerManager : : runControlCreated ( AnalyzerRunControl * rc )
{
QTC_ASSERT ( ! d - > m_currentRunControl , qt_noop ( ) ) ;
d - > m_currentRunControl = rc ;
connect ( rc , SIGNAL ( finished ( ) ) , this , SLOT ( handleToolFinished ( ) ) ) ;
}
void AnalyzerManager : : stopTool ( )
{
if ( ! d - > m_currentRunControl )
return ;
2011-04-04 14:39:28 +02:00
// be sure to call handleToolFinished only once, and only when the engine is really finished
if ( d - > m_currentRunControl - > stop ( ) = = ProjectExplorer : : RunControl : : StoppedSynchronously )
handleToolFinished ( ) ;
// else: wait for the finished() signal to trigger handleToolFinished()
2011-03-04 12:15:18 +01:00
}
void AnalyzerManager : : handleToolFinished ( )
{
d - > m_currentRunControl = 0 ;
2011-04-04 14:39:28 +02:00
updateRunActions ( ) ;
if ( d - > m_restartOnStop ) {
startTool ( ) ;
d - > m_restartOnStop = false ;
}
2011-03-04 12:15:18 +01:00
}
Utils : : FancyMainWindow * AnalyzerManager : : mainWindow ( ) const
{
return d - > m_mainWindow ;
}
void AnalyzerManager : : resetLayout ( )
{
d - > m_mainWindow - > restoreSettings ( d - > m_defaultSettings . value ( currentTool ( ) ) ) ;
}
void AnalyzerManager : : loadToolSettings ( IAnalyzerTool * tool )
{
2011-03-10 16:11:20 +01:00
QTC_ASSERT ( d - > m_mainWindow , return ; )
2011-03-04 12:15:18 +01:00
QSettings * settings = Core : : ICore : : instance ( ) - > settings ( ) ;
settings - > beginGroup ( QLatin1String ( " AnalyzerViewSettings_ " ) + tool - > id ( ) ) ;
if ( settings - > value ( " ToolSettingsSaved " , false ) . toBool ( ) ) {
d - > m_mainWindow - > restoreSettings ( settings ) ;
}
settings - > endGroup ( ) ;
}
void AnalyzerManager : : saveToolSettings ( IAnalyzerTool * tool )
{
2011-03-04 16:00:03 +01:00
if ( ! tool )
return ; // no active tool, do nothing
2011-03-10 16:11:20 +01:00
QTC_ASSERT ( d - > m_mainWindow , return ; )
2011-03-04 16:00:03 +01:00
2011-03-04 12:15:18 +01:00
QSettings * settings = Core : : ICore : : instance ( ) - > settings ( ) ;
settings - > beginGroup ( QLatin1String ( " AnalyzerViewSettings_ " ) + tool - > id ( ) ) ;
d - > m_mainWindow - > saveSettings ( settings ) ;
settings - > setValue ( " ToolSettingsSaved " , true ) ;
settings - > endGroup ( ) ;
}
void AnalyzerManager : : updateRunActions ( )
{
ProjectExplorer : : ProjectExplorerPlugin * pe = ProjectExplorer : : ProjectExplorerPlugin : : instance ( ) ;
ProjectExplorer : : Project * project = pe - > startupProject ( ) ;
2011-03-10 16:11:20 +01:00
bool startEnabled = ! d - > m_currentRunControl & & pe - > canRun ( project , Constants : : MODE_ANALYZE )
& & currentTool ( ) ;
2011-03-04 12:15:18 +01:00
d - > m_startAction - > setEnabled ( startEnabled ) ;
2011-04-04 14:39:28 +02:00
d - > m_startRemoteAction - > setEnabled ( ! d - > m_currentRunControl & & currentTool ( )
& & currentTool ( ) - > canRunRemotely ( ) ) ;
d - > m_toolBox - > setEnabled ( ! d - > m_currentRunControl ) ;
d - > m_toolGroup - > setEnabled ( ! d - > m_currentRunControl ) ;
d - > m_stopAction - > setEnabled ( d - > m_currentRunControl ) ;
2011-03-04 12:15:18 +01:00
}
2011-03-08 13:56:52 +01:00
2011-03-16 13:49:28 +01:00
void AnalyzerManager : : showStatusMessage ( const QString & message , int timeoutMS )
{
d - > m_statusLabel - > showStatusMessage ( message , timeoutMS ) ;
}
void AnalyzerManager : : showPermanentStatusMessage ( const QString & message )
{
showStatusMessage ( message , - 1 ) ;
}
QString AnalyzerManager : : msgToolStarted ( const QString & name )
{
return tr ( " Tool '%1' started... " ) . arg ( name ) ;
}
QString AnalyzerManager : : msgToolFinished ( const QString & name , int issuesFound )
{
return issuesFound ?
tr ( " Tool '%1' finished, %n issues were found. " , 0 , issuesFound ) . arg ( name ) :
tr ( " Tool '%1' finished, no issues were found. " ) . arg ( name ) ;
}
2011-04-04 14:39:28 +02:00
AnalyzerRunControl * AnalyzerManager : : createAnalyzer ( const AnalyzerStartParameters & sp ,
ProjectExplorer : : RunConfiguration * rc )
{
return d - > m_runControlFactory - > create ( sp , rc ) ;
}
2011-04-04 15:00:18 +02:00
void AnalyzerManager : : showMode ( )
{
if ( d - > m_mode )
ModeManager : : instance ( ) - > activateMode ( d - > m_mode - > id ( ) ) ;
d - > m_outputpane - > popup ( ) ;
}
2011-03-08 13:56:52 +01:00
# include "analyzermanager.moc"