📄 projectmanager.cpp
字号:
/** This file is part of QDevelop, an open-source cross-platform IDE* Copyright (C) 2006 Jean-Luc Biord** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA** Contact e-mail: Jean-Luc Biord <jl.biord@free.fr>* Program URL : http://qdevelop.org**/#include "mainimpl.h"#include "projectmanager.h"#include "ui_exechoice.h"#include "addexistantimpl.h"#include "addnewimpl.h"#include "addnewclassimpl.h"#include "addscopeimpl.h"#include "misc.h"#include "newprojectimpl.h"#include "projectpropertieimpl.h"#include "subclassingimpl.h"#include "parametersimpl.h"#include "tabwidget.h"#include "editor.h"//#include <QTreeWidget>#include <QFile>#include <QDir>#include <QDateTime>#include <QDebug>#include <QDialog>#include <QMessageBox>#include <QProcess>#include <QInputDialog>#include <QUiLoader>#include <QScrollArea>#include <QDesktopWidget>#include <QMetaMethod>#include <QSqlQuery>#include <QSqlError>#include <QProgressBar>#include <QPlastiqueStyle>#include <QSplashScreen>//ProjectManager::ProjectManager(MainImpl * parent, TreeProject *treeFiles, TreeClasses *treeClasses) : m_parent(parent), m_treeFiles(treeFiles), m_treeClasses(treeClasses){}void ProjectManager::init(QString name){ m_treeFiles->clear(); m_treeClasses->clear(); // QTreeWidgetItem *newProjectItem = new QTreeWidgetItem(m_treeFiles); // // connect(m_treeFiles, SIGNAL(addNewItem(QTreeWidgetItem *, QString)), this, SLOT(slotAddNewItem(QTreeWidgetItem *, QString))); connect(m_treeFiles, SIGNAL(addNewClass(QTreeWidgetItem *)), this, SLOT(slotAddNewClass(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(addExistingsFiles(QTreeWidgetItem *)), this, SLOT(slotAddExistingFiles(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(addScope(QTreeWidgetItem *)), this, SLOT(slotAddScope(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(lupdate(QTreeWidgetItem *)), this, SLOT(slotlupdate(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(lrelease(QTreeWidgetItem *)), this, SLOT(slotlrelease(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(addSubProject(QTreeWidgetItem *)), this, SLOT(slotAddSubProject(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(projectPropertie(QTreeWidgetItem *)), this, SLOT(slotProjectPropertie(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(open(QTreeWidgetItem *, int)), m_parent, SLOT(slotDoubleClickTreeFiles(QTreeWidgetItem *, int))); connect(m_treeFiles, SIGNAL(deleteItem(QTreeWidgetItem *)), this, SLOT(slotDeleteItem(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(renameItem(QTreeWidgetItem *)), this, SLOT(slotRenameItem(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(subclassing(QTreeWidgetItem *)), this, SLOT(slotSubclassing(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(previewForm(QTreeWidgetItem *)), this, SLOT(slotPreviewForm(QTreeWidgetItem *))); connect(m_treeFiles, SIGNAL(sort()), this, SLOT(slotSort())); m_isModifiedProject = false; m_previewForm = 0; m_parameters.isEmpty = true; loadProject(name, newProjectItem); parseTreeClasses(); loadProjectSettings();}//ProjectManager::~ProjectManager(){ QString directory = projectDirectory(m_treeFiles->topLevelItem(0)); if ( m_treeFiles->topLevelItem ( 0 ) ) m_treeClasses->toDB( directory ); m_treeFiles->clear(); m_treeClasses->clear(); if ( m_previewForm ) delete m_previewForm; QSqlDatabase::database().close();}//QStringList ProjectManager::parents(QTreeWidgetItem *it){ QStringList parentsList; if ( !it ) return QStringList(); QTreeWidgetItem *parent = it; if ( toKey( it->data(0, Qt::UserRole) ) == "PROJECT" || toKey( it->data(0, Qt::UserRole) ) == "SCOPE" ) parentsList.prepend( it->text( 0 ) ); // while ( (parent = parent->parent()) ) { if ( toKey( parent->data(0, Qt::UserRole) ) == "PROJECT" || toKey( parent->data(0, Qt::UserRole) ) == "SCOPE" ) parentsList.prepend( parent->text( 0 ) ); } return parentsList;}//void ProjectManager::parseTreeClasses(bool force){ if ( !m_parent->showTreeClasses() ) return; m_treeClasses->clear(); QString directory = projectDirectory( m_treeFiles->topLevelItem( 0 ) ); if ( QFile::exists( directory+"/qdevelop-settings.db" ) && !force) { m_treeClasses->fromDB( directory ); } else { // QList<QTreeWidgetItem *> projectsList; childsList(0, "PROJECT", projectsList); for (int nbProjects=0; nbProjects < projectsList.count(); nbProjects++) { QString projectName = projectsList.at(nbProjects)->text(0); QString projectDir = findData(projectName, "projectDirectory"); QStringList files; sources(projectsList.at(nbProjects), files ); headers(projectsList.at(nbProjects), files ); files.sort(); extern QSplashScreen *splash; QProgressBar *bar = 0; if ( !splash ) { bar = new QProgressBar( 0 ); bar->setStyle( new QPlastiqueStyle() ); QRect screenGeometry = QDesktopWidget().screenGeometry(); bar->setGeometry( (screenGeometry.width()-(screenGeometry.width()/8))/2, (screenGeometry.height()-30)/2, screenGeometry.width()/8, 30 ); bar->setWindowFlags( Qt::Tool | Qt::WindowStaysOnTopHint ); bar->setAlignment( Qt::AlignHCenter ); bar->setMaximum( files.count() ); bar->setFormat( tr("Project parsing")+" %p%" ); bar->show(); } int value = 0; foreach(QString s, files) { QStringList parentsList = parents(projectsList.at(nbProjects)); QString buffer; Editor *editor = 0; foreach(Editor *ed, m_parent->allEditors() ) { if ( ed->filename() == s) { editor = ed; } } if ( editor ) { buffer = editor->toPlainText(); } else { QFile file(s); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) continue; buffer = file.readAll(); file.close(); } m_treeClasses->updateClasses(s, buffer, parentsList, "."+s.section(".", -1, -1)); if ( !splash ) bar->setValue( value++ ); else splash->showMessage(QObject::tr("Current project parsing")+" "+QString::number((100/files.count())*value++)+"%", Qt::AlignRight | Qt::AlignTop, Qt::white); } if ( !splash ) delete bar; } }}//Parameters ProjectManager::parameters(){ if ( m_parameters.isEmpty ) { ParametersImpl *parametersimpl = new ParametersImpl(0); m_parameters = parametersimpl->parameters(); delete parametersimpl; } m_parameters.isEmpty = false; return m_parameters;}//void ProjectManager::setParameters(Parameters p){ m_parameters = p; m_parameters.isEmpty = false;}//QStringList ProjectManager::dependpath(QTreeWidgetItem *it){ if ( !it ) return QStringList(); while ( toKey( it->data(0, Qt::UserRole) ) != "PROJECT" ) it = it->parent(); QTreeWidgetItem *itDepend = 0; for (int i=0; i<it->childCount(); i++) { if ( toKey( it->child(i)->data(0, Qt::UserRole) ) == "DEPENDPATH" ) { itDepend = it->child(i); break; } } if ( !itDepend ) return QStringList(); QStringList path; for (int i=0; i<itDepend->childCount(); i++) { path << itDepend->child( i )->text(0); } return path;}//bool ProjectManager::close(){ QTreeWidgetItem *it = item(m_treeFiles->topLevelItem ( 0 ), "PROJECT", Key); if ( !it ) return true; QString projectName = it->text(0); if ( isModifiedProject() ) { // Save? int rep = QMessageBox::question(0, "QDevelop", tr("Save project changes ?"), tr("Yes"), tr("No"), tr("Cancel"), 0, 2 ); if ( rep == 2 ) return false; if ( rep == 0 ) { slotSaveProject(); } } return true;}//void ProjectManager::saveProjectSettings(){ // Save opened files QString directory = projectDirectory(m_treeFiles->topLevelItem(0)); if ( !connectDB( directory + "/qdevelop-settings.db" ) ) return; QSqlQuery query(QSqlDatabase::database( directory + "/qdevelop-settings.db") ); QString queryString = "delete from editors where 1"; if (!query.exec(queryString)) { qDebug() << "Failed to execute" << queryString; return; } queryString = "delete from bookmarks where 1"; if (!query.exec(queryString)) { qDebug() << "Failed to execute" << queryString; return; } queryString = "delete from breakpoints where 1"; if (!query.exec(queryString)) { qDebug() << "Failed to execute" << queryString; return; } queryString = "delete from config where 1"; if (!query.exec(queryString)) { qDebug() << "Failed to execute" << queryString; return; } queryString = "delete from projectsDirectories where 1"; if (!query.exec(queryString)) { qDebug() << "Failed to execute" << queryString; return; } foreach(Editor *editor, m_parent->allEditors() ) { if ( editor ) { QString filename = QDir( directory ).relativeFilePath( editor->filename() ); QSqlQuery query( QSqlDatabase::database( directory + "/qdevelop-settings.db" )); query.prepare("INSERT INTO editors (filename, scrollbar, numline) " "VALUES (:filename, :scrollbar, :numline)"); query.bindValue(":filename", filename); query.bindValue(":scrollbar", editor->verticalScrollBar()); query.bindValue(":numline", editor->currentLineNumber()); if ( !query.exec() ) qDebug() << query.lastError(); foreach(int line, editor->bookmarksList()) { filename = QDir( directory ).relativeFilePath( editor->filename() ); QSqlQuery query( QSqlDatabase::database( directory + "/qdevelop-settings.db" )); query.prepare("INSERT INTO bookmarks (filename, numline) " "VALUES (:filename, :numline)"); query.bindValue(":filename", filename); query.bindValue(":numline", line); if ( !query.exec() ) qDebug() << query.lastError(); } foreach(QTextBlock block, editor->breakpointsList()) { BlockUserData *blockUserData = (BlockUserData*)block.userData(); filename = QDir( directory ).relativeFilePath( editor->filename() ); QSqlQuery query( QSqlDatabase::database( directory + "/qdevelop-settings.db" )); query.prepare("INSERT INTO breakpoints (filename, numline, breakpointCondition, isTrue) " "VALUES (:filename, :numline, :breakpointCondition, :isTrue)"); query.bindValue(":filename", filename); query.bindValue(":numline", editor->currentLineNumber(block)); query.bindValue(":breakpointCondition", blockUserData->breakpointCondition); query.bindValue(":isTrue", blockUserData->isTrue); if ( !query.exec() ) qDebug() << query.lastError(); } } } // QList<QTreeWidgetItem *> projectsList; childsList(0, "PROJECT", projectsList);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -