📄 treeclasses.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 "treeclasses.h"#include "projectmanager.h"#include "mainimpl.h"#include "misc.h"#include "ui_addnewclassvariable.h"#include "addnewclassmethodimpl.h"#include "addnewclassvariableimpl.h"#include "addsetgetimpl.h"#include <QMenu>#include <QMouseEvent>#include <QDir>#include <QProcess>#include <QVariant>#include <QHeaderView>#include <QMessageBox>#include <QTreeWidgetItemIterator>#include <QtSql/QSqlQuery>#include <QtSql/QSqlError>#include <QDebug>//TreeClasses::TreeClasses(QWidget * parent) : QTreeWidget(parent){ header()->hide(); m_treeClassesItems = new QList<ParsedItem>();}//TreeClasses::~TreeClasses(){ delete m_treeClassesItems;}//void TreeClasses::clear(){ QTreeWidget::clear();}//void TreeClasses::updateClasses(QString filename, QString buffer, QStringList parents, QString ext){ if ( !m_ctagsPresent || !QFile::exists(m_ctagsName) ) return; while ( tempProcessMap.count() > 10 ) qApp->processEvents(); QProcess *process = new QProcess(); connect(process, SIGNAL(finished(int , QProcess::ExitStatus)), this, SLOT(slotParseCtags()) ); tempProcessMap[process].ext = ext; tempProcessMap[process].numTempFile = 0; tempProcessMap[process].filename = filename; QString f; do { tempProcessMap[process].numTempFile++; f = QDir::tempPath()+"/qdevelop_"+QString::number(tempProcessMap[process].numTempFile)+ext; } while ( QFile::exists( f ) ); QFile tempFileRead( QDir::tempPath()+"/qdevelop_"+QString::number( tempProcessMap[process].numTempFile )+ext ); if (!tempFileRead.open(QIODevice::WriteOnly | QIODevice::Text)) return; tempFileRead.write( buffer.toLocal8Bit() ); tempProcessMap[process].parents = parents; tempFileRead.close(); // process->start(m_ctagsName, QStringList()<<"-f " + QDir::tempPath()+"/qdevelop_ctags"+ext+"."+QString::number(tempProcessMap[process].numTempFile) << "--fields=+z+k+a+S+l+n" << "--c++-kinds=+p"<< QDir::tempPath()+"/qdevelop_"+QString::number( tempProcessMap[process].numTempFile )+tempProcessMap[process].ext); //}//void TreeClasses::slotParseCtags(){ QProcess *process = ((QProcess*)sender()); process->waitForFinished( -1 ); QString read; QFile file( QDir::tempPath()+"/qdevelop_ctags"+tempProcessMap[process].ext+"."+QString::number(tempProcessMap[process].numTempFile) ); if ( !file.open(QIODevice::ReadOnly | QIODevice::Text) ) return; read = file.readAll(); file.close(); // QString filenameRead = QDir::tempPath()+"/qdevelop_"+QString::number( tempProcessMap[process].numTempFile )+tempProcessMap[process].ext; if ( !QFile( filenameRead ).remove() ) qDebug()<<"Unable to remove"<<QDir::tempPath()+"/qdevelop_"+QString::number( tempProcessMap[process].numTempFile )+tempProcessMap[process].ext; QString filenameWrite = QDir::tempPath()+"/qdevelop_ctags"+tempProcessMap[process].ext+"."+QString::number(tempProcessMap[process].numTempFile); if ( !QFile( filenameWrite ).remove() ) qDebug()<<"Unable to remove" << QDir::tempPath()+"/qdevelop_ctags"+tempProcessMap[process].ext+"."+QString::number(tempProcessMap[process].numTempFile); QStringList parents = tempProcessMap[process].parents; QString filename = tempProcessMap[process].filename; QString ext = tempProcessMap[process].ext; tempProcessMap.remove( process ); process->deleteLater(); QDir dir(filename); dir.makeAbsolute(); QString absolutePath = dir.path(); QString pathHash = getPathHash(absolutePath); if ( read.isEmpty() ) return; if ( topLevelItem(0) ) { setSortingSymbols(topLevelItem(0), true, filename, ext, parents); } foreach(QString s, read.split("\n", QString::SkipEmptyParts) ) { if ( !s.isEmpty() && s.simplified().at(0) == '!' ) continue; //if( s.contains("typeref:") ) //continue; s += '\t'; s.replace("__anon", pathHash); ParsedItem parsedItem; parsedItem.parents = parents; parsedItem.markedForDelete = false; parsedItem.name = s.section("\t", 0, 0).simplified(); //parsedItem.ex_cmd = s.section("/^", -1, -1).section("$/", 0, 0).simplified(); QString ex_cmd = s.section("/^", -1, -1).section("\"", 0, 0).simplified(); parsedItem.ex_cmd = ex_cmd; QString numline = s.section("line:", -1, -1).section("\t", 0, 0).simplified(); if ( ext == QString(".cpp") ) parsedItem.implementation = filename + "|" + numline; else parsedItem.declaration = filename + "|" + numline; parsedItem.language = s.section("language:", -1, -1).section("\t", 0, 0).simplified(); if ( s.contains("class:") ) parsedItem.classname = s.section("class:", -1, -1).section("\t", 0, 0).simplified(); if ( s.contains("struct:") ) parsedItem.structname = s.section("struct:", -1, -1).section("\t", 0, 0).simplified(); if ( s.contains("namespace:") ) parsedItem.structname = s.section("namespace:", -1, -1).section("\t", 0, 0).simplified(); if ( s.contains("enum:") ) parsedItem.enumname = s.section("enum:", -1, -1).section("\t", 0, 0).simplified(); if ( s.contains("access:") ) parsedItem.access = s.section("access:", -1, -1).section("\t", 0, 0).simplified(); parsedItem.signature = s.section("signature:", -1, -1).section("\t", 0, 0).simplified(); parsedItem.kind = s.section("kind:", -1, -1).section("\t", 0, 0).simplified(); //m_parsedItemsList.append( parsedItem ); parse(parsedItem); } //m_parsedItemsList.clear(); if ( topLevelItem(0) ) { m_listDeletion.clear(); deleteMarked( topLevelItem(0) ); for (int i=0; i<m_listDeletion.count(); i++) delete m_listDeletion.at(i); m_listDeletion.clear(); setItemExpanded(topLevelItem(0), true ); sortItems(0, Qt::AscendingOrder); m_treeClassesItems->clear(); setSortingSymbols(topLevelItem(0), false, QString(), QString(), QStringList()); }}//void TreeClasses::parse(ParsedItem parsedItem){ // Begin parsing if ( parsedItem.name.simplified().isEmpty() ) return; QTreeWidgetItem *itemParent = topLevelItem(0); int level = 0; foreach(QString s, parsedItem.parents) { itemParent = findAndCreate(itemParent, "", s, "parent:"+QString::number(level++)+":"+s, false, false, ParsedItem()); } if ( parsedItem.classname.count() || parsedItem.structname.count() || parsedItem.enumname.count() ) { QString text; QString pixname; if ( parsedItem.classname.count() ) { text = parsedItem.classname; pixname = "class"; } else if ( parsedItem.structname.count() ) { text = parsedItem.structname; pixname = "struct"; } else if ( parsedItem.enumname.count() ) { text = parsedItem.enumname; pixname = "enum"; } foreach(QString classname, text.split("::", QString::SkipEmptyParts) ) { //itemParent = findAndCreate(itemParent, QString(), parsedItem.classname, "class:"+classname, true, false, ParsedItem()); itemParent = findAndCreate(itemParent, pixname, classname, "class:"+classname, true, false, ParsedItem()); } } if ( parsedItem.kind == "c" ) // class { findAndCreate(itemParent, "class", parsedItem.name, "class:"+parsedItem.name, true, true, parsedItem); } else if ( parsedItem.kind == "p" ) // function prototype in declaration (header) { QString pixname; if ( !parsedItem.access.isEmpty() ) pixname = parsedItem.access+"_meth"; findAndCreate(itemParent, pixname, parsedItem.name+parsedItem.signature, "function:"+parsedItem.name+signature(parsedItem.signature), false, true, parsedItem); } else if ( parsedItem.kind == "f" ) // function in implementation (sources) { QString pixname; if ( !parsedItem.access.isEmpty() ) pixname = parsedItem.access+"_meth"; else if ( parsedItem.classname.isEmpty() ) pixname = "global_meth"; findAndCreate(itemParent, pixname, parsedItem.name+parsedItem.signature, "function:"+parsedItem.name+signature(parsedItem.signature), false, true, parsedItem); } else if ( parsedItem.kind == "m" ) // member { findAndCreate(itemParent, parsedItem.access+"_var", parsedItem.name, "variable:"+parsedItem.name, false, true, parsedItem); } else if ( parsedItem.kind == "v" ) // variable { QString pixname; if ( parsedItem.classname.isEmpty() ) pixname = "global_var"; findAndCreate(itemParent, pixname, parsedItem.name, "variable:"+parsedItem.name, false, true, parsedItem); } else if ( parsedItem.kind == "s" ) // struct { QString pixname; pixname = "struct"; findAndCreate(itemParent, pixname, parsedItem.name, "class:"+parsedItem.name, false, true, parsedItem); } else if ( parsedItem.kind == "g" ) // enum name { QString pixname; pixname = "public_enum"; if ( !parsedItem.access.isEmpty() ) pixname = parsedItem.access+"_enum"; findAndCreate(itemParent, pixname, parsedItem.name, "class:"+parsedItem.name, false, true, parsedItem); } else if ( parsedItem.kind == "e" ) // enum value { QString pixname; if ( parsedItem.classname.isEmpty() ) pixname = "public_var"; findAndCreate(itemParent, pixname, parsedItem.name, "enum:"+parsedItem.name, false, true, parsedItem); } else if ( parsedItem.kind == "t" ) // typedef { QString pixname; pixname = "typedef"; findAndCreate(itemParent, pixname, parsedItem.name, "class:"+parsedItem.name, false, true, parsedItem); } else if ( parsedItem.kind == "n" ) // namespace { QString pixname; pixname = "namespace"; findAndCreate(itemParent, pixname, parsedItem.name, "class:"+parsedItem.name, false, true, parsedItem); } // End parsing}//void TreeClasses::setSortingSymbols(QTreeWidgetItem *it, bool active, QString filename, QString ext, QStringList parents){ ParsedItem parsedItem = it->data(0, Qt::UserRole).value<ParsedItem>(); m_treeClassesItems->append( parsedItem ); if ( active ) { it->setText(0, markForSorting(parsedItem.kind, it->text(0)) ); markForDeletion(it, filename, ext, parents); } else { it->setText(0, it->text(0).section('|', -1, -1) ); if ( parsedItem.markedForDelete || it->text(0).simplified().isEmpty() ) { //delete current; m_listDeletion.append( it );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -