diff --git a/bin/app/data/color_schemes/bad_rainbow.xml b/bin/app/data/color_schemes/bad_rainbow.xml
index 1538f87b..db6cd8a0 100644
--- a/bin/app/data/color_schemes/bad_rainbow.xml
+++ b/bin/app/data/color_schemes/bad_rainbow.xml
@@ -534,12 +534,21 @@
#808080
#BEBEBE
diff --git a/bin/app/data/color_schemes/bright.xml b/bin/app/data/color_schemes/bright.xml
index 6df33d8b..7dbdd530 100644
--- a/bin/app/data/color_schemes/bright.xml
+++ b/bin/app/data/color_schemes/bright.xml
@@ -67,7 +67,7 @@
black
- #5EA071
+ #6DB080
black
@@ -508,12 +508,21 @@
#E0E0E0
#BEBEBE
diff --git a/bin/app/data/color_schemes/dark.xml b/bin/app/data/color_schemes/dark.xml
index 7fbe57cd..4c9aee0e 100644
--- a/bin/app/data/color_schemes/dark.xml
+++ b/bin/app/data/color_schemes/dark.xml
@@ -511,12 +511,21 @@
#555555
#BEBEBE
diff --git a/bin/app/data/gui/main/main.css b/bin/app/data/gui/main/main.css
index f42f9e1a..785331b1 100644
--- a/bin/app/data/gui/main/main.css
+++ b/bin/app/data/gui/main/main.css
@@ -13,6 +13,10 @@ QMainWindow::separator {
width: 1px;
}
+QToolBar {
+ border: none;
+}
+
QDockWidget {
color: ;
font-size: 10pt;
diff --git a/bin/app/data/gui/tabbed_view/tabbed_view.css b/bin/app/data/gui/tabbed_view/tabbed_view.css
index 4355800e..8a21d2aa 100644
--- a/bin/app/data/gui/tabbed_view/tabbed_view.css
+++ b/bin/app/data/gui/tabbed_view/tabbed_view.css
@@ -15,7 +15,7 @@ QTabBar::tab {
border: 1px solid ;
border-top-left-radius: 7px;
border-top-right-radius: 7px;
- color: ;
+ color: ;
font-size: px;
height: ;
margin-left: 3px;
@@ -25,11 +25,13 @@ QTabBar::tab {
QTabBar::tab:hover {
background-color: ;
+ color: ;
}
QTabBar::tab:selected, QTabBar::tab:pressed {
background-color: ;
border-bottom: 1px solid ;
+ color: ;
}
QTabWidget #tab_content {
diff --git a/bin/app/data/gui/tabs_view/images/add.png b/bin/app/data/gui/tabs_view/images/add.png
new file mode 100644
index 00000000..79f5052a
Binary files /dev/null and b/bin/app/data/gui/tabs_view/images/add.png differ
diff --git a/bin/app/data/gui/tabs_view/images/close.png b/bin/app/data/gui/tabs_view/images/close.png
new file mode 100644
index 00000000..bf6e88a3
Binary files /dev/null and b/bin/app/data/gui/tabs_view/images/close.png differ
diff --git a/bin/app/data/gui/tabs_view/tabs_view.css b/bin/app/data/gui/tabs_view/tabs_view.css
new file mode 100644
index 00000000..acf6c2d4
--- /dev/null
+++ b/bin/app/data/gui/tabs_view/tabs_view.css
@@ -0,0 +1,81 @@
+QTabBar {
+ background-color: ;
+ border-bottom: 1px solid ;
+ font-size: px;
+ padding-left: 4px;
+ min-height: 30px;
+}
+
+QTabBar::tab {
+ background-color: ;
+ border: 1px solid ;
+ border-top-left-radius: 11px;
+ border-top-right-radius: 11px;
+ color: ;
+ min-height: 25px;
+ margin-left: 3px;
+ margin-top: 4px;
+}
+
+QTabBar::tab:hover {
+ background-color: ;
+ color: ;
+}
+
+QTabBar::tab:selected, QTabBar::tab:pressed {
+ background-color: ;
+ border-bottom: 1px solid ;
+ color: ;
+}
+
+#side_area {
+ background-color: ;
+ border-bottom: 1px solid ;
+}
+
+#type_circle {
+ background-color: ;
+ border: 1px solid ;
+ border-radius: 6px;
+ margin: 0;
+ height: 10px;
+ width: 10px;
+ margin-top: 3px;
+ margin-left: 6px;
+}
+
+#type_circle[selected=true] {
+ border: 1px solid ;
+}
+
+#close_button {
+ background-color: transparent;
+ border: 1px solid transparent;
+ border-radius: 8px;
+ color: ;
+ font-size: 12px;
+ margin: 0;
+ height: 14px;
+ width: 14px;
+ margin-top: 5px;
+ margin-right: 0px;
+}
+
+#close_button:hover {
+ border: 1px solid ;
+}
+
+#add_button {
+ background-color: ;
+ border: 1px solid ;
+ border-radius: 11px;
+ color: ;
+ margin: 5px 0 3px 0;
+ height: 20px;
+ width: 20px;
+}
+
+#add_button:hover {
+ background-color: ;
+ color: ;
+}
diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp
index 3ce07a55..5ab30bc0 100644
--- a/src/lib/Application.cpp
+++ b/src/lib/Application.cpp
@@ -22,6 +22,8 @@
#include "MessageForceEnterLicense.h"
#include "MessageQuitApplication.h"
#include "MessageStatus.h"
+#include "TabId.h"
+#include "TaskManager.h"
#include "TaskScheduler.h"
#include "tracing.h"
#include "UserPaths.h"
@@ -45,7 +47,8 @@ void Application::createInstance(
collector->run(Application::getUUID());
}
- TaskScheduler::getInstance();
+ TaskManager::createScheduler(TabId::app());
+ TaskManager::createScheduler(TabId::background());
MessageQueue::getInstance();
bool hasGui = (viewFactory != nullptr);
@@ -55,15 +58,11 @@ void Application::createInstance(
if (hasGui)
{
- s_instance->m_componentManager = ComponentManager::create(viewFactory, s_instance->m_storageCache.get());
-
- s_instance->m_mainView = viewFactory->createMainView();
+ s_instance->m_mainView = viewFactory->createMainView(s_instance->m_storageCache.get());
+ s_instance->m_mainView->setup();
s_instance->updateTitle();
- s_instance->m_componentManager->setup(s_instance->m_mainView.get());
- s_instance->m_mainView->loadLayout();
-
- s_instance->m_componentManager->refreshViews();
+ GraphViewStyle::setImpl(viewFactory->createGraphStyleImpl());
}
if (networkFactory != nullptr)
@@ -86,7 +85,8 @@ std::shared_ptr Application::getInstance()
void Application::destroyInstance()
{
MessageQueue::getInstance()->stopMessageLoop();
- TaskScheduler::getInstance()->stopSchedulerLoop();
+ TaskManager::destroyScheduler(TabId::background());
+ TaskManager::destroyScheduler(TabId::app());
s_instance.reset();
}
@@ -145,6 +145,15 @@ const std::shared_ptr Application::getCurrentProject()
return m_project;
}
+bool Application::isProjectLoaded() const
+{
+ if (m_project)
+ {
+ return m_project->isLoaded();
+ }
+ return false;
+}
+
bool Application::hasGUI()
{
return m_hasGUI;
@@ -172,17 +181,17 @@ int Application::handleDialog(const std::wstring& message, const std::vector Application::getDialogView(DialogView::UseCase useCase)
{
- if (m_componentManager)
+ if (m_mainView)
{
- return m_componentManager->getDialogView(useCase);
+ return m_mainView->getDialogView(useCase);
}
return std::make_shared(useCase, nullptr);
}
-void Application::updateHistoryMenu(const std::vector>& historyMenuItems)
+void Application::updateHistoryMenu(std::shared_ptr message)
{
- m_mainView->updateHistoryMenu(historyMenuItems);
+ m_mainView->updateHistoryMenu(message);
}
void Application::updateBookmarks(const std::vector>& bookmarks)
@@ -209,8 +218,7 @@ void Application::handleMessage(MessageEnteredLicense* message)
if (m_hasGUI)
{
- m_mainView->refreshView();
- m_componentManager->refreshViews();
+ m_mainView->refreshViews();
}
}
@@ -264,6 +272,13 @@ void Application::handleMessage(MessageLoadProject* message)
projectSettingsFilePath = migrateProjectSettings(projectSettingsFilePath);
+ m_project.reset();
+
+ if (m_hasGUI)
+ {
+ m_mainView->clear();
+ }
+
try
{
updateRecentProjects(projectSettingsFilePath);
@@ -297,11 +312,6 @@ void Application::handleMessage(MessageLoadProject* message)
MessageStatus(L"Failed to load project, unknown exception was thrown: " + projectSettingsFilePath.wstr(), true).dispatch();
}
- if (m_hasGUI)
- {
- m_componentManager->clearComponents();
- }
-
if (message->refreshMode != REFRESH_NONE)
{
refreshProject(message->refreshMode);
@@ -327,8 +337,7 @@ void Application::handleMessage(MessageRefreshUI* message)
loadStyle(ApplicationSettings::getInstance()->getColorSchemePath());
}
- m_mainView->refreshView();
- m_componentManager->refreshViews();
+ m_mainView->refreshViews();
}
}
@@ -396,7 +405,8 @@ FilePath Application::migrateProjectSettings(const FilePath& projectSettingsFile
void Application::startMessagingAndScheduling()
{
- TaskScheduler::getInstance()->startSchedulerLoopThreaded();
+ TaskManager::getScheduler(TabId::app())->startSchedulerLoopThreaded();
+ TaskManager::getScheduler(TabId::background())->startSchedulerLoopThreaded();
MessageQueue* queue = MessageQueue::getInstance().get();
queue->addMessageFilter(std::make_shared());
diff --git a/src/lib/Application.h b/src/lib/Application.h
index 6ad82df3..9130695f 100644
--- a/src/lib/Application.h
+++ b/src/lib/Application.h
@@ -3,8 +3,7 @@
#include
-#include "ComponentManager.h"
-#include "Project.h"
+#include "DialogView.h"
#include "MessageListener.h"
#include "MessageIndexingFinished.h"
#include "MessageActivateWindow.h"
@@ -14,9 +13,10 @@
#include "MessageRefreshUI.h"
#include "MessageSwitchColorScheme.h"
#include "MessageWindowFocus.h"
+#include "Project.h"
+#include "TimeStamp.h"
class Bookmark;
-class DialogView;
class IDECommunicationController;
class MainView;
class NetworkFactory;
@@ -48,6 +48,7 @@ public:
~Application();
const std::shared_ptr getCurrentProject();
+ bool isProjectLoaded() const;
bool hasGUI();
@@ -57,7 +58,7 @@ public:
int handleDialog(const std::wstring& message, const std::vector& options);
std::shared_ptr getDialogView(DialogView::UseCase useCase);
- void updateHistoryMenu(const std::vector>& historyMenuItems);
+ void updateHistoryMenu(std::shared_ptr message);
void updateBookmarks(const std::vector>& bookmarks);
private:
@@ -92,7 +93,6 @@ private:
std::shared_ptr m_storageCache;
std::shared_ptr m_mainView;
- std::shared_ptr m_componentManager;
std::shared_ptr m_ideCommunicationController;
std::shared_ptr m_updateChecker;
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 956d7e46..9d094eed 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -40,6 +40,8 @@ add_files(
component/controller/StatusBarController.h
component/controller/StatusController.cpp
component/controller/StatusController.h
+ component/controller/TabsController.cpp
+ component/controller/TabsController.h
component/controller/TooltipController.cpp
component/controller/TooltipController.h
component/controller/UndoRedoController.cpp
@@ -47,6 +49,8 @@ add_files(
component/view/helper/CodeSnippetParams.cpp
component/view/helper/CodeSnippetParams.h
+ component/view/BookmarkButtonsView.cpp
+ component/view/BookmarkButtonsView.h
component/view/BookmarkView.cpp
component/view/BookmarkView.h
component/view/CodeView.cpp
@@ -76,13 +80,14 @@ add_files(
component/view/StatusView.h
component/view/TabbedView.cpp
component/view/TabbedView.h
+ component/view/TabsView.cpp
+ component/view/TabsView.h
component/view/TooltipView.cpp
component/view/TooltipView.h
component/view/UndoRedoView.cpp
component/view/UndoRedoView.h
component/view/View.cpp
component/view/View.h
- component/view/ViewFactory.cpp
component/view/ViewFactory.h
component/view/ViewLayout.cpp
component/view/ViewLayout.h
@@ -97,6 +102,10 @@ add_files(
component/ComponentManager.h
component/NetworkFactory.cpp
component/NetworkFactory.h
+ component/Tab.cpp
+ component/Tab.h
+ component/TabId.cpp
+ component/TabId.h
data/access/StorageAccess.h
data/access/StorageAccessProxy.cpp
@@ -424,6 +433,13 @@ add_files(
utility/messaging/type/activation/MessageActivateLegend.h
+ utility/messaging/type/bookmark/MessageBookmarkActivate.h
+ utility/messaging/type/bookmark/MessageBookmarkBrowse.h
+ utility/messaging/type/bookmark/MessageBookmarkButtonState.h
+ utility/messaging/type/bookmark/MessageBookmarkCreate.h
+ utility/messaging/type/bookmark/MessageBookmarkDelete.h
+ utility/messaging/type/bookmark/MessageBookmarkEdit.h
+
utility/messaging/type/code/MessageCodeShowDefinition.h
utility/messaging/type/error/MessageActivateErrors.h
@@ -443,9 +459,14 @@ add_files(
utility/messaging/type/indexing/MessageIndexingStarted.h
utility/messaging/type/indexing/MessageIndexingStatus.h
+ utility/messaging/type/tab/MessageTabClose.h
+ utility/messaging/type/tab/MessageTabOpen.h
+ utility/messaging/type/tab/MessageTabOpenWith.h
+ utility/messaging/type/tab/MessageTabSelect.h
+ utility/messaging/type/tab/MessageTabState.h
+
utility/messaging/type/MessageActivateAll.h
utility/messaging/type/MessageActivateBase.h
- utility/messaging/type/MessageActivateBookmark.h
utility/messaging/type/MessageActivateEdge.h
utility/messaging/type/MessageActivateFile.h
utility/messaging/type/MessageActivateFullTextSearch.h
@@ -462,8 +483,6 @@ add_files(
utility/messaging/type/MessageClearStatusView.h
utility/messaging/type/MessageCodeReference.h
utility/messaging/type/MessageDeactivateEdge.h
- utility/messaging/type/MessageDisplayBookmarkCreator.h
- utility/messaging/type/MessageDisplayBookmarks.h
utility/messaging/type/MessageEnteredLicense.h
utility/messaging/type/MessageFind.h
utility/messaging/type/MessageFlushUpdates.h
@@ -540,6 +559,8 @@ add_files(
utility/scheduling/TaskGroupSequence.h
utility/scheduling/TaskLambda.cpp
utility/scheduling/TaskLambda.h
+ utility/scheduling/TaskManager.cpp
+ utility/scheduling/TaskManager.h
utility/scheduling/TaskReturnSuccessIf.h
utility/scheduling/TaskRunner.cpp
utility/scheduling/TaskRunner.h
diff --git a/src/lib/component/Component.cpp b/src/lib/component/Component.cpp
index 79faf5a0..4a016b34 100644
--- a/src/lib/component/Component.cpp
+++ b/src/lib/component/Component.cpp
@@ -6,6 +6,7 @@
Component::Component(std::shared_ptr view, std::shared_ptr controller)
: m_controller(controller)
, m_view(view)
+ , m_tabId(0)
{
if (m_controller)
{
@@ -40,3 +41,13 @@ View* Component::getViewPtr() const
{
return m_view.get();
}
+
+void Component::setTabId(Id tabId)
+{
+ m_tabId = tabId;
+}
+
+Id Component::getTabId() const
+{
+ return m_tabId;
+}
diff --git a/src/lib/component/Component.h b/src/lib/component/Component.h
index a7ad841a..9a7cd5a6 100644
--- a/src/lib/component/Component.h
+++ b/src/lib/component/Component.h
@@ -3,6 +3,8 @@
#include
+#include "types.h"
+
class View;
class Controller;
@@ -22,9 +24,14 @@ public:
View* getViewPtr() const;
+ void setTabId(Id tabId);
+ Id getTabId() const;
+
private:
const std::shared_ptr m_controller;
const std::shared_ptr m_view;
+
+ Id m_tabId;
};
diff --git a/src/lib/component/ComponentFactory.cpp b/src/lib/component/ComponentFactory.cpp
index 3e329eae..484e834d 100644
--- a/src/lib/component/ComponentFactory.cpp
+++ b/src/lib/component/ComponentFactory.cpp
@@ -11,6 +11,7 @@
#include "SearchController.h"
#include "StatusBarController.h"
#include "StatusController.h"
+#include "TabsController.h"
#include "TooltipController.h"
#include "UndoRedoController.h"
#include "BookmarkView.h"
@@ -21,25 +22,18 @@
#include "SearchView.h"
#include "StatusBarView.h"
#include "StatusView.h"
+#include "TabsView.h"
#include "TooltipView.h"
#include "UndoRedoView.h"
#include "ViewFactory.h"
-std::shared_ptr ComponentFactory::create(ViewFactory* viewFactory, StorageAccess* storageAccess)
-{
- std::shared_ptr ptr(new ComponentFactory());
-
- ptr->m_viewFactory = viewFactory;
- ptr->m_storageAccess = storageAccess;
-
- return ptr;
-}
-
-ComponentFactory::~ComponentFactory()
+ComponentFactory::ComponentFactory(const ViewFactory* viewFactory, StorageAccess* storageAccess)
+ : m_viewFactory(viewFactory)
+ , m_storageAccess(storageAccess)
{
}
-ViewFactory* ComponentFactory::getViewFactory() const
+const ViewFactory* ComponentFactory::getViewFactory() const
{
return m_viewFactory;
}
@@ -128,6 +122,16 @@ std::shared_ptr ComponentFactory::createStatusComponent(ViewLayout* v
return std::make_shared(view, controller);
}
+std::shared_ptr ComponentFactory::createTabsComponent(
+ ViewLayout* viewLayout, ScreenSearchSender* screenSearchSender)
+{
+ std::shared_ptr view = m_viewFactory->createTabsView(viewLayout);
+ std::shared_ptr controller = std::make_shared(
+ viewLayout, m_viewFactory, m_storageAccess, screenSearchSender);
+
+ return std::make_shared(view, controller);
+}
+
std::shared_ptr ComponentFactory::createTooltipComponent(ViewLayout* viewLayout)
{
std::shared_ptr view = m_viewFactory->createTooltipView(viewLayout);
@@ -143,7 +147,3 @@ std::shared_ptr ComponentFactory::createUndoRedoComponent(ViewLayout*
return std::make_shared(view, controller);
}
-
-ComponentFactory::ComponentFactory()
-{
-}
diff --git a/src/lib/component/ComponentFactory.h b/src/lib/component/ComponentFactory.h
index db27cbe8..1326d92d 100644
--- a/src/lib/component/ComponentFactory.h
+++ b/src/lib/component/ComponentFactory.h
@@ -8,15 +8,14 @@
class Component;
class ViewFactory;
class ViewLayout;
+class ScreenSearchSender;
class ComponentFactory
{
public:
- static std::shared_ptr create(ViewFactory* viewFactory, StorageAccess* storageAccess);
+ ComponentFactory(const ViewFactory* viewFactory, StorageAccess* storageAccess);
- ~ComponentFactory();
-
- ViewFactory* getViewFactory() const;
+ const ViewFactory* getViewFactory() const;
StorageAccess* getStorageAccess() const;
std::shared_ptr createActivationComponent();
@@ -29,14 +28,12 @@ public:
std::shared_ptr createSearchComponent(ViewLayout* viewLayout);
std::shared_ptr createStatusBarComponent(ViewLayout* viewLayout);
std::shared_ptr createStatusComponent(ViewLayout* viewLayout);
+ std::shared_ptr createTabsComponent(ViewLayout* viewLayout, ScreenSearchSender* screenSearchSender);
std::shared_ptr createTooltipComponent(ViewLayout* viewLayout);
std::shared_ptr createUndoRedoComponent(ViewLayout* viewLayout);
private:
- ComponentFactory();
- ComponentFactory(const ComponentFactory&);
-
- ViewFactory* m_viewFactory;
+ const ViewFactory* m_viewFactory;
StorageAccess* m_storageAccess;
};
diff --git a/src/lib/component/ComponentManager.cpp b/src/lib/component/ComponentManager.cpp
index 3ec98e4e..9d4d45b5 100644
--- a/src/lib/component/ComponentManager.cpp
+++ b/src/lib/component/ComponentManager.cpp
@@ -1,87 +1,147 @@
#include "ComponentManager.h"
-#include "logging.h"
-
-#include "Controller.h"
-#include "ScreenSearchController.h"
#include "CompositeView.h"
+#include "Controller.h"
#include "DialogView.h"
+#include "logging.h"
+#include "ScreenSearchController.h"
#include "TabbedView.h"
#include "ViewFactory.h"
+#include "BookmarkButtonsView.h"
+#include "BookmarkView.h"
+#include "CodeView.h"
+#include "GraphView.h"
+#include "RefreshView.h"
+#include "SearchView.h"
+#include "UndoRedoView.h"
-std::shared_ptr ComponentManager::create(ViewFactory* viewFactory, StorageAccess* storageAccess)
-{
- std::shared_ptr ptr(new ComponentManager());
-
- ptr->m_componentFactory = ComponentFactory::create(viewFactory, storageAccess);
-
- return ptr;
-}
-
-ComponentManager::~ComponentManager()
+ComponentManager::ComponentManager(const ViewFactory* viewFactory, StorageAccess* storageAccess)
+ : m_componentFactory(viewFactory, storageAccess)
{
}
-void ComponentManager::setup(ViewLayout* viewLayout)
+void ComponentManager::clear()
+{
+ m_dialogViews.clear();
+ m_components.clear();
+ m_singleViews.clear();
+}
+
+void ComponentManager::setupMain(ViewLayout* viewLayout, Id appId)
{
std::shared_ptr compositeView =
- m_componentFactory->getViewFactory()->createCompositeView(viewLayout, CompositeView::DIRECTION_HORIZONTAL, "Search");
- m_compositeViews.push_back(compositeView);
+ m_componentFactory.getViewFactory()->createCompositeView(viewLayout, CompositeView::DIRECTION_HORIZONTAL, "Search");
+ m_singleViews.push_back(compositeView);
- std::shared_ptr undoRedoComponent = m_componentFactory->createUndoRedoComponent(compositeView.get());
- m_components.push_back(undoRedoComponent);
+ std::shared_ptr undoRedoView = m_componentFactory.getViewFactory()->createUndoRedoView(compositeView.get());
+ std::shared_ptr refreshView = m_componentFactory.getViewFactory()->createRefreshView(compositeView.get());
+ std::shared_ptr searchView = m_componentFactory.getViewFactory()->createSearchView(compositeView.get());
- std::shared_ptr refreshComponent = m_componentFactory->createRefreshComponent(compositeView.get());
- m_components.push_back(refreshComponent);
+ std::shared_ptr bookmarkView =
+ m_componentFactory.getViewFactory()->createBookmarkButtonsView(compositeView.get());
+ bookmarkView->setTabId(appId);
- std::shared_ptr searchComponent = m_componentFactory->createSearchComponent(compositeView.get());
- m_components.push_back(searchComponent);
+ std::shared_ptr graphView = m_componentFactory.getViewFactory()->createGraphView(viewLayout);
+ std::shared_ptr codeView = m_componentFactory.getViewFactory()->createCodeView(viewLayout);
- std::shared_ptr bookmarkComponent = m_componentFactory->createBookmarkComponent(compositeView.get());
- m_components.push_back(bookmarkComponent);
+ for (std::shared_ptr view :
+ std::vector>({ undoRedoView, searchView, bookmarkView, graphView, codeView }))
+ {
+ view->setEnabled(false);
+ }
- std::shared_ptr graphComponent = m_componentFactory->createGraphComponent(viewLayout);
- m_components.push_back(graphComponent);
+ m_singleViews.push_back(undoRedoView);
+ m_singleViews.push_back(refreshView);
+ m_singleViews.push_back(searchView);
+ m_singleViews.push_back(bookmarkView);
+ m_singleViews.push_back(graphView);
+ m_singleViews.push_back(codeView);
- std::shared_ptr codeComponent = m_componentFactory->createCodeComponent(viewLayout);
- m_components.push_back(codeComponent);
+ std::shared_ptr screenSearchComponent = m_componentFactory.createScreenSearchComponent(viewLayout);
+ ScreenSearchController* screenSearchController = screenSearchComponent->getController();
+ screenSearchController->addResponder(graphView.get());
+ screenSearchController->addResponder(codeView.get());
+ m_components.push_back(screenSearchComponent);
- std::shared_ptr statusBarComponent = m_componentFactory->createStatusBarComponent(viewLayout);
+ std::shared_ptr tabsComponent = m_componentFactory.createTabsComponent(viewLayout, screenSearchController);
+ m_components.push_back(tabsComponent);
+
+ std::shared_ptr statusBarComponent = m_componentFactory.createStatusBarComponent(viewLayout);
m_components.push_back(statusBarComponent);
- std::shared_ptr activationComponent = m_componentFactory->createActivationComponent();
- m_components.push_back(activationComponent);
-
- std::shared_ptr tooltipComponent = m_componentFactory->createTooltipComponent(viewLayout);
+ std::shared_ptr tooltipComponent = m_componentFactory.createTooltipComponent(viewLayout);
m_components.push_back(tooltipComponent);
- std::shared_ptr screenSearchComponent = m_componentFactory->createScreenSearchComponent(viewLayout);
- ScreenSearchController* screenSearchController = screenSearchComponent->getController();
- screenSearchController->addResponder(dynamic_cast(graphComponent->getViewPtr()));
- screenSearchController->addResponder(dynamic_cast(codeComponent->getViewPtr()));
- m_components.push_back(screenSearchComponent);
-
for (DialogView::UseCase useCase :
{ DialogView::UseCase::GENERAL, DialogView::UseCase::INDEXING, DialogView::UseCase::PROJECT_SETUP })
{
m_dialogViews.emplace(
useCase,
- m_componentFactory->getViewFactory()->createDialogView(viewLayout, useCase, m_componentFactory->getStorageAccess())
+ m_componentFactory.getViewFactory()->createDialogView(viewLayout, useCase, m_componentFactory.getStorageAccess())
);
}
m_dialogViews[DialogView::UseCase::INDEXING]->setDialogsHideable(true);
std::shared_ptr tabbedView =
- m_componentFactory->getViewFactory()->createTabbedView(viewLayout, "Status");
- m_tabbedViews.push_back(tabbedView);
+ m_componentFactory.getViewFactory()->createTabbedView(viewLayout, "Status");
+ m_singleViews.push_back(tabbedView);
- std::shared_ptr statusComponent = m_componentFactory->createStatusComponent(tabbedView.get());
+ std::shared_ptr statusComponent = m_componentFactory.createStatusComponent(tabbedView.get());
m_components.push_back(statusComponent);
- std::shared_ptr errorComponent = m_componentFactory->createErrorComponent(tabbedView.get());
+ std::shared_ptr errorComponent = m_componentFactory.createErrorComponent(tabbedView.get());
m_components.push_back(errorComponent);
+ std::shared_ptr bookmarkComponent = m_componentFactory.createBookmarkComponent(compositeView.get());
+ m_components.push_back(bookmarkComponent);
+
+ std::shared_ptr activationComponent = m_componentFactory.createActivationComponent();
+ m_components.push_back(activationComponent);
+}
+
+void ComponentManager::setupTab(ViewLayout* viewLayout, Id tabId, ScreenSearchSender* screenSearchSender)
+{
+ std::shared_ptr compositeView =
+ m_componentFactory.getViewFactory()->createCompositeView(viewLayout, CompositeView::DIRECTION_HORIZONTAL, "Search");
+ m_singleViews.push_back(compositeView);
+
+ std::shared_ptr undoRedoComponent = m_componentFactory.createUndoRedoComponent(compositeView.get());
+ undoRedoComponent->setTabId(tabId);
+ m_components.push_back(undoRedoComponent);
+
+ std::shared_ptr refreshComponent = m_componentFactory.createRefreshComponent(compositeView.get());
+ refreshComponent->setTabId(tabId);
+ m_components.push_back(refreshComponent);
+
+ std::shared_ptr searchComponent = m_componentFactory.createSearchComponent(compositeView.get());
+ searchComponent->setTabId(tabId);
+ m_components.push_back(searchComponent);
+
+ std::shared_ptr bookmarkView =
+ m_componentFactory.getViewFactory()->createBookmarkButtonsView(compositeView.get());
+ bookmarkView->setTabId(tabId);
+ m_singleViews.push_back(bookmarkView);
+
+ std::shared_ptr graphComponent = m_componentFactory.createGraphComponent(viewLayout);
+ graphComponent->setTabId(tabId);
+ m_components.push_back(graphComponent);
+
+ std::shared_ptr codeComponent = m_componentFactory.createCodeComponent(viewLayout);
+ codeComponent->setTabId(tabId);
+ m_components.push_back(codeComponent);
+
+ screenSearchSender->addResponder(graphComponent->getView());
+ screenSearchSender->addResponder(codeComponent->getView());
+}
+
+void ComponentManager::teardownTab(ScreenSearchSender* screenSearchSender)
+{
+ for (const std::shared_ptr& component : m_components)
+ {
+ screenSearchSender->removeResponder(component->getView());
+ screenSearchSender->removeResponder(component->getView());
+ }
}
void ComponentManager::clearComponents()
@@ -109,12 +169,7 @@ void ComponentManager::refreshViews()
}
}
- for (const std::shared_ptr& view : m_compositeViews)
- {
- view->refreshView();
- }
-
- for (const std::shared_ptr& view : m_tabbedViews)
+ for (const std::shared_ptr& view : m_singleViews)
{
view->refreshView();
}
@@ -131,7 +186,3 @@ std::shared_ptr ComponentManager::getDialogView(DialogView::UseCase
return it->second;
}
-
-ComponentManager::ComponentManager()
-{
-}
diff --git a/src/lib/component/ComponentManager.h b/src/lib/component/ComponentManager.h
index e61a6c9d..fa24ff78 100644
--- a/src/lib/component/ComponentManager.h
+++ b/src/lib/component/ComponentManager.h
@@ -10,6 +10,7 @@
class CompositeView;
class DialogView;
+class ScreenSearchSender;
class StorageAccess;
class TabbedView;
class View;
@@ -19,11 +20,13 @@ class ViewLayout;
class ComponentManager
{
public:
- static std::shared_ptr create(ViewFactory* viewFactory, StorageAccess* graphAccess);
+ ComponentManager(const ViewFactory* viewFactory, StorageAccess* storageAccess);
- ~ComponentManager();
+ void clear();
- void setup(ViewLayout* viewLayout);
+ void setupMain(ViewLayout* viewLayout, Id appId);
+ void setupTab(ViewLayout* viewLayout, Id tabId, ScreenSearchSender* screenSearchSender);
+ void teardownTab(ScreenSearchSender* screenSearchSender);
void clearComponents();
void refreshViews();
@@ -31,13 +34,9 @@ public:
std::shared_ptr getDialogView(DialogView::UseCase useCase) const;
private:
- ComponentManager();
- ComponentManager(const ComponentManager&);
+ ComponentFactory m_componentFactory;
- std::shared_ptr m_componentFactory;
-
- std::vector> m_compositeViews;
- std::vector> m_tabbedViews;
+ std::vector> m_singleViews;
std::vector> m_components;
std::map> m_dialogViews;
diff --git a/src/lib/component/Tab.cpp b/src/lib/component/Tab.cpp
new file mode 100644
index 00000000..722b4b23
--- /dev/null
+++ b/src/lib/component/Tab.cpp
@@ -0,0 +1,74 @@
+#include "Tab.h"
+
+Tab::Tab(Id tabId, const ViewFactory* viewFactory, StorageAccess* storageAccess, ScreenSearchSender* screenSearchSender)
+ : m_tabId(tabId)
+ , m_componentManager(viewFactory, storageAccess)
+ , m_parentLayout(nullptr)
+ , m_screenSearchSender(screenSearchSender)
+{
+ m_componentManager.setupTab(this, m_tabId, m_screenSearchSender);
+ m_componentManager.refreshViews();
+}
+
+Tab::~Tab()
+{
+ m_componentManager.teardownTab(m_screenSearchSender);
+}
+
+void Tab::setParentLayout(ViewLayout* parentLayout)
+{
+ m_parentLayout = parentLayout;
+
+ if (parentLayout)
+ {
+ for (View* view : m_views)
+ {
+ parentLayout->overrideView(view);
+ }
+ }
+}
+
+void Tab::addView(View* view)
+{
+ m_views.push_back(view);
+}
+
+void Tab::removeView(View* view)
+{
+ std::vector::iterator it = std::find(m_views.begin(), m_views.end(), view);
+ if (it == m_views.end())
+ {
+ return;
+ }
+
+ m_views.erase(it);
+}
+
+void Tab::showView(View* view)
+{
+ if (m_parentLayout)
+ {
+ m_parentLayout->showView(view);
+ }
+}
+
+void Tab::hideView(View* view)
+{
+ if (m_parentLayout)
+ {
+ m_parentLayout->hideView(view);
+ }
+}
+
+void Tab::setViewEnabled(View* view, bool enabled)
+{
+ if (m_parentLayout)
+ {
+ m_parentLayout->setViewEnabled(view, enabled);
+ }
+}
+
+void Tab::handleMessage(MessageRefreshUI* message)
+{
+ m_componentManager.refreshViews();
+}
diff --git a/src/lib/component/Tab.h b/src/lib/component/Tab.h
new file mode 100644
index 00000000..0f8a6754
--- /dev/null
+++ b/src/lib/component/Tab.h
@@ -0,0 +1,43 @@
+#ifndef TAB_H
+#define TAB_H
+
+#include
+
+#include "ComponentManager.h"
+#include "MessageListener.h"
+#include "MessageRefreshUI.h"
+#include "View.h"
+#include "ViewLayout.h"
+
+class Tab
+ : public ViewLayout
+ , public MessageListener
+{
+public:
+ Tab(Id tabId, const ViewFactory* viewFactory, StorageAccess* storageAccess, ScreenSearchSender* screenSearchSender);
+ virtual ~Tab();
+
+ void setParentLayout(ViewLayout* parentLayout);
+
+ // ViewLayout implementation
+ void addView(View* view) override;
+ void removeView(View* view) override;
+
+ void showView(View* view) override;
+ void hideView(View* view) override;
+
+ void setViewEnabled(View* view, bool enabled) override;
+
+private:
+ void handleMessage(MessageRefreshUI* message) override;
+
+ const Id m_tabId;
+
+ ComponentManager m_componentManager;
+ std::vector m_views;
+
+ ViewLayout* m_parentLayout;
+ ScreenSearchSender* m_screenSearchSender;
+};
+
+#endif // TAB_H
diff --git a/src/lib/component/TabId.cpp b/src/lib/component/TabId.cpp
new file mode 100644
index 00000000..b8aafa53
--- /dev/null
+++ b/src/lib/component/TabId.cpp
@@ -0,0 +1,34 @@
+#include "TabId.h"
+
+Id TabId::s_nextTabId = 10;
+Id TabId::s_currentTabId = 0;
+
+Id TabId::app()
+{
+ return 1;
+}
+
+Id TabId::background()
+{
+ return 2;
+}
+
+Id TabId::ignore()
+{
+ return 3;
+}
+
+Id TabId::nextTab()
+{
+ return s_nextTabId++;
+}
+
+Id TabId::currentTab()
+{
+ return s_currentTabId;
+}
+
+void TabId::setCurrentTabId(Id currentTabId)
+{
+ s_currentTabId = currentTabId;
+}
diff --git a/src/lib/component/TabId.h b/src/lib/component/TabId.h
new file mode 100644
index 00000000..afe47f47
--- /dev/null
+++ b/src/lib/component/TabId.h
@@ -0,0 +1,23 @@
+#ifndef TAB_ID_H
+#define TAB_ID_H
+
+#include "types.h"
+
+class TabId
+{
+public:
+ static Id app();
+ static Id background();
+ static Id ignore();
+
+ static Id nextTab();
+ static Id currentTab();
+
+ static void setCurrentTabId(Id currentTabId);
+
+private:
+ static Id s_nextTabId;
+ static Id s_currentTabId;
+};
+
+#endif // TAB_ID_H
diff --git a/src/lib/component/controller/ActivationController.cpp b/src/lib/component/controller/ActivationController.cpp
index 5cc8aa7f..f1eac641 100644
--- a/src/lib/component/controller/ActivationController.cpp
+++ b/src/lib/component/controller/ActivationController.cpp
@@ -19,10 +19,6 @@ ActivationController::ActivationController(StorageAccess* storageAccess)
{
}
-ActivationController::~ActivationController()
-{
-}
-
void ActivationController::clear()
{
}
@@ -66,12 +62,15 @@ void ActivationController::handleMessage(MessageActivateFile* message)
true,
true
);
+ msg.setSchedulerId(message->getSchedulerId());
msg.dispatchImmediately();
}
if (message->line > 0)
{
- MessageScrollToLine(message->filePath, message->line).dispatch();
+ MessageScrollToLine msg(message->filePath, message->line);
+ msg.setSchedulerId(message->getSchedulerId());
+ msg.dispatch();
}
}
@@ -105,12 +104,13 @@ void ActivationController::handleMessage(MessageActivateTokenIds* message)
void ActivationController::handleMessage(MessageActivateSourceLocations* message)
{
- MessageActivateNodes m;
+ MessageActivateNodes msg;
for (Id nodeId : m_storageAccess->getNodeIdsForLocationIds(message->locationIds))
{
- m.addNode(nodeId);
+ msg.addNode(nodeId);
}
- m.dispatchImmediately();
+ msg.setSchedulerId(message->getSchedulerId());
+ msg.dispatchImmediately();
}
void ActivationController::handleMessage(MessageResetZoom* message)
@@ -140,19 +140,25 @@ void ActivationController::handleMessage(MessageSearch* message)
case SearchMatch::COMMAND_ALL:
case SearchMatch::COMMAND_NODE_FILTER:
{
- MessageActivateAll(message->acceptedNodeTypes).dispatchImmediately();
+ MessageActivateAll msg(message->acceptedNodeTypes);
+ msg.setSchedulerId(message->getSchedulerId());
+ msg.dispatch();
return;
}
case SearchMatch::COMMAND_ERROR:
{
- MessageErrorsAll().dispatch();
+ MessageErrorsAll msg;
+ msg.setSchedulerId(message->getSchedulerId());
+ msg.dispatch();
return;
}
case SearchMatch::COMMAND_LEGEND:
{
- MessageActivateLegend().dispatch();
+ MessageActivateLegend msg;
+ msg.setSchedulerId(message->getSchedulerId());
+ msg.dispatch();
return;
}
}
diff --git a/src/lib/component/controller/ActivationController.h b/src/lib/component/controller/ActivationController.h
index 55ee325e..ba243cee 100644
--- a/src/lib/component/controller/ActivationController.h
+++ b/src/lib/component/controller/ActivationController.h
@@ -30,19 +30,18 @@ class ActivationController
{
public:
ActivationController(StorageAccess* storageAccess);
- ~ActivationController();
- virtual void clear();
+ void clear() override;
private:
- virtual void handleMessage(MessageActivateEdge* message);
- virtual void handleMessage(MessageActivateFile* message);
- virtual void handleMessage(MessageActivateNodes* message);
- virtual void handleMessage(MessageActivateTokenIds* message);
- virtual void handleMessage(MessageActivateSourceLocations* message);
- virtual void handleMessage(MessageResetZoom* message);
- virtual void handleMessage(MessageSearch* message);
- virtual void handleMessage(MessageZoom* message);
+ void handleMessage(MessageActivateEdge* message) override;
+ void handleMessage(MessageActivateFile* message) override;
+ void handleMessage(MessageActivateNodes* message) override;
+ void handleMessage(MessageActivateTokenIds* message) override;
+ void handleMessage(MessageActivateSourceLocations* message) override;
+ void handleMessage(MessageResetZoom* message) override;
+ void handleMessage(MessageSearch* message) override;
+ void handleMessage(MessageZoom* message) override;
StorageAccess* m_storageAccess;
};
diff --git a/src/lib/component/controller/BookmarkController.cpp b/src/lib/component/controller/BookmarkController.cpp
index 250dc0df..a4a22eaf 100644
--- a/src/lib/component/controller/BookmarkController.cpp
+++ b/src/lib/component/controller/BookmarkController.cpp
@@ -10,7 +10,9 @@
#include "MessageActivateEdge.h"
#include "MessageActivateNodes.h"
+#include "MessageBookmarkButtonState.h"
#include "logging.h"
+#include "TabId.h"
#include "utilityString.h"
#include "utility.h"
@@ -33,8 +35,6 @@ void BookmarkController::clear()
{
m_activeNodeIds.clear();
m_activeEdgeIds.clear();
-
- getView()->setCreateButtonState(BookmarkView::CreateButtonState::CANNOT_CREATE);
}
void BookmarkController::displayBookmarks()
@@ -62,18 +62,20 @@ void BookmarkController::createBookmark(
){
LOG_INFO("Attempting to create new bookmark");
+ Id tabId = TabId::currentTab();
+
BookmarkCategory bookmarkCategory(0, category.empty() ? s_defaultCategoryName : category);
- if (!m_activeEdgeIds.empty())
+ if (!m_activeEdgeIds[tabId].empty())
{
LOG_INFO("Creating Edge Bookmark");
EdgeBookmark bookmark(0, name, comment, TimeStamp::now(), bookmarkCategory);
- bookmark.setEdgeIds(m_activeEdgeIds);
+ bookmark.setEdgeIds(m_activeEdgeIds[tabId]);
- if (!m_activeNodeIds.empty())
+ if (!m_activeNodeIds[TabId::currentTab()].empty())
{
- bookmark.setActiveNodeId(m_activeNodeIds.front());
+ bookmark.setActiveNodeId(m_activeNodeIds[tabId].front());
}
else
{
@@ -93,16 +95,17 @@ void BookmarkController::createBookmark(
}
else
{
- bookmark.setNodeIds(m_activeNodeIds);
+ bookmark.setNodeIds(m_activeNodeIds[TabId::currentTab()]);
}
+
m_storageAccess->addNodeBookmark(bookmark);
}
m_bookmarkCache.clear();
- if (!nodeId || (m_activeNodeIds.size() == 1 && m_activeNodeIds[0] == nodeId))
+ if (!nodeId || (m_activeNodeIds[TabId::currentTab()].size() == 1 && m_activeNodeIds[TabId::currentTab()][0] == nodeId))
{
- getView()->setCreateButtonState(BookmarkView::CreateButtonState::ALREADY_CREATED);
+ MessageBookmarkButtonState(TabId::currentTab(), MessageBookmarkButtonState::ALREADY_CREATED).dispatch();
}
update();
@@ -128,9 +131,9 @@ void BookmarkController::deleteBookmark(Id bookmarkId)
cleanBookmarkCategories();
- if (!getBookmarkForActiveToken())
+ if (!getBookmarkForActiveToken(TabId::currentTab()))
{
- getView()->setCreateButtonState(BookmarkView::CreateButtonState::CAN_CREATE);
+ MessageBookmarkButtonState(TabId::currentTab(), MessageBookmarkButtonState::CAN_CREATE).dispatch();
}
update();
@@ -142,9 +145,9 @@ void BookmarkController::deleteBookmarkCategory(Id categoryId)
m_bookmarkCache.clear();
- if (!getBookmarkForActiveToken())
+ if (!getBookmarkForActiveToken(TabId::currentTab()))
{
- getView()->setCreateButtonState(BookmarkView::CreateButtonState::CAN_CREATE);
+ MessageBookmarkButtonState(TabId::currentTab(), MessageBookmarkButtonState::CAN_CREATE).dispatch();
}
update();
@@ -152,7 +155,7 @@ void BookmarkController::deleteBookmarkCategory(Id categoryId)
void BookmarkController::deleteBookmarkForActiveTokens()
{
- if (std::shared_ptr bookmark = getBookmarkForActiveToken())
+ if (std::shared_ptr bookmark = getBookmarkForActiveToken(TabId::currentTab()))
{
LOG_INFO(L"Deleting bookmark " + bookmark->getName());
@@ -160,7 +163,7 @@ void BookmarkController::deleteBookmarkForActiveTokens()
cleanBookmarkCategories();
- getView()->setCreateButtonState(BookmarkView::CreateButtonState::CAN_CREATE);
+ MessageBookmarkButtonState(TabId::currentTab(), MessageBookmarkButtonState::CAN_CREATE).dispatch();
update();
}
else
@@ -223,7 +226,8 @@ void BookmarkController::activateBookmark(const std::shared_ptr bookma
void BookmarkController::showBookmarkCreator(Id nodeId)
{
- if (!canCreateBookmark() && !nodeId)
+ Id tabId = TabId::currentTab();
+ if (!m_activeNodeIds[tabId].size() && !m_activeEdgeIds[tabId].size() && !nodeId)
{
return;
}
@@ -244,7 +248,7 @@ void BookmarkController::showBookmarkCreator(Id nodeId)
}
else
{
- std::shared_ptr bookmark = getBookmarkForActiveToken();
+ std::shared_ptr bookmark = getBookmarkForActiveToken(tabId);
if (bookmark != nullptr)
{
view->displayBookmarkEditor(bookmark, getAllBookmarkCategories());
@@ -297,69 +301,89 @@ void BookmarkController::handleMessage(MessageActivateAll* message)
clear();
}
-void BookmarkController::handleMessage(MessageActivateBookmark* message)
+void BookmarkController::handleMessage(MessageActivateErrors* message)
{
- activateBookmark(message->bookmark);
+ clear();
}
-void BookmarkController::handleMessage(MessageActivateErrors* message)
+void BookmarkController::handleMessage(MessageActivateFullTextSearch* message)
+{
+ clear();
+}
+
+void BookmarkController::handleMessage(MessageActivateLegend* message)
{
clear();
}
void BookmarkController::handleMessage(MessageActivateTokens* message)
{
- m_activeEdgeIds.clear();
+ Id tabId = message->getSchedulerId();
+ m_activeEdgeIds[tabId].clear();
if (message->isEdge || message->isAggregation)
{
- m_activeEdgeIds = message->tokenIds;
+ m_activeEdgeIds[tabId] = message->tokenIds;
- if (getBookmarkForActiveToken())
+ if (getBookmarkForActiveToken(tabId))
{
- getView()->setCreateButtonState(BookmarkView::CreateButtonState::ALREADY_CREATED);
+ MessageBookmarkButtonState(tabId, MessageBookmarkButtonState::ALREADY_CREATED).dispatch();
}
else
{
- getView()->setCreateButtonState(BookmarkView::CreateButtonState::CAN_CREATE);
+ MessageBookmarkButtonState(tabId, MessageBookmarkButtonState::CAN_CREATE).dispatch();
}
}
else if (!message->isEdge)
{
- m_activeNodeIds = message->tokenIds;
+ m_activeNodeIds[tabId] = message->tokenIds;
- if (getBookmarkForActiveToken())
+ if (getBookmarkForActiveToken(tabId))
{
- getView()->setCreateButtonState(BookmarkView::CreateButtonState::ALREADY_CREATED);
+ MessageBookmarkButtonState(tabId, MessageBookmarkButtonState::ALREADY_CREATED).dispatch();
}
else
{
- getView()->setCreateButtonState(BookmarkView::CreateButtonState::CAN_CREATE);
+ MessageBookmarkButtonState(tabId, MessageBookmarkButtonState::CAN_CREATE).dispatch();
}
}
}
-void BookmarkController::handleMessage(MessageDisplayBookmarks* message)
+void BookmarkController::handleMessage(MessageBookmarkActivate* message)
+{
+ activateBookmark(message->bookmark);
+}
+
+void BookmarkController::handleMessage(MessageBookmarkBrowse* message)
{
displayBookmarksFor(message->filter, message->order);
}
-void BookmarkController::handleMessage(MessageDisplayBookmarkCreator* message)
+void BookmarkController::handleMessage(MessageBookmarkCreate* message)
{
showBookmarkCreator(message->nodeId);
}
+void BookmarkController::handleMessage(MessageBookmarkDelete* message)
+{
+ deleteBookmarkForActiveTokens();
+}
+
+void BookmarkController::handleMessage(MessageBookmarkEdit* message)
+{
+ showBookmarkCreator(0);
+}
+
void BookmarkController::handleMessage(MessageIndexingFinished* message)
{
m_bookmarkCache.clear();
- getView()->enableDisplayBookmarks(true);
update();
}
std::vector BookmarkController::getActiveTokenDisplayNames() const
{
- if (m_activeEdgeIds.size() > 0)
+ if (m_activeEdgeIds[TabId::currentTab()].size() > 0)
{
return getActiveEdgeDisplayNames();
}
@@ -379,14 +403,14 @@ std::vector BookmarkController::getAllBookmarkCategories() con
return m_storageAccess->getAllBookmarkCategories();
}
-std::shared_ptr BookmarkController::getBookmarkForActiveToken() const
+std::shared_ptr BookmarkController::getBookmarkForActiveToken(Id tabId) const
{
- if (!m_activeEdgeIds.empty())
+ if (!m_activeEdgeIds[tabId].empty())
{
for (const std::shared_ptr& edgeBookmark: getAllEdgeBookmarks())
{
- if (!m_activeNodeIds.empty() && edgeBookmark->getActiveNodeId() == m_activeNodeIds.front() &&
- utility::isPermutation(edgeBookmark->getEdgeIds(), m_activeEdgeIds))
+ if (!m_activeNodeIds[tabId].empty() && edgeBookmark->getActiveNodeId() == m_activeNodeIds[tabId].front() &&
+ utility::isPermutation(edgeBookmark->getEdgeIds(), m_activeEdgeIds[tabId]))
{
return std::make_shared(*(edgeBookmark.get()));
}
@@ -396,7 +420,7 @@ std::shared_ptr BookmarkController::getBookmarkForActiveToken() const
{
for (const std::shared_ptr& nodeBookmark: getAllNodeBookmarks())
{
- if (utility::isPermutation(nodeBookmark->getNodeIds(), m_activeNodeIds))
+ if (utility::isPermutation(nodeBookmark->getNodeIds(), m_activeNodeIds[tabId]))
{
return std::make_shared(*(nodeBookmark.get()));
}
@@ -419,11 +443,6 @@ std::shared_ptr BookmarkController::getBookmarkForNodeId(Id nodeId) co
return std::shared_ptr();
}
-bool BookmarkController::canCreateBookmark() const
-{
- return m_activeNodeIds.size() || m_activeEdgeIds.size();
-}
-
std::vector> BookmarkController::getAllBookmarks() const
{
LOG_INFO("Retrieving all bookmarks");
@@ -476,7 +495,7 @@ std::vector> BookmarkController::getBookmarks(
std::vector BookmarkController::getActiveNodeDisplayNames() const
{
std::vector names;
- for (Id nodeId : m_activeNodeIds)
+ for (Id nodeId : m_activeNodeIds[TabId::currentTab()])
{
names.push_back(getNodeDisplayName(nodeId));
}
@@ -486,7 +505,7 @@ std::vector BookmarkController::getActiveNodeDisplayNames() const
std::vector BookmarkController::getActiveEdgeDisplayNames() const
{
std::vector activeEdgeDisplayNames;
- for (Id activeEdgeId: m_activeEdgeIds)
+ for (Id activeEdgeId: m_activeEdgeIds[TabId::currentTab()])
{
const StorageEdge activeEdge = m_storageAccess->getEdgeById(activeEdgeId);
const std::wstring sourceDisplayName = getNodeDisplayName(activeEdge.sourceNodeId);
diff --git a/src/lib/component/controller/BookmarkController.h b/src/lib/component/controller/BookmarkController.h
index 4dc9f6c4..b377bede 100644
--- a/src/lib/component/controller/BookmarkController.h
+++ b/src/lib/component/controller/BookmarkController.h
@@ -6,13 +6,17 @@
#include "EdgeBookmark.h"
#include "MessageListener.h"
-#include "MessageActivateErrors.h"
-#include "MessageIndexingFinished.h"
#include "MessageActivateAll.h"
-#include "MessageActivateBookmark.h"
+#include "MessageActivateErrors.h"
+#include "MessageActivateFullTextSearch.h"
+#include "MessageActivateLegend.h"
#include "MessageActivateTokens.h"
-#include "MessageDisplayBookmarkCreator.h"
-#include "MessageDisplayBookmarks.h"
+#include "MessageBookmarkActivate.h"
+#include "MessageBookmarkBrowse.h"
+#include "MessageBookmarkCreate.h"
+#include "MessageBookmarkDelete.h"
+#include "MessageBookmarkEdit.h"
+#include "MessageIndexingFinished.h"
#include "Controller.h"
@@ -21,18 +25,22 @@ class StorageAccess;
class BookmarkController
: public Controller
, public MessageListener
- , public MessageListener
, public MessageListener
+ , public MessageListener
+ , public MessageListener
, public MessageListener
- , public MessageListener
- , public MessageListener
+ , public MessageListener
+ , public MessageListener
+ , public MessageListener
+ , public MessageListener
+ , public MessageListener
, public MessageListener
{
public:
BookmarkController(StorageAccess* storageAccess);
virtual ~BookmarkController();
- virtual void clear();
+ void clear() override;
void displayBookmarks();
void displayBookmarksFor(Bookmark::BookmarkFilter filter, Bookmark::BookmarkOrder order);
@@ -68,20 +76,24 @@ private:
bool m_edgeBookmarksValid;
};
- virtual void handleMessage(MessageActivateAll* message);
- virtual void handleMessage(MessageActivateBookmark* message);
- virtual void handleMessage(MessageActivateErrors* message);
- virtual void handleMessage(MessageActivateTokens* message);
- virtual void handleMessage(MessageDisplayBookmarkCreator* message);
- virtual void handleMessage(MessageDisplayBookmarks* message);
- virtual void handleMessage(MessageIndexingFinished* message);
+ void handleMessage(MessageActivateAll* message) override;
+ void handleMessage(MessageActivateErrors* message) override;
+ void handleMessage(MessageActivateFullTextSearch* message) override;
+ void handleMessage(MessageActivateLegend* message) override;
+ void handleMessage(MessageActivateTokens* message) override;
+ void handleMessage(MessageBookmarkActivate* message) override;
+ void handleMessage(MessageBookmarkBrowse* message) override;
+ void handleMessage(MessageBookmarkCreate* message) override;
+ void handleMessage(MessageBookmarkDelete* message) override;
+ void handleMessage(MessageBookmarkEdit* message) override;
+ void handleMessage(MessageIndexingFinished* message) override;
std::vector getActiveTokenDisplayNames() const;
std::vector getDisplayNamesForNodeId(Id nodeId) const;
std::vector getAllBookmarkCategories() const;
- std::shared_ptr getBookmarkForActiveToken() const;
+ std::shared_ptr getBookmarkForActiveToken(Id tabId) const;
std::shared_ptr getBookmarkForNodeId(Id nodeId) const;
bool canCreateBookmark() const;
@@ -118,8 +130,8 @@ private:
StorageAccess* m_storageAccess;
mutable BookmarkCache m_bookmarkCache;
- std::vector m_activeNodeIds;
- std::vector m_activeEdgeIds;
+ mutable std::map> m_activeNodeIds;
+ mutable std::map> m_activeEdgeIds;
Bookmark::BookmarkFilter m_filter;
Bookmark::BookmarkOrder m_order;
diff --git a/src/lib/component/controller/CodeController.cpp b/src/lib/component/controller/CodeController.cpp
index e85f4c93..1a7dfbc5 100644
--- a/src/lib/component/controller/CodeController.cpp
+++ b/src/lib/component/controller/CodeController.cpp
@@ -20,8 +20,9 @@ CodeController::CodeController(StorageAccess* storageAccess)
{
}
-CodeController::~CodeController()
+Id CodeController::getSchedulerId() const
{
+ return Controller::getTabId();
}
const uint CodeController::s_lineRadius = 2;
diff --git a/src/lib/component/controller/CodeController.h b/src/lib/component/controller/CodeController.h
index a3dda681..f2e55b02 100644
--- a/src/lib/component/controller/CodeController.h
+++ b/src/lib/component/controller/CodeController.h
@@ -58,33 +58,35 @@ class CodeController
{
public:
CodeController(StorageAccess* storageAccess);
- ~CodeController();
+ virtual ~CodeController() = default;
+
+ Id getSchedulerId() const override;
private:
static const uint s_lineRadius;
- virtual void handleMessage(MessageActivateAll* message);
- virtual void handleMessage(MessageActivateErrors* message);
- virtual void handleMessage(MessageActivateFullTextSearch* message);
- virtual void handleMessage(MessageActivateLegend* message);
- virtual void handleMessage(MessageActivateLocalSymbols* message);
- virtual void handleMessage(MessageActivateTokens* message);
- virtual void handleMessage(MessageActivateTrailEdge* message);
- virtual void handleMessage(MessageChangeFileView* message);
- virtual void handleMessage(MessageCodeShowDefinition* message);
- virtual void handleMessage(MessageDeactivateEdge* message);
- virtual void handleMessage(MessageErrorCountClear* message);
- virtual void handleMessage(MessageFlushUpdates* message);
- virtual void handleMessage(MessageFocusIn* message);
- virtual void handleMessage(MessageFocusOut* message);
- virtual void handleMessage(MessageScrollCode* message);
- virtual void handleMessage(MessageScrollToLine* message);
- virtual void handleMessage(MessageShowError* message);
- virtual void handleMessage(MessageShowScope* message);
+ void handleMessage(MessageActivateAll* message) override;
+ void handleMessage(MessageActivateErrors* message) override;
+ void handleMessage(MessageActivateFullTextSearch* message) override;
+ void handleMessage(MessageActivateLegend* message) override;
+ void handleMessage(MessageActivateLocalSymbols* message) override;
+ void handleMessage(MessageActivateTokens* message) override;
+ void handleMessage(MessageActivateTrailEdge* message) override;
+ void handleMessage(MessageChangeFileView* message) override;
+ void handleMessage(MessageCodeShowDefinition* message) override;
+ void handleMessage(MessageDeactivateEdge* message) override;
+ void handleMessage(MessageErrorCountClear* message) override;
+ void handleMessage(MessageFlushUpdates* message) override;
+ void handleMessage(MessageFocusIn* message) override;
+ void handleMessage(MessageFocusOut* message) override;
+ void handleMessage(MessageScrollCode* message) override;
+ void handleMessage(MessageScrollToLine* message) override;
+ void handleMessage(MessageShowError* message) override;
+ void handleMessage(MessageShowScope* message) override;
CodeView* getView() const;
- virtual void clear();
+ void clear() override;
std::vector getSnippetsForFileWithState(const FilePath& filePath, CodeView::FileState state) const;
std::vector getSnippetsForActiveSourceLocations(
diff --git a/src/lib/component/controller/Controller.cpp b/src/lib/component/controller/Controller.cpp
index d3be3d22..f98e929f 100644
--- a/src/lib/component/controller/Controller.cpp
+++ b/src/lib/component/controller/Controller.cpp
@@ -1,6 +1,7 @@
#include "component/controller/Controller.h"
Controller::Controller()
+ : m_component(nullptr)
{
}
@@ -12,3 +13,13 @@ void Controller::setComponent(Component* component)
{
m_component = component;
}
+
+Id Controller::getTabId() const
+{
+ if (m_component)
+ {
+ return m_component->getTabId();
+ }
+
+ return 0;
+}
diff --git a/src/lib/component/controller/Controller.h b/src/lib/component/controller/Controller.h
index 9201578f..9e63f3ea 100644
--- a/src/lib/component/controller/Controller.h
+++ b/src/lib/component/controller/Controller.h
@@ -13,6 +13,8 @@ public:
virtual void clear() = 0;
+ Id getTabId() const;
+
protected:
template
ViewType* getView() const;
diff --git a/src/lib/component/controller/ErrorController.cpp b/src/lib/component/controller/ErrorController.cpp
index 2c445dab..4461bbdf 100644
--- a/src/lib/component/controller/ErrorController.cpp
+++ b/src/lib/component/controller/ErrorController.cpp
@@ -1,10 +1,11 @@
#include "ErrorController.h"
#include "Application.h"
-#include "DialogView.h"
-#include "StorageAccess.h"
-#include "Project.h"
#include "ApplicationSettings.h"
+#include "DialogView.h"
+#include "Project.h"
+#include "StorageAccess.h"
+#include "TabId.h"
ErrorController::ErrorController(StorageAccess* storageAccess)
: m_storageAccess(storageAccess)
@@ -17,19 +18,19 @@ ErrorController::~ErrorController()
void ErrorController::errorFilterChanged(const ErrorFilter& filter)
{
- if (m_activeFilePath.empty())
+ if (m_tabActiveFilePath[TabId::currentTab()].empty())
{
MessageActivateErrors(filter).dispatch();
}
else
{
- MessageActivateErrors(filter, m_activeFilePath).dispatch();
+ MessageActivateErrors(filter, m_tabActiveFilePath[TabId::currentTab()]).dispatch();
}
}
void ErrorController::showError(Id errorId)
{
- if (!m_showsErrors)
+ if (!m_tabShowsErrors[TabId::currentTab()])
{
errorFilterChanged(getView()->getErrorFilter());
}
@@ -39,15 +40,15 @@ void ErrorController::showError(Id errorId)
void ErrorController::handleMessage(MessageActivateAll* message)
{
- m_showsErrors = false;
+ m_tabShowsErrors[message->getSchedulerId()] = false;
}
void ErrorController::handleMessage(MessageActivateErrors* message)
{
clear();
- m_showsErrors = true;
- m_activeFilePath = message->file;
+ m_tabShowsErrors[message->getSchedulerId()] = true;
+ m_tabActiveFilePath[message->getSchedulerId()] = message->file;
ErrorView* view = getView();
view->setErrorFilter(message->filter);
@@ -60,12 +61,12 @@ void ErrorController::handleMessage(MessageActivateErrors* message)
void ErrorController::handleMessage(MessageActivateFullTextSearch* message)
{
- m_showsErrors = false;
+ m_tabShowsErrors[message->getSchedulerId()] = false;
}
void ErrorController::handleMessage(MessageActivateTokens* message)
{
- m_showsErrors = false;
+ m_tabShowsErrors[message->getSchedulerId()] = false;
}
void ErrorController::handleMessage(MessageErrorCountClear* message)
@@ -178,9 +179,9 @@ ErrorView* ErrorController::getView() const
void ErrorController::clear()
{
- m_showsErrors = false;
m_errorCount = 0;
- m_activeFilePath = FilePath();
+ m_tabShowsErrors.clear();
+ m_tabActiveFilePath.clear();
getView()->clear();
}
@@ -193,13 +194,13 @@ bool ErrorController::showErrors(const ErrorFilter& filter, bool scrollTo)
filterUnlimited.limit = 0;
std::vector errors;
- if (m_activeFilePath.empty())
+ if (m_tabActiveFilePath[TabId::currentTab()].empty())
{
errors = m_storageAccess->getErrorsLimited(filterUnlimited);
}
else
{
- errors = m_storageAccess->getErrorsForFileLimited(filter, m_activeFilePath);
+ errors = m_storageAccess->getErrorsForFileLimited(filter, m_tabActiveFilePath[TabId::currentTab()]);
}
ErrorCountInfo errorCount(errors);
diff --git a/src/lib/component/controller/ErrorController.h b/src/lib/component/controller/ErrorController.h
index 30b3eb8e..0b161c48 100644
--- a/src/lib/component/controller/ErrorController.h
+++ b/src/lib/component/controller/ErrorController.h
@@ -65,9 +65,10 @@ private:
StorageAccess* m_storageAccess;
- bool m_showsErrors = false;
size_t m_errorCount = 0;
- FilePath m_activeFilePath;
+
+ std::map m_tabShowsErrors;
+ std::map m_tabActiveFilePath;
};
#endif // ERROR_CONTROLLER_H
diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp
index fc506974..efc38026 100644
--- a/src/lib/component/controller/GraphController.cpp
+++ b/src/lib/component/controller/GraphController.cpp
@@ -28,8 +28,9 @@ GraphController::GraphController(StorageAccess* storageAccess)
{
}
-GraphController::~GraphController()
+Id GraphController::getSchedulerId() const
{
+ return Controller::getTabId();
}
void GraphController::handleMessage(MessageActivateAll* message)
diff --git a/src/lib/component/controller/GraphController.h b/src/lib/component/controller/GraphController.h
index 5434282b..ecd797e7 100644
--- a/src/lib/component/controller/GraphController.h
+++ b/src/lib/component/controller/GraphController.h
@@ -52,29 +52,31 @@ class GraphController
{
public:
GraphController(StorageAccess* storageAccess);
- ~GraphController();
+ ~GraphController() = default;
+
+ Id getSchedulerId() const override;
private:
- virtual void handleMessage(MessageActivateAll* message);
- virtual void handleMessage(MessageActivateErrors* message);
- virtual void handleMessage(MessageActivateFullTextSearch* message);
- virtual void handleMessage(MessageActivateLegend* message);
- virtual void handleMessage(MessageActivateTokens* message);
- virtual void handleMessage(MessageActivateTrail* message);
- virtual void handleMessage(MessageActivateTrailEdge* message);
- virtual void handleMessage(MessageFlushUpdates* message);
- virtual void handleMessage(MessageFocusIn* message);
- virtual void handleMessage(MessageFocusOut* message);
- virtual void handleMessage(MessageGraphNodeBundleSplit* message);
- virtual void handleMessage(MessageGraphNodeExpand* message);
- virtual void handleMessage(MessageGraphNodeHide* message);
- virtual void handleMessage(MessageGraphNodeMove* message);
- virtual void handleMessage(MessageScrollGraph* message);
- virtual void handleMessage(MessageShowReference* message);
+ void handleMessage(MessageActivateAll* message) override;
+ void handleMessage(MessageActivateErrors* message) override;
+ void handleMessage(MessageActivateFullTextSearch* message) override;
+ void handleMessage(MessageActivateLegend* message) override;
+ void handleMessage(MessageActivateTokens* message) override;
+ void handleMessage(MessageActivateTrail* message) override;
+ void handleMessage(MessageActivateTrailEdge* message) override;
+ void handleMessage(MessageFlushUpdates* message) override;
+ void handleMessage(MessageFocusIn* message) override;
+ void handleMessage(MessageFocusOut* message) override;
+ void handleMessage(MessageGraphNodeBundleSplit* message) override;
+ void handleMessage(MessageGraphNodeExpand* message) override;
+ void handleMessage(MessageGraphNodeHide* message) override;
+ void handleMessage(MessageGraphNodeMove* message) override;
+ void handleMessage(MessageScrollGraph* message) override;
+ void handleMessage(MessageShowReference* message) override;
GraphView* getView() const;
- virtual void clear();
+ void clear() override;
void createDummyGraph(const std::shared_ptr graph);
void createDummyGraphAndSetActiveAndVisibility(
diff --git a/src/lib/component/controller/IDECommunicationController.cpp b/src/lib/component/controller/IDECommunicationController.cpp
index 13764fec..56643664 100644
--- a/src/lib/component/controller/IDECommunicationController.cpp
+++ b/src/lib/component/controller/IDECommunicationController.cpp
@@ -2,12 +2,11 @@
#include "FileSystem.h"
#include "logging.h"
-#include "MessageActivateSourceLocations.h"
#include "MessageActivateWindow.h"
+#include "MessagePingReceived.h"
#include "MessageProjectNew.h"
#include "MessageStatus.h"
-#include "MessageActivateFile.h"
-#include "MessagePingReceived.h"
+#include "MessageTabOpenWith.h"
#include "StorageAccess.h"
#include "SourceLocationFile.h"
@@ -118,7 +117,7 @@ void IDECommunicationController::handleSetActiveTokenMessage(
std::to_wstring(message.row) + L", col: " + std::to_wstring(message.column)
).dispatch();
- MessageActivateSourceLocations(selectedLocationIds).dispatch();
+ MessageTabOpenWith(0, selectedLocationIds[0]).showNewTab(true).dispatch();
MessageActivateWindow().dispatch();
return;
}
@@ -126,7 +125,7 @@ void IDECommunicationController::handleSetActiveTokenMessage(
if (fileId > 0)
{
- MessageActivateFile(filePath, message.row).dispatchImmediately();
+ MessageTabOpenWith(filePath, message.row).showNewTab(true).dispatch();
MessageActivateWindow().dispatch();
}
else
diff --git a/src/lib/component/controller/ScreenSearchController.cpp b/src/lib/component/controller/ScreenSearchController.cpp
index c25c4d9f..c43994d5 100644
--- a/src/lib/component/controller/ScreenSearchController.cpp
+++ b/src/lib/component/controller/ScreenSearchController.cpp
@@ -2,14 +2,6 @@
#include "ScreenSearchView.h"
-ScreenSearchController::ScreenSearchController()
-{
-}
-
-ScreenSearchController::~ScreenSearchController()
-{
-}
-
void ScreenSearchController::clear()
{
}
@@ -54,15 +46,21 @@ void ScreenSearchController::addResponder(ScreenSearchResponder* responder)
}
}
+void ScreenSearchController::removeResponder(ScreenSearchResponder* responder)
+{
+ if (responder)
+ {
+ auto it = std::find(m_responders.begin(), m_responders.end(), responder);
+ if (it != m_responders.end())
+ {
+ m_responders.erase(it);
+ }
+ }
+}
+
void ScreenSearchController::search(const std::wstring& query, const std::set& responderNames)
{
- {
- std::lock_guard lock(m_matchMutex);
- m_matches.clear();
- m_matchIndex = 0;
- }
-
- getView()->setMatchCount(0);
+ clearMatches();
for (ScreenSearchResponder* responder : m_responders)
{
@@ -75,10 +73,6 @@ void ScreenSearchController::search(const std::wstring& query, const std::setfindMatches(this, query);
}
- else
- {
- responder->clearMatches();
- }
}
}
@@ -133,6 +127,8 @@ void ScreenSearchController::clearMatches()
m_matchIndex = 0;
}
+ getView()->setMatchCount(0);
+
for (ScreenSearchResponder* responder : m_responders)
{
responder->clearMatches();
diff --git a/src/lib/component/controller/ScreenSearchController.h b/src/lib/component/controller/ScreenSearchController.h
index 74d26954..5bd78df2 100644
--- a/src/lib/component/controller/ScreenSearchController.h
+++ b/src/lib/component/controller/ScreenSearchController.h
@@ -13,19 +13,19 @@ class ScreenSearchController
, public ScreenSearchSender
{
public:
- ScreenSearchController();
- virtual ~ScreenSearchController();
+ virtual ~ScreenSearchController() = default;
// Controller implementation
- virtual void clear();
+ void clear() override;
// ScreenSearchSender implementation
- virtual void foundMatches(ScreenSearchResponder* responder, size_t matchCount);
+ void foundMatches(ScreenSearchResponder* responder, size_t matchCount) override;
+ void addResponder(ScreenSearchResponder* responder) override;
+ void removeResponder(ScreenSearchResponder* responder) override;
+ void clearMatches() override;
- void addResponder(ScreenSearchResponder* responder);
void search(const std::wstring& query, const std::set& responderNames);
void activateMatch(bool next);
- void clearMatches();
private:
size_t getResponderId(ScreenSearchResponder* responder) const;
diff --git a/src/lib/component/controller/SearchController.cpp b/src/lib/component/controller/SearchController.cpp
index 5cbc0969..8f2df7d3 100644
--- a/src/lib/component/controller/SearchController.cpp
+++ b/src/lib/component/controller/SearchController.cpp
@@ -1,8 +1,9 @@
#include "SearchController.h"
+#include "logging.h"
+#include "MessageTabState.h"
#include "SearchView.h"
#include "StorageAccess.h"
-#include "logging.h"
#include "tracing.h"
SearchController::SearchController(StorageAccess* storageAccess)
@@ -10,38 +11,37 @@ SearchController::SearchController(StorageAccess* storageAccess)
{
}
-SearchController::~SearchController()
+Id SearchController::getSchedulerId() const
{
+ return Controller::getTabId();
}
void SearchController::handleMessage(MessageActivateAll* message)
{
- getView()->setMatches(message->getSearchMatches());
+ updateMatches(message);
}
void SearchController::handleMessage(MessageActivateErrors* message)
{
- getView()->setMatches(message->getSearchMatches());
+ updateMatches(message);
}
void SearchController::handleMessage(MessageActivateFullTextSearch* message)
{
- getView()->setMatches(message->getSearchMatches());
+ updateMatches(message);
}
void SearchController::handleMessage(MessageActivateLegend* message)
{
- getView()->setMatches(message->getSearchMatches());
+ updateMatches(message);
}
void SearchController::handleMessage(MessageActivateTokens* message)
{
- if (message->keepContent())
+ if (!message->isEdge)
{
- return;
+ updateMatches(message, !message->keepContent());
}
-
- getView()->setMatches(message->getSearchMatches());
}
void SearchController::handleMessage(MessageFind* message)
@@ -79,5 +79,22 @@ SearchView* SearchController::getView()
void SearchController::clear()
{
- getView()->setMatches(std::vector());
+ updateMatches(nullptr);
+}
+
+void SearchController::updateMatches(MessageActivateBase* message, bool updateView)
+{
+ std::vector matches;
+
+ if (message)
+ {
+ matches = message->getSearchMatches();
+ }
+
+ if (updateView)
+ {
+ getView()->setMatches(matches);
+ }
+
+ MessageTabState(Controller::getTabId(), matches).dispatch();
}
diff --git a/src/lib/component/controller/SearchController.h b/src/lib/component/controller/SearchController.h
index 27da44ae..159f44e2 100644
--- a/src/lib/component/controller/SearchController.h
+++ b/src/lib/component/controller/SearchController.h
@@ -26,20 +26,24 @@ class SearchController
{
public:
SearchController(StorageAccess* storageAccess);
- ~SearchController();
+ ~SearchController() = default;
+
+ Id getSchedulerId() const override;
private:
- virtual void handleMessage(MessageActivateAll* message);
- virtual void handleMessage(MessageActivateErrors* message);
- virtual void handleMessage(MessageActivateFullTextSearch* message);
- virtual void handleMessage(MessageActivateLegend* message);
- virtual void handleMessage(MessageActivateTokens* message);
- virtual void handleMessage(MessageFind* message);
- virtual void handleMessage(MessageSearchAutocomplete* message);
+ void handleMessage(MessageActivateAll* message) override;
+ void handleMessage(MessageActivateErrors* message) override;
+ void handleMessage(MessageActivateFullTextSearch* message) override;
+ void handleMessage(MessageActivateLegend* message) override;
+ void handleMessage(MessageActivateTokens* message) override;
+ void handleMessage(MessageFind* message) override;
+ void handleMessage(MessageSearchAutocomplete* message) override;
SearchView* getView();
- virtual void clear();
+ void clear() override;
+
+ void updateMatches(MessageActivateBase* message, bool updateView = true);
StorageAccess* m_storageAccess;
};
diff --git a/src/lib/component/controller/TabsController.cpp b/src/lib/component/controller/TabsController.cpp
new file mode 100644
index 00000000..f489daf8
--- /dev/null
+++ b/src/lib/component/controller/TabsController.cpp
@@ -0,0 +1,224 @@
+#include "TabsController.h"
+
+#include "Application.h"
+#include "MessageFind.h"
+#include "MessageIndexingFinished.h"
+#include "MessageSearch.h"
+#include "MessageScrollToLine.h"
+#include "ScreenSearchInterfaces.h"
+#include "TabId.h"
+#include "TaskLambda.h"
+#include "TaskManager.h"
+#include "TaskScheduler.h"
+
+TabsController::TabsController(
+ ViewLayout* mainLayout,
+ const ViewFactory* viewFactory,
+ StorageAccess* storageAccess,
+ ScreenSearchSender* screenSearchSender
+)
+ : m_mainLayout(mainLayout)
+ , m_viewFactory(viewFactory)
+ , m_storageAccess(storageAccess)
+ , m_screenSearchSender(screenSearchSender)
+{
+}
+
+void TabsController::clear()
+{
+ getView()->clear();
+
+ while (true)
+ {
+ {
+ std::lock_guard lock(m_tabsMutex);
+ if (m_tabs.empty())
+ {
+ break;
+ }
+ }
+
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ }
+}
+
+void TabsController::addTab(Id tabId, SearchMatch match)
+{
+ std::lock_guard lock(m_tabsMutex);
+
+ TaskManager::createScheduler(tabId)->startSchedulerLoopThreaded();
+
+ m_tabs.emplace(tabId, std::make_shared(tabId, m_viewFactory, m_storageAccess, m_screenSearchSender));
+
+ if (match.isValid())
+ {
+ MessageSearch msg({ match }, NodeTypeSet::all());
+ msg.setSchedulerId(tabId);
+ msg.dispatch();
+
+ if (match.tokenIds.size() && std::get<0>(m_scrollToLine) == match.tokenIds[0])
+ {
+ MessageScrollToLine scrollMsg(std::get<1>(m_scrollToLine), std::get<2>(m_scrollToLine));
+ scrollMsg.setSchedulerId(tabId);
+ scrollMsg.dispatch();
+ }
+ }
+ else
+ {
+ MessageFind msg;
+ msg.setSchedulerId(tabId);
+ msg.dispatch();
+ }
+
+ m_scrollToLine = std::make_tuple(0, FilePath(), 0);
+}
+
+void TabsController::showTab(Id tabId)
+{
+ std::lock_guard lock(m_tabsMutex);
+
+ auto it = m_tabs.find(tabId);
+ if (it != m_tabs.end())
+ {
+ TabId::setCurrentTabId(tabId);
+ it->second->setParentLayout(m_mainLayout);
+ }
+ else
+ {
+ TabId::setCurrentTabId(0);
+ m_mainLayout->showOriginalViews();
+ }
+
+ Task::dispatch(
+ TabId::app(),
+ std::make_shared(
+ [this]()
+ {
+ m_screenSearchSender->clearMatches();
+ }
+ )
+ );
+}
+
+void TabsController::removeTab(Id tabId)
+{
+ // use app task scheduler thread to stop running tasks of tab
+ Task::dispatch(
+ TabId::background(),
+ std::make_shared(
+ [tabId, this]()
+ {
+ m_screenSearchSender->clearMatches();
+
+ TaskScheduler* scheduler = TaskManager::getScheduler(tabId).get();
+ scheduler->terminateRunningTasks();
+ scheduler->stopSchedulerLoop();
+
+ TaskManager::destroyScheduler(tabId);
+
+ getView()->destroyTab(tabId);
+ }
+ )
+ );
+}
+
+void TabsController::destroyTab(Id tabId)
+{
+ std::lock_guard lock(m_tabsMutex);
+
+ // destroy the tab on the qt thread to allow view destruction
+ m_tabs.erase(tabId);
+
+ if (m_tabs.empty() && Application::getInstance()->isProjectLoaded())
+ {
+ MessageTabOpen().dispatch();
+ }
+}
+
+void TabsController::onClearTabs()
+{
+ TabId::setCurrentTabId(0);
+ m_mainLayout->showOriginalViews();
+}
+
+TabsView* TabsController::getView() const
+{
+ return Controller::getView();
+}
+
+void TabsController::handleMessage(MessageIndexingFinished* message)
+{
+ if (m_tabs.empty() && Application::getInstance()->isProjectLoaded())
+ {
+ MessageTabOpenWith(SearchMatch::createCommand(SearchMatch::COMMAND_ALL)).dispatch();
+ }
+}
+
+void TabsController::handleMessage(MessageTabClose* message)
+{
+ getView()->closeTab();
+}
+
+void TabsController::handleMessage(MessageTabOpen* message)
+{
+ if (Application::getInstance()->isProjectLoaded())
+ {
+ getView()->openTab(true, SearchMatch());
+ }
+}
+
+void TabsController::handleMessage(MessageTabOpenWith* message)
+{
+ if (!Application::getInstance()->isProjectLoaded())
+ {
+ return;
+ }
+
+ SearchMatch match = message->match;
+ if (!match.isValid())
+ {
+ Id tokenId = message->tokenId;
+ if (!tokenId && message->locationId)
+ {
+ std::vector tokenIds = m_storageAccess->getNodeIdsForLocationIds({ message->locationId });
+ if (tokenIds.size())
+ {
+ tokenId = tokenIds[0];
+ }
+ }
+
+ if (!tokenId && !message->filePath.empty())
+ {
+ tokenId = m_storageAccess->getNodeIdForFileNode(message->filePath);
+
+ if (message->line)
+ {
+ m_scrollToLine = std::make_tuple(tokenId, message->filePath, message->line);
+ }
+ }
+
+ if (tokenId)
+ {
+ std::vector matches = m_storageAccess->getSearchMatchesForTokenIds({ tokenId });
+ if (matches.size())
+ {
+ match = matches[0];
+ }
+ }
+ }
+
+ if (match.isValid())
+ {
+ getView()->openTab(message->showTab, match);
+ }
+}
+
+void TabsController::handleMessage(MessageTabSelect* message)
+{
+ getView()->selectTab(message->next);
+}
+
+void TabsController::handleMessage(MessageTabState* message)
+{
+ getView()->updateTab(message->tabId, message->searchMatches);
+}
diff --git a/src/lib/component/controller/TabsController.h b/src/lib/component/controller/TabsController.h
new file mode 100644
index 00000000..02a28df9
--- /dev/null
+++ b/src/lib/component/controller/TabsController.h
@@ -0,0 +1,69 @@
+#ifndef TABS_CONTROLLER_H
+#define TABS_CONTROLLER_H
+
+#include "MessageListener.h"
+#include "MessageIndexingFinished.h"
+#include "MessageTabClose.h"
+#include "MessageTabOpen.h"
+#include "MessageTabOpenWith.h"
+#include "MessageTabSelect.h"
+#include "MessageTabState.h"
+
+#include "Controller.h"
+#include "Tab.h"
+#include "TabsView.h"
+
+struct SearchMatch;
+
+class StorageAccess;
+class ViewFactory;
+class ViewLayout;
+
+class TabsController
+ : public Controller
+ , public MessageListener
+ , public MessageListener
+ , public MessageListener
+ , public MessageListener
+ , public MessageListener
+ , public MessageListener
+{
+public:
+ TabsController(
+ ViewLayout* mainLayout,
+ const ViewFactory* viewFactory,
+ StorageAccess* storageAccess,
+ ScreenSearchSender* screenSearchSender
+ );
+
+ // Controller implementation
+ virtual void clear();
+
+ void addTab(Id tabId, SearchMatch match);
+ void showTab(Id tabId);
+ void removeTab(Id tabId);
+ void destroyTab(Id tabId);
+ void onClearTabs();
+
+private:
+ virtual void handleMessage(MessageIndexingFinished* message);
+ virtual void handleMessage(MessageTabClose* message);
+ virtual void handleMessage(MessageTabOpen* message);
+ virtual void handleMessage(MessageTabOpenWith* message);
+ virtual void handleMessage(MessageTabSelect* message);
+ virtual void handleMessage(MessageTabState* message);
+
+ TabsView* getView() const;
+
+ ViewLayout* m_mainLayout;
+ const ViewFactory* m_viewFactory;
+ StorageAccess* m_storageAccess;
+ ScreenSearchSender* m_screenSearchSender;
+
+ std::map> m_tabs;
+ std::mutex m_tabsMutex;
+
+ std::tuple m_scrollToLine;
+};
+
+#endif // TABS_CONTROLLER_H
diff --git a/src/lib/component/controller/TooltipController.cpp b/src/lib/component/controller/TooltipController.cpp
index 4231d87b..9f56f8b8 100644
--- a/src/lib/component/controller/TooltipController.cpp
+++ b/src/lib/component/controller/TooltipController.cpp
@@ -6,6 +6,7 @@
#include "StorageAccess.h"
#include "MessageActivateSourceLocations.h"
+#include "TabId.h"
#include "TaskDecoratorDelay.h"
#include "TaskLambda.h"
@@ -143,7 +144,7 @@ void TooltipController::requestTooltipShow(const std::vector tokenIds, Toolt
delayMS = 300;
}
- Task::dispatch(std::make_shared(delayMS)->addChildTask(
+ Task::dispatch(TabId::app(), std::make_shared(delayMS)->addChildTask(
std::make_shared(
[requestId, this]()
{
@@ -180,7 +181,7 @@ void TooltipController::requestTooltipHide()
}
m_hideRequest = true;
- Task::dispatch(std::make_shared(500)->addChildTask(
+ Task::dispatch(TabId::app(), std::make_shared(500)->addChildTask(
std::make_shared(
[this]()
{
diff --git a/src/lib/component/controller/UndoRedoController.cpp b/src/lib/component/controller/UndoRedoController.cpp
index d89ee8c8..dc362ad6 100644
--- a/src/lib/component/controller/UndoRedoController.cpp
+++ b/src/lib/component/controller/UndoRedoController.cpp
@@ -15,8 +15,9 @@ UndoRedoController::UndoRedoController(StorageAccess* storageAccess)
m_iterator = m_list.end();
}
-UndoRedoController::~UndoRedoController()
+Id UndoRedoController::getSchedulerId() const
{
+ return Controller::getTabId();
}
UndoRedoView* UndoRedoController::getView()
@@ -269,7 +270,10 @@ void UndoRedoController::handleMessage(MessageHistoryToPosition* message)
else
{
replayCommand(m_iterator);
- MessageFlushUpdates(false).dispatch();
+
+ MessageFlushUpdates msg(false);
+ msg.setSchedulerId(getSchedulerId());
+ msg.dispatch();
}
}
@@ -359,7 +363,9 @@ void UndoRedoController::handleMessage(MessageRefreshUI* message)
{
if (m_iterator == m_list.begin())
{
- MessageActivateAll().dispatch();
+ MessageActivateAll msg;
+ msg.setSchedulerId(getSchedulerId());
+ msg.dispatch();
}
else
{
@@ -466,7 +472,9 @@ void UndoRedoController::replayCommands(std::list::iterator it)
std::advance(it, 1);
}
- MessageFlushUpdates(keepsContent).dispatch();
+ MessageFlushUpdates msg(keepsContent);
+ msg.setSchedulerId(getSchedulerId());
+ msg.dispatch();
}
void UndoRedoController::replayCommand(std::list::iterator it)
@@ -512,6 +520,7 @@ void UndoRedoController::replayCommand(std::list::iterator it)
filter.unindexedFatal = false;
MessageActivateErrors msg(filter);
+ msg.setSchedulerId(getSchedulerId());
msg.setIsReplayed(true);
msg.setIsLast(it == std::prev(m_iterator));
msg.dispatch();
@@ -608,34 +617,7 @@ MessageBase* UndoRedoController::lastMessage() const
void UndoRedoController::updateHistoryMenu(std::shared_ptr message)
{
- const size_t historyMenuSize = 20;
-
- if (message && dynamic_cast(message.get()))
- {
- std::vector matches = dynamic_cast(message.get())->getSearchMatches();
- if (matches.size() && !matches[0].text.empty())
- {
- std::vector> history = { message };
- std::set uniqueMatches = { matches[0] };
-
- for (std::shared_ptr m : m_history)
- {
- if (uniqueMatches.insert(dynamic_cast(m.get())->getSearchMatches()[0]).second)
- {
- history.push_back(m);
-
- if (history.size() >= historyMenuSize)
- {
- break;
- }
- }
- }
-
- m_history = history;
- }
- }
-
- Application::getInstance()->updateHistoryMenu(m_history);
+ Application::getInstance()->updateHistoryMenu(message);
}
void UndoRedoController::updateHistory()
diff --git a/src/lib/component/controller/UndoRedoController.h b/src/lib/component/controller/UndoRedoController.h
index ea7bae6b..19ba3d79 100644
--- a/src/lib/component/controller/UndoRedoController.h
+++ b/src/lib/component/controller/UndoRedoController.h
@@ -66,7 +66,9 @@ class UndoRedoController
{
public:
UndoRedoController(StorageAccess* storageAccess);
- virtual ~UndoRedoController();
+ virtual ~UndoRedoController() = default;
+
+ Id getSchedulerId() const override;
UndoRedoView* getView();
diff --git a/src/lib/component/controller/helper/ControllerProxy.h b/src/lib/component/controller/helper/ControllerProxy.h
index 4c324ba5..44162f66 100644
--- a/src/lib/component/controller/helper/ControllerProxy.h
+++ b/src/lib/component/controller/helper/ControllerProxy.h
@@ -11,8 +11,9 @@ template
class ControllerProxy
{
public:
- ControllerProxy(View* view)
+ ControllerProxy(View* view, Id schedulerId)
: m_view(view)
+ , m_schedulerId(schedulerId)
{
}
@@ -30,7 +31,7 @@ public:
ControllerType* controller = m_view->getController();
if (controller)
{
- Task::dispatch(std::make_shared