Files
create/src/Tools/embedded/wxWidgets/wxWidgetsMain.cpp
2022-03-12 20:12:19 +01:00

239 lines
7.2 KiB
C++

/***************************************************************
* Name: wxWidgetsMain.cpp
* Purpose: Code for Application Frame
* Author: Werner Mayer ()
* Created: 2011-03-12
* Copyright: Werner Mayer ()
* License: LGPL
**************************************************************/
#ifdef WX_PRECOMP
#include "wx_pch.h"
#endif
#ifdef __BORLANDC__
#pragma hdrstop
#endif //__BORLANDC__
#include "wxWidgetsMain.h"
#undef _POSIX_C_SOURCE
#undef _XOPEN_SOURCE
#include <Python.h>
#include <string>
#include <sstream>
#include <vector>
#ifdef __WXGTK__
# include "wx/gtk/win_gtk.h"
#endif
//helper functions
enum wxbuildinfoformat {
short_f, long_f };
wxString wxbuildinfo(wxbuildinfoformat format)
{
wxString wxbuild(wxVERSION_STRING);
if (format == long_f )
{
#if defined(__WXMSW__)
wxbuild << _T("-Windows");
#elif defined(__WXMAC__)
wxbuild << _T("-Mac");
#elif defined(__UNIX__)
wxbuild << _T("-Linux");
#endif
#if wxUSE_UNICODE
wxbuild << _T("-Unicode build");
#else
wxbuild << _T("-ANSI build");
#endif // wxUSE_UNICODE
}
return wxbuild;
}
BEGIN_EVENT_TABLE(wxWidgetsFrame, wxFrame)
EVT_CLOSE(wxWidgetsFrame::OnClose)
EVT_MENU(idMenuQuit, wxWidgetsFrame::OnQuit)
EVT_MENU(idMenuLoad, wxWidgetsFrame::OnLoad)
EVT_MENU(idMenuNewDocument, wxWidgetsFrame::OnNewDocument)
EVT_MENU(idMenuEmbed, wxWidgetsFrame::OnEmbed)
EVT_MENU(idMenuAbout, wxWidgetsFrame::OnAbout)
END_EVENT_TABLE()
wxWidgetsFrame::wxWidgetsFrame(wxFrame *frame, const wxString& title)
: wxFrame(frame, -1, title)
{
if (!Py_IsInitialized()) {
static std::vector<char*> argv;
argv.push_back((char*)"wxwidgetsDialog");
static int argc = 1;
Py_SetProgramName(argv[0]);
Py_Initialize();
PySys_SetArgv(argc, &(argv[0]));
}
#if wxUSE_MENUS
// create a menu bar
wxMenuBar* mbar = new wxMenuBar();
wxMenu* fileMenu = new wxMenu(_T(""));
fileMenu->Append(idMenuQuit, _("&Quit\tAlt-F4"), _("Quit the application"));
mbar->Append(fileMenu, _("&File"));
wxMenu* freecadMenu = new wxMenu(_T(""));
freecadMenu->Append(idMenuLoad, _("Load"), _("Load FreeCAD module"));
freecadMenu->Append(idMenuNewDocument, _("New document"), _("Create new document in the FreeCAD module"));
freecadMenu->Append(idMenuEmbed, _("Embed"), _("Embed FreeCAD as child window"));
mbar->Append(freecadMenu, _("FreeCAD"));
freecadMenu->Enable(idMenuLoad, true);
freecadMenu->Enable(idMenuNewDocument, false);
freecadMenu->Enable(idMenuEmbed, false);
wxMenu* helpMenu = new wxMenu(_T(""));
helpMenu->Append(idMenuAbout, _("&About\tF1"), _("Show info about this application"));
mbar->Append(helpMenu, _("&Help"));
SetMenuBar(mbar);
#endif // wxUSE_MENUS
#if wxUSE_STATUSBAR
// create a status bar with some information about the used wxWidgets version
CreateStatusBar(2);
SetStatusText(_("Hello Code::Blocks user!"),0);
SetStatusText(wxbuildinfo(short_f), 1);
#endif // wxUSE_STATUSBAR
}
wxWidgetsFrame::~wxWidgetsFrame()
{
}
void wxWidgetsFrame::OnClose(wxCloseEvent &event)
{
Destroy();
}
void wxWidgetsFrame::OnQuit(wxCommandEvent &event)
{
Destroy();
}
void wxWidgetsFrame::OnLoad(wxCommandEvent &event)
{
const wxString& dir = wxDirSelector("FreeCAD module path");
std::string path = dir.ToAscii();
if (!path.empty()) {
for (std::string::iterator it = path.begin(); it != path.end(); ++it) {
if (*it == '\\')
*it = '/';
}
PyObject* main = PyImport_AddModule("__main__");
PyObject* dict = PyModule_GetDict(main);
std::stringstream cmd;
cmd << "import sys,os\n"
<< "sys.path.append(\"" << path << "\")\n"
<< "os.chdir(\"" << path << "\")\n"
<< "import FreeCADGui\n"
<< "FreeCADGui.showMainWindow()\n";
PyObject* result = PyRun_String(cmd.str().c_str(), Py_file_input, dict, dict);
if (result) {
Py_DECREF(result);
wxMenuBar* mbar = GetMenuBar();
wxMenu* menu = mbar->GetMenu(1);
menu->Enable(idMenuLoad, false);
menu->Enable(idMenuNewDocument, true);
menu->Enable(idMenuEmbed, true);
}
else {
PyObject *ptype, *pvalue, *ptrace;
PyErr_Fetch(&ptype, &pvalue, &ptrace);
PyObject* pystring = PyObject_Str(pvalue);
const char* error = PyString_AsString(pystring);
wxString msg = wxString::FromAscii(error);
wxMessageBox(msg, _("Error"));
Py_DECREF(pystring);
}
Py_DECREF(dict);
}
}
void wxWidgetsFrame::OnNewDocument(wxCommandEvent &event)
{
PyObject* main = PyImport_AddModule("__main__");
PyObject* dict = PyModule_GetDict(main);
const char* cmd =
"FreeCAD.newDocument()\n";
PyObject* result = PyRun_String(cmd, Py_file_input, dict, dict);
if (result) {
Py_DECREF(result);
}
else {
PyObject *ptype, *pvalue, *ptrace;
PyErr_Fetch(&ptype, &pvalue, &ptrace);
PyObject* pystring = PyObject_Str(pvalue);
const char* error = PyString_AsString(pystring);
wxString msg = wxString::FromAscii(error);
wxMessageBox(msg, _("Error"));
Py_DECREF(pystring);
}
Py_DECREF(dict);
}
void wxWidgetsFrame::OnEmbed(wxCommandEvent &event)
{
void* hwnd = 0;
#if defined (_WIN32)
hwnd = this->GetHWND();
#elif defined(__WXGTK__)
//http://old.nabble.com/wxWindow-and-x11-td2853615.html
//GdkWindow *window = GTK_PIZZA()->bin_window;
//GDK_WINDOW_XWINDOW( window );
//hwnd = window;
#endif
PyObject* main = PyImport_AddModule("__main__");
PyObject* dict = PyModule_GetDict(main);
std::stringstream cmd;
cmd << "class BlankWorkbench (Workbench):\n"
<< " MenuText = \"Blank\"\n"
<< " ToolTip = \"Blank workbench\"\n"
<< "\n"
<< " def Initialize(self):\n"
<< " return\n"
<< " def GetClassName(self):\n"
<< " return \"Gui::BlankWorkbench\"\n"
<< "\n"
<< "FreeCADGui.addWorkbench(BlankWorkbench)\n"
<< "FreeCADGui.activateWorkbench(\"BlankWorkbench\")\n"
<< "FreeCADGui.embedToWindow(\"" << hwnd << "\")\n"
<< "\n";
PyObject* result = PyRun_String(cmd.str().c_str(), Py_file_input, dict, dict);
if (result) {
Py_DECREF(result);
wxMenuBar* mbar = GetMenuBar();
wxMenu* menu = mbar->GetMenu(1);
menu->Enable(idMenuEmbed, true);
}
else {
PyObject *ptype, *pvalue, *ptrace;
PyErr_Fetch(&ptype, &pvalue, &ptrace);
PyObject* pystring = PyObject_Str(pvalue);
const char* error = PyString_AsString(pystring);
wxString msg = wxString::FromAscii(error);
wxMessageBox(msg, _("Error"));
Py_DECREF(pystring);
}
Py_DECREF(dict);
}
void wxWidgetsFrame::OnAbout(wxCommandEvent &event)
{
wxString msg = wxbuildinfo(long_f);
wxMessageBox(msg, _("Welcome to..."));
}