2009-07-17 17:19:23 +02:00
/**************************************************************************
* *
* * This file is part of Qt Creator
* *
* * Copyright ( c ) 2009 Nokia Corporation and / or its subsidiary ( - ies ) .
* *
* * Contact : Nokia Corporation ( qt - info @ nokia . com )
* *
* * Commercial Usage
* *
* * Licensees holding valid Qt Commercial licenses may use this file in
* * accordance with the Qt Commercial License Agreement provided with the
* * Software or , alternatively , in accordance with the terms contained in
* * a written agreement between you and Nokia .
* *
* * GNU Lesser General Public License Usage
* *
* * Alternatively , 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.
* *
* * If you are unsure which license is appropriate for your use , please
2009-08-14 09:30:56 +02:00
* * contact the sales department at http : //qt.nokia.com/contact.
2009-07-17 17:19:23 +02:00
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "basecheckoutwizard.h"
# include "vcsbaseconstants.h"
# include "checkoutwizarddialog.h"
# include "checkoutjobs.h"
# include <projectexplorer/projectexplorer.h>
# include <projectexplorer/session.h>
# include <QtCore/QCoreApplication>
# include <QtCore/QFileInfo>
# include <QtCore/QDir>
# include <QtGui/QMessageBox>
namespace VCSBase {
struct BaseCheckoutWizardPrivate {
2009-07-21 11:14:48 +02:00
BaseCheckoutWizardPrivate ( ) : dialog ( 0 ) { }
2009-07-17 17:19:23 +02:00
void clear ( ) ;
Internal : : CheckoutWizardDialog * dialog ;
2009-07-21 11:14:48 +02:00
QList < QWizardPage * > parameterPages ;
2009-07-17 17:19:23 +02:00
QString checkoutPath ;
2009-11-27 10:33:24 +01:00
QString id ;
2009-07-17 17:19:23 +02:00
} ;
void BaseCheckoutWizardPrivate : : clear ( )
{
2009-07-21 11:14:48 +02:00
parameterPages . clear ( ) ;
2009-07-17 17:19:23 +02:00
dialog = 0 ;
checkoutPath . clear ( ) ;
}
BaseCheckoutWizard : : BaseCheckoutWizard ( QObject * parent ) :
Core : : IWizard ( parent ) ,
d ( new BaseCheckoutWizardPrivate )
{
}
BaseCheckoutWizard : : ~ BaseCheckoutWizard ( )
{
delete d ;
}
2010-01-14 14:14:39 +01:00
Core : : IWizard : : WizardKind BaseCheckoutWizard : : kind ( ) const
2009-07-17 17:19:23 +02:00
{
2009-11-27 10:33:24 +01:00
return Core : : IWizard : : ProjectWizard ;
2009-07-17 17:19:23 +02:00
}
QString BaseCheckoutWizard : : category ( ) const
{
return QLatin1String ( VCSBase : : Constants : : VCS_WIZARD_CATEGORY ) ;
}
2010-01-07 18:17:24 +01:00
QString BaseCheckoutWizard : : displayCategory ( ) const
2009-07-17 17:19:23 +02:00
{
2009-11-27 10:33:24 +01:00
return QCoreApplication : : translate ( " VCSBase " , VCSBase : : Constants : : VCS_WIZARD_TR_CATEGORY ) ;
}
QString BaseCheckoutWizard : : id ( ) const
{
return d - > id ;
}
void BaseCheckoutWizard : : setId ( const QString & id )
{
d - > id = id ;
2009-07-17 17:19:23 +02:00
}
QStringList BaseCheckoutWizard : : runWizard ( const QString & path , QWidget * parent )
{
// Create dialog and launch
2009-07-21 11:14:48 +02:00
d - > parameterPages = createParameterPages ( path ) ;
Internal : : CheckoutWizardDialog dialog ( d - > parameterPages , parent ) ;
2009-07-17 17:19:23 +02:00
d - > dialog = & dialog ;
connect ( & dialog , SIGNAL ( progressPageShown ( ) ) , this , SLOT ( slotProgressPageShown ( ) ) ) ;
2010-01-07 18:17:24 +01:00
dialog . setWindowTitle ( displayName ( ) ) ;
2009-07-17 17:19:23 +02:00
if ( dialog . exec ( ) ! = QDialog : : Accepted )
return QStringList ( ) ;
// Now try to find the project file and open
const QString checkoutPath = d - > checkoutPath ;
d - > clear ( ) ;
QString errorMessage ;
const QString projectFile = openProject ( checkoutPath , & errorMessage ) ;
if ( projectFile . isEmpty ( ) ) {
QMessageBox msgBox ( QMessageBox : : Warning , tr ( " Cannot Open Project " ) ,
2009-08-05 09:17:26 +02:00
tr ( " Failed to open project in '%1'. " ) . arg ( QDir : : toNativeSeparators ( checkoutPath ) ) ) ;
2009-07-17 17:19:23 +02:00
msgBox . setDetailedText ( errorMessage ) ;
msgBox . exec ( ) ;
return QStringList ( ) ;
}
return QStringList ( projectFile ) ;
}
2009-07-27 09:22:26 +02:00
static inline QString msgNoProjectFiles ( const QDir & dir , const QStringList & patterns )
{
2009-08-05 09:17:26 +02:00
return BaseCheckoutWizard : : tr ( " Could not find any project files matching (%1) in the directory '%2'. " ) . arg ( patterns . join ( QLatin1String ( " , " ) ) , QDir : : toNativeSeparators ( dir . absolutePath ( ) ) ) ;
2009-07-27 09:22:26 +02:00
}
// Try to find the project files in a project directory with some smartness
static QFileInfoList findProjectFiles ( const QDir & projectDir , QString * errorMessage )
{
// Hardcoded: Find *.pro/Cmakefiles
QStringList projectFilePatterns ;
projectFilePatterns < < QLatin1String ( " *.pro " ) < < QLatin1String ( " CMakeLists.txt " ) ;
// Project directory
QFileInfoList projectFiles = projectDir . entryInfoList ( projectFilePatterns , QDir : : Files | QDir : : NoDotAndDotDot | QDir : : Readable ) ;
if ( ! projectFiles . empty ( ) )
return projectFiles ;
// Try a 'src' directory
QFileInfoList srcDirs = projectDir . entryInfoList ( QStringList ( QLatin1String ( " src " ) ) , QDir : : Dirs | QDir : : NoDotAndDotDot | QDir : : Readable ) ;
if ( srcDirs . empty ( ) ) {
* errorMessage = msgNoProjectFiles ( projectDir , projectFilePatterns ) ;
return QFileInfoList ( ) ;
}
const QDir srcDir = QDir ( srcDirs . front ( ) . absoluteFilePath ( ) ) ;
projectFiles = srcDir . entryInfoList ( projectFilePatterns , QDir : : Files | QDir : : NoDotAndDotDot | QDir : : Readable ) ;
if ( projectFiles . empty ( ) ) {
* errorMessage = msgNoProjectFiles ( srcDir , projectFilePatterns ) ;
return QFileInfoList ( ) ;
}
return projectFiles ; ;
}
2009-07-17 17:19:23 +02:00
QString BaseCheckoutWizard : : openProject ( const QString & path , QString * errorMessage )
{
ProjectExplorer : : ProjectExplorerPlugin * pe = ProjectExplorer : : ProjectExplorerPlugin : : instance ( ) ;
if ( ! pe ) {
* errorMessage = tr ( " The Project Explorer is not available. " ) ;
return QString ( ) ;
}
// Search the directory for project files
const QDir dir ( path ) ;
if ( ! dir . exists ( ) ) {
* errorMessage = tr ( " '%1' does not exist. " ) . arg ( path ) ; // Should not happen
return QString ( ) ;
}
2009-07-27 09:22:26 +02:00
QFileInfoList projectFiles = findProjectFiles ( dir , errorMessage ) ;
if ( projectFiles . empty ( ) )
2009-07-17 17:19:23 +02:00
return QString ( ) ;
2009-07-27 09:22:26 +02:00
// Open. Do not use a busy cursor here as additional wizards might pop up
2009-07-17 17:19:23 +02:00
const QString projectFile = projectFiles . front ( ) . absoluteFilePath ( ) ;
if ( ! pe - > openProject ( projectFile ) ) {
* errorMessage = tr ( " Unable to open the project '%1'. " ) . arg ( projectFile ) ;
return QString ( ) ;
}
return projectFile ;
}
void BaseCheckoutWizard : : slotProgressPageShown ( )
{
2009-07-21 11:14:48 +02:00
const QSharedPointer < AbstractCheckoutJob > job = createJob ( d - > parameterPages , & ( d - > checkoutPath ) ) ;
2009-07-17 17:19:23 +02:00
if ( ! job . isNull ( ) )
d - > dialog - > start ( job ) ;
}
} // namespace VCSBase