ui: Added shortcuts for navigating to next and previous reference in code view

* Added new class QtCodeNavigator between QtCodeView and QtCodeFileList that handles active ids and navigation
* Pass all files as initially collapsed to code view and decide in QtCodeNavigator which ones show content
* Rewrote requesting of active snippet display to top down approach
* Display other locations focused when active location changes
* Show corresponding edges when navigating references
This commit is contained in:
Eberhard Graether
2016-08-09 13:29:14 +02:00
parent 210c5b1245
commit d0a063a3b6
32 changed files with 1037 additions and 599 deletions
+4 -2
View File
@@ -128,13 +128,13 @@ add_files(
data/parser/cxx/TaskParseCxx.h
data/parser/cxx/TaskParseWrapper.h
data/parser/java/JavaEnvironment.cpp
data/parser/java/JavaEnvironment.h
data/parser/java/JavaEnvironmentFactory.cpp
data/parser/java/JavaEnvironmentFactory.h
data/parser/java/TaskParseJava.h
data/parser/AccessKind.cpp
data/parser/AccessKind.h
data/parser/ParseLocation.cpp
@@ -245,6 +245,7 @@ add_files(
utility/messaging/type/MessageAutoRefreshChanged.h
utility/messaging/type/MessageChangeFileView.h
utility/messaging/type/MessageClearErrorCount.h
utility/messaging/type/MessageCodeReference.h
utility/messaging/type/MessageColorSchemeTest.h
utility/messaging/type/MessageDeactivateEdge.h
utility/messaging/type/MessageDispatchWhenLicenseValid.h
@@ -272,6 +273,7 @@ add_files(
utility/messaging/type/MessageSearchAutocomplete.h
utility/messaging/type/MessageSearchFullText.h
utility/messaging/type/MessageShowErrors.h
utility/messaging/type/MessageShowReference.h
utility/messaging/type/MessageShowScope.h
utility/messaging/type/MessageShowStartScreen.h
utility/messaging/type/MessageStatus.h
+14 -47
View File
@@ -122,7 +122,8 @@ void CodeController::handleMessage(MessageActivateTokens* message)
if (message->isEdge)
{
view->showFirstActiveSnippet(activeTokenIds, message->isLast());
std::shared_ptr<TokenLocationCollection> collection = m_storageAccess->getTokenLocationsForTokenIds(activeTokenIds);
view->showActiveSnippet(activeTokenIds, collection, message->isLast());
}
else if (message->keepContent())
{
@@ -365,9 +366,6 @@ std::vector<CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocation
TRACE();
std::vector<CodeSnippetParams> snippets;
size_t definitionFileCount = 0;
size_t declarationFileCount = 0;
collection->forEachTokenLocationFile(
[&](std::shared_ptr<TokenLocationFile> file) -> void
{
@@ -388,38 +386,15 @@ std::vector<CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocation
}
);
if (collection->getTokenLocationFileCount() < 5 || file->isWholeCopy ||
(isDefinitionFile && definitionFileCount < 3) ||
(!isDefinitionFile && isDeclarationFile && declarationFileCount < 3))
{
std::vector<CodeSnippetParams> fileSnippets = getSnippetsForFile(file, true);
CodeSnippetParams params;
params.locationFile = file;
params.refCount = file->getUnscopedStartTokenLocationCount();
for (CodeSnippetParams& snippet : fileSnippets)
{
snippet.isDeclaration = isDeclarationFile;
snippet.isDefinition = isDefinitionFile;
}
params.isDeclaration = isDeclarationFile;
params.isDefinition = isDefinitionFile;
utility::append(snippets, fileSnippets);
}
else
{
CodeSnippetParams params;
params.locationFile = file;
params.refCount = file->getUnscopedStartTokenLocationCount();
params.isCollapsed = true;
snippets.push_back(params);
}
if (isDefinitionFile)
{
definitionFileCount++;
}
else if (isDeclarationFile)
{
declarationFileCount++;
}
params.isCollapsed = true;
snippets.push_back(params);
}
);
@@ -439,20 +414,12 @@ std::vector<CodeSnippetParams> CodeController::getSnippetsForCollection(
collection->forEachTokenLocationFile(
[&](std::shared_ptr<TokenLocationFile> file) -> void
{
if (snippets.size() < 10)
{
std::vector<CodeSnippetParams> fileSnippets = getSnippetsForFile(file, addTokenLocations);
snippets.insert(snippets.end(), fileSnippets.begin(), fileSnippets.end());
}
else
{
CodeSnippetParams params;
params.locationFile = file;
params.refCount = file->getUnscopedStartTokenLocationCount();
CodeSnippetParams params;
params.locationFile = file;
params.refCount = file->getUnscopedStartTokenLocationCount();
params.isCollapsed = true;
snippets.push_back(params);
}
params.isCollapsed = true;
snippets.push_back(params);
}
);
@@ -176,6 +176,18 @@ void GraphController::handleMessage(MessageShowErrors* message)
clear();
}
void GraphController::handleMessage(MessageShowReference* message)
{
if (!message->tokenId)
{
return;
}
m_activeEdgeIds = std::vector<Id>(1, message->tokenId);
setActiveAndVisibility(utility::concat(m_activeNodeIds, m_activeEdgeIds));
buildGraph(message, false);
}
GraphView* GraphController::getView() const
{
return Controller::getView<GraphView>();
@@ -16,6 +16,7 @@
#include "utility/messaging/type/MessageGraphNodeMove.h"
#include "utility/messaging/type/MessageSearchFullText.h"
#include "utility/messaging/type/MessageShowErrors.h"
#include "utility/messaging/type/MessageShowReference.h"
#include "component/controller/Controller.h"
#include "component/controller/helper/DummyEdge.h"
@@ -41,6 +42,7 @@ class GraphController
, public MessageListener<MessageGraphNodeMove>
, public MessageListener<MessageSearchFullText>
, public MessageListener<MessageShowErrors>
, public MessageListener<MessageShowReference>
{
public:
GraphController(StorageAccess* storageAccess);
@@ -57,6 +59,7 @@ private:
virtual void handleMessage(MessageGraphNodeMove* message);
virtual void handleMessage(MessageSearchFullText* message);
virtual void handleMessage(MessageShowErrors* message);
virtual void handleMessage(MessageShowReference* message);
GraphView* getView() const;
+3 -2
View File
@@ -10,6 +10,7 @@
#include "component/view/View.h"
class CodeController;
class TokenLocationCollection;
class CodeView
: public View
@@ -29,7 +30,6 @@ public:
virtual void clear() = 0;
virtual void setActiveTokenIds(const std::vector<Id>& activeTokenIds) = 0;
virtual void setErrorInfos(const std::vector<ErrorInfo>& errorInfos) = 0;
virtual void showCodeSnippets(const std::vector<CodeSnippetParams>& snippets, const std::vector<Id>& activeTokenIds) = 0;
@@ -38,7 +38,8 @@ public:
virtual void setFileState(const FilePath filePath, FileState state) = 0;
virtual void showFirstActiveSnippet(const std::vector<Id>& activeTokenIds, bool scrollTo) = 0;
virtual void showActiveSnippet(
const std::vector<Id>& activeTokenIds, std::shared_ptr<TokenLocationCollection> collection, bool scrollTo) = 0;
virtual void showActiveTokenIds(const std::vector<Id>& activeTokenIds) = 0;
virtual void showActiveLocalSymbolIds(const std::vector<Id>& activeLocalSymbolIds) = 0;
@@ -9,7 +9,6 @@ CodeSnippetParams::CodeSnippetParams()
, footerId(0)
, locationFile()
, refCount(0)
, isActive(false)
, isCollapsed(false)
, isDeclaration(false)
, isDefinition(false)
@@ -19,16 +18,6 @@ CodeSnippetParams::CodeSnippetParams()
bool CodeSnippetParams::sort(const CodeSnippetParams& a, const CodeSnippetParams& b)
{
// sort active snippet first
if (a.isActive && !b.isActive)
{
return true;
}
else if (!a.isActive && b.isActive)
{
return false;
}
// sort definitions
if (a.isDefinition && !b.isDefinition)
{
@@ -30,7 +30,6 @@ struct CodeSnippetParams
int refCount;
bool isActive;
bool isCollapsed;
bool isDeclaration;
+8 -2
View File
@@ -480,8 +480,11 @@ std::shared_ptr<TokenLocationCollection> PersistentStorage::getFullTextSearchLoc
if ( addHit )
{
// Set first bit to 1 to avoid collisions
Id locationId = ~(~size_t(0) >> 1) + collection->getTokenLocationCount();
collection->addTokenLocation(
collection->getTokenLocationCount(),
locationId,
0,
filepath,
location.startLineNumber,
@@ -1012,8 +1015,11 @@ std::shared_ptr<TokenLocationCollection> PersistentStorage::getErrorTokenLocatio
const StorageError& error = storageErrors[i];
if (error.fatal || error.indexed || showExternalNonFatalErrors)
{
// Set first bit to 1 to avoid collisions
Id locationId = ~(~size_t(0) >> 1) + i;
errorCollection->addTokenLocation(
i, i, error.filePath, error.lineNumber, error.columnNumber, error.lineNumber, error.columnNumber
locationId, i, error.filePath, error.lineNumber, error.columnNumber, error.lineNumber, error.columnNumber
)->setType(LOCATION_ERROR);
errors->push_back(ErrorInfo(error.message, error.filePath, i, error.fatal));
}
@@ -0,0 +1,41 @@
#ifndef MESSAGE_CODE_REFERENCE_H
#define MESSAGE_CODE_REFERENCE_H
#include "utility/messaging/Message.h"
class MessageCodeReference
: public Message<MessageCodeReference>
{
public:
enum ReferenceType
{
REFERENCE_PREVIOUS,
REFERENCE_NEXT
};
MessageCodeReference(ReferenceType type)
: type(type)
{
}
static const std::string getStaticType()
{
return "MessageCodeReference";
}
virtual void print(std::ostream& os) const
{
if (type == REFERENCE_PREVIOUS)
{
os << "previous";
}
else
{
os << "next";
}
}
const ReferenceType type;
};
#endif // MESSAGE_CODE_REFERENCE_H
+2 -2
View File
@@ -2,9 +2,9 @@
#define MESSAGE_REDO_H
#include "utility/messaging/Message.h"
#include "utility/types.h"
class MessageRedo: public Message<MessageRedo>
class MessageRedo
: public Message<MessageRedo>
{
public:
MessageRedo()
@@ -0,0 +1,33 @@
#ifndef MESSAGE_SHOW_REFERENCE_H
#define MESSAGE_SHOW_REFERENCE_H
#include "utility/messaging/Message.h"
#include "utility/types.h"
class MessageShowReference
: public Message<MessageShowReference>
{
public:
MessageShowReference(size_t refIndex, Id tokenId, Id locationId)
: refIndex(refIndex)
, tokenId(tokenId)
, locationId(locationId)
{
}
static const std::string getStaticType()
{
return "MessageShowReference";
}
virtual void print(std::ostream& os) const
{
os << "index: " << refIndex << " token: " << tokenId << " location: " << locationId;
}
const size_t refIndex;
const Id tokenId;
const Id locationId;
};
#endif // MESSAGE_SHOW_REFERENCE_H
+2 -2
View File
@@ -2,9 +2,9 @@
#define MESSAGE_UNDO_H
#include "utility/messaging/Message.h"
#include "utility/types.h"
class MessageUndo: public Message<MessageUndo>
class MessageUndo
: public Message<MessageUndo>
{
public:
MessageUndo()