From 6168ab75c64025ddad2e7cbafdb6df0720389c6b Mon Sep 17 00:00:00 2001 From: John Peterson Date: Tue, 1 Sep 2009 15:16:44 +0000 Subject: [PATCH] GUI: File split git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4142 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/DolphinWX/DolphinWX.vcproj | 4 + Source/Core/DolphinWX/Src/Frame.cpp | 480 ++-------- Source/Core/DolphinWX/Src/Frame.h | 1 + Source/Core/DolphinWX/Src/FrameAui.cpp | 1043 ++++++++++++++++++++++ Source/Core/DolphinWX/Src/FrameTools.cpp | 593 ------------ Source/Core/DolphinWX/Src/Main.cpp | 13 +- Source/Core/DolphinWX/Src/SConscript | 5 +- 7 files changed, 1121 insertions(+), 1018 deletions(-) create mode 100644 Source/Core/DolphinWX/Src/FrameAui.cpp diff --git a/Source/Core/DolphinWX/DolphinWX.vcproj b/Source/Core/DolphinWX/DolphinWX.vcproj index 1414e80ef2..20249e31f0 100644 --- a/Source/Core/DolphinWX/DolphinWX.vcproj +++ b/Source/Core/DolphinWX/DolphinWX.vcproj @@ -1072,6 +1072,10 @@ RelativePath=".\src\Frame.h" > + + diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index f6e373f96e..1dd1b81bbc 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -305,17 +305,20 @@ CFrame::CFrame(wxFrame* parent, const wxPoint& pos, const wxSize& size, bool _UseDebugger, + bool ShowLogWindow, long style) - : wxFrame(parent, id, title, pos, size, style) - , UseDebugger(_UseDebugger), m_LogWindow(NULL) - , m_GameListCtrl(NULL), m_pStatusBar(NULL), bRenderToMain(true), HaveLeds(false) - , HaveSpeakers(false), m_Panel(NULL), m_ToolBar(NULL), m_ToolBarDebug(NULL) - , m_fLastClickTime(0), m_iLastMotionTime(0), LastMouseX(0), LastMouseY(0) + : wxFrame(parent, id, title, pos, size, style) + , m_GameListCtrl(NULL), m_pStatusBar(NULL) + , m_LogWindow(NULL) , m_Panel(NULL), m_ToolBar(NULL), m_ToolBarDebug(NULL) + , bRenderToMain(true), HaveLeds(false), HaveSpeakers(false) + , UseDebugger(_UseDebugger), m_fLastClickTime(0), m_iLastMotionTime(0), LastMouseX(0), LastMouseY(0) #if wxUSE_TIMER , m_timer(this) #endif { + if (ShowLogWindow) SConfig::GetInstance().m_InterfaceLogWindow = true; + // Give it a console early to show potential messages from this onward ConsoleListener *Console = LogManager::GetInstance()->getConsoleListener(); if (SConfig::GetInstance().m_InterfaceConsole) Console->Open(true); @@ -489,6 +492,10 @@ void CFrame::OnQuit(wxCommandEvent& WXUNUSED (event)) Close(true); } +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Events +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + void CFrame::OnClose(wxCloseEvent& event) { // Don't forget the skip or the window won't be destroyed @@ -506,404 +513,30 @@ void CFrame::OnClose(wxCloseEvent& event) } } -wxPanel* CFrame::CreateEmptyPanel() -{ - wxPanel* Panel = new wxPanel(this, wxID_ANY); - return Panel; -} -wxAuiNotebook* CFrame::CreateEmptyNotebook() -{ - wxAuiNotebook* NB = new wxAuiNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, DefaultNBStyle); - return NB; -} +// Post events - -void CFrame::DoFullscreen(bool _F) +// Warning: This may cause an endless loop if the event is propagated back to its parent +void CFrame::PostEvent(wxCommandEvent& event) { - ShowFullScreen(_F); - if (_F) - { - // Save the current mode before going to fullscreen - AuiCurrent = m_Mgr->SavePerspective(); - m_Mgr->LoadPerspective(AuiFullscreen, true); - } - else - { - // Restore saved perspective - m_Mgr->LoadPerspective(AuiCurrent, true); - } -} + event.Skip(); + event.StopPropagation(); -int CFrame::Limit(int i, int Low, int High) -{ - if (i < Low) return Low; - if (i > High) return High; - return i; + if (g_pCodeWindow + && event.GetId() >= IDM_INTERPRETER && event.GetId() <= IDM_ADDRBOX + && event.GetId() != IDM_JITUNLIMITED + ) + wxPostEvent(g_pCodeWindow, event); } - -void CFrame::SetSimplePaneSize() +void CFrame::PostMenuEvent(wxMenuEvent& event) { - wxArrayInt Pane, Size; - Pane.Add(0); Size.Add(50); - Pane.Add(1); Size.Add(50); - - int iClientSize = this->GetSize().GetX(); - // Fix the pane sizes - for (int i = 0; i < Pane.size(); i++) - { - // Check limits - Size[i] = Limit(Size[i], 5, 95); - // Produce pixel width from percentage width - Size[i] = PercentageToPixels(Size[i], iClientSize); - // Update size - m_Mgr->GetPane(wxString::Format(wxT("Pane %i"), Pane[i])).BestSize(Size[i], -1).MinSize(Size[i], -1).MaxSize(Size[i], -1); - } - m_Mgr->Update(); - for (int i = 0; i < Pane.size(); i++) - { - // Remove the size limits - m_Mgr->GetPane(wxString::Format(wxT("Pane %i"), Pane[i])).MinSize(-1, -1).MaxSize(-1, -1); - } + if (g_pCodeWindow) wxPostEvent(g_pCodeWindow, event); } - -void CFrame::SetPaneSize() +void CFrame::PostUpdateUIEvent(wxUpdateUIEvent& event) { - if (Perspectives.size() <= ActivePerspective) return; - int iClientX = this->GetSize().GetX(), iClientY = this->GetSize().GetY(); - - for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiToolBar))) - { - if (!m_Mgr->GetAllPanes().Item(i).IsOk()) return; - if (Perspectives.at(ActivePerspective).Width.size() <= j || Perspectives.at(ActivePerspective).Height.size() <= j) continue; - int W = Perspectives.at(ActivePerspective).Width.at(j), H = Perspectives.at(ActivePerspective).Height.at(j); - // Check limits - W = Limit(W, 5, 95); H = Limit(H, 5, 95); - // Produce pixel width from percentage width - W = PercentageToPixels(W, iClientX); H = PercentageToPixels(H, iClientY); - m_Mgr->GetAllPanes().Item(i).BestSize(W,H).MinSize(W,H).MaxSize(W,H); - - j++; - } - } - m_Mgr->Update(); - - for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiToolBar))) - { - m_Mgr->GetAllPanes().Item(i).MinSize(-1,-1).MaxSize(-1,-1); - } - } + if (g_pCodeWindow) wxPostEvent(g_pCodeWindow, event); } -// Debugging, show loose windows -void CFrame::ListChildren() -{ - ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - wxAuiNotebook * NB = NULL; - Console->Log(LogTypes::LCUSTOM, "--------------------------------------------------------------------\n"); - - for (int i = 0; i < this->GetChildren().size(); i++) - { - wxWindow * Win = this->GetChildren().Item(i)->GetData(); - Console->Log(LogTypes::LCUSTOM, StringFromFormat( - "%i: %s (%s) :: %s", i, - Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); - //if (Win->GetName().IsSameAs(wxT("control"))) - if (Win->IsKindOf(CLASSINFO(wxAuiNotebook))) - { - NB = (wxAuiNotebook*)Win; - Console->Log(LogTypes::LCUSTOM, StringFromFormat(" :: NB", NB->GetName().mb_str()).c_str()); - } - else - { - NB = NULL; - } - Console->Log(LogTypes::LCUSTOM, StringFromFormat("\n").c_str()); - - Win = this->GetChildren().Item(i)->GetData(); - for (int j = 0; j < Win->GetChildren().size(); j++) - { - Console->Log(LogTypes::LCUSTOM, StringFromFormat( - " %i.%i: %s (%s) :: %s", i, j, - Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); - if (NB) - { - if (j < NB->GetPageCount()) - Console->Log(LogTypes::LCUSTOM, StringFromFormat(" :: %s", NB->GetPage(j)->GetName().mb_str()).c_str()); - } - Console->Log(LogTypes::LCUSTOM, StringFromFormat("\n").c_str()); - - /* - Win = this->GetChildren().Item(j)->GetData(); - for (int k = 0; k < Win->GetChildren().size(); k++) - { - Console->Log(LogTypes::LCUSTOM, StringFromFormat( - " %i.%i.%i: %s (%s) :: %s\n", i, j, k, - Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); - } - */ - } - } - - Console->Log(LogTypes::LCUSTOM, "--------------------------------------------------------------------\n"); - - for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; - wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; - Console->Log(LogTypes::LCUSTOM, StringFromFormat("%i: %s\n", i, m_Mgr->GetAllPanes().Item(i).name.mb_str()).c_str()); - - for (int j = 0; j < NB->GetPageCount(); j++) - { - Console->Log(LogTypes::LCUSTOM, StringFromFormat("%i.%i: %s\n", i, j, NB->GetPageText(j).mb_str()).c_str()); - } - } - - Console->Log(LogTypes::LCUSTOM, "--------------------------------------------------------------------\n"); -} - -void CFrame::ReloadPanes() -{ - // Keep settings - bool bConsole = SConfig::GetInstance().m_InterfaceConsole; - - //ListChildren(); - //ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - //Console->Log(LogTypes::LNOTICE, StringFromFormat("ReloadPanes begin: Sound %i\n", FindWindowByName(wxT("Sound"))).c_str()); - - if (ActivePerspective >= Perspectives.size()) ActivePerspective = 0; - - // Check that there is a perspective - if (Perspectives.size() > 0) - { - // Check that the perspective was saved once before - if (Perspectives.at(ActivePerspective).Width.size() == 0) return; - - // Hide to avoid flickering - HideAllNotebooks(true); - // Close all pages - ClosePages(); - - CloseAllNotebooks(); - //m_Mgr->Update(); - - // Create new panes with notebooks - for (int i = 0; i < Perspectives.at(ActivePerspective).Width.size() - 1; i++) - { - m_Mgr->AddPane(CreateEmptyNotebook(), wxAuiPaneInfo().Hide()); - } - HideAllNotebooks(true); - - // Names - NamePanes(); - // Perspectives - m_Mgr->LoadPerspective(Perspectives.at(ActivePerspective).Perspective, false); - } - // Create one pane by default - else - { - m_Mgr->AddPane(CreateEmptyNotebook()); - } - - // Restore settings - SConfig::GetInstance().m_InterfaceConsole = bConsole; - // Load GUI settings - g_pCodeWindow->Load(); - // Open notebook pages - AddRemoveBlankPage(); - g_pCodeWindow->OpenPages(); - if (SConfig::GetInstance().m_InterfaceLogWindow) DoToggleWindow(IDM_LOGWINDOW, true); - if (SConfig::GetInstance().m_InterfaceConsole) DoToggleWindow(IDM_CONSOLEWINDOW, true); - - //Console->Log(LogTypes::LNOTICE, StringFromFormat("ReloadPanes end: Sound %i\n", FindWindowByName(wxT("Sound"))).c_str()); - //ListChildren(); -} - -void CFrame::DoLoadPerspective() -{ - ReloadPanes(); - // Restore the exact window sizes, which LoadPerspective doesn't always do - SetPaneSize(); - // Show - ShowAllNotebooks(true); - - /* - ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - Console->Log(LogTypes::LCUSTOM, StringFromFormat( - "Loaded: %s (%i panes, %i NBs)\n", - Perspectives.at(ActivePerspective).Name.c_str(), m_Mgr->GetAllPanes().GetCount(), GetNotebookCount()).c_str()); - */ -} - -// Update the local perspectives array -void CFrame::SaveLocal() -{ - Perspectives.clear(); - std::vector VPerspectives; - std::string _Perspectives; - - IniFile ini; - ini.Load(DEBUGGER_CONFIG_FILE); - ini.Get("Perspectives", "Perspectives", &_Perspectives, ""); - ini.Get("Perspectives", "Active", &ActivePerspective, 5); - SplitString(_Perspectives, ",", VPerspectives); - - // - for (int i = 0; i < VPerspectives.size(); i++) - { - SPerspectives Tmp; - std::string _Section, _Perspective, _Width, _Height; - std::vector _SWidth, _SHeight; - Tmp.Name = VPerspectives.at(i); - _Section = StringFromFormat("P - %s", Tmp.Name.c_str()); - if (!ini.Exists(_Section.c_str(), "Width")) continue; - - ini.Get(_Section.c_str(), "Perspective", &_Perspective, ""); - ini.Get(_Section.c_str(), "Width", &_Width, ""); - ini.Get(_Section.c_str(), "Height", &_Height, ""); - - Tmp.Perspective = wxString::FromAscii(_Perspective.c_str()); - - SplitString(_Width, ",", _SWidth); - SplitString(_Height, ",", _SHeight); - for (int i = 0; i < _SWidth.size(); i++) - { - int _Tmp; - if (TryParseInt(_SWidth.at(0).c_str(), &_Tmp)) Tmp.Width.push_back(_Tmp); - } - for (int i = 0; i < _SHeight.size(); i++) - { - int _Tmp; - if (TryParseInt(_SHeight.at(0).c_str(), &_Tmp)) Tmp.Height.push_back(_Tmp); - } - Perspectives.push_back(Tmp); - } -} -void CFrame::Save() -{ - if (Perspectives.size() == 0) return; - if (ActivePerspective >= Perspectives.size()) ActivePerspective = 0; - - // Turn off edit before saving - TogglePaneStyle(false); - // Name panes - NamePanes(); - - // Get client size - int iClientX = this->GetSize().GetX(), iClientY = this->GetSize().GetY(); - - IniFile ini; - ini.Load(DEBUGGER_CONFIG_FILE); - - std::string _Section = StringFromFormat("P - %s", Perspectives.at(ActivePerspective).Name.c_str()); - ini.Set(_Section.c_str(), "Perspective", m_Mgr->SavePerspective().mb_str()); - - std::string SWidth = "", SHeight = ""; - for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiToolBar))) - { - SWidth += StringFromFormat("%i", PixelsToPercentage(m_Mgr->GetAllPanes().Item(i).window->GetClientSize().GetX(), iClientX)); - SHeight += StringFromFormat("%i", PixelsToPercentage(m_Mgr->GetAllPanes().Item(i).window->GetClientSize().GetY(), iClientY)); - SWidth += ","; SHeight += ","; - } - } - // Remove the ending "," - SWidth = SWidth.substr(0, SWidth.length()-1); SHeight = SHeight.substr(0, SHeight.length()-1); - - ini.Set(_Section.c_str(), "Width", SWidth.c_str()); - ini.Set(_Section.c_str(), "Height", SHeight.c_str()); - - // Save perspective names - std::string STmp = ""; - for (int i = 0; i < Perspectives.size(); i++) - { - STmp += Perspectives.at(i).Name + ","; - } - STmp = STmp.substr(0, STmp.length()-1); - ini.Set("Perspectives", "Perspectives", STmp.c_str()); - ini.Set("Perspectives", "Active", ActivePerspective); - ini.Save(DEBUGGER_CONFIG_FILE); - - // Save notebook affiliations - g_pCodeWindow->Save(); - - // Update the local vector - SaveLocal(); - - /* - ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - Console->Log(LogTypes::LCUSTOM, StringFromFormat( - "Saved: %s (%i panes, %i NBs)\n", - Perspectives.at(ActivePerspective).Name.c_str(), m_Mgr->GetAllPanes().GetCount(), GetNotebookCount()).c_str()); - */ - - TogglePaneStyle(m_ToolBarAui->GetToolToggled(IDM_EDIT_PERSPECTIVES)); -} - -int CFrame::PercentageToPixels(int Percentage, int Total) -{ - int Pixels = (int)((float)Total * ((float)Percentage / 100.0)); - return Pixels; -} -int CFrame::PixelsToPercentage(int Pixels, int Total) -{ - int Percentage = (int)(((float)Pixels / (float)Total) * 100.0); - return Percentage; -} - -void CFrame::NamePanes() -{ - for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiToolBar))) - { - m_Mgr->GetAllPanes().Item(i).Name(wxString::Format(wxT("Pane %i"), j)); - m_Mgr->GetAllPanes().Item(i).Caption(wxString::Format(wxT("Pane %i"), j)); - j++; - } - } -} -void CFrame::AddPane() -{ - m_Mgr->AddPane(CreateEmptyNotebook()); - NamePanes(); - AddRemoveBlankPage(); - m_Mgr->Update(); -} - -void CFrame::OnPaneClose(wxAuiManagerEvent& event) -{ - event.Veto(); - - wxAuiNotebook * nb = (wxAuiNotebook*)event.pane->window; - if (!nb) return; - if (! (nb->GetPageCount() == 0 || (nb->GetPageCount() == 1 && nb->GetPageText(0).IsSameAs(wxT("<>"))))) - { - wxMessageBox(wxT("You can't close panes that have pages in them."), wxT("Notice"), wxOK, this); - } - else - { - /* - ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - Console->Log(LogTypes::LCUSTOM, StringFromFormat("GetNotebookCount before: %i\n", GetNotebookCount()).c_str()); - */ - - // Detach and delete the empty notebook - event.pane->DestroyOnClose(true); - m_Mgr->ClosePane(*event.pane); - - //Console->Log(LogTypes::LCUSTOM, StringFromFormat("GetNotebookCount after: %i\n", GetNotebookCount()).c_str()); - } - - m_Mgr->Update(); -} - -//--------------- // Host messages #ifdef _WIN32 @@ -942,31 +575,6 @@ void CFrame::OnHostMessage(wxCommandEvent& event) } } -// Post events -// Warning: This may cause an endless loop if the event is propagated back to its parent -void CFrame::PostEvent(wxCommandEvent& event) -{ - event.Skip(); - event.StopPropagation(); - - if (g_pCodeWindow - && event.GetId() >= IDM_INTERPRETER && event.GetId() <= IDM_ADDRBOX - && event.GetId() != IDM_JITUNLIMITED - ) - wxPostEvent(g_pCodeWindow, event); -} -void CFrame::PostMenuEvent(wxMenuEvent& event) -{ - if (g_pCodeWindow) wxPostEvent(g_pCodeWindow, event); -} -void CFrame::PostUpdateUIEvent(wxUpdateUIEvent& event) -{ - if (g_pCodeWindow) wxPostEvent(g_pCodeWindow, event); -} - -// --------------- -// Input - void CFrame::OnGameListCtrl_ItemActivated(wxListEvent& WXUNUSED (event)) { // Show all platforms and regions if... @@ -1181,4 +789,38 @@ void CFrame::Update() #endif } } -#endif \ No newline at end of file +#endif +///////////////////////////////////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Functions +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +wxPanel* CFrame::CreateEmptyPanel() +{ + wxPanel* Panel = new wxPanel(this, wxID_ANY); + return Panel; +} +wxAuiNotebook* CFrame::CreateEmptyNotebook() +{ + wxAuiNotebook* NB = new wxAuiNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, DefaultNBStyle); + return NB; +} + + +void CFrame::DoFullscreen(bool _F) +{ + ShowFullScreen(_F); + if (_F) + { + // Save the current mode before going to fullscreen + AuiCurrent = m_Mgr->SavePerspective(); + m_Mgr->LoadPerspective(AuiFullscreen, true); + } + else + { + // Restore saved perspective + m_Mgr->LoadPerspective(AuiCurrent, true); + } +} +///////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/Source/Core/DolphinWX/Src/Frame.h b/Source/Core/DolphinWX/Src/Frame.h index 186f06968e..6faaaacac7 100644 --- a/Source/Core/DolphinWX/Src/Frame.h +++ b/Source/Core/DolphinWX/Src/Frame.h @@ -52,6 +52,7 @@ class CFrame : public wxFrame const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, bool _UseDebugger = false, + bool ShowLogWindow = false, long style = wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE); void* GetRenderHandle() diff --git a/Source/Core/DolphinWX/Src/FrameAui.cpp b/Source/Core/DolphinWX/Src/FrameAui.cpp new file mode 100644 index 0000000000..7fe0e1d0b9 --- /dev/null +++ b/Source/Core/DolphinWX/Src/FrameAui.cpp @@ -0,0 +1,1043 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + + +/* +1.1 Windows + +CFrame is the main parent window. Inside CFrame there is m_Panel which is the +parent for the rendering window (when we render to the main window). In Windows +the rendering window is created by giving CreateWindow() m_Panel->GetHandle() +as parent window and creating a new child window to m_Panel. The new child +window handle that is returned by CreateWindow() can be accessed from +Core::GetWindowHandle(). +*/ + + +// FIXME: why doesn't it work on windows??? +#ifndef _WIN32 +#include "Common.h" +#endif + +#include "Setup.h" // Common + +#if defined(HAVE_SFML) && HAVE_SFML || defined(_WIN32) +#include "NetWindow.h" +#endif + +#include "Common.h" // Common +#include "FileUtil.h" +#include "FileSearch.h" +#include "Timer.h" + +#include "Globals.h" // Local +#include "Frame.h" +#include "ConfigMain.h" +#include "PluginManager.h" +#include "MemcardManager.h" +#include "CheatsWindow.h" +#include "InfoWindow.h" +#include "AboutDolphin.h" +#include "GameListCtrl.h" +#include "BootManager.h" +#include "LogWindow.h" +#include "WxUtils.h" + +#include "ConfigManager.h" // Core +#include "Core.h" +#include "OnFrame.h" +#include "HW/DVDInterface.h" +#include "State.h" +#include "VolumeHandler.h" +#include "NANDContentLoader.h" + +#include // wxWidgets + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Aui events +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + + +void CFrame::OnManagerResize(wxAuiManagerEvent& event) +{ + event.Skip(); + ResizeConsole(); +} +void CFrame::OnResize(wxSizeEvent& event) +{ + event.Skip(); + // fit frame content, not needed right now + //FitInside(); + DoMoveIcons(); // In FrameWiimote.cpp +} + +void CFrame::OnPaneClose(wxAuiManagerEvent& event) +{ + event.Veto(); + + wxAuiNotebook * nb = (wxAuiNotebook*)event.pane->window; + if (!nb) return; + if (! (nb->GetPageCount() == 0 || (nb->GetPageCount() == 1 && nb->GetPageText(0).IsSameAs(wxT("<>"))))) + { + wxMessageBox(wxT("You can't close panes that have pages in them."), wxT("Notice"), wxOK, this); + } + else + { + /* + ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); + Console->Log(LogTypes::LCUSTOM, StringFromFormat("GetNotebookCount before: %i\n", GetNotebookCount()).c_str()); + */ + + // Detach and delete the empty notebook + event.pane->DestroyOnClose(true); + m_Mgr->ClosePane(*event.pane); + + //Console->Log(LogTypes::LCUSTOM, StringFromFormat("GetNotebookCount after: %i\n", GetNotebookCount()).c_str()); + } + + m_Mgr->Update(); +} + + +// Enable and disable the log window +void CFrame::OnToggleLogWindow(wxCommandEvent& event) +{ + SConfig::GetInstance().m_InterfaceLogWindow = event.IsChecked(); + DoToggleWindow(event.GetId(), event.IsChecked()); +} +void CFrame::ToggleLogWindow(bool Show, int i) +{ + if (Show) + { + if (!m_LogWindow) m_LogWindow = new CLogWindow(this); + #ifdef _WIN32 + DoAddPage(m_LogWindow, i, "Log"); + #else + m_LogWindow->Show(); + #endif + } + else + { + #ifdef _WIN32 + DoRemovePage(m_LogWindow); + #else + if (m_LogWindow) m_LogWindow->Show(); + #endif + } + + // Hide pane + if (!UseDebugger) HidePane(); + + // Make sure the check is updated (if wxw isn't calling this func) + //GetMenuBar()->FindItem(IDM_LOGWINDOW)->Check(Show); +} +// Enable and disable the console +void CFrame::OnToggleConsole(wxCommandEvent& event) +{ + SConfig::GetInstance().m_InterfaceConsole = event.IsChecked(); + DoToggleWindow(event.GetId(), event.IsChecked()); +} +void CFrame::ToggleConsole(bool Show, int i) +{ + ConsoleListener *Console = LogManager::GetInstance()->getConsoleListener(); + + if (Show) + { + //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" >>> Show\n").c_str()); + + if (GetNotebookCount() == 0) return; + if (i < 0 || i > GetNotebookCount()-1) i = 0; + + #ifdef _WIN32 + wxWindow *Win = GetWxWindowHwnd(GetConsoleWindow()); + if (Win && GetNotebook(i)->GetPageIndex(Win) != wxNOT_FOUND) return; + { + #else + Console->Open(); + #endif + + #ifdef _WIN32 + if(!GetConsoleWindow()) Console->Open(); else ShowWindow(GetConsoleWindow(),SW_SHOW); + } + Win = GetWxWindowHwnd(GetConsoleWindow()); + // Can we remove the border? + //Win->SetWindowStyleFlag(wxNO_BORDER); + //SetWindowLong(GetConsoleWindow(), GWL_STYLE, WS_VISIBLE); + // Create parent window + wxPanel * ConsoleParent = CreateEmptyPanel(); + ::SetParent(GetConsoleWindow(), (HWND)ConsoleParent->GetHWND()); + //Win->SetParent(ConsoleParent); + //if (Win) m_Mgr->GetAllPanes().Item(i)->AddPage(Win, wxT("Console"), true, aNormalFile ); + if (Win) GetNotebook(i)->AddPage(ConsoleParent, wxT("Console"), true, aNormalFile ); + #endif + } + else // hide + { + //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" >>> Show\n").c_str()); + + #ifdef _WIN32 + // Hide + if(GetConsoleWindow()) ShowWindow(GetConsoleWindow(),SW_HIDE); + // Release the console to Windows + ::SetParent(GetConsoleWindow(), NULL); + // Destroy the empty parent of the console + DoRemovePageString(wxT("Console"), true, true); + + #else + Console->Close(); + #endif + } + + // Hide pane + if (!UseDebugger) HidePane(); + + // Make sure the check is updated (if wxw isn't calling this func) + //GetMenuBar()->FindItem(IDM_CONSOLEWINDOW)->Check(Show); +} +///////////////////////////////////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Notebooks +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +#ifdef _WIN32 +wxWindow * CFrame::GetWxWindowHwnd(HWND hWnd) +{ + wxWindow * Win = new wxWindow(); + Win->SetHWND((WXHWND)hWnd); + Win->AdoptAttributesFromHWND(); + return Win; +} +#endif +wxWindow * CFrame::GetWxWindow(wxString Name) +{ + #ifdef _WIN32 + HWND hWnd = ::FindWindow(NULL, Name.c_str()); + if (hWnd) + { + wxWindow * Win = new wxWindow(); + Win->SetHWND((WXHWND)hWnd); + Win->AdoptAttributesFromHWND(); + return Win; + } + else + #endif + if (FindWindowByName(Name)) + { + return FindWindowByName(Name); + } + else if (FindWindowByLabel(Name)) + { + return FindWindowByLabel(Name); + } + else if (GetNootebookPage(Name)) + { + return GetNootebookPage(Name); + } + else + return NULL; +} +wxWindow * CFrame::GetNootebookPage(wxString Name) +{ + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; + wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; + for(u32 j = 0; j < NB->GetPageCount(); j++) + { + if (NB->GetPageText(j).IsSameAs(Name)) return NB->GetPage(j); + } + } + return NULL; +} +void CFrame::AddRemoveBlankPage() +{ + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; + wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; + for(u32 j = 0; j < NB->GetPageCount(); j++) + { + if (NB->GetPageText(j).IsSameAs(wxT("<>")) && NB->GetPageCount() > 1) NB->DeletePage(j); + } + if (NB->GetPageCount() == 0) NB->AddPage(CreateEmptyPanel(), wxT("<>"), true); + } +} +int CFrame::GetNootebookAffiliation(wxString Name) +{ + for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; + wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; + for(u32 k = 0; k < NB->GetPageCount(); k++) + { + if (NB->GetPageText(k).IsSameAs(Name)) return j; + } + j++; + } + return -1; +} +void CFrame::ClosePages() +{ + DoToggleWindow(IDM_LOGWINDOW, false); + DoToggleWindow(IDM_CONSOLEWINDOW, false); + DoToggleWindow(IDM_CODEWINDOW, false); + DoToggleWindow(IDM_REGISTERWINDOW, false); + DoToggleWindow(IDM_BREAKPOINTWINDOW, false); + DoToggleWindow(IDM_MEMORYWINDOW, false); + DoToggleWindow(IDM_JITWINDOW, false); + DoToggleWindow(IDM_SOUNDWINDOW, false); + DoToggleWindow(IDM_VIDEOWINDOW, false); +} +void CFrame::DoToggleWindow(int Id, bool Show) +{ + switch (Id) + { + case IDM_LOGWINDOW: ToggleLogWindow(Show, UseDebugger ? g_pCodeWindow->iLogWindow : 0); break; + case IDM_CONSOLEWINDOW: ToggleConsole(Show, UseDebugger ? g_pCodeWindow->iConsoleWindow : 0); break; + } + + if (!UseDebugger) return; + + switch (Id) + { + case IDM_CODEWINDOW: g_pCodeWindow->OnToggleCodeWindow(Show, g_pCodeWindow->iCodeWindow); break; + case IDM_REGISTERWINDOW: g_pCodeWindow->OnToggleRegisterWindow(Show, g_pCodeWindow->iRegisterWindow); break; + case IDM_BREAKPOINTWINDOW: g_pCodeWindow->OnToggleBreakPointWindow(Show, g_pCodeWindow->iBreakpointWindow); break; + case IDM_MEMORYWINDOW: g_pCodeWindow->OnToggleMemoryWindow(Show, g_pCodeWindow->iMemoryWindow); break; + case IDM_JITWINDOW: g_pCodeWindow->OnToggleJitWindow(Show, g_pCodeWindow->iJitWindow); break; + case IDM_SOUNDWINDOW: g_pCodeWindow->OnToggleSoundWindow(Show, g_pCodeWindow->iSoundWindow); break; + case IDM_VIDEOWINDOW: g_pCodeWindow->OnToggleVideoWindow(Show, g_pCodeWindow->iVideoWindow); break; + } +} +void CFrame::OnNotebookPageChanged(wxAuiNotebookEvent& event) +{ + event.Skip(); + if (!UseDebugger) return; + + // Remove the blank page if any + AddRemoveBlankPage(); + + // Update the notebook affiliation + if(GetNootebookAffiliation(wxT("Log")) >= 0) g_pCodeWindow->iLogWindow = GetNootebookAffiliation(wxT("Log")); + if(GetNootebookAffiliation(wxT("Console")) >= 0) g_pCodeWindow->iConsoleWindow = GetNootebookAffiliation(wxT("Console")); + if(GetNootebookAffiliation(wxT("Code")) >= 0) g_pCodeWindow->iCodeWindow = GetNootebookAffiliation(wxT("Code")); + if(GetNootebookAffiliation(wxT("Registers")) >= 0) g_pCodeWindow->iRegisterWindow = GetNootebookAffiliation(wxT("Registers")); + if(GetNootebookAffiliation(wxT("Breakpoints")) >= 0) g_pCodeWindow->iBreakpointWindow = GetNootebookAffiliation(wxT("Breakpoints")); + if(GetNootebookAffiliation(wxT("JIT")) >= 0) g_pCodeWindow->iJitWindow = GetNootebookAffiliation(wxT("JIT")); + if(GetNootebookAffiliation(wxT("Memory")) >= 0) g_pCodeWindow->iMemoryWindow = GetNootebookAffiliation(wxT("Memory")); + if(GetNootebookAffiliation(wxT("Sound")) >= 0) g_pCodeWindow->iSoundWindow = GetNootebookAffiliation(wxT("Sound")); + if(GetNootebookAffiliation(wxT("Video")) >= 0) g_pCodeWindow->iVideoWindow = GetNootebookAffiliation(wxT("Video")); +} +void CFrame::OnNotebookPageClose(wxAuiNotebookEvent& event) +{ + // Override event + event.Veto(); + + wxAuiNotebook* Ctrl = (wxAuiNotebook*)event.GetEventObject(); + + if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Log"))) { GetMenuBar()->FindItem(IDM_LOGWINDOW)->Check(false); DoToggleWindow(IDM_LOGWINDOW, false); } + if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Console"))) { GetMenuBar()->FindItem(IDM_CONSOLEWINDOW)->Check(false); DoToggleWindow(IDM_CONSOLEWINDOW, false); } + if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Registers"))) { GetMenuBar()->FindItem(IDM_REGISTERWINDOW)->Check(false); DoToggleWindow(IDM_REGISTERWINDOW, false); } + if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Breakpoints"))) { GetMenuBar()->FindItem(IDM_BREAKPOINTWINDOW)->Check(false); DoToggleWindow(IDM_BREAKPOINTWINDOW, false); } + if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("JIT"))) { GetMenuBar()->FindItem(IDM_JITWINDOW)->Check(false); DoToggleWindow(IDM_JITWINDOW, false); } + if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Memory"))) { GetMenuBar()->FindItem(IDM_MEMORYWINDOW)->Check(false); DoToggleWindow(IDM_MEMORYWINDOW, false); } + if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Sound"))) { GetMenuBar()->FindItem(IDM_SOUNDWINDOW)->Check(false); DoToggleWindow(IDM_SOUNDWINDOW, false); } + if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Video"))) { GetMenuBar()->FindItem(IDM_VIDEOWINDOW)->Check(false); DoToggleWindow(IDM_VIDEOWINDOW, false); } +} +void CFrame::OnAllowNotebookDnD(wxAuiNotebookEvent& event) +{ + event.Skip(); + event.Allow(); + wxAuiNotebook* Ctrl = (wxAuiNotebook*)event.GetEventObject(); + // If we drag away the last one the tab bar goes away and we can't add any panes to it + //if (Ctrl->GetPageCount() == 1) Ctrl->AddPage(CreateEmptyPanel(), wxT("<>"), true); +} +void CFrame::HidePane() +{ + // Get the first notebook + wxAuiNotebook * NB; + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) + NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; + } + if (NB->GetPageCount() == 0) + m_Mgr->GetPane(wxT("Pane 1")).Hide(); + else + m_Mgr->GetPane(wxT("Pane 1")).Show(); + m_Mgr->Update(); + + SetSimplePaneSize(); +} +void CFrame::DoRemovePageString(wxString Str, bool Hide, bool Destroy) +{ + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; + wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; + for (int j = 0; j < NB->GetPageCount(); j++) + { + if (NB->GetPageText(j).IsSameAs(Str)) + { + if (!Destroy) + { + // Reparent to avoid destruction if the notebook is closed and destroyed + wxWindow * Win = NB->GetPage(j); + NB->RemovePage(j); + Win->Reparent(this); + } + else + { + NB->DeletePage(j); + } + //if (Hide) Win->Hide(); + break; + } + } + } + +} +wxAuiNotebook * CFrame::GetNotebook(int NBId) +{ + int Ret = 0; + for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; + if (j == NBId) return (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; + j++; + } + return NULL; +} +void CFrame::ShowAllNotebooks(bool Window) +{ + for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) + { + if (Window) + m_Mgr->GetAllPanes().Item(i).Show(); + else + m_Mgr->GetAllPanes().Item(i).window->Hide(); + } + } + m_Mgr->Update(); +} +void CFrame::HideAllNotebooks(bool Window) +{ + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) + { + if (Window) + m_Mgr->GetAllPanes().Item(i).Hide(); + else + m_Mgr->GetAllPanes().Item(i).window->Hide(); + } + } + m_Mgr->Update(); +} +// Close all panes with notebooks +void CFrame::CloseAllNotebooks() +{ + int i = 0; + while(GetNotebookCount() > 0) + { + if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) + { + m_Mgr->GetAllPanes().Item(i).DestroyOnClose(true); + m_Mgr->ClosePane(m_Mgr->GetAllPanes().Item(i)); + //m_Mgr->GetAllPanes().Item(i).window->Hide(); + //m_Mgr->DetachPane(m_Mgr->GetAllPanes().Item(i).window); + + i = 0; + //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" %i Pane\n", i).c_str()); + } + else + { + i++; + //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" %i No pane\n", i).c_str()); + } + + } +} +int CFrame::GetNotebookCount() +{ + int Ret = 0; + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) Ret++; + } + return Ret; +} +void CFrame::DoAddPage(wxWindow * Win, int i, std::string Name) +{ + if (!Win) return; + if (GetNotebookCount() == 0) return; + if (i < 0 || i > GetNotebookCount()-1) i = 0; + if (Win && GetNotebook(i)->GetPageIndex(Win) != wxNOT_FOUND) return; + GetNotebook(i)->AddPage(Win, wxString::FromAscii(Name.c_str()), true, aNormalFile ); + + /* + ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); + Console->Log(LogTypes::LCUSTOM, StringFromFormat("Add: %s\n", Name.c_str()).c_str()); + */ +} +void CFrame::DoRemovePage(wxWindow * Win, bool Hide) +{ + // If m_dialog is NULL, then possibly the system didn't report the checked menu item status correctly. + // It should be true just after the menu item was selected, if there was no modeless dialog yet. + //wxASSERT(Win != NULL); + + if (Win) + { + for (int i = 0; i < GetNotebookCount(); i++) + { + if (GetNotebook(i)->GetPageIndex(Win) != wxNOT_FOUND) GetNotebook(i)->RemovePage(GetNotebook(i)->GetPageIndex(Win)); + } + // Reparent to avoid destruction if the notebook is closed and destroyed + Win->Reparent(this); + + if (Hide) Win->Hide(); + } +} + +// Enable and disable the toolbar +void CFrame::OnToggleToolbar(wxCommandEvent& event) +{ + SConfig::GetInstance().m_InterfaceToolbar = event.IsChecked(); + DoToggleToolbar(event.IsChecked()); +} +void CFrame::DoToggleToolbar(bool Show) +{ + if (Show) + { + m_Mgr->GetPane(wxT("TBMain")).Show(); + if (UseDebugger) { m_Mgr->GetPane(wxT("TBDebug")).Show(); m_Mgr->GetPane(wxT("TBAui")).Show(); } + m_Mgr->Update(); + } + else + { + m_Mgr->GetPane(wxT("TBMain")).Hide(); + if (UseDebugger) { m_Mgr->GetPane(wxT("TBDebug")).Hide(); m_Mgr->GetPane(wxT("TBAui")).Hide(); } + m_Mgr->Update(); + } +} + +// Enable and disable the status bar +void CFrame::OnToggleStatusbar(wxCommandEvent& event) +{ + SConfig::GetInstance().m_InterfaceStatusbar = event.IsChecked(); + if (SConfig::GetInstance().m_InterfaceStatusbar == true) + m_pStatusBar->Show(); + else + m_pStatusBar->Hide(); + + this->SendSizeEvent(); +} +///////////////////////////////////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Functions +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ +void CFrame::OnSelectPerspective(wxCommandEvent& event) +{ + int _Selection = event.GetId() - IDM_PERSPECTIVES_0; + if (Perspectives.size() <= _Selection) _Selection = 0; + ActivePerspective = _Selection; + DoLoadPerspective(); +} +void CFrame::OnDropDownToolbarItem(wxAuiToolBarEvent& event) +{ + event.Skip(); + + if (event.IsDropDownClicked()) + { + wxAuiToolBar* tb = static_cast(event.GetEventObject()); + + tb->SetToolSticky(event.GetId(), true); + + // create the popup menu + wxMenu menuPopup; + wxMenuItem* m1 = new wxMenuItem(&menuPopup, IDM_ADD_PERSPECTIVE, wxT("Create new perspective")); + menuPopup.Append(m1); + + if (Perspectives.size() > 0) + { + menuPopup.Append(new wxMenuItem(&menuPopup)); + for (int i = 0; i < Perspectives.size(); i++) + { + wxMenuItem* Item = new wxMenuItem(&menuPopup, IDM_PERSPECTIVES_0 + i, wxString::FromAscii(Perspectives.at(i).Name.c_str()), wxT(""), wxITEM_CHECK); + menuPopup.Append(Item); + if (i == ActivePerspective) Item->Check(true); + } + } + + // line up our menu with the button + wxRect rect = tb->GetToolRect(event.GetId()); + wxPoint pt = tb->ClientToScreen(rect.GetBottomLeft()); + pt = ScreenToClient(pt); + + PopupMenu(&menuPopup, pt); + + // make sure the button is "un-stuck" + tb->SetToolSticky(event.GetId(), false); + } +} +void CFrame::OnCreatePerspective(wxCommandEvent& event) +{ + wxTextEntryDialog dlg(this, wxT("Enter a name for the new perspective:"), wxT("Create new perspective")); + + dlg.SetValue(wxString::Format(wxT("Perspective %u"), unsigned(Perspectives.size() + 1))); + if (dlg.ShowModal() != wxID_OK) return; + + SPerspectives Tmp; + Tmp.Name = dlg.GetValue().mb_str(); + Perspectives.push_back(Tmp); +} + +void CFrame::TogglePaneStyle(bool On) +{ + wxAuiPaneInfoArray& AllPanes = m_Mgr->GetAllPanes(); + for (int i = 0; i < AllPanes.GetCount(); ++i) + { + wxAuiPaneInfo& Pane = AllPanes.Item(i); + if (Pane.window->IsKindOf(CLASSINFO(wxAuiNotebook))) + { + Pane.CaptionVisible(On); + Pane.Show(); + } + } + m_Mgr->Update(); +} +void CFrame::ToggleNotebookStyle(long Style) +{ + wxAuiPaneInfoArray& AllPanes = m_Mgr->GetAllPanes(); + for (int i = 0, Count = AllPanes.GetCount(); i < Count; ++i) + { + wxAuiPaneInfo& Pane = AllPanes.Item(i); + if (Pane.window->IsKindOf(CLASSINFO(wxAuiNotebook))) + { + wxAuiNotebook* NB = (wxAuiNotebook*)Pane.window; + NB->SetWindowStyleFlag(NB->GetWindowStyleFlag() ^ Style); + NB->Refresh(); + } + } +} +void CFrame::ResizeConsole() +{ + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; + for(u32 j = 0; j <= wxDynamicCast(m_Mgr->GetAllPanes().Item(i).window, wxAuiNotebook)->GetPageCount(); j++) + { + if (wxDynamicCast(m_Mgr->GetAllPanes().Item(i).window, wxAuiNotebook)->GetPageText(j).IsSameAs(wxT("Console"))) + { + #ifdef _WIN32 + // ---------------------------------------------------------- + // Get OS version + // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ + int wxBorder, Border, LowerBorder, MenuBar, ScrollBar, WidthReduction; + OSVERSIONINFO osvi; + ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osvi); + if (osvi.dwMajorVersion == 6) // Vista (same as 7?) + { + wxBorder = 2; + Border = 4; + LowerBorder = 6; + MenuBar = 30; // Including upper border + ScrollBar = 19; + } + else // XP + { + wxBorder = 2; + Border = 4; + LowerBorder = 6; + MenuBar = 30; + ScrollBar = 19; + } + WidthReduction = 30 - Border; + // -------------------------------- + // Get the client size + int X = m_Mgr->GetAllPanes().Item(i).window->GetClientSize().GetX(); + int Y = m_Mgr->GetAllPanes().Item(i).window->GetClientSize().GetY(); + int InternalWidth = X - wxBorder*2 - ScrollBar; + int InternalHeight = Y - wxBorder*2; + int WindowWidth = InternalWidth + Border*2; + int WindowHeight = InternalHeight; + // Resize buffer + ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); + //Console->Log(LogTypes::LNOTICE, StringFromFormat("Window WxH:%i %i\n", X, Y).c_str()); + Console->PixelSpace(0,0, InternalWidth,InternalHeight, false); + // Move the window to hide the border + MoveWindow(GetConsoleWindow(), -Border-wxBorder,-MenuBar-wxBorder, WindowWidth + 100,WindowHeight, true); + // Move it to the bottom of the view order so that it doesn't hide the notebook tabs + // ... + #endif + } + } + } +} + + +int CFrame::Limit(int i, int Low, int High) +{ + if (i < Low) return Low; + if (i > High) return High; + return i; +} + +void CFrame::SetSimplePaneSize() +{ + wxArrayInt Pane, Size; + Pane.Add(0); Size.Add(50); + Pane.Add(1); Size.Add(50); + + int iClientSize = this->GetSize().GetX(); + // Fix the pane sizes + for (int i = 0; i < Pane.size(); i++) + { + // Check limits + Size[i] = Limit(Size[i], 5, 95); + // Produce pixel width from percentage width + Size[i] = PercentageToPixels(Size[i], iClientSize); + // Update size + m_Mgr->GetPane(wxString::Format(wxT("Pane %i"), Pane[i])).BestSize(Size[i], -1).MinSize(Size[i], -1).MaxSize(Size[i], -1); + } + m_Mgr->Update(); + for (int i = 0; i < Pane.size(); i++) + { + // Remove the size limits + m_Mgr->GetPane(wxString::Format(wxT("Pane %i"), Pane[i])).MinSize(-1, -1).MaxSize(-1, -1); + } +} + +void CFrame::SetPaneSize() +{ + if (Perspectives.size() <= ActivePerspective) return; + int iClientX = this->GetSize().GetX(), iClientY = this->GetSize().GetY(); + + for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiToolBar))) + { + if (!m_Mgr->GetAllPanes().Item(i).IsOk()) return; + if (Perspectives.at(ActivePerspective).Width.size() <= j || Perspectives.at(ActivePerspective).Height.size() <= j) continue; + int W = Perspectives.at(ActivePerspective).Width.at(j), H = Perspectives.at(ActivePerspective).Height.at(j); + // Check limits + W = Limit(W, 5, 95); H = Limit(H, 5, 95); + // Produce pixel width from percentage width + W = PercentageToPixels(W, iClientX); H = PercentageToPixels(H, iClientY); + m_Mgr->GetAllPanes().Item(i).BestSize(W,H).MinSize(W,H).MaxSize(W,H); + + j++; + } + } + m_Mgr->Update(); + + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiToolBar))) + { + m_Mgr->GetAllPanes().Item(i).MinSize(-1,-1).MaxSize(-1,-1); + } + } +} + +// Debugging, show loose windows +void CFrame::ListChildren() +{ + ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); + wxAuiNotebook * NB = NULL; + + Console->Log(LogTypes::LCUSTOM, "--------------------------------------------------------------------\n"); + + for (int i = 0; i < this->GetChildren().size(); i++) + { + wxWindow * Win = this->GetChildren().Item(i)->GetData(); + Console->Log(LogTypes::LCUSTOM, StringFromFormat( + "%i: %s (%s) :: %s", i, + Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); + //if (Win->GetName().IsSameAs(wxT("control"))) + if (Win->IsKindOf(CLASSINFO(wxAuiNotebook))) + { + NB = (wxAuiNotebook*)Win; + Console->Log(LogTypes::LCUSTOM, StringFromFormat(" :: NB", NB->GetName().mb_str()).c_str()); + } + else + { + NB = NULL; + } + Console->Log(LogTypes::LCUSTOM, StringFromFormat("\n").c_str()); + + Win = this->GetChildren().Item(i)->GetData(); + for (int j = 0; j < Win->GetChildren().size(); j++) + { + Console->Log(LogTypes::LCUSTOM, StringFromFormat( + " %i.%i: %s (%s) :: %s", i, j, + Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); + if (NB) + { + if (j < NB->GetPageCount()) + Console->Log(LogTypes::LCUSTOM, StringFromFormat(" :: %s", NB->GetPage(j)->GetName().mb_str()).c_str()); + } + Console->Log(LogTypes::LCUSTOM, StringFromFormat("\n").c_str()); + + /* + Win = this->GetChildren().Item(j)->GetData(); + for (int k = 0; k < Win->GetChildren().size(); k++) + { + Console->Log(LogTypes::LCUSTOM, StringFromFormat( + " %i.%i.%i: %s (%s) :: %s\n", i, j, k, + Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); + } + */ + } + } + + Console->Log(LogTypes::LCUSTOM, "--------------------------------------------------------------------\n"); + + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; + wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; + Console->Log(LogTypes::LCUSTOM, StringFromFormat("%i: %s\n", i, m_Mgr->GetAllPanes().Item(i).name.mb_str()).c_str()); + + for (int j = 0; j < NB->GetPageCount(); j++) + { + Console->Log(LogTypes::LCUSTOM, StringFromFormat("%i.%i: %s\n", i, j, NB->GetPageText(j).mb_str()).c_str()); + } + } + + Console->Log(LogTypes::LCUSTOM, "--------------------------------------------------------------------\n"); +} + +void CFrame::ReloadPanes() +{ + // Keep settings + bool bConsole = SConfig::GetInstance().m_InterfaceConsole; + + //ListChildren(); + //ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); + //Console->Log(LogTypes::LNOTICE, StringFromFormat("ReloadPanes begin: Sound %i\n", FindWindowByName(wxT("Sound"))).c_str()); + + if (ActivePerspective >= Perspectives.size()) ActivePerspective = 0; + + // Check that there is a perspective + if (Perspectives.size() > 0) + { + // Check that the perspective was saved once before + if (Perspectives.at(ActivePerspective).Width.size() == 0) return; + + // Hide to avoid flickering + HideAllNotebooks(true); + // Close all pages + ClosePages(); + + CloseAllNotebooks(); + //m_Mgr->Update(); + + // Create new panes with notebooks + for (int i = 0; i < Perspectives.at(ActivePerspective).Width.size() - 1; i++) + { + m_Mgr->AddPane(CreateEmptyNotebook(), wxAuiPaneInfo().Hide()); + } + HideAllNotebooks(true); + + // Names + NamePanes(); + // Perspectives + m_Mgr->LoadPerspective(Perspectives.at(ActivePerspective).Perspective, false); + } + // Create one pane by default + else + { + m_Mgr->AddPane(CreateEmptyNotebook()); + } + + // Restore settings + SConfig::GetInstance().m_InterfaceConsole = bConsole; + // Load GUI settings + g_pCodeWindow->Load(); + // Open notebook pages + AddRemoveBlankPage(); + g_pCodeWindow->OpenPages(); + if (SConfig::GetInstance().m_InterfaceLogWindow) DoToggleWindow(IDM_LOGWINDOW, true); + if (SConfig::GetInstance().m_InterfaceConsole) DoToggleWindow(IDM_CONSOLEWINDOW, true); + + //Console->Log(LogTypes::LNOTICE, StringFromFormat("ReloadPanes end: Sound %i\n", FindWindowByName(wxT("Sound"))).c_str()); + //ListChildren(); +} + +void CFrame::DoLoadPerspective() +{ + ReloadPanes(); + // Restore the exact window sizes, which LoadPerspective doesn't always do + SetPaneSize(); + // Show + ShowAllNotebooks(true); + + /* + ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); + Console->Log(LogTypes::LCUSTOM, StringFromFormat( + "Loaded: %s (%i panes, %i NBs)\n", + Perspectives.at(ActivePerspective).Name.c_str(), m_Mgr->GetAllPanes().GetCount(), GetNotebookCount()).c_str()); + */ +} + +// Update the local perspectives array +void CFrame::SaveLocal() +{ + Perspectives.clear(); + std::vector VPerspectives; + std::string _Perspectives; + + IniFile ini; + ini.Load(DEBUGGER_CONFIG_FILE); + ini.Get("Perspectives", "Perspectives", &_Perspectives, ""); + ini.Get("Perspectives", "Active", &ActivePerspective, 5); + SplitString(_Perspectives, ",", VPerspectives); + + // + for (int i = 0; i < VPerspectives.size(); i++) + { + SPerspectives Tmp; + std::string _Section, _Perspective, _Width, _Height; + std::vector _SWidth, _SHeight; + Tmp.Name = VPerspectives.at(i); + _Section = StringFromFormat("P - %s", Tmp.Name.c_str()); + if (!ini.Exists(_Section.c_str(), "Width")) continue; + + ini.Get(_Section.c_str(), "Perspective", &_Perspective, ""); + ini.Get(_Section.c_str(), "Width", &_Width, ""); + ini.Get(_Section.c_str(), "Height", &_Height, ""); + + Tmp.Perspective = wxString::FromAscii(_Perspective.c_str()); + + SplitString(_Width, ",", _SWidth); + SplitString(_Height, ",", _SHeight); + for (int i = 0; i < _SWidth.size(); i++) + { + int _Tmp; + if (TryParseInt(_SWidth.at(0).c_str(), &_Tmp)) Tmp.Width.push_back(_Tmp); + } + for (int i = 0; i < _SHeight.size(); i++) + { + int _Tmp; + if (TryParseInt(_SHeight.at(0).c_str(), &_Tmp)) Tmp.Height.push_back(_Tmp); + } + Perspectives.push_back(Tmp); + } +} +void CFrame::Save() +{ + if (Perspectives.size() == 0) return; + if (ActivePerspective >= Perspectives.size()) ActivePerspective = 0; + + // Turn off edit before saving + TogglePaneStyle(false); + // Name panes + NamePanes(); + + // Get client size + int iClientX = this->GetSize().GetX(), iClientY = this->GetSize().GetY(); + + IniFile ini; + ini.Load(DEBUGGER_CONFIG_FILE); + + std::string _Section = StringFromFormat("P - %s", Perspectives.at(ActivePerspective).Name.c_str()); + ini.Set(_Section.c_str(), "Perspective", m_Mgr->SavePerspective().mb_str()); + + std::string SWidth = "", SHeight = ""; + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiToolBar))) + { + SWidth += StringFromFormat("%i", PixelsToPercentage(m_Mgr->GetAllPanes().Item(i).window->GetClientSize().GetX(), iClientX)); + SHeight += StringFromFormat("%i", PixelsToPercentage(m_Mgr->GetAllPanes().Item(i).window->GetClientSize().GetY(), iClientY)); + SWidth += ","; SHeight += ","; + } + } + // Remove the ending "," + SWidth = SWidth.substr(0, SWidth.length()-1); SHeight = SHeight.substr(0, SHeight.length()-1); + + ini.Set(_Section.c_str(), "Width", SWidth.c_str()); + ini.Set(_Section.c_str(), "Height", SHeight.c_str()); + + // Save perspective names + std::string STmp = ""; + for (int i = 0; i < Perspectives.size(); i++) + { + STmp += Perspectives.at(i).Name + ","; + } + STmp = STmp.substr(0, STmp.length()-1); + ini.Set("Perspectives", "Perspectives", STmp.c_str()); + ini.Set("Perspectives", "Active", ActivePerspective); + ini.Save(DEBUGGER_CONFIG_FILE); + + // Save notebook affiliations + g_pCodeWindow->Save(); + + // Update the local vector + SaveLocal(); + + /* + ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); + Console->Log(LogTypes::LCUSTOM, StringFromFormat( + "Saved: %s (%i panes, %i NBs)\n", + Perspectives.at(ActivePerspective).Name.c_str(), m_Mgr->GetAllPanes().GetCount(), GetNotebookCount()).c_str()); + */ + + TogglePaneStyle(m_ToolBarAui->GetToolToggled(IDM_EDIT_PERSPECTIVES)); +} + +int CFrame::PercentageToPixels(int Percentage, int Total) +{ + int Pixels = (int)((float)Total * ((float)Percentage / 100.0)); + return Pixels; +} +int CFrame::PixelsToPercentage(int Pixels, int Total) +{ + int Percentage = (int)(((float)Pixels / (float)Total) * 100.0); + return Percentage; +} + +void CFrame::NamePanes() +{ + for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiToolBar))) + { + m_Mgr->GetAllPanes().Item(i).Name(wxString::Format(wxT("Pane %i"), j)); + m_Mgr->GetAllPanes().Item(i).Caption(wxString::Format(wxT("Pane %i"), j)); + j++; + } + } +} +void CFrame::AddPane() +{ + m_Mgr->AddPane(CreateEmptyNotebook()); + NamePanes(); + AddRemoveBlankPage(); + m_Mgr->Update(); +} + + +///////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index 6aca0a745f..0531b9a1de 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -721,147 +721,6 @@ void CFrame::OnToolBar(wxCommandEvent& event) break; } } -void CFrame::OnSelectPerspective(wxCommandEvent& event) -{ - int _Selection = event.GetId() - IDM_PERSPECTIVES_0; - if (Perspectives.size() <= _Selection) _Selection = 0; - ActivePerspective = _Selection; - DoLoadPerspective(); -} -void CFrame::OnDropDownToolbarItem(wxAuiToolBarEvent& event) -{ - event.Skip(); - - if (event.IsDropDownClicked()) - { - wxAuiToolBar* tb = static_cast(event.GetEventObject()); - - tb->SetToolSticky(event.GetId(), true); - - // create the popup menu - wxMenu menuPopup; - wxMenuItem* m1 = new wxMenuItem(&menuPopup, IDM_ADD_PERSPECTIVE, wxT("Create new perspective")); - menuPopup.Append(m1); - - if (Perspectives.size() > 0) - { - menuPopup.Append(new wxMenuItem(&menuPopup)); - for (int i = 0; i < Perspectives.size(); i++) - { - wxMenuItem* Item = new wxMenuItem(&menuPopup, IDM_PERSPECTIVES_0 + i, wxString::FromAscii(Perspectives.at(i).Name.c_str()), wxT(""), wxITEM_CHECK); - menuPopup.Append(Item); - if (i == ActivePerspective) Item->Check(true); - } - } - - // line up our menu with the button - wxRect rect = tb->GetToolRect(event.GetId()); - wxPoint pt = tb->ClientToScreen(rect.GetBottomLeft()); - pt = ScreenToClient(pt); - - PopupMenu(&menuPopup, pt); - - // make sure the button is "un-stuck" - tb->SetToolSticky(event.GetId(), false); - } -} -void CFrame::OnCreatePerspective(wxCommandEvent& event) -{ - wxTextEntryDialog dlg(this, wxT("Enter a name for the new perspective:"), wxT("Create new perspective")); - - dlg.SetValue(wxString::Format(wxT("Perspective %u"), unsigned(Perspectives.size() + 1))); - if (dlg.ShowModal() != wxID_OK) return; - - SPerspectives Tmp; - Tmp.Name = dlg.GetValue().mb_str(); - Perspectives.push_back(Tmp); -} - -void CFrame::TogglePaneStyle(bool On) -{ - wxAuiPaneInfoArray& AllPanes = m_Mgr->GetAllPanes(); - for (int i = 0; i < AllPanes.GetCount(); ++i) - { - wxAuiPaneInfo& Pane = AllPanes.Item(i); - if (Pane.window->IsKindOf(CLASSINFO(wxAuiNotebook))) - { - Pane.CaptionVisible(On); - Pane.Show(); - } - } - m_Mgr->Update(); -} -void CFrame::ToggleNotebookStyle(long Style) -{ - wxAuiPaneInfoArray& AllPanes = m_Mgr->GetAllPanes(); - for (int i = 0, Count = AllPanes.GetCount(); i < Count; ++i) - { - wxAuiPaneInfo& Pane = AllPanes.Item(i); - if (Pane.window->IsKindOf(CLASSINFO(wxAuiNotebook))) - { - wxAuiNotebook* NB = (wxAuiNotebook*)Pane.window; - NB->SetWindowStyleFlag(NB->GetWindowStyleFlag() ^ Style); - NB->Refresh(); - } - } -} -void CFrame::ResizeConsole() -{ - for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; - for(u32 j = 0; j <= wxDynamicCast(m_Mgr->GetAllPanes().Item(i).window, wxAuiNotebook)->GetPageCount(); j++) - { - if (wxDynamicCast(m_Mgr->GetAllPanes().Item(i).window, wxAuiNotebook)->GetPageText(j).IsSameAs(wxT("Console"))) - { - #ifdef _WIN32 - // ---------------------------------------------------------- - // Get OS version - // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ - int wxBorder, Border, LowerBorder, MenuBar, ScrollBar, WidthReduction; - OSVERSIONINFO osvi; - ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&osvi); - if (osvi.dwMajorVersion == 6) // Vista (same as 7?) - { - wxBorder = 2; - Border = 4; - LowerBorder = 6; - MenuBar = 30; // Including upper border - ScrollBar = 19; - } - else // XP - { - wxBorder = 2; - Border = 4; - LowerBorder = 6; - MenuBar = 30; - ScrollBar = 19; - } - WidthReduction = 30 - Border; - // -------------------------------- - // Get the client size - int X = m_Mgr->GetAllPanes().Item(i).window->GetClientSize().GetX(); - int Y = m_Mgr->GetAllPanes().Item(i).window->GetClientSize().GetY(); - int InternalWidth = X - wxBorder*2 - ScrollBar; - int InternalHeight = Y - wxBorder*2; - int WindowWidth = InternalWidth + Border*2; - int WindowHeight = InternalHeight; - // Resize buffer - ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - //Console->Log(LogTypes::LNOTICE, StringFromFormat("Window WxH:%i %i\n", X, Y).c_str()); - Console->PixelSpace(0,0, InternalWidth,InternalHeight, false); - // Move the window to hide the border - MoveWindow(GetConsoleWindow(), -Border-wxBorder,-MenuBar-wxBorder, WindowWidth + 100,WindowHeight, true); - // Move it to the bottom of the view order so that it doesn't hide the notebook tabs - // ... - #endif - } - } - } -} -///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -992,465 +851,13 @@ void CFrame::OnFrameSkip(wxCommandEvent& event) ///////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////////// -// Notebooks -// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -#ifdef _WIN32 -wxWindow * CFrame::GetWxWindowHwnd(HWND hWnd) -{ - wxWindow * Win = new wxWindow(); - Win->SetHWND((WXHWND)hWnd); - Win->AdoptAttributesFromHWND(); - return Win; -} -#endif -wxWindow * CFrame::GetWxWindow(wxString Name) -{ - #ifdef _WIN32 - HWND hWnd = ::FindWindow(NULL, Name.c_str()); - if (hWnd) - { - wxWindow * Win = new wxWindow(); - Win->SetHWND((WXHWND)hWnd); - Win->AdoptAttributesFromHWND(); - return Win; - } - else - #endif - if (FindWindowByName(Name)) - { - return FindWindowByName(Name); - } - else if (FindWindowByLabel(Name)) - { - return FindWindowByLabel(Name); - } - else if (GetNootebookPage(Name)) - { - return GetNootebookPage(Name); - } - else - return NULL; -} -wxWindow * CFrame::GetNootebookPage(wxString Name) -{ - for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; - wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; - for(u32 j = 0; j < NB->GetPageCount(); j++) - { - if (NB->GetPageText(j).IsSameAs(Name)) return NB->GetPage(j); - } - } - return NULL; -} -void CFrame::AddRemoveBlankPage() -{ - for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; - wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; - for(u32 j = 0; j < NB->GetPageCount(); j++) - { - if (NB->GetPageText(j).IsSameAs(wxT("<>")) && NB->GetPageCount() > 1) NB->DeletePage(j); - } - if (NB->GetPageCount() == 0) NB->AddPage(CreateEmptyPanel(), wxT("<>"), true); - } -} -int CFrame::GetNootebookAffiliation(wxString Name) -{ - for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; - wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; - for(u32 k = 0; k < NB->GetPageCount(); k++) - { - if (NB->GetPageText(k).IsSameAs(Name)) return j; - } - j++; - } - return -1; -} -void CFrame::ClosePages() -{ - DoToggleWindow(IDM_LOGWINDOW, false); - DoToggleWindow(IDM_CONSOLEWINDOW, false); - DoToggleWindow(IDM_CODEWINDOW, false); - DoToggleWindow(IDM_REGISTERWINDOW, false); - DoToggleWindow(IDM_BREAKPOINTWINDOW, false); - DoToggleWindow(IDM_MEMORYWINDOW, false); - DoToggleWindow(IDM_JITWINDOW, false); - DoToggleWindow(IDM_SOUNDWINDOW, false); - DoToggleWindow(IDM_VIDEOWINDOW, false); -} -void CFrame::DoToggleWindow(int Id, bool Show) -{ - switch (Id) - { - case IDM_LOGWINDOW: ToggleLogWindow(Show, UseDebugger ? g_pCodeWindow->iLogWindow : 0); break; - case IDM_CONSOLEWINDOW: ToggleConsole(Show, UseDebugger ? g_pCodeWindow->iConsoleWindow : 0); break; - } - - if (!UseDebugger) return; - - switch (Id) - { - case IDM_CODEWINDOW: g_pCodeWindow->OnToggleCodeWindow(Show, g_pCodeWindow->iCodeWindow); break; - case IDM_REGISTERWINDOW: g_pCodeWindow->OnToggleRegisterWindow(Show, g_pCodeWindow->iRegisterWindow); break; - case IDM_BREAKPOINTWINDOW: g_pCodeWindow->OnToggleBreakPointWindow(Show, g_pCodeWindow->iBreakpointWindow); break; - case IDM_MEMORYWINDOW: g_pCodeWindow->OnToggleMemoryWindow(Show, g_pCodeWindow->iMemoryWindow); break; - case IDM_JITWINDOW: g_pCodeWindow->OnToggleJitWindow(Show, g_pCodeWindow->iJitWindow); break; - case IDM_SOUNDWINDOW: g_pCodeWindow->OnToggleSoundWindow(Show, g_pCodeWindow->iSoundWindow); break; - case IDM_VIDEOWINDOW: g_pCodeWindow->OnToggleVideoWindow(Show, g_pCodeWindow->iVideoWindow); break; - } -} -void CFrame::OnNotebookPageChanged(wxAuiNotebookEvent& event) -{ - event.Skip(); - if (!UseDebugger) return; - - // Remove the blank page if any - AddRemoveBlankPage(); - - // Update the notebook affiliation - if(GetNootebookAffiliation(wxT("Log")) >= 0) g_pCodeWindow->iLogWindow = GetNootebookAffiliation(wxT("Log")); - if(GetNootebookAffiliation(wxT("Console")) >= 0) g_pCodeWindow->iConsoleWindow = GetNootebookAffiliation(wxT("Console")); - if(GetNootebookAffiliation(wxT("Code")) >= 0) g_pCodeWindow->iCodeWindow = GetNootebookAffiliation(wxT("Code")); - if(GetNootebookAffiliation(wxT("Registers")) >= 0) g_pCodeWindow->iRegisterWindow = GetNootebookAffiliation(wxT("Registers")); - if(GetNootebookAffiliation(wxT("Breakpoints")) >= 0) g_pCodeWindow->iBreakpointWindow = GetNootebookAffiliation(wxT("Breakpoints")); - if(GetNootebookAffiliation(wxT("JIT")) >= 0) g_pCodeWindow->iJitWindow = GetNootebookAffiliation(wxT("JIT")); - if(GetNootebookAffiliation(wxT("Memory")) >= 0) g_pCodeWindow->iMemoryWindow = GetNootebookAffiliation(wxT("Memory")); - if(GetNootebookAffiliation(wxT("Sound")) >= 0) g_pCodeWindow->iSoundWindow = GetNootebookAffiliation(wxT("Sound")); - if(GetNootebookAffiliation(wxT("Video")) >= 0) g_pCodeWindow->iVideoWindow = GetNootebookAffiliation(wxT("Video")); -} -void CFrame::OnNotebookPageClose(wxAuiNotebookEvent& event) -{ - // Override event - event.Veto(); - - wxAuiNotebook* Ctrl = (wxAuiNotebook*)event.GetEventObject(); - - if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Log"))) { GetMenuBar()->FindItem(IDM_LOGWINDOW)->Check(false); DoToggleWindow(IDM_LOGWINDOW, false); } - if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Console"))) { GetMenuBar()->FindItem(IDM_CONSOLEWINDOW)->Check(false); DoToggleWindow(IDM_CONSOLEWINDOW, false); } - if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Registers"))) { GetMenuBar()->FindItem(IDM_REGISTERWINDOW)->Check(false); DoToggleWindow(IDM_REGISTERWINDOW, false); } - if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Breakpoints"))) { GetMenuBar()->FindItem(IDM_BREAKPOINTWINDOW)->Check(false); DoToggleWindow(IDM_BREAKPOINTWINDOW, false); } - if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("JIT"))) { GetMenuBar()->FindItem(IDM_JITWINDOW)->Check(false); DoToggleWindow(IDM_JITWINDOW, false); } - if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Memory"))) { GetMenuBar()->FindItem(IDM_MEMORYWINDOW)->Check(false); DoToggleWindow(IDM_MEMORYWINDOW, false); } - if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Sound"))) { GetMenuBar()->FindItem(IDM_SOUNDWINDOW)->Check(false); DoToggleWindow(IDM_SOUNDWINDOW, false); } - if (Ctrl->GetPageText(event.GetSelection()).IsSameAs(wxT("Video"))) { GetMenuBar()->FindItem(IDM_VIDEOWINDOW)->Check(false); DoToggleWindow(IDM_VIDEOWINDOW, false); } -} -void CFrame::OnAllowNotebookDnD(wxAuiNotebookEvent& event) -{ - event.Skip(); - event.Allow(); - wxAuiNotebook* Ctrl = (wxAuiNotebook*)event.GetEventObject(); - // If we drag away the last one the tab bar goes away and we can't add any panes to it - //if (Ctrl->GetPageCount() == 1) Ctrl->AddPage(CreateEmptyPanel(), wxT("<>"), true); -} -void CFrame::HidePane() -{ - // Get the first notebook - wxAuiNotebook * NB; - for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) - NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; - } - if (NB->GetPageCount() == 0) - m_Mgr->GetPane(wxT("Pane 1")).Hide(); - else - m_Mgr->GetPane(wxT("Pane 1")).Show(); - m_Mgr->Update(); - - SetSimplePaneSize(); -} -void CFrame::DoRemovePageString(wxString Str, bool Hide, bool Destroy) -{ - for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; - wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; - for (int j = 0; j < NB->GetPageCount(); j++) - { - if (NB->GetPageText(j).IsSameAs(Str)) - { - if (!Destroy) - { - // Reparent to avoid destruction if the notebook is closed and destroyed - wxWindow * Win = NB->GetPage(j); - NB->RemovePage(j); - Win->Reparent(this); - } - else - { - NB->DeletePage(j); - } - //if (Hide) Win->Hide(); - break; - } - } - } - -} -wxAuiNotebook * CFrame::GetNotebook(int NBId) -{ - int Ret = 0; - for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; - if (j == NBId) return (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; - j++; - } - return NULL; -} -void CFrame::ShowAllNotebooks(bool Window) -{ - for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) - { - if (Window) - m_Mgr->GetAllPanes().Item(i).Show(); - else - m_Mgr->GetAllPanes().Item(i).window->Hide(); - } - } - m_Mgr->Update(); -} -void CFrame::HideAllNotebooks(bool Window) -{ - for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) - { - if (Window) - m_Mgr->GetAllPanes().Item(i).Hide(); - else - m_Mgr->GetAllPanes().Item(i).window->Hide(); - } - } - m_Mgr->Update(); -} -// Close all panes with notebooks -void CFrame::CloseAllNotebooks() -{ - int i = 0; - while(GetNotebookCount() > 0) - { - if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) - { - m_Mgr->GetAllPanes().Item(i).DestroyOnClose(true); - m_Mgr->ClosePane(m_Mgr->GetAllPanes().Item(i)); - //m_Mgr->GetAllPanes().Item(i).window->Hide(); - //m_Mgr->DetachPane(m_Mgr->GetAllPanes().Item(i).window); - - i = 0; - //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" %i Pane\n", i).c_str()); - } - else - { - i++; - //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" %i No pane\n", i).c_str()); - } - - } -} -int CFrame::GetNotebookCount() -{ - int Ret = 0; - for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) - { - if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) Ret++; - } - return Ret; -} -void CFrame::DoAddPage(wxWindow * Win, int i, std::string Name) -{ - if (!Win) return; - if (GetNotebookCount() == 0) return; - if (i < 0 || i > GetNotebookCount()-1) i = 0; - if (Win && GetNotebook(i)->GetPageIndex(Win) != wxNOT_FOUND) return; - GetNotebook(i)->AddPage(Win, wxString::FromAscii(Name.c_str()), true, aNormalFile ); - - /* - ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - Console->Log(LogTypes::LCUSTOM, StringFromFormat("Add: %s\n", Name.c_str()).c_str()); - */ -} -void CFrame::DoRemovePage(wxWindow * Win, bool Hide) -{ - // If m_dialog is NULL, then possibly the system didn't report the checked menu item status correctly. - // It should be true just after the menu item was selected, if there was no modeless dialog yet. - //wxASSERT(Win != NULL); - - if (Win) - { - for (int i = 0; i < GetNotebookCount(); i++) - { - if (GetNotebook(i)->GetPageIndex(Win) != wxNOT_FOUND) GetNotebook(i)->RemovePage(GetNotebook(i)->GetPageIndex(Win)); - } - // Reparent to avoid destruction if the notebook is closed and destroyed - Win->Reparent(this); - - if (Hide) Win->Hide(); - } -} - -// Enable and disable the toolbar -void CFrame::OnToggleToolbar(wxCommandEvent& event) -{ - SConfig::GetInstance().m_InterfaceToolbar = event.IsChecked(); - DoToggleToolbar(event.IsChecked()); -} -void CFrame::DoToggleToolbar(bool Show) -{ - if (Show) - { - m_Mgr->GetPane(wxT("TBMain")).Show(); - if (UseDebugger) { m_Mgr->GetPane(wxT("TBDebug")).Show(); m_Mgr->GetPane(wxT("TBAui")).Show(); } - m_Mgr->Update(); - } - else - { - m_Mgr->GetPane(wxT("TBMain")).Hide(); - if (UseDebugger) { m_Mgr->GetPane(wxT("TBDebug")).Hide(); m_Mgr->GetPane(wxT("TBAui")).Hide(); } - m_Mgr->Update(); - } -} - -// Enable and disable the status bar -void CFrame::OnToggleStatusbar(wxCommandEvent& event) -{ - SConfig::GetInstance().m_InterfaceStatusbar = event.IsChecked(); - if (SConfig::GetInstance().m_InterfaceStatusbar == true) - m_pStatusBar->Show(); - else - m_pStatusBar->Hide(); - - this->SendSizeEvent(); -} - -// Enable and disable the log window -void CFrame::OnToggleLogWindow(wxCommandEvent& event) -{ - SConfig::GetInstance().m_InterfaceLogWindow = event.IsChecked(); - DoToggleWindow(event.GetId(), event.IsChecked()); -} -void CFrame::ToggleLogWindow(bool Show, int i) -{ - if (Show) - { - if (!m_LogWindow) m_LogWindow = new CLogWindow(this); - #ifdef _WIN32 - DoAddPage(m_LogWindow, i, "Log"); - #else - m_LogWindow->Show(); - #endif - } - else - { - #ifdef _WIN32 - DoRemovePage(m_LogWindow); - #else - if (m_LogWindow) m_LogWindow->Show(); - #endif - } - - // Hide pane - if (!UseDebugger) HidePane(); - - // Make sure the check is updated (if wxw isn't calling this func) - //GetMenuBar()->FindItem(IDM_LOGWINDOW)->Check(Show); -} -// Enable and disable the console -void CFrame::OnToggleConsole(wxCommandEvent& event) -{ - SConfig::GetInstance().m_InterfaceConsole = event.IsChecked(); - DoToggleWindow(event.GetId(), event.IsChecked()); -} -void CFrame::ToggleConsole(bool Show, int i) -{ - ConsoleListener *Console = LogManager::GetInstance()->getConsoleListener(); - - if (Show) - { - //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" >>> Show\n").c_str()); - - if (GetNotebookCount() == 0) return; - if (i < 0 || i > GetNotebookCount()-1) i = 0; - - #ifdef _WIN32 - wxWindow *Win = GetWxWindowHwnd(GetConsoleWindow()); - if (Win && GetNotebook(i)->GetPageIndex(Win) != wxNOT_FOUND) return; - { - #else - Console->Open(); - #endif - - #ifdef _WIN32 - if(!GetConsoleWindow()) Console->Open(); else ShowWindow(GetConsoleWindow(),SW_SHOW); - } - Win = GetWxWindowHwnd(GetConsoleWindow()); - // Can we remove the border? - //Win->SetWindowStyleFlag(wxNO_BORDER); - //SetWindowLong(GetConsoleWindow(), GWL_STYLE, WS_VISIBLE); - // Create parent window - wxPanel * ConsoleParent = CreateEmptyPanel(); - ::SetParent(GetConsoleWindow(), (HWND)ConsoleParent->GetHWND()); - //Win->SetParent(ConsoleParent); - //if (Win) m_Mgr->GetAllPanes().Item(i)->AddPage(Win, wxT("Console"), true, aNormalFile ); - if (Win) GetNotebook(i)->AddPage(ConsoleParent, wxT("Console"), true, aNormalFile ); - #endif - } - else // hide - { - //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" >>> Show\n").c_str()); - - #ifdef _WIN32 - // Hide - if(GetConsoleWindow()) ShowWindow(GetConsoleWindow(),SW_HIDE); - // Release the console to Windows - ::SetParent(GetConsoleWindow(), NULL); - // Destroy the empty parent of the console - DoRemovePageString(wxT("Console"), true, true); - - #else - Console->Close(); - #endif - } - - // Hide pane - if (!UseDebugger) HidePane(); - - // Make sure the check is updated (if wxw isn't calling this func) - //GetMenuBar()->FindItem(IDM_CONSOLEWINDOW)->Check(Show); -} -///////////////////////////////////////////////////////////////////////////////////////////////////////// - - - ///////////////////////////////////////////////////////////////////////////////////////////////////////// // GUI // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -void CFrame::OnManagerResize(wxAuiManagerEvent& event) -{ - event.Skip(); - ResizeConsole(); -} -void CFrame::OnResize(wxSizeEvent& event) -{ - event.Skip(); - // fit frame content, not needed right now - //FitInside(); - DoMoveIcons(); // In FrameWiimote.cpp -} // Update the enabled/disabled status void CFrame::UpdateGUI() { - return; - // Save status bool initialized = Core::isRunning(); bool running = Core::GetState() == Core::CORE_RUN; diff --git a/Source/Core/DolphinWX/Src/Main.cpp b/Source/Core/DolphinWX/Src/Main.cpp index 74f198e409..ab8be10128 100644 --- a/Source/Core/DolphinWX/Src/Main.cpp +++ b/Source/Core/DolphinWX/Src/Main.cpp @@ -89,6 +89,7 @@ bool DolphinApp::OnInit() NOTICE_LOG(BOOT, "Starting application"); // Declarations and definitions bool UseDebugger = false; + bool UseLogger = false; bool LoadElf = false; wxString ElfFile; @@ -197,6 +198,9 @@ bool DolphinApp::OnInit() { wxCMD_LINE_SWITCH, _T("d"), _T("debugger"), _T("Opens the debugger") }, + { + wxCMD_LINE_SWITCH, _T("l"), _T("logger"), _T("Opens The Logger") + }, { wxCMD_LINE_OPTION, _T("e"), _T("elf"), _T("Loads an elf file"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL @@ -258,6 +262,7 @@ bool DolphinApp::OnInit() } UseDebugger = parser.Found(_T("debugger")); + UseLogger = parser.Found(_T("logger")); LoadElf = parser.Found(_T("elf"), &ElfFile); if( LoadElf && ElfFile == wxEmptyString ) @@ -292,13 +297,13 @@ bool DolphinApp::OnInit() if (UseDebugger) { - main_frame = new CFrame((wxFrame*) NULL, wxID_ANY, wxString::FromAscii(title), - wxPoint(x, y), wxSize(w, h), true); + main_frame = new CFrame((wxFrame*)NULL, wxID_ANY, wxString::FromAscii(title), + wxPoint(x, y), wxSize(w, h), true, UseLogger); } else { - main_frame = new CFrame((wxFrame*) NULL, wxID_ANY, wxString::FromAscii(title), - wxPoint(100, 100), wxSize(800, 600)); + main_frame = new CFrame((wxFrame*)NULL, wxID_ANY, wxString::FromAscii(title), + wxPoint(100, 100), wxSize(800, 600), false, UseLogger); } // --------------------------------------------------- diff --git a/Source/Core/DolphinWX/Src/SConscript b/Source/Core/DolphinWX/Src/SConscript index e1aaee59e8..348975b3ff 100644 --- a/Source/Core/DolphinWX/Src/SConscript +++ b/Source/Core/DolphinWX/Src/SConscript @@ -27,8 +27,10 @@ if wxenv['HAVE_WX']: 'ARCodeAddEdit.cpp', 'ConfigMain.cpp', 'Frame.cpp', - 'LogWindow.cpp', + 'FrameAui.cpp', 'FrameTools.cpp', + 'FrameWiimote.cpp', + 'LogWindow.cpp', 'GameListCtrl.cpp', 'Globals.cpp', 'ISOFile.cpp', @@ -39,7 +41,6 @@ if wxenv['HAVE_WX']: 'CheatsWindow.cpp', 'InfoWindow.cpp', 'stdafx.cpp', - 'FrameWiimote.cpp', 'WxUtils.cpp', ]