bool ZoomNavigator::IsZoomPaneDetached() { DetachedPanesInfo dpi; m_mgr->GetConfigTool()->ReadObject(wxT("DetachedPanesList"), &dpi); wxArrayString detachedPanes = dpi.GetPanes(); return detachedPanes.Index(ZOOM_PANE_TITLE) != wxNOT_FOUND; }
bool SymbolViewPlugin::IsPaneDetached() { DetachedPanesInfo dpi; m_mgr->GetConfigTool()->ReadObject(wxT("DetachedPanesList"), &dpi); wxArrayString detachedPanes = dpi.GetPanes(); return detachedPanes.Index(_("Outline")) != wxNOT_FOUND; }
bool PhpPlugin::IsWorkspaceViewDetached() { DetachedPanesInfo dpi; m_mgr->GetConfigTool()->ReadObject(wxT("DetachedPanesList"), &dpi); wxArrayString detachedPanes = dpi.GetPanes(); return detachedPanes.Index(PHPStrings::PHP_WORKSPACE_VIEW_TITLE) != wxNOT_FOUND; }
bool DatabaseExplorer::IsDbViewDetached() { DetachedPanesInfo dpi; m_mgr->GetConfigTool()->ReadObject(wxT("DetachedPanesList"), &dpi); wxArrayString detachedPanes = dpi.GetPanes(); return detachedPanes.Index(wxT("DbExplorer")) != wxNOT_FOUND; }
bool CMakePlugin::IsPaneDetached() const { wxASSERT(m_mgr); IConfigTool* configTool = m_mgr->GetConfigTool(); wxASSERT(configTool); DetachedPanesInfo dpi; configTool->ReadObject("DetachedPanesList", &dpi); const wxArrayString& detachedPanes = dpi.GetPanes(); return detachedPanes.Index(HELP_TAB_NAME) != wxNOT_FOUND; }
void WorkspacePane::DoShowTab(bool show, const wxString& title) { if(!show) { for(size_t i = 0; i < m_book->GetPageCount(); i++) { if(m_book->GetPageText(i) == title) { // we've got a match m_book->RemovePage(i); wxWindow* win = DoGetControlByName(title); if(win) { win->Show(false); } break; } } } else { for(size_t i = 0; i < m_book->GetPageCount(); i++) { if(m_book->GetPageText(i) == title) { // requested to add a page which already exists return; } } // Fetch the list of detached panes // If the mainframe is NULL, read the // list from the disk, otherwise use the // dockable pane menu // Read it from the disk DetachedPanesInfo dpi; EditorConfigST::Get()->ReadObject(wxT("DetachedPanesList"), &dpi); wxArrayString detachedPanes; detachedPanes = dpi.GetPanes(); if(IS_DETACHED(title)) return; wxWindow* win = DoGetControlByName(title); if(win) { win->Show(true); m_book->InsertPage(0, win, title, true); } } }
void DebuggerPane::CreateGUIControls() { wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL); SetSizer(mainSizer); long style = (kNotebook_Default | kNotebook_AllowDnD); if(!EditorConfigST::Get()->GetOptions()->GetWorkspaceTabsDirection()) { style |= kNotebook_BottomTabs; } if(EditorConfigST::Get()->GetOptions()->IsTabColourDark()) { style &= ~kNotebook_LightTabs; style |= kNotebook_DarkTabs; } if(EditorConfigST::Get()->GetOptions()->IsMouseScrollSwitchTabs()) { style |= kNotebook_MouseScrollSwitchTabs; } style |= kNotebook_UnderlineActiveTab; GeneralImages img; m_book = new Notebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, style); mainSizer->Add(m_book, 1, wxEXPAND | wxALL, 0); // Calculate the widthest tab (the one with the 'Call Stack' label) int xx, yy; wxFont fnt = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); wxWindow::GetTextExtent(_("Breakpoints"), &xx, &yy, NULL, NULL, &fnt); // load list of detached panes wxArrayString detachedPanes; DetachedPanesInfo dpi; EditorConfigST::Get()->ReadObject(wxT("DetachedPanesList"), &dpi); detachedPanes = dpi.GetPanes(); wxString name; wxBitmap bmp; name = wxGetTranslation(LOCALS); bmp = wxXmlResource::Get()->LoadBitmap(wxT("locals_view")); // Add the 'Locals View' if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, bmp, wxSize(200, 200)); m_localsTable = new LocalsTable(cp); cp->SetChildNoReparent(m_localsTable); } else { m_localsTable = new LocalsTable(m_book); m_book->AddPage(m_localsTable, name, false, bmp); } // Add the 'watches View' name = wxGetTranslation(WATCHES); bmp = wxXmlResource::Get()->LoadBitmap(wxT("watches")); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, bmp, wxSize(200, 200)); m_watchesTable = new WatchesTable(cp); cp->SetChildNoReparent(m_watchesTable); } else { m_watchesTable = new WatchesTable(m_book); m_book->AddPage(m_watchesTable, name, false, bmp); } // Add the 'ASCII Viewer' name = wxGetTranslation(ASCII_VIEWER); bmp = wxXmlResource::Get()->LoadBitmap(wxT("text_view")); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, bmp, wxSize(200, 200)); m_asciiViewer = new DebuggerAsciiViewer(cp); cp->SetChildNoReparent(m_asciiViewer); } else { m_asciiViewer = new DebuggerAsciiViewer(m_book); m_book->AddPage(m_asciiViewer, name, false, bmp); } // Add the 'Call Stack' name = wxGetTranslation(FRAMES); bmp = wxXmlResource::Get()->LoadBitmap(wxT("frames")); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, bmp, wxSize(200, 200)); m_frameList = new DebuggerCallstackView(cp); cp->SetChildNoReparent(m_frameList); } else { m_frameList = new DebuggerCallstackView(m_book); m_book->AddPage(m_frameList, name, false, bmp); } // Add the 'Breakpoints' name = wxGetTranslation(BREAKPOINTS); bmp = wxXmlResource::Get()->LoadBitmap(wxT("breakpoint")); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, bmp, wxSize(200, 200)); m_breakpoints = new BreakpointDlg(cp); cp->SetChildNoReparent(m_breakpoints); } else { m_breakpoints = new BreakpointDlg(m_book); m_book->AddPage(m_breakpoints, name, false, bmp); } // Add the 'Threads' name = wxGetTranslation(THREADS); bmp = wxXmlResource::Get()->LoadBitmap(wxT("threads")); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, bmp, wxSize(200, 200)); m_threads = new ThreadListPanel(cp); cp->SetChildNoReparent(m_threads); } else { m_threads = new ThreadListPanel(m_book); m_book->AddPage(m_threads, name, false, bmp); } // Add the 'Memory View' name = wxGetTranslation(MEMORY); bmp = wxXmlResource::Get()->LoadBitmap(wxT("memory_view")); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, bmp, wxSize(200, 200)); m_memory = new MemoryView(cp); cp->SetChildNoReparent(m_memory); } else { m_memory = new MemoryView(m_book); m_book->AddPage(m_memory, name, false, bmp); } // Add the "Output" tab name = wxGetTranslation(DEBUGGER_OUTPUT); bmp = wxXmlResource::Get()->LoadBitmap(wxT("debugger_tab")); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, bmp, wxSize(200, 200)); m_outputDebug = new DebugTab(cp, wxID_ANY, wxGetTranslation(DEBUGGER_OUTPUT)); cp->SetChildNoReparent(m_outputDebug); } else { m_outputDebug = new DebugTab(m_book, wxID_ANY, wxGetTranslation(DEBUGGER_OUTPUT)); m_book->AddPage(m_outputDebug, name, false, bmp); } // Add the "Output" tab name = wxGetTranslation(DISASSEMBLY); bmp = img.Bitmap("dbgAsm"); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, bmp, wxSize(200, 200)); m_disassemble = new DebuggerDisassemblyTab(cp, wxGetTranslation(DISASSEMBLY)); cp->SetChildNoReparent(m_disassemble); } else { m_disassemble = new DebuggerDisassemblyTab(m_book, wxGetTranslation(DISASSEMBLY)); m_book->AddPage(m_disassemble, name, false, bmp); } m_book->Bind(wxEVT_BOOK_PAGE_CHANGED, &DebuggerPane::OnPageChanged, this); m_initDone = true; }
void WorkspacePane::CreateGUIControls() { wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL); SetSizer(mainSizer); // add notebook for tabs #ifdef __WXOSX__ long style = (kNotebook_Default | kNotebook_AllowDnD | kNotebook_LeftTabs); #else long style = (kNotebook_Default | kNotebook_AllowDnD); #endif if(EditorConfigST::Get()->GetOptions()->IsTabColourDark()) { style &= ~kNotebook_LightTabs; style |= kNotebook_DarkTabs; } style |= kNotebook_UnderlineActiveTab; if(EditorConfigST::Get()->GetOptions()->IsMouseScrollSwitchTabs()) { style |= kNotebook_MouseScrollSwitchTabs; } m_book = new Notebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, style); m_book->SetTabDirection(EditorConfigST::Get()->GetOptions()->GetWorkspaceTabsDirection()); m_book->SetArt(GetNotebookRenderer()); // Calculate the widest tab (the one with the 'Workspace' label) int xx, yy; wxFont fnt = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); wxWindow::GetTextExtent(_("Workspace"), &xx, &yy, NULL, NULL, &fnt); mainSizer->Add(m_book, 1, wxEXPAND | wxALL, 0); // Add the parsing progress controls m_staticText = new wxStaticText(this, wxID_ANY, _("Parsing workspace...")); mainSizer->Add(m_staticText, 0, wxEXPAND | wxALL, 2); m_parsingProgress = new wxGauge(this, wxID_ANY, 100, wxDefaultPosition, wxSize(-1, 15), wxGA_HORIZONTAL | wxGA_SMOOTH); mainSizer->Add(m_parsingProgress, 0, wxEXPAND | wxALL, 1); m_parsingProgress->Hide(); m_staticText->Hide(); // create tabs (possibly detached) DetachedPanesInfo dpi; EditorConfigST::Get()->ReadObject(wxT("DetachedPanesList"), &dpi); wxArrayString detachedPanes; detachedPanes = dpi.GetPanes(); // Add the workspace tab wxString name; // the IManager instance IManager* mgr = PluginManager::Get(); name = _("Workspace"); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, wxNullBitmap, wxSize(200, 200)); m_workspaceTab = new WorkspaceTab(cp, name); cp->SetChildNoReparent(m_workspaceTab); } else { m_workspaceTab = new WorkspaceTab(m_book, name); m_book->AddPage(m_workspaceTab, name, true, wxNullBitmap); } m_tabs.insert(std::make_pair(name, Tab(name, m_workspaceTab))); mgr->AddWorkspaceTab(name); // Add the explorer tab name = _("Explorer"); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, wxNullBitmap, wxSize(200, 200)); m_explorer = new FileExplorer(cp, name); cp->SetChildNoReparent(m_explorer); } else { m_explorer = new FileExplorer(m_book, name); m_book->AddPage(m_explorer, name, false); } m_tabs.insert(std::make_pair(name, Tab(name, m_explorer))); mgr->AddWorkspaceTab(name); // Add the "File Explorer" view to the list of files managed by the workspace-view m_workspaceTab->GetView()->AddPage(m_explorer, _("File Explorer"), false); // Add the Open Windows Panel (Tabs) #ifndef __WXOSX__ name = _("Tabs"); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, wxNullBitmap, wxSize(200, 200)); m_openWindowsPane = new OpenWindowsPanel(cp, name); cp->SetChildNoReparent(m_openWindowsPane); } else { m_openWindowsPane = new OpenWindowsPanel(m_book, name); m_book->AddPage(m_openWindowsPane, name, false); } m_tabs.insert(std::make_pair(name, Tab(name, m_openWindowsPane))); mgr->AddWorkspaceTab(name); #endif // Add the Tabgroups tab name = _("Tabgroups"); if(IS_DETACHED(name)) { DockablePane* cp = new DockablePane(GetParent(), m_book, name, false, wxNullBitmap, wxSize(200, 200)); m_TabgroupsPane = new TabgroupsPane(cp, name); cp->SetChildNoReparent(m_TabgroupsPane); } else { m_TabgroupsPane = new TabgroupsPane(m_book, name); m_book->AddPage(m_TabgroupsPane, name, false); } m_tabs.insert(std::make_pair(name, Tab(name, m_TabgroupsPane))); mgr->AddWorkspaceTab(name); if(m_book->GetPageCount() > 0) { m_book->SetSelection((size_t)0); } m_mgr->Update(); }
void WorkspacePane::CreateGUIControls() { wxBoxSizer *mainSizer = new wxBoxSizer(wxVERTICAL); SetSizer(mainSizer); // add notebook for tabs long bookStyle = wxVB_LEFT | wxAUI_NB_WINDOWLIST_BUTTON; m_book = new Notebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, bookStyle); // Calculate the widest tab (the one with the 'Workspace' label) int xx, yy; wxFont fnt = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); wxWindow::GetTextExtent(_("Workspace"), &xx, &yy, NULL, NULL, &fnt); mainSizer->Add(m_book, 1, wxEXPAND | wxALL, 0); // Add the parsing progress controls m_staticText = new wxStaticText(this, wxID_ANY, _("Parsing workspace...")); mainSizer->Add(m_staticText, 0, wxEXPAND|wxALL, 2); m_parsingProgress = new wxGauge(this, wxID_ANY, 100, wxDefaultPosition, wxSize(-1, 15), wxGA_HORIZONTAL|wxGA_SMOOTH); mainSizer->Add(m_parsingProgress, 0, wxEXPAND|wxALL, 1); m_parsingProgress->Hide(); m_staticText->Hide(); // create tabs (possibly detached) DetachedPanesInfo dpi; EditorConfigST::Get()->ReadObject(wxT("DetachedPanesList"), &dpi); wxArrayString detachedPanes; detachedPanes = dpi.GetPanes(); // Add the workspace tab wxString name; name = _("Workspace"); if(IS_DETACHED(name)) { DockablePane *cp = new DockablePane(GetParent(), m_book, name, wxNullBitmap, wxSize(200, 200)); m_workspaceTab = new WorkspaceTab(cp, name); cp->SetChildNoReparent(m_workspaceTab); } else { m_workspaceTab = new WorkspaceTab(m_book, name); m_book->AddPage(m_workspaceTab, name, true, wxNullBitmap); } // Add the explorer tab name = _("Explorer"); if(IS_DETACHED(name)) { DockablePane *cp = new DockablePane(GetParent(), m_book, name, wxNullBitmap, wxSize(200, 200)); m_explorer = new FileExplorer(cp, name); cp->SetChildNoReparent(m_explorer); } else { m_explorer = new FileExplorer(m_book, name); m_book->AddPage(m_explorer, name, false); } // Add the Open Windows Panel (Tabs) name = _("Tabs"); if(IS_DETACHED(name)) { DockablePane *cp = new DockablePane(GetParent(), m_book, name, wxNullBitmap, wxSize(200, 200)); m_openWindowsPane = new OpenWindowsPanel(cp, name); cp->SetChildNoReparent(m_openWindowsPane); } else { m_openWindowsPane = new OpenWindowsPanel(m_book, name); m_book->AddPage(m_openWindowsPane, name, false); } // Add the Tabgroups tab name = _("Tabgroups"); if(IS_DETACHED(name)) { DockablePane *cp = new DockablePane(GetParent(), m_book, name, wxNullBitmap, wxSize(200, 200)); m_TabgroupsPane = new TabgroupsPane(cp, name); cp->SetChildNoReparent(m_TabgroupsPane); } else { m_TabgroupsPane = new TabgroupsPane(m_book, name); m_book->AddPage(m_TabgroupsPane, name, false); } if (m_book->GetPageCount() > 0) { m_book->SetSelection((size_t)0); } UpdateTabs(); m_mgr->Update(); }
void PluginManager::Load() { wxString ext; #if defined(__WXGTK__) ext = wxT("so"); #elif defined(__WXMAC__) ext = wxT("dylib"); #else ext = wxT("dll"); #endif wxString fileSpec(wxT("*.") + ext); clConfig conf("plugins.conf"); conf.ReadItem(&m_pluginsData); // set the managers // this code assures us that the shared objects will see the same instances as the application // does LanguageST::Get()->SetTagsManager(GetTagsManager()); TagsManagerST::Get()->SetLanguage(LanguageST::Get()); // Plugin loading policy CodeLiteApp* app = static_cast<CodeLiteApp*>(GetTheApp()); CodeLiteApp::PluginPolicy pp = app->GetPluginLoadPolicy(); wxArrayString allowedPlugins; if(pp == CodeLiteApp::PP_None) { return; } else if(pp == CodeLiteApp::PP_FromList) allowedPlugins = app->GetAllowedPlugins(); wxString pluginsDir = clStandardPaths::Get().GetPluginsDirectory(); if(wxDir::Exists(pluginsDir)) { // get list of dlls wxArrayString files; wxDir::GetAllFiles(pluginsDir, &files, fileSpec, wxDIR_FILES); // Sort the plugins by A-Z std::sort(files.begin(), files.end()); for(size_t i = 0; i < files.GetCount(); i++) { wxString fileName(files.Item(i)); #if defined(__WXMSW__) && !defined(NDEBUG) // Under MSW loading a release plugin while in debug mode will cause a crash if(!fileName.EndsWith("-dbg.dll")) { continue; } #elif defined(__WXMSW__) // filter debug plugins if(fileName.EndsWith("-dbg.dll")) { continue; } #endif #ifdef __WXGTK__ wxFileName fnDLL(fileName); if(fnDLL.GetFullName().StartsWith("lib")) { // don't attempt to load a library continue; } #endif clDynamicLibrary* dl = new clDynamicLibrary(); if(!dl->Load(fileName)) { CL_ERROR(wxT("Failed to load plugin's dll: ") + fileName); if(!dl->GetError().IsEmpty()) { CL_ERROR(dl->GetError()); } wxDELETE(dl); continue; } bool success(false); GET_PLUGIN_INFO_FUNC pfnGetPluginInfo = (GET_PLUGIN_INFO_FUNC)dl->GetSymbol(wxT("GetPluginInfo"), &success); if(!success) { wxDELETE(dl); continue; } // load the plugin version method // if the methods does not exist, handle it as if it has value of 100 (lowest version API) int interface_version(100); GET_PLUGIN_INTERFACE_VERSION_FUNC pfnInterfaceVersion = (GET_PLUGIN_INTERFACE_VERSION_FUNC)dl->GetSymbol(wxT("GetPluginInterfaceVersion"), &success); if(success) { interface_version = pfnInterfaceVersion(); } else { CL_WARNING(wxT("Failed to find GetPluginInterfaceVersion() in dll: ") + fileName); if(!dl->GetError().IsEmpty()) { CL_WARNING(dl->GetError()); } } if(interface_version != PLUGIN_INTERFACE_VERSION) { CL_WARNING(wxString::Format(wxT("Version interface mismatch error for plugin '%s'. Plugin's interface " "version is '%d', CodeLite interface version is '%d'"), fileName.c_str(), interface_version, PLUGIN_INTERFACE_VERSION)); wxDELETE(dl); continue; } // Check if this dll can be loaded PluginInfo* pluginInfo = pfnGetPluginInfo(); wxString pname = pluginInfo->GetName(); pname.MakeLower().Trim().Trim(false); // Check the policy if(pp == CodeLiteApp::PP_FromList && allowedPlugins.Index(pname) == wxNOT_FOUND) { // Policy is set to 'from list' and this plugin does not match any plugins from // the list, don't allow it to be loaded wxDELETE(dl); continue; } // If the plugin does not exist in the m_pluginsData, assume its the first time we see it bool firstTimeLoading = (m_pluginsData.GetPlugins().count(pluginInfo->GetName()) == 0); // Add the plugin information m_pluginsData.AddPlugin((*pluginInfo)); if(firstTimeLoading && pluginInfo->HasFlag(PluginInfo::kDisabledByDefault)) { m_pluginsData.DisablePlugin(pluginInfo->GetName()); wxDELETE(dl); continue; } // Can we load it? if(!m_pluginsData.CanLoad(*pluginInfo)) { CL_WARNING(wxT("Plugin ") + pluginInfo->GetName() + wxT(" is not enabled")); wxDELETE(dl); continue; } // try and load the plugin GET_PLUGIN_CREATE_FUNC pfn = (GET_PLUGIN_CREATE_FUNC)dl->GetSymbol(wxT("CreatePlugin"), &success); if(!success) { CL_WARNING(wxT("Failed to find CreatePlugin() in dll: ") + fileName); if(!dl->GetError().IsEmpty()) { CL_WARNING(dl->GetError()); } m_pluginsData.DisablePlugin(pluginInfo->GetName()); continue; } // Construct the plugin IPlugin* plugin = pfn((IManager*)this); CL_DEBUG(wxT("Loaded plugin: ") + plugin->GetLongName()); m_plugins[plugin->GetShortName()] = plugin; // Load the toolbar clToolBar* tb = plugin->CreateToolBar(clMainFrame::Get()->GetDockingManager().GetManagedWindow()); if(tb) { // When using AUI toolbars, use our own custom art-provider tb->SetArtProvider(new CLMainAuiTBArt()); clMainFrame::Get()->GetDockingManager().AddPane(tb, wxAuiPaneInfo() .Name(plugin->GetShortName()) .LeftDockable(true) .RightDockable(true) .Caption(plugin->GetShortName()) .ToolbarPane() .Top() .Position(999)); // Add menu entry at the 'View->Toolbars' menu for this toolbar wxMenuItem* item = clMainFrame::Get()->GetMenuBar()->FindItem(XRCID("toolbars_menu")); if(item) { wxMenu* submenu = NULL; submenu = item->GetSubMenu(); // add the new toolbar entry at the end of this menu int id = wxNewId(); wxString text(plugin->GetShortName()); wxMenuItem* newItem = new wxMenuItem(submenu, id, text, wxEmptyString, wxITEM_CHECK); submenu->Append(newItem); clMainFrame::Get()->RegisterToolbar(id, plugin->GetShortName()); } } // Keep the dynamic load library m_dl.push_back(dl); } clMainFrame::Get()->GetDockingManager().Update(); // Let the plugins plug their menu in the 'Plugins' menu at the menu bar // the create menu will be placed as a sub menu of the 'Plugin' menu wxMenu* pluginsMenu = NULL; wxMenuItem* menuitem = clMainFrame::Get()->GetMenuBar()->FindItem(XRCID("manage_plugins"), &pluginsMenu); if(pluginsMenu && menuitem) { std::map<wxString, IPlugin*>::iterator iter = m_plugins.begin(); for(; iter != m_plugins.end(); ++iter) { IPlugin* plugin = iter->second; plugin->CreatePluginMenu(pluginsMenu); } } // save the plugins data conf.WriteItem(&m_pluginsData); } // Now that all the plugins are loaded, load from the configuration file // list of visible tabs static wxArrayString DefaultArray; if(DefaultArray.IsEmpty()) { DefaultArray.Add("NOT-FOUND"); } DetachedPanesInfo dpi; GetConfigTool()->ReadObject(wxT("DetachedPanesList"), &dpi); const wxArrayString& detachedPanes = dpi.GetPanes(); { // Hide workspace tabs const wxArrayString& tabs = GetWorkspaceTabs(); wxArrayString visibleTabs = clConfig::Get().Read("VisibleWorkspaceTabs", DefaultArray); if(!((visibleTabs.size() == 1) && (visibleTabs.Item(0) == "NOT-FOUND"))) { for(size_t i = 0; i < tabs.size(); ++i) { if((visibleTabs.Index(tabs.Item(i)) == wxNOT_FOUND) && (detachedPanes.Index(tabs.Item(i)) == wxNOT_FOUND)) { // hidden tab - post an event clCommandEvent eventHide(wxEVT_SHOW_WORKSPACE_TAB); eventHide.SetSelected(false).SetString(tabs.Item(i)); EventNotifier::Get()->AddPendingEvent(eventHide); } } } } { // Hide output tabs const wxArrayString& tabs = GetOutputTabs(); wxArrayString visibleTabs = clConfig::Get().Read("VisibleOutputTabs", DefaultArray); if(!((visibleTabs.size() == 1) && (visibleTabs.Item(0) == "NOT-FOUND"))) { for(size_t i = 0; i < tabs.size(); ++i) { if((visibleTabs.Index(tabs.Item(i)) == wxNOT_FOUND) && (detachedPanes.Index(tabs.Item(i)) == wxNOT_FOUND)) { // hidden tab - post an event clCommandEvent eventHide(wxEVT_SHOW_OUTPUT_TAB); eventHide.SetSelected(false).SetString(tabs.Item(i)); EventNotifier::Get()->AddPendingEvent(eventHide); } } } } }