summaryrefslogtreecommitdiffstats
path: root/Project
diff options
context:
space:
mode:
authorThales Lima Oliveira <thaleslima.ufu@gmail.com>2017-09-19 21:14:46 -0300
committerGitHub <noreply@github.com>2017-09-19 21:14:46 -0300
commitfa2776e9a939a793a9e46a0cc5880dda868e7028 (patch)
tree302f16d6d9af20a293d18d8a553ba2eac19a0fae /Project
parent3be51dc6e55414c76e7059a8dffa74a99268a7c8 (diff)
parent011fe58b631f66b715b0ba0d3f8be58277b355b2 (diff)
downloadPSP.git-fa2776e9a939a793a9e46a0cc5880dda868e7028.tar.gz
PSP.git-fa2776e9a939a793a9e46a0cc5880dda868e7028.tar.xz
PSP.git-fa2776e9a939a793a9e46a0cc5880dda868e7028.zip
Merge pull request #38 from Thales1330/wip/open-dot-psp
Wip open dot psp
Diffstat (limited to 'Project')
-rw-r--r--Project/AboutForm.cpp4
-rw-r--r--Project/AboutForm.h1
-rw-r--r--Project/ControlEditor.cpp36
-rw-r--r--Project/Element.cpp9
-rw-r--r--Project/Element.h9
-rw-r--r--Project/Line.cpp27
-rw-r--r--Project/MainFrame.cpp24
-rw-r--r--Project/MainFrame.h24
-rw-r--r--Project/Project.mk2
-rw-r--r--Project/PropertiesForm.cpp2
-rw-r--r--Project/PropertiesForm.wxcp2
-rw-r--r--Project/Workspace.cpp2
-rw-r--r--Project/Workspace.h31
-rw-r--r--Project/main.cpp22
14 files changed, 138 insertions, 57 deletions
diff --git a/Project/AboutForm.cpp b/Project/AboutForm.cpp
index 191d9e4..b9d4f88 100644
--- a/Project/AboutForm.cpp
+++ b/Project/AboutForm.cpp
@@ -60,7 +60,9 @@ void AboutForm::Init()
// Load license file
wxString licenseStr = "";
wxTextFile file;
- if(!file.Open("../data/LICENSE")) {
+ wxFileName fn(wxStandardPaths::Get().GetExecutablePath());
+ wxString licensePath = fn.GetPath() + "\\..\\data\\LICENSE";
+ if(!file.Open(licensePath)) {
// Error message
} else {
licenseStr += file.GetFirstLine() + "\n";
diff --git a/Project/AboutForm.h b/Project/AboutForm.h
index ba64324..abba7f4 100644
--- a/Project/AboutForm.h
+++ b/Project/AboutForm.h
@@ -3,6 +3,7 @@
#include "PropertiesForm.h"
#include <wx/textfile.h>
+#include <wx/stdpaths.h>
class AboutForm : public AboutFormBase
{
diff --git a/Project/ControlEditor.cpp b/Project/ControlEditor.cpp
index c86477d..b72f6dd 100644
--- a/Project/ControlEditor.cpp
+++ b/Project/ControlEditor.cpp
@@ -132,48 +132,54 @@ void ControlEditor::BuildControlElementPanel()
wxWrapSizer* wrapSizer = new wxWrapSizer();
m_panelControlElements->SetSizer(wrapSizer);
- ControlElementButton* ioButton = new ControlElementButton(m_panelControlElements, _("In/Out"),
- wxImage("..\\data\\images\\control\\io.png"), ID_IO);
+ wxFileName exeFileName(wxStandardPaths::Get().GetExecutablePath());
+ wxString exePath = exeFileName.GetPath();
+
+ ControlElementButton* ioButton = new ControlElementButton(
+ m_panelControlElements, _("In/Out"), wxImage(exePath + "\\..\\data\\images\\control\\io.png"), ID_IO);
wrapSizer->Add(ioButton, 0, wxALL, 5);
ioButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
- ControlElementButton* tfButton = new ControlElementButton(
- m_panelControlElements, _("Transfer fcn"), wxImage("..\\data\\images\\control\\transferFunc.png"), ID_TF);
+ ControlElementButton* tfButton =
+ new ControlElementButton(m_panelControlElements, _("Transfer fcn"),
+ wxImage(exePath + "\\..\\data\\images\\control\\transferFunc.png"), ID_TF);
wrapSizer->Add(tfButton, 0, wxALL, 5);
tfButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
- ControlElementButton* sumButton = new ControlElementButton(m_panelControlElements, _("Sum"),
- wxImage("..\\data\\images\\control\\sum.png"), ID_SUM);
+ ControlElementButton* sumButton = new ControlElementButton(
+ m_panelControlElements, _("Sum"), wxImage(exePath + "\\..\\data\\images\\control\\sum.png"), ID_SUM);
wrapSizer->Add(sumButton, 0, wxALL, 5);
sumButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
ControlElementButton* constButton = new ControlElementButton(
- m_panelControlElements, _("Constant"), wxImage("..\\data\\images\\control\\value.png"), ID_CONST);
+ m_panelControlElements, _("Constant"), wxImage(exePath + "\\..\\data\\images\\control\\value.png"), ID_CONST);
wrapSizer->Add(constButton, 0, wxALL, 5);
constButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
- ControlElementButton* limButton = new ControlElementButton(
- m_panelControlElements, _("Limiter"), wxImage("..\\data\\images\\control\\limiter.png"), ID_LIMITER);
+ ControlElementButton* limButton =
+ new ControlElementButton(m_panelControlElements, _("Limiter"),
+ wxImage(exePath + "\\..\\data\\images\\control\\limiter.png"), ID_LIMITER);
wrapSizer->Add(limButton, 0, wxALL, 5);
limButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
ControlElementButton* gainButton = new ControlElementButton(
- m_panelControlElements, _("Gain"), wxImage("..\\data\\images\\control\\gain.png"), ID_GAIN);
+ m_panelControlElements, _("Gain"), wxImage(exePath + "\\..\\data\\images\\control\\gain.png"), ID_GAIN);
wrapSizer->Add(gainButton, 0, wxALL, 5);
gainButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
ControlElementButton* multButton = new ControlElementButton(
- m_panelControlElements, _("Multiplier"), wxImage("..\\data\\images\\control\\mult.png"), ID_MULT);
+ m_panelControlElements, _("Multiplier"), wxImage(exePath + "\\..\\data\\images\\control\\mult.png"), ID_MULT);
wrapSizer->Add(multButton, 0, wxALL, 5);
multButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
- ControlElementButton* satButton = new ControlElementButton(m_panelControlElements, _("Exponential"),
- wxImage("..\\data\\images\\control\\sat.png"), ID_EXP);
+ ControlElementButton* satButton = new ControlElementButton(
+ m_panelControlElements, _("Exponential"), wxImage(exePath + "\\..\\data\\images\\control\\sat.png"), ID_EXP);
wrapSizer->Add(satButton, 0, wxALL, 5);
satButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
- ControlElementButton* rateLimButton = new ControlElementButton(
- m_panelControlElements, _("Rate limiter"), wxImage("..\\data\\images\\control\\rateLimiter.png"), ID_RATELIM);
+ ControlElementButton* rateLimButton =
+ new ControlElementButton(m_panelControlElements, _("Rate limiter"),
+ wxImage(exePath + "\\..\\data\\images\\control\\rateLimiter.png"), ID_RATELIM);
wrapSizer->Add(rateLimButton, 0, wxALL, 5);
rateLimButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this);
}
diff --git a/Project/Element.cpp b/Project/Element.cpp
index 381be00..0b6202e 100644
--- a/Project/Element.cpp
+++ b/Project/Element.cpp
@@ -227,16 +227,19 @@ bool Element::SetOnline(bool online)
void Element::GeneralMenuItens(wxMenu& menu)
{
+ wxFileName exeFileName(wxStandardPaths::Get().GetExecutablePath());
+ wxString exePath = exeFileName.GetPath();
+
wxMenuItem* clockItem = new wxMenuItem(&menu, ID_ROTATE_CLOCK, _("Rotate clockwise"));
- clockItem->SetBitmap(wxImage("..\\data\\images\\menu\\rotateClock16.png"));
+ clockItem->SetBitmap(wxImage(exePath + "\\..\\data\\images\\menu\\rotateClock16.png"));
menu.Append(clockItem);
wxMenuItem* counterClockItem = new wxMenuItem(&menu, ID_ROTATE_COUNTERCLOCK, _("Rotate counter-clockwise"));
- counterClockItem->SetBitmap(wxImage("..\\data\\images\\menu\\rotateCounterClock16.png"));
+ counterClockItem->SetBitmap(wxImage(exePath + "\\..\\data\\images\\menu\\rotateCounterClock16.png"));
menu.Append(counterClockItem);
wxMenuItem* deleteItem = new wxMenuItem(&menu, ID_DELETE, _("Delete"));
- deleteItem->SetBitmap(wxImage("..\\data\\images\\menu\\delete16.png"));
+ deleteItem->SetBitmap(wxImage(exePath + "\\..\\data\\images\\menu\\delete16.png"));
menu.Append(deleteItem);
}
diff --git a/Project/Element.h b/Project/Element.h
index 08fdfe9..2cd7392 100644
--- a/Project/Element.h
+++ b/Project/Element.h
@@ -5,6 +5,8 @@
#include <wx/geometry.h>
#include <wx/cursor.h>
#include <wx/menu.h>
+#include <wx/stdpaths.h>
+#include <wx/filename.h>
#include <GL/gl.h>
#include <complex>
@@ -85,6 +87,13 @@ protected:
GLdouble rgba[4];
};
+/**
+ * @class Element
+ * @author Thales Lima Oliveira <thales@ufu.br>
+ * @date 19/09/2017
+ * @file Element.h
+ * @brief Base class of all elements of the program. This class is responsible for manage graphical and his data.
+ */
class Element
{
public:
diff --git a/Project/Line.cpp b/Project/Line.cpp
index 1277361..540d844 100644
--- a/Project/Line.cpp
+++ b/Project/Line.cpp
@@ -271,18 +271,21 @@ void Line::MoveNode(Element* parent, wxPoint2DDouble position)
bool Line::GetContextMenu(wxMenu& menu)
{
+ wxFileName exeFileName(wxStandardPaths::Get().GetExecutablePath());
+ wxString exePath = exeFileName.GetPath();
+
menu.Append(ID_EDIT_ELEMENT, _("Edit line"));
if(m_activePickboxID == ID_PB_NONE) {
wxMenuItem* addNodeItem = new wxMenuItem(&menu, ID_LINE_ADD_NODE, _("Insert node"));
- addNodeItem->SetBitmap(wxImage("..\\data\\images\\menu\\addNode16.png"));
+ addNodeItem->SetBitmap(wxImage(exePath + "\\..\\data\\images\\menu\\addNode16.png"));
menu.Append(addNodeItem);
} else {
wxMenuItem* addNodeItem = new wxMenuItem(&menu, ID_LINE_REMOVE_NODE, _("Remove node"));
- addNodeItem->SetBitmap(wxImage("..\\data\\images\\menu\\removeNode16.png"));
+ addNodeItem->SetBitmap(wxImage(exePath + "\\..\\data\\images\\menu\\removeNode16.png"));
menu.Append(addNodeItem);
}
wxMenuItem* deleteItem = new wxMenuItem(&menu, ID_DELETE, _("Delete"));
- deleteItem->SetBitmap(wxImage("..\\data\\images\\menu\\delete16.png"));
+ deleteItem->SetBitmap(wxImage(exePath + "\\..\\data\\images\\menu\\delete16.png"));
menu.Append(deleteItem);
return true;
}
@@ -557,16 +560,16 @@ LineElectricalData Line::GetPUElectricalData(double systemBasePower)
// Zero seq. cap. susceptance
double b0 = data.zeroCapSusceptance;
if(data.useLinePower) data.zeroCapSusceptance = (b0 * lineBaseImpedance) / systemBaseImpedance;
-
+
if(!m_online) {
- data.powerFlow[0] = std::complex<double>(0,0);
- data.powerFlow[1] = std::complex<double>(0,0);
- data.faultCurrent[0][0] = std::complex<double>(0,0);
- data.faultCurrent[0][1] = std::complex<double>(0,0);
- data.faultCurrent[0][2] = std::complex<double>(0,0);
- data.faultCurrent[1][0] = std::complex<double>(0,0);
- data.faultCurrent[1][1] = std::complex<double>(0,0);
- data.faultCurrent[1][2] = std::complex<double>(0,0);
+ data.powerFlow[0] = std::complex<double>(0, 0);
+ data.powerFlow[1] = std::complex<double>(0, 0);
+ data.faultCurrent[0][0] = std::complex<double>(0, 0);
+ data.faultCurrent[0][1] = std::complex<double>(0, 0);
+ data.faultCurrent[0][2] = std::complex<double>(0, 0);
+ data.faultCurrent[1][0] = std::complex<double>(0, 0);
+ data.faultCurrent[1][1] = std::complex<double>(0, 0);
+ data.faultCurrent[1][2] = std::complex<double>(0, 0);
}
return data;
diff --git a/Project/MainFrame.cpp b/Project/MainFrame.cpp
index 9477e13..436f1fd 100644
--- a/Project/MainFrame.cpp
+++ b/Project/MainFrame.cpp
@@ -19,12 +19,34 @@
#include "AboutForm.h"
MainFrame::MainFrame() : MainFrameBase(NULL) {}
-MainFrame::MainFrame(wxWindow* parent, wxLocale* locale, PropertiesData* initProperties) : MainFrameBase(parent)
+MainFrame::MainFrame(wxWindow* parent, wxLocale* locale, PropertiesData* initProperties, wxString openPath)
+ : MainFrameBase(parent)
{
m_locale = locale;
m_generalProperties = initProperties;
Init();
+
+ if(openPath != "") {
+ EnableCurrentProjectRibbon();
+ Workspace* newWorkspace = new Workspace(this, _("Open project"), this->GetStatusBar());
+
+ FileHanding fileHandling(newWorkspace);
+ if(fileHandling.OpenProject(openPath)) {
+ newWorkspace->SetSavedPath(openPath);
+
+ m_workspaceList.push_back(newWorkspace);
+
+ m_ribbonButtonBarContinuous->ToggleButton(ID_RIBBON_DISABLESOL, true);
+ m_ribbonButtonBarContinuous->ToggleButton(ID_RIBBON_ENABLESOL, false);
+
+ m_auiNotebook->AddPage(newWorkspace, newWorkspace->GetName(), true);
+ m_auiNotebook->Layout();
+ newWorkspace->Redraw();
+ newWorkspace->SetJustOpened(true);
+ m_projectNumber++;
+ }
+ }
}
MainFrame::~MainFrame()
diff --git a/Project/MainFrame.h b/Project/MainFrame.h
index 876b57c..2b91b20 100644
--- a/Project/MainFrame.h
+++ b/Project/MainFrame.h
@@ -30,11 +30,32 @@ enum {
ID_ADDMENU_SYNCCOMP
};
+/**
+ * @class MainFrame
+ * @author Thales Lima Oliveira <thales@ufu.br>
+ * @date 19/09/2017
+ * @file MainFrame.h
+ * @brief Main frame of the program. This class manage the ribbon menu and the notebook behavior.
+ */
class MainFrame : public MainFrameBase
{
public:
+ /**
+ * @brief Default constructor.
+ */
+
MainFrame();
- MainFrame(wxWindow* parent, wxLocale* locale, PropertiesData* initProperties);
+ /**
+ * @brief Main frame contructor.
+ * @param parent Parent window.
+ * @param locale Locale settings.
+ * @param initProperties Initial properties.
+ */
+ MainFrame(wxWindow* parent, wxLocale* locale, PropertiesData* initProperties, wxString openPath = "");
+
+ /**
+ * @brief Default destructor.
+ */
~MainFrame();
protected:
@@ -73,7 +94,6 @@ class MainFrame : public MainFrameBase
virtual void OnUndoClick(wxRibbonButtonBarEvent& event);
virtual void OnNewClick(wxRibbonButtonBarEvent& event);
- protected:
std::vector<Workspace*> m_workspaceList;
int m_projectNumber = 1;
diff --git a/Project/Project.mk b/Project/Project.mk
index 40c7916..922d62d 100644
--- a/Project/Project.mk
+++ b/Project/Project.mk
@@ -13,7 +13,7 @@ CurrentFileName :=
CurrentFilePath :=
CurrentFileFullPath :=
User :=NDSE-69
-Date :=18/09/2017
+Date :=19/09/2017
CodeLitePath :="C:/Program Files/CodeLite"
LinkerName :=C:/TDM-GCC-64/bin/g++.exe
SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC
diff --git a/Project/PropertiesForm.cpp b/Project/PropertiesForm.cpp
index d63c659..af7fcc2 100644
--- a/Project/PropertiesForm.cpp
+++ b/Project/PropertiesForm.cpp
@@ -532,7 +532,7 @@ AboutFormBase::AboutFormBase(wxWindow* parent, wxWindowID id, const wxString& ti
flexGridSizer247->Add(m_staticTextVersionLabel, 0, wxALL, WXC_FROM_DIP(5));
- m_staticTextVersion = new wxStaticText(this, wxID_ANY, _("Alpha 2017w37a"), wxDefaultPosition, wxDLG_UNIT(this, wxSize(-1,-1)), 0);
+ m_staticTextVersion = new wxStaticText(this, wxID_ANY, _("Alpha 2017w38b"), wxDefaultPosition, wxDLG_UNIT(this, wxSize(-1,-1)), 0);
flexGridSizer247->Add(m_staticTextVersion, 0, wxALL, WXC_FROM_DIP(5));
diff --git a/Project/PropertiesForm.wxcp b/Project/PropertiesForm.wxcp
index 56284bb..72d0a53 100644
--- a/Project/PropertiesForm.wxcp
+++ b/Project/PropertiesForm.wxcp
@@ -5801,7 +5801,7 @@
}, {
"type": "multi-string",
"m_label": "Label:",
- "m_value": "Alpha 2017w37a"
+ "m_value": "Alpha 2017w38b"
}, {
"type": "string",
"m_label": "Wrap:",
diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp
index ddbf470..70bd345 100644
--- a/Project/Workspace.cpp
+++ b/Project/Workspace.cpp
@@ -725,7 +725,7 @@ void Workspace::OnKeyDown(wxKeyEvent& event)
}
// Tests - Ctrl + Shift + L
if(event.ControlDown() && event.ShiftDown()) {
- UpdateTextElements();
+ // Nothing...
}
} break;
case 'T': // Insert a transformer.
diff --git a/Project/Workspace.h b/Project/Workspace.h
index 5a36106..09b94e5 100644
--- a/Project/Workspace.h
+++ b/Project/Workspace.h
@@ -53,9 +53,17 @@ enum ElementID {
NUM_ELEMENTS
};
+/**
+ * @class Workspace
+ * @author Thales Lima Oliveira <thales@ufu.br>
+ * @date 19/09/2017
+ * @file Workspace.h
+ * @brief This class manages the graphical and power elements. It is responsible for handling the user's interaction
+ * with the elements.
+ */
class Workspace : public WorkspaceBase
{
-public:
+ public:
enum WorkspaceMode {
MODE_EDIT = 0,
MODE_MOVE_ELEMENT,
@@ -81,12 +89,10 @@ public:
std::vector<Element*> GetAllElements() const;
WorkspaceMode GetWorkspaceMode() const { return m_mode; }
Camera* GetCamera() const { return m_camera; }
-
void CopySelection();
bool Paste();
wxFileName GetSavedPath() const { return m_savedPath; }
-
void SetName(wxString name) { m_name = name; }
void SetElementList(std::vector<Element*> elementList);
void SetTextList(std::vector<Text*> textList);
@@ -94,13 +100,12 @@ public:
void SetWorkspaceMode(WorkspaceMode mode) { m_mode = mode; }
void SetSavedPath(wxFileName savedPath) { m_savedPath = savedPath; }
void SetJustOpened(bool justOpened) { m_justOpened = justOpened; }
-
void Redraw() { m_glCanvas->Refresh(); }
void RotateSelectedElements(bool clockwise = true);
void DeleteSelectedElements();
bool GetElementsCorners(wxPoint2DDouble& leftUpCorner,
- wxPoint2DDouble& rightDownCorner,
- std::vector<Element*> elementList);
+ wxPoint2DDouble& rightDownCorner,
+ std::vector<Element*> elementList);
void Fit();
void UnselectAll();
@@ -112,21 +117,17 @@ public:
int GetElementNumber(ElementID elementID) { return m_elementNumber[elementID]; }
void IncrementElementNumber(ElementID elementID) { m_elementNumber[elementID]++; }
-
PropertiesData* GetProperties() const { return m_properties; }
-
std::vector<double> GetStabilityTimeVector() const { return m_stabilityTimeVector; }
-
bool IsContinuousCalculationActive() const { return m_continuousCalc; }
void SetContinuousCalculationActive(bool value = true) { m_continuousCalc = value; }
-
bool RunPowerFlow();
bool RunFault();
bool RunSCPower();
bool RunStaticStudies();
bool RunStability();
-protected:
+ protected:
virtual void OnMiddleDoubleClick(wxMouseEvent& event);
virtual void OnIdle(wxIdleEvent& event);
virtual void OnTimer(wxTimerEvent& event);
@@ -162,14 +163,14 @@ protected:
wxRect2DDouble m_selectionRect;
wxPoint2DDouble m_startSelRect;
-
+
PropertiesData* m_properties = NULL;
-
+
std::vector<double> m_stabilityTimeVector;
-
+
bool m_continuousCalc = false;
bool m_disconnectedElement = false;
bool m_justOpened = false;
};
-#endif // WORKSPACE_H
+#endif // WORKSPACE_H
diff --git a/Project/main.cpp b/Project/main.cpp
index a138a63..de8cac3 100644
--- a/Project/main.cpp
+++ b/Project/main.cpp
@@ -3,6 +3,7 @@
#include <wx/image.h>
#include <wx/stdpaths.h>
#include <wx/textfile.h>
+#include <wx/cmdline.h>
#include "MainFrame.h"
#include "PropertiesData.h"
@@ -15,12 +16,13 @@ class MainApp : public wxApp
virtual ~MainApp() {}
bool LoadInitFile(PropertiesData* propertiesData)
{
- wxTextFile file("config.ini");
+ wxFileName fn(wxStandardPaths::Get().GetExecutablePath());
+ wxTextFile file(fn.GetPath() + "\\config.ini");
auto data = propertiesData->GetGeneralPropertiesData();
if(!file.Create()) {
if(!file.Open()) return false;
-
+
wxString line;
for(line = file.GetFirstLine(); !file.Eof(); line = file.GetNextLine()) {
wxString tag = "";
@@ -53,7 +55,7 @@ class MainApp : public wxApp
}
}
file.Close();
- } else { // Create default init file.
+ } else { // Create default init file.
if(!file.Open()) return false;
// Default parameters.
@@ -95,7 +97,19 @@ class MainApp : public wxApp
wxLocale* locale = new wxLocale();
LoadCatalogs(locale, propertiesData);
- MainFrame* mainFrame = new MainFrame(NULL, locale, propertiesData);
+ wxString openFilePath = "";
+
+ wxCmdLineParser cmdLineParser(wxApp::argc, wxApp::argv);
+ cmdLineParser.AddParam("", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
+ if(cmdLineParser.Parse() == 0) {
+ wxCmdLineArgs args = cmdLineParser.GetArguments();
+ for(auto it = args.begin(), itEnd = args.end(); it != itEnd; ++it) {
+ if(it->GetKind() == wxCMD_LINE_PARAM) {
+ openFilePath = it->GetStrVal();
+ }
+ }
+ }
+ MainFrame* mainFrame = new MainFrame(NULL, locale, propertiesData, openFilePath);
mainFrame->SetIcon(wxICON(aaaaprogicon));
SetTopWindow(mainFrame);
return GetTopWindow()->Show();