work save
This commit is contained in:
parent
5bcb19805e
commit
60a4e8c468
|
@ -90,11 +90,19 @@ Editor::Editor(QWidget *parent, const QString& filename,
|
|||
setUseCodeFolding(false);
|
||||
}
|
||||
|
||||
if (inProject) {
|
||||
//todo:
|
||||
} else {
|
||||
initParser();
|
||||
}
|
||||
|
||||
applySettings();
|
||||
applyColorScheme(pSettings->editor().colorScheme());
|
||||
|
||||
connect(this,&SynEdit::statusChanged,this,&Editor::onStatusChanged);
|
||||
connect(this,&SynEdit::gutterClicked,this,&Editor::onGutterClicked);
|
||||
|
||||
onStatusChanged(SynStatusChange::scOpenFile);
|
||||
}
|
||||
|
||||
Editor::~Editor() {
|
||||
|
@ -300,6 +308,7 @@ void Editor::focusInEvent(QFocusEvent *event)
|
|||
pMainWindow->updateEditorActions();
|
||||
pMainWindow->updateStatusbarForLineCol();
|
||||
pMainWindow->updateForStatusbarModeInfo();
|
||||
pMainWindow->updateClassBrowserForEditor(this);
|
||||
}
|
||||
|
||||
void Editor::focusOutEvent(QFocusEvent *event)
|
||||
|
@ -645,8 +654,7 @@ void Editor::onModificationChanged(bool) {
|
|||
|
||||
void Editor::onStatusChanged(SynStatusChanges changes)
|
||||
{
|
||||
if (!changes.testFlag(SynStatusChange::scOpenFile)
|
||||
&& !changes.testFlag(SynStatusChange::scReadOnly)
|
||||
if (!changes.testFlag(SynStatusChange::scReadOnly)
|
||||
&& !changes.testFlag(SynStatusChange::scInsertMode)
|
||||
&& (lines()->count()!=mLineCount)
|
||||
&& (lines()->count()!=0) && ((mLineCount>0) || (lines()->count()>1))) {
|
||||
|
@ -1185,6 +1193,11 @@ void Editor::reparse()
|
|||
parseFile(mParser,mFilename,mInProject);
|
||||
}
|
||||
|
||||
const PCppParser &Editor::parser() const
|
||||
{
|
||||
return mParser;
|
||||
}
|
||||
|
||||
int Editor::gutterClickedLine() const
|
||||
{
|
||||
return mGutterClickedLine;
|
||||
|
|
|
@ -115,6 +115,8 @@ public:
|
|||
void removeBreakpointFocus();
|
||||
void setActiveBreakpointFocus(int Line, bool setFocus=true);
|
||||
|
||||
const PCppParser &parser() const;
|
||||
|
||||
signals:
|
||||
|
||||
|
||||
|
|
|
@ -35,7 +35,8 @@ MainWindow::MainWindow(QWidget *parent)
|
|||
mMessageControlChanged(false),
|
||||
mTabMessagesTogglingState(false),
|
||||
mCheckSyntaxInBack(false),
|
||||
mSearchDialog(nullptr)
|
||||
mSearchDialog(nullptr),
|
||||
mQuitting(false)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
// status bar
|
||||
|
@ -117,6 +118,9 @@ MainWindow::MainWindow(QWidget *parent)
|
|||
connect(mSearchResultTreeModel.get() , &QAbstractItemModel::modelReset,
|
||||
ui->searchView,&QTreeView::expandAll);
|
||||
ui->replacePanel->setVisible(false);
|
||||
|
||||
//class browser
|
||||
ui->classBrowser->setModel(&mClassBrowserModel);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
|
@ -385,6 +389,35 @@ void MainWindow::rebuildOpenedFileHisotryMenu()
|
|||
}
|
||||
}
|
||||
|
||||
void MainWindow::updateClassBrowserForEditor(Editor *editor)
|
||||
{
|
||||
if (!editor) {
|
||||
mClassBrowserModel.setParser(nullptr);
|
||||
mClassBrowserModel.setCurrentFile("");
|
||||
return;
|
||||
}
|
||||
if (mQuitting)
|
||||
return;
|
||||
// if not devCodeCompletion.Enabled then
|
||||
// Exit;
|
||||
if ((mClassBrowserModel.currentFile() == editor->filename())
|
||||
&& (mClassBrowserModel.parser() == editor->parser()))
|
||||
return;
|
||||
|
||||
mClassBrowserModel.beginUpdate();
|
||||
{
|
||||
auto action = finally([this] {
|
||||
mClassBrowserModel.endUpdate();
|
||||
});
|
||||
mClassBrowserModel.setParser(editor->parser());
|
||||
// if e.InProject then begin
|
||||
// ClassBrowser.StatementsType := devClassBrowsing.StatementsType;
|
||||
// end else
|
||||
// ClassBrowser.StatementsType := cbstFile;
|
||||
mClassBrowserModel.setCurrentFile(editor->filename());
|
||||
}
|
||||
}
|
||||
|
||||
QPlainTextEdit *MainWindow::txtLocals()
|
||||
{
|
||||
return ui->txtLocals;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <QMainWindow>
|
||||
#include "common.h"
|
||||
#include "widgets/searchresultview.h"
|
||||
#include "widgets/classbrowser.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui { class MainWindow; }
|
||||
|
@ -73,6 +74,8 @@ public:
|
|||
|
||||
void rebuildOpenedFileHisotryMenu();
|
||||
|
||||
void updateClassBrowserForEditor(Editor* editor);
|
||||
|
||||
QPlainTextEdit* txtLocals();
|
||||
|
||||
CPUDialog *cpuDialog() const;
|
||||
|
@ -85,6 +88,8 @@ public:
|
|||
|
||||
SearchResultModel* searchResultModel();
|
||||
|
||||
|
||||
|
||||
protected:
|
||||
void openFiles(const QStringList& files);
|
||||
void openFile(const QString& filename);
|
||||
|
@ -220,11 +225,13 @@ private:
|
|||
CPUDialog *mCPUDialog;
|
||||
SearchDialog *mSearchDialog;
|
||||
QList<QAction *> mRecentFileActions;
|
||||
bool mQuitting;
|
||||
|
||||
SearchResultModel mSearchResultModel;
|
||||
PSearchResultListModel mSearchResultListModel;
|
||||
PSearchResultTreeModel mSearchResultTreeModel;
|
||||
PSearchResultTreeViewDelegate mSearchViewDelegate;
|
||||
ClassBrowserModel mClassBrowserModel;
|
||||
|
||||
bool mMessageControlChanged;
|
||||
bool mTabMessagesTogglingState;
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
<enum>QTabWidget::West</enum>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>1</number>
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="usesScrollButtons">
|
||||
<bool>true</bool>
|
||||
|
@ -131,6 +131,33 @@
|
|||
<attribute name="title">
|
||||
<string>Structure</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QTreeView" name="classBrowser">
|
||||
<property name="rootIsDecorated">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="headerVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabFiles">
|
||||
<attribute name="title">
|
||||
|
|
|
@ -971,6 +971,7 @@ PStatement CppParser::addStatement(PStatement parent, const QString &fileName, c
|
|||
result->fullName = getFullStatementName(newCommand, parent);
|
||||
result->usageCount = 0;
|
||||
result->freqTop = 0;
|
||||
mStatementList.add(result);
|
||||
if (result->kind == StatementKind::skNamespace) {
|
||||
PStatementList namespaceList = mNamespaces.value(result->fullName,PStatementList());
|
||||
if (!namespaceList) {
|
||||
|
@ -1293,7 +1294,7 @@ bool CppParser::checkForPreprocessor()
|
|||
{
|
||||
// return (mIndex < mTokenizer.tokenCount())
|
||||
// && ( "#" == mTokenizer[mIndex]->text);
|
||||
return ("#" == mTokenizer[mIndex]->text);
|
||||
return (mTokenizer[mIndex]->text.startsWith('#'));
|
||||
}
|
||||
|
||||
bool CppParser::checkForScope()
|
||||
|
@ -2316,7 +2317,7 @@ bool CppParser::handleStatement()
|
|||
false);
|
||||
addSoloScopeLevel(block,mTokenizer[mIndex]->line);
|
||||
mIndex++;
|
||||
} else if (mTokenizer[mIndex]->text[1] == '}') {
|
||||
} else if (mTokenizer[mIndex]->text[0] == '}') {
|
||||
removeScopeLevel(mTokenizer[mIndex]->line);
|
||||
mIndex++;
|
||||
} else if (checkForPreprocessor()) {
|
||||
|
@ -2859,9 +2860,9 @@ void CppParser::internalParse(const QString &fileName)
|
|||
if (!isCfile(fileName) && !isHfile(fileName)) // support only known C/C++ files
|
||||
return;
|
||||
|
||||
QStringList tempStream;
|
||||
QStringList buffer;
|
||||
if (mOnGetFileStream) {
|
||||
mOnGetFileStream(fileName,tempStream);
|
||||
mOnGetFileStream(fileName,buffer);
|
||||
}
|
||||
|
||||
// Preprocess the file...
|
||||
|
@ -2876,8 +2877,10 @@ void CppParser::internalParse(const QString &fileName)
|
|||
// mPreprocessor.setProjectIncludePaths(mProjectIncludePaths);
|
||||
// mPreprocessor.setScannedFileList(mScannedFiles);
|
||||
mPreprocessor.setScanOptions(mParseGlobalHeaders, mParseLocalHeaders);
|
||||
mPreprocessor.preprocess(fileName, tempStream);
|
||||
|
||||
mPreprocessor.preprocess(fileName, buffer);
|
||||
#ifdef QT_DEBUG
|
||||
StringsToFile(mPreprocessor.result(),"f:\\preprocess.txt");
|
||||
#endif
|
||||
// with TStringList.Create do try
|
||||
// Text:=fPreprocessor.Result;
|
||||
// SaveToFile('f:\\Preprocess.txt');
|
||||
|
@ -2903,11 +2906,16 @@ void CppParser::internalParse(const QString &fileName)
|
|||
if (!handleStatement())
|
||||
break;
|
||||
}
|
||||
//mTokenizer.DumpTokens('f:\tokens.txt');
|
||||
#ifdef QT_DEBUG
|
||||
mTokenizer.dumpTokens("f:\\tokens.txt");
|
||||
mPreprocessor.dumpDefinesTo("f:\\defines.txt");
|
||||
mPreprocessor.dumpIncludesListTo("f:\\includes.txt");
|
||||
mStatementList.dump("f:\\stats.txt");
|
||||
//Statements.DumpTo('f:\stats.txt');
|
||||
//Statements.DumpWithScope('f:\\statements.txt');
|
||||
//fPreprocessor.DumpDefinesTo('f:\defines.txt');
|
||||
//fPreprocessor.DumpIncludesListTo('f:\\includes.txt');
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -888,6 +888,8 @@ QStringList CppPreprocessor::removeComments(const QStringList &text)
|
|||
s+=ch;
|
||||
}
|
||||
}
|
||||
default:
|
||||
s+=ch;
|
||||
}
|
||||
if (stopProcess)
|
||||
break;
|
||||
|
|
|
@ -279,6 +279,7 @@ QString CppTokenizer::getWord(bool bSkipParenthesis, bool bSkipArray, bool bSkip
|
|||
QString result;
|
||||
// We found a word...
|
||||
if (!currentWord.isEmpty()) {
|
||||
result = currentWord;
|
||||
// Skip whitespace
|
||||
skipToNextToken();
|
||||
|
||||
|
|
|
@ -88,7 +88,7 @@ int StatementModel::deleteMember(StatementMap &map, PStatement statement)
|
|||
|
||||
void StatementModel::dumpStatementMap(StatementMap &map, QTextStream &out, int level)
|
||||
{
|
||||
QString indent(' ',level);
|
||||
QString indent(level,' ');
|
||||
for (PStatement statement:map.values()) {
|
||||
out<<indent<<QString("%1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12")
|
||||
.arg(statement->command).arg(int(statement->kind))
|
||||
|
|
|
@ -4551,7 +4551,7 @@ int SynEdit::InsertTextByColumnMode(const QString &Value, bool AddToUndoList)
|
|||
TempString = mLines->getString(mCaretY - 1);
|
||||
Len = stringColumns(TempString,0);
|
||||
if (Len < InsertCol) {
|
||||
TempString = TempString + QChar(' ', InsertCol - Len - 1) + Str;
|
||||
TempString = TempString + QString(InsertCol - Len - 1,' ') + Str;
|
||||
} else {
|
||||
int insertPos = charToColumn(TempString,InsertCol);
|
||||
TempString.insert(insertPos-1,Str);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <QString>
|
||||
#include <QRect>
|
||||
#include <QStringList>
|
||||
#include <memory>
|
||||
|
||||
class QByteArray;
|
||||
class QTextStream;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "classbrowser.h"
|
||||
#include "../utils.h"
|
||||
#include <QDebug>
|
||||
|
||||
ClassBrowserModel::ClassBrowserModel(QObject *parent):QAbstractItemModel(parent)
|
||||
{
|
||||
|
@ -33,7 +34,7 @@ QModelIndex ClassBrowserModel::index(int row, int column, const QModelIndex &par
|
|||
|
||||
QModelIndex ClassBrowserModel::parent(const QModelIndex &child) const
|
||||
{
|
||||
if (child.isValid()) {
|
||||
if (!child.isValid()) {
|
||||
return QModelIndex();
|
||||
}
|
||||
ClassBrowserNode *childNode = static_cast<ClassBrowserNode *>(child.internalPointer());
|
||||
|
@ -46,6 +47,21 @@ QModelIndex ClassBrowserModel::parent(const QModelIndex &child) const
|
|||
return createIndex(row,0,parentNode);
|
||||
}
|
||||
|
||||
bool ClassBrowserModel::hasChildren(const QModelIndex &parent) const
|
||||
{
|
||||
ClassBrowserNode *parentNode;
|
||||
if (!parent.isValid()) { // top level
|
||||
return mRoot->children.count();
|
||||
} else {
|
||||
parentNode = static_cast<ClassBrowserNode *>(parent.internalPointer());
|
||||
if (parentNode->childrenFetched)
|
||||
return parentNode->children.count();
|
||||
if (parentNode->statement)
|
||||
return !parentNode->statement->children.isEmpty();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int ClassBrowserModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
ClassBrowserNode *parentNode;
|
||||
|
@ -71,8 +87,11 @@ void ClassBrowserModel::fetchMore(const QModelIndex &parent)
|
|||
ClassBrowserNode *parentNode = static_cast<ClassBrowserNode *>(parent.internalPointer());
|
||||
if (!parentNode->childrenFetched) {
|
||||
parentNode->childrenFetched = true;
|
||||
if (parentNode->statement && !parentNode->statement->children.isEmpty())
|
||||
if (parentNode->statement && !parentNode->statement->children.isEmpty()) {
|
||||
filterChildren(parentNode, parentNode->statement->children);
|
||||
beginInsertRows(parent,0,parentNode->children.count());
|
||||
endInsertRows();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -109,12 +128,12 @@ QVariant ClassBrowserModel::data(const QModelIndex &index, int role) const
|
|||
return QVariant();
|
||||
}
|
||||
|
||||
const PCppParser &ClassBrowserModel::cppParser() const
|
||||
const PCppParser &ClassBrowserModel::parser() const
|
||||
{
|
||||
return mParser;
|
||||
}
|
||||
|
||||
void ClassBrowserModel::setCppParser(const PCppParser &newCppParser)
|
||||
void ClassBrowserModel::setParser(const PCppParser &newCppParser)
|
||||
{
|
||||
if (mParser) {
|
||||
disconnect(mParser.get(),
|
||||
|
@ -128,8 +147,6 @@ void ClassBrowserModel::setCppParser(const PCppParser &newCppParser)
|
|||
&CppParser::onEndParsing,
|
||||
this,
|
||||
&ClassBrowserModel::fillStatements);
|
||||
if (!mParser->parsing())
|
||||
fillStatements();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -143,11 +160,13 @@ void ClassBrowserModel::clear()
|
|||
}
|
||||
|
||||
void ClassBrowserModel::fillStatements()
|
||||
{
|
||||
{
|
||||
QMutexLocker locker(&mMutex);
|
||||
if (mUpdateCount!=0)
|
||||
if (mUpdateCount!=0 || mUpdating)
|
||||
return;
|
||||
mUpdating = true;
|
||||
}
|
||||
beginResetModel();
|
||||
clear();
|
||||
{
|
||||
|
@ -305,4 +324,29 @@ PStatement ClassBrowserModel::createDummy(PStatement statement)
|
|||
return result;
|
||||
}
|
||||
|
||||
const QString &ClassBrowserModel::currentFile() const
|
||||
{
|
||||
return mCurrentFile;
|
||||
}
|
||||
|
||||
void ClassBrowserModel::setCurrentFile(const QString &newCurrentFile)
|
||||
{
|
||||
mCurrentFile = newCurrentFile;
|
||||
}
|
||||
|
||||
void ClassBrowserModel::beginUpdate()
|
||||
{
|
||||
mUpdateCount++;
|
||||
}
|
||||
|
||||
void ClassBrowserModel::endUpdate()
|
||||
{
|
||||
mUpdateCount--;
|
||||
if (mUpdateCount == 0) {
|
||||
if (!mParser->parsing()) {
|
||||
this->fillStatements();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -23,14 +23,20 @@ public:
|
|||
|
||||
QModelIndex index(int row, int column, const QModelIndex &parent) const override;
|
||||
QModelIndex parent(const QModelIndex &child) const override;
|
||||
bool hasChildren(const QModelIndex &parent) const override;
|
||||
int rowCount(const QModelIndex &parent) const override;
|
||||
int columnCount(const QModelIndex &parent) const override;
|
||||
void fetchMore(const QModelIndex &parent) override;
|
||||
bool canFetchMore(const QModelIndex &parent) const override;
|
||||
QVariant data(const QModelIndex &index, int role) const override;
|
||||
const PCppParser &cppParser() const;
|
||||
void setCppParser(const PCppParser &newCppParser);
|
||||
const PCppParser &parser() const;
|
||||
void setParser(const PCppParser &newCppParser);
|
||||
void clear();
|
||||
const QString ¤tFile() const;
|
||||
void setCurrentFile(const QString &newCurrentFile);
|
||||
void beginUpdate();
|
||||
void endUpdate();
|
||||
|
||||
public slots:
|
||||
void fillStatements();
|
||||
private:
|
||||
|
@ -49,6 +55,9 @@ private:
|
|||
QString mCurrentFile;
|
||||
bool mShowInheritedMembers;
|
||||
|
||||
|
||||
// QAbstractItemModel interface
|
||||
public:
|
||||
};
|
||||
|
||||
#endif // CLASSBROWSER_H
|
||||
|
|
Loading…
Reference in New Issue