#ifndef QT_CODE_NAVIGATOR_H #define QT_CODE_NAVIGATOR_H #include #include "data/ErrorInfo.h" #include "data/location/LocationType.h" #include "qt/element/QtCodeFileList.h" #include "qt/element/QtCodeFileSingle.h" #include "qt/utility/QtThreadedFunctor.h" #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/MessageCodeReference.h" #include "utility/messaging/type/MessageFinishedParsing.h" #include "utility/messaging/type/MessageShowReference.h" #include "utility/messaging/type/MessageSwitchColorScheme.h" #include "utility/messaging/type/MessageWindowFocus.h" class QLabel; class QPushButton; class QtSearchBarButton; class SourceLocationCollection; class SourceLocationFile; class QtCodeNavigator : public QWidget , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener { Q_OBJECT public: enum Mode { MODE_NONE, MODE_LIST, MODE_SINGLE }; QtCodeNavigator(QWidget* parent = nullptr); virtual ~QtCodeNavigator(); void addCodeSnippet(const CodeSnippetParams& params); void updateCodeSnippet(const CodeSnippetParams& params); void addFile(std::shared_ptr locationFile, int refCount, TimeStamp modificationTime); void addedFiles(); void clear(); void clearCodeSnippets(); void clearFile(); void clearCaches(); void clearSnippetReferences(); void setMode(Mode mode); const std::set& getCurrentActiveTokenIds() const; void setCurrentActiveTokenIds(const std::vector& currentActiveTokenIds); const std::set& getCurrentActiveLocationIds() const; void setCurrentActiveLocationIds(const std::vector& currentActiveLocationIds); const std::set& getActiveTokenIds() const; void setActiveTokenIds(const std::vector& activeTokenIds); const std::set& getActiveLocalSymbolIds() const; void setActiveLocalSymbolIds(const std::vector& activeLocalSymbolIds); const std::set& getFocusedTokenIds() const; void setFocusedTokenIds(const std::vector& focusedTokenIds); std::wstring getErrorMessageForId(Id errorId) const; void setErrorInfos(const std::vector& errorInfos); bool hasErrors() const; size_t getFatalErrorCountForFile(const FilePath& filePath) const; bool isInListMode() const; bool hasSingleFileCached(const FilePath& filePath) const; void showActiveSnippet( const std::vector& activeTokenIds, std::shared_ptr collection, bool scrollTo); void focusTokenIds(const std::vector& focusedTokenIds); void defocusTokenIds(); void setFileMinimized(const FilePath path); void setFileSnippets(const FilePath path); void setFileMaximized(const FilePath path); void updateFiles(); void showContents(); void refreshStyle(); size_t findScreenMatches(const std::wstring& query); void activateScreenMatch(size_t matchIndex); void deactivateScreenMatch(size_t matchIndex); void clearScreenMatches(); void scrollToValue(int value, bool inListMode); void scrollToLine(const FilePath& filePath, unsigned int line); void scrollToDefinition(bool animated, bool ignoreActiveReference); void scrollToSnippetIfRequested(); void requestScroll( const FilePath& filePath, uint lineNumber, Id locationId, bool animated, QtCodeNavigateable::ScrollTarget target); signals: void scrollRequest(); public slots: void scrolled(int value); private slots: void handleScrollRequest(); void setValue(); void previousReference(bool fromUI = true); void nextReference(bool fromUI = true); void setModeList(); void setModeSingle(); private: struct Reference { Reference() : tokenId(0) , locationId(0) , locationType(LOCATION_TOKEN) { } FilePath filePath; Id tokenId; Id locationId; LocationType locationType; }; void showCurrentReference(bool fromUI); void updateRefLabel(); struct ScrollRequest { ScrollRequest() : lineNumber(0) , locationId(0) , animated(false) , target(QtCodeNavigateable::SCROLL_VISIBLE) { } FilePath filePath; uint lineNumber; Id locationId; bool animated; QtCodeNavigateable::ScrollTarget target; }; void handleMessage(MessageCodeReference* message); void handleMessage(MessageFinishedParsing* message); void handleMessage(MessageShowReference* message); void handleMessage(MessageSwitchColorScheme* message); void handleMessage(MessageWindowFocus* message); QtThreadedLambdaFunctor m_onQtThread; QtCodeNavigateable* m_current; QtCodeFileList* m_list; QtCodeFileSingle* m_single; Mode m_mode; Mode m_oldMode; std::set m_currentActiveTokenIds; std::set m_currentActiveLocationIds; std::set m_activeTokenIds; std::set m_activeLocalSymbolIds; std::set m_focusedTokenIds; std::map m_errorInfos; Id m_activeTokenId; int m_value; QtSearchBarButton* m_listButton; QtSearchBarButton* m_fileButton; QLabel* m_refLabel; QtSearchBarButton* m_prevButton; QtSearchBarButton* m_nextButton; QFrame* m_separatorLine; std::vector m_references; Reference m_activeReference; size_t m_refIndex; ScrollRequest m_scrollRequest; bool m_singleHasNewFile; std::vector> m_screenMatches; Id m_activeScreenMatchId = 0; }; #endif // QT_CODE_NAVIGATOR_H