diff --git a/src/apps/debugger/Debugger.cpp b/src/apps/debugger/Debugger.cpp index eb4f484d04..4367b9161d 100644 --- a/src/apps/debugger/Debugger.cpp +++ b/src/apps/debugger/Debugger.cpp @@ -26,6 +26,7 @@ #include "CoreFileDebuggerInterface.h" #include "CommandLineUserInterface.h" #include "DebuggerInterface.h" +#include "DebuggerUiSettingsFactory.h" #include "GraphicalUserInterface.h" #include "ImageDebugLoadingStateHandlerRoster.h" #include "MessageCodes.h" @@ -233,7 +234,11 @@ parse_arguments(int argc, const char* const* argv, bool noOutput, static status_t global_init(TargetHostInterfaceRoster::Listener* listener) { - status_t error = TypeHandlerRoster::CreateDefault(); + status_t error = DebuggerUiSettingsFactory::CreateDefault(); + if (error != B_OK) + return error; + + error = TypeHandlerRoster::CreateDefault(); if (error != B_OK) return error; @@ -331,6 +336,7 @@ Debugger::Debugger() Debugger::~Debugger() { + DebuggerUiSettingsFactory::DeleteDefault(); ValueHandlerRoster::DeleteDefault(); TypeHandlerRoster::DeleteDefault(); ImageDebugLoadingStateHandlerRoster::DeleteDefault(); @@ -345,7 +351,7 @@ Debugger::Init() if (error != B_OK) return error; - return fSettingsManager.Init(); + return fSettingsManager.Init(DebuggerUiSettingsFactory::Default()); } @@ -656,7 +662,7 @@ CliDebugger::Run(const Options& options) } SettingsManager settingsManager; - error = settingsManager.Init(); + error = settingsManager.Init(DebuggerUiSettingsFactory::Default()); if (error != B_OK) { fprintf(stderr, "Error: Settings manager initialization failed: " "%s\n", strerror(error)); @@ -724,7 +730,7 @@ ReportDebugger::Run(const Options& options) } SettingsManager settingsManager; - error = settingsManager.Init(); + error = settingsManager.Init(DebuggerUiSettingsFactory::Default()); if (error != B_OK) { fprintf(stderr, "Error: Settings manager initialization failed: " "%s\n", strerror(error)); diff --git a/src/apps/debugger/Jamfile b/src/apps/debugger/Jamfile index 5e3306c366..cc8d5e5a41 100644 --- a/src/apps/debugger/Jamfile +++ b/src/apps/debugger/Jamfile @@ -44,6 +44,7 @@ SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui expression_eval_window ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui inspector_window ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui model ] ; +SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui settings ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui team_window ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui team_settings_window ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) user_interface gui teams_window ] ; @@ -216,7 +217,6 @@ local sources = # settings BreakpointSetting.cpp - GuiTeamUiSettings.cpp SettingsManager.cpp TeamFileManagerSettings.cpp TeamSettings.cpp @@ -296,6 +296,10 @@ local sources = InspectorWindow.cpp MemoryView.cpp + # user_interface/gui/settings + DebuggerUiSettingsFactory.cpp + GuiTeamUiSettings.cpp + # user_interface/gui/teams_window TeamsWindow.cpp TeamsListView.cpp diff --git a/src/apps/debugger/settings/SettingsManager.cpp b/src/apps/debugger/settings/SettingsManager.cpp index c3a56cc59d..7efe77bebc 100644 --- a/src/apps/debugger/settings/SettingsManager.cpp +++ b/src/apps/debugger/settings/SettingsManager.cpp @@ -26,7 +26,8 @@ static const int32 kMaxRecentTeamSettings = 10; SettingsManager::SettingsManager() : fLock("settings manager"), - fRecentTeamSettings(kMaxRecentTeamSettings, true) + fRecentTeamSettings(kMaxRecentTeamSettings, true), + fUiSettingsFactory(NULL) { } @@ -38,13 +39,15 @@ SettingsManager::~SettingsManager() status_t -SettingsManager::Init() +SettingsManager::Init(TeamUiSettingsFactory* factory) { // check the lock status_t error = fLock.InitCheck(); if (error != B_OK) return error; + fUiSettingsFactory = factory; + // get and create our settings directory if (find_directory(B_USER_SETTINGS_DIRECTORY, &fSettingsPath, true) == B_OK && fSettingsPath.Append(kSettingsDirPath) == B_OK @@ -147,7 +150,7 @@ SettingsManager::_LoadSettings() if (settings == NULL) return B_NO_MEMORY; - error = settings->SetTo(childArchive); + error = settings->SetTo(childArchive, *fUiSettingsFactory); if (error != B_OK) { delete settings; continue; diff --git a/src/apps/debugger/settings/SettingsManager.h b/src/apps/debugger/settings/SettingsManager.h index 6dc9465152..7a007d9fe4 100644 --- a/src/apps/debugger/settings/SettingsManager.h +++ b/src/apps/debugger/settings/SettingsManager.h @@ -13,6 +13,7 @@ class TeamSettings; +class TeamUiSettingsFactory; class SettingsManager { @@ -20,7 +21,7 @@ public: SettingsManager(); ~SettingsManager(); - status_t Init(); + status_t Init(TeamUiSettingsFactory* factory); status_t LoadTeamSettings(const char* teamName, TeamSettings& settings); @@ -41,6 +42,7 @@ private: BLocker fLock; BPath fSettingsPath; TeamSettingsList fRecentTeamSettings; // oldest is first + TeamUiSettingsFactory* fUiSettingsFactory; }; diff --git a/src/apps/debugger/settings/TeamSettings.cpp b/src/apps/debugger/settings/TeamSettings.cpp index 0ce088b2f2..54a0480708 100644 --- a/src/apps/debugger/settings/TeamSettings.cpp +++ b/src/apps/debugger/settings/TeamSettings.cpp @@ -97,7 +97,8 @@ TeamSettings::SetTo(Team* team) status_t -TeamSettings::SetTo(const BMessage& archive) +TeamSettings::SetTo(const BMessage& archive, + const TeamUiSettingsFactory& factory) { _Unset(); @@ -127,7 +128,7 @@ TeamSettings::SetTo(const BMessage& archive) for (int32 i = 0; archive.FindMessage("uisettings", i, &childArchive) == B_OK; i++) { TeamUiSettings* setting = NULL; - error = TeamUiSettingsFactory::Create(childArchive, setting); + error = factory.Create(childArchive, setting); if (error == B_OK && !fUiSettings.AddItem(setting)) error = B_NO_MEMORY; if (error != B_OK) { diff --git a/src/apps/debugger/settings/TeamSettings.h b/src/apps/debugger/settings/TeamSettings.h index 1bd14f5e00..2e5e45fc72 100644 --- a/src/apps/debugger/settings/TeamSettings.h +++ b/src/apps/debugger/settings/TeamSettings.h @@ -18,6 +18,7 @@ class Team; class TeamFileManagerSettings; class TeamSignalSettings; class TeamUiSettings; +class TeamUiSettingsFactory; class TeamSettings { @@ -28,7 +29,8 @@ public: ~TeamSettings(); status_t SetTo(Team* team); - status_t SetTo(const BMessage& archive); + status_t SetTo(const BMessage& archive, + const TeamUiSettingsFactory& factory); status_t WriteTo(BMessage& archive) const; const BString& TeamName() const { return fTeamName; } diff --git a/src/apps/debugger/settings/TeamUiSettingsFactory.cpp b/src/apps/debugger/settings/TeamUiSettingsFactory.cpp index 4ff393e968..e6448fdfea 100644 --- a/src/apps/debugger/settings/TeamUiSettingsFactory.cpp +++ b/src/apps/debugger/settings/TeamUiSettingsFactory.cpp @@ -6,52 +6,7 @@ #include "TeamUiSettingsFactory.h" -#include - -#include "GuiTeamUiSettings.h" - - -TeamUiSettingsFactory::TeamUiSettingsFactory() -{ -} - TeamUiSettingsFactory::~TeamUiSettingsFactory() { } - - -status_t -TeamUiSettingsFactory::Create(const BMessage& archive, - TeamUiSettings*& settings) -{ - int32 type; - status_t error = archive.FindInt32("type", &type); - if (error != B_OK) - return error; - - switch (type) { - case TEAM_UI_SETTINGS_TYPE_GUI: - settings = new(std::nothrow) GuiTeamUiSettings(); - if (settings == NULL) - return B_NO_MEMORY; - - error = settings->SetTo(archive); - if (error != B_OK) { - delete settings; - settings = NULL; - return error; - } - break; - - case TEAM_UI_SETTINGS_TYPE_CLI: - // TODO: implement once we have a CLI interface - // (and corresponding settings) - return B_UNSUPPORTED; - - default: - return B_BAD_DATA; - } - - return B_OK; -} diff --git a/src/apps/debugger/settings/TeamUiSettingsFactory.h b/src/apps/debugger/settings/TeamUiSettingsFactory.h index 8ec0b3cb9e..04d0b3049d 100644 --- a/src/apps/debugger/settings/TeamUiSettingsFactory.h +++ b/src/apps/debugger/settings/TeamUiSettingsFactory.h @@ -14,11 +14,10 @@ class TeamUiSettings; class TeamUiSettingsFactory { public: - TeamUiSettingsFactory(); - ~TeamUiSettingsFactory(); - - static status_t Create(const BMessage& archive, - TeamUiSettings*& settings); + virtual ~TeamUiSettingsFactory(); + + virtual status_t Create(const BMessage& archive, + TeamUiSettings*& settings) const = 0; }; #endif // TEAM_UI_SETTINGS_FACTORY_H diff --git a/src/apps/debugger/user_interface/gui/settings/DebuggerUiSettingsFactory.cpp b/src/apps/debugger/user_interface/gui/settings/DebuggerUiSettingsFactory.cpp new file mode 100644 index 0000000000..ee2b010c74 --- /dev/null +++ b/src/apps/debugger/user_interface/gui/settings/DebuggerUiSettingsFactory.cpp @@ -0,0 +1,86 @@ +/* + * Copyright 2011-2016, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ + + +#include "DebuggerUiSettingsFactory.h" + +#include + +#include "GuiTeamUiSettings.h" + + +DebuggerUiSettingsFactory* DebuggerUiSettingsFactory::sDefaultInstance = NULL; + + +DebuggerUiSettingsFactory::DebuggerUiSettingsFactory() +{ +} + + +DebuggerUiSettingsFactory::~DebuggerUiSettingsFactory() +{ +} + + +DebuggerUiSettingsFactory* +DebuggerUiSettingsFactory::Default() +{ + return sDefaultInstance; +} + + +status_t +DebuggerUiSettingsFactory::CreateDefault() +{ + sDefaultInstance = new(std::nothrow) DebuggerUiSettingsFactory(); + if (sDefaultInstance == NULL) + return B_NO_MEMORY; + + return B_OK; +} + + +void +DebuggerUiSettingsFactory::DeleteDefault() +{ + delete sDefaultInstance; + sDefaultInstance = NULL; +} + + +status_t +DebuggerUiSettingsFactory::Create(const BMessage& archive, + TeamUiSettings*& settings) const +{ + int32 type; + status_t error = archive.FindInt32("type", &type); + if (error != B_OK) + return error; + + switch (type) { + case TEAM_UI_SETTINGS_TYPE_GUI: + settings = new(std::nothrow) GuiTeamUiSettings(); + if (settings == NULL) + return B_NO_MEMORY; + + error = settings->SetTo(archive); + if (error != B_OK) { + delete settings; + settings = NULL; + return error; + } + break; + + case TEAM_UI_SETTINGS_TYPE_CLI: + // TODO: implement once we have a CLI interface + // (and corresponding settings) + return B_UNSUPPORTED; + + default: + return B_BAD_DATA; + } + + return B_OK; +} diff --git a/src/apps/debugger/user_interface/gui/settings/DebuggerUiSettingsFactory.h b/src/apps/debugger/user_interface/gui/settings/DebuggerUiSettingsFactory.h new file mode 100644 index 0000000000..42c5137abe --- /dev/null +++ b/src/apps/debugger/user_interface/gui/settings/DebuggerUiSettingsFactory.h @@ -0,0 +1,29 @@ +/* + * Copyright 2011-2016, Rene Gollent, rene@gollent.com. + * Distributed under the terms of the MIT License. + */ +#ifndef DEBUGGER_UI_SETTINGS_FACTORY_H +#define DEBUGGER_UI_SETTINGS_FACTORY_H + + +#include "TeamUiSettingsFactory.h" + + +class DebuggerUiSettingsFactory : public TeamUiSettingsFactory { +public: + + static DebuggerUiSettingsFactory* Default(); + static status_t CreateDefault(); + static void DeleteDefault(); + + virtual status_t Create(const BMessage& archive, + TeamUiSettings*& settings) const; + +private: + DebuggerUiSettingsFactory(); + virtual ~DebuggerUiSettingsFactory(); + + static DebuggerUiSettingsFactory* sDefaultInstance; +}; + +#endif // DEBUGGER_UI_SETTINGS_FACTORY_H diff --git a/src/apps/debugger/settings/GuiTeamUiSettings.cpp b/src/apps/debugger/user_interface/gui/settings/GuiTeamUiSettings.cpp similarity index 100% rename from src/apps/debugger/settings/GuiTeamUiSettings.cpp rename to src/apps/debugger/user_interface/gui/settings/GuiTeamUiSettings.cpp diff --git a/src/apps/debugger/settings/GuiTeamUiSettings.h b/src/apps/debugger/user_interface/gui/settings/GuiTeamUiSettings.h similarity index 100% rename from src/apps/debugger/settings/GuiTeamUiSettings.h rename to src/apps/debugger/user_interface/gui/settings/GuiTeamUiSettings.h