⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treeclasses.cpp

📁 用Qt4编写的linux IDE开发环境
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/** 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 + -