plugins/svgui/svgui.py
changeset 203 cb9901076a21
parent 201 520d2416ff4d
child 229 8bc65076e290
--- a/plugins/svgui/svgui.py	Tue Aug 12 16:27:07 2008 +0200
+++ b/plugins/svgui/svgui.py	Wed Aug 20 00:11:40 2008 +0200
@@ -116,9 +116,6 @@
             self.CreateNewInterface()
             self.SetFilePath(filepath)
 
-    def IsGUIPlugin(self):
-        return True
-
     def GetElementIdFromName(self, name):
         element = self.GetElementByName(name)
         if element is not None:
@@ -126,7 +123,7 @@
         return None
 
     _View = None
-    def _OpenView(self, logger):
+    def _OpenView(self):
         if not self._View:
             def _onclose():
                 self._View = None
@@ -137,7 +134,7 @@
             self._View._onsave = _onsave
             self._View.Show()
 
-    def _ImportSVG(self, logger):
+    def _ImportSVG(self):
         if not self._View:
             dialog = wx.FileDialog(self.GetPlugRoot().AppFrame, "Choose a SVG file", os.getcwd(), "",  "SVG files (*.svg)|*.svg|All files|*.*", wx.OPEN)
             if dialog.ShowModal() == wx.ID_OK:
@@ -145,10 +142,10 @@
                 if os.path.isfile(svgpath):
                     shutil.copy(svgpath, os.path.join(self.PlugPath(), "gui.svg"))
                 else:
-                    logger.write_error("No such SVG file: %s\n"%svgpath)
+                    self.logger.write_error("No such SVG file: %s\n"%svgpath)
             dialog.Destroy()
 
-    def _ImportXML(self, logger):
+    def _ImportXML(self):
         if not self._View:
             dialog = wx.FileDialog(self.GetPlugRoot().AppFrame, "Choose a XML file", os.getcwd(), "",  "XML files (*.xml)|*.xml|All files|*.*", wx.OPEN)
             if dialog.ShowModal() == wx.ID_OK:
@@ -156,7 +153,7 @@
                 if os.path.isfile(xmlpath):
                     shutil.copy(xmlpath, os.path.join(self.PlugPath(), "gui.xml"))
                 else:
-                    logger.write_error("No such XML file: %s\n"%xmlpath)
+                    self.logger.write_error("No such XML file: %s\n"%xmlpath)
             dialog.Destroy()
 
     PluginMethods = [
@@ -178,7 +175,7 @@
         self.SaveXMLFile(os.path.join(self.PlugPath(), "gui.xml"))
         return True
     
-    def PlugGenerate_C(self, buildpath, locations, logger):
+    def PlugGenerate_C(self, buildpath, locations):
         progname = "SVGUI_%s"%"_".join(map(str, self.GetCurrentLocation()))
         
         doc = SVGDocument(self.GetSVGFilePath())
@@ -186,10 +183,15 @@
         window_size = (int(float(root_element.GetAttribute("width"))),
                        int(float(root_element.GetAttribute("height"))))
 
-        svgfilepath = self.GetSVGFilePath()
-        xmlfilepath = self.GetFilePath()
-        shutil.copy(svgfilepath, buildpath)
-        shutil.copy(xmlfilepath, buildpath)
+#        svgfilepath = self.GetSVGFilePath()
+#        xmlfilepath = self.GetFilePath()
+#        shutil.copy(svgfilepath, buildpath)
+#        shutil.copy(xmlfilepath, buildpath)
+        
+        SVGFilePath = self.GetSVGFilePath()
+        SVGFileBaseName = os.path.split(SVGFilePath)[1]
+        FilePath = self.GetFilePath()
+        FileBaseName = os.path.split(FilePath)[1]
         
         generator = _SVGUICGenerator(self, self.GetElementsByType(), 
                                      os.path.split(self.GetSVGFilePath())[1], 
@@ -202,17 +204,17 @@
             cxx_flags = "-I..\\..\\wxPython-src-2.8.7.1\\bld\\lib\\wx\\include\\msw-unicode-release-2.8 -I..\\..\\wxPython-src-2.8.7.1\\include -I..\\..\\wxPython-src-2.8.7.1\\contrib\\include -I..\\..\\matiec\\lib -DWXUSINGDLL -D__WXMSW__ -mthreads"
             libs = "\"..\\lib\\libwxsvg.a\" \"..\\lib\\libwxsvg_agg.a\" \"..\\lib\\libagg.a\" \"..\\lib\\libaggplatformwin32.a\" \"..\\lib\\libaggfontwin32tt.a\" -L..\\..\\wxPython-src-2.8.7.1\\bld\\lib -mno-cygwin -mwindows -mthreads  -mno-cygwin -mwindows -Wl,--subsystem,windows -mwindows -lwx_mswu_richtext-2.8 -lwx_mswu_aui-2.8 -lwx_mswu_xrc-2.8 -lwx_mswu_qa-2.8 -lwx_mswu_html-2.8 -lwx_mswu_adv-2.8 -lwx_mswu_core-2.8 -lwx_baseu_xml-2.8 -lwx_baseu_net-2.8 -lwx_baseu-2.8"
         else:
-            status, result, err_result = ProcessLogger(logger, "wx-config --cxxflags", no_stdout=True).spin()
+            status, result, err_result = ProcessLogger(self.logger, "wx-config --cxxflags", no_stdout=True).spin()
             if status:
-                logger.write_error("Unable to get wx cxxflags\n")
+                self.logger.write_error("Unable to get wx cxxflags\n")
             cxx_flags = result.strip() + " -I../matiec/lib"
             
-            status, result, err_result = ProcessLogger(logger, "wx-config --libs", no_stdout=True).spin()
+            status, result, err_result = ProcessLogger(self.logger, "wx-config --libs", no_stdout=True).spin()
             if status:
-                logger.write_error("Unable to get wx libs\n")
+                self.logger.write_error("Unable to get wx libs\n")
             libs = result.strip() + " -lwxsvg"
         
-        return [(Gen_C_file, cxx_flags)],libs,True
+        return [(Gen_C_file, cxx_flags)],libs,True,(SVGFileBaseName, file(SVGFilePath, "rb")), (FileBaseName, file(FilePath, "rb"))
     
     def BlockTypesFactory(self):
         
@@ -330,7 +332,8 @@
         self.Controler = controler
 
     def GenerateProgramHeadersPublicVars(self):
-        text = """    void OnPlcOutEvent(wxEvent& event);
+        text = """
+    void OnPlcOutEvent(wxEvent& event);
 
     void Retrieve();
     void Publish();
@@ -382,7 +385,6 @@
         text += self.GenerateIECVars()
         
         text += """IMPLEMENT_APP_NO_MAIN(SVGViewApp);
-IMPLEMENT_WX_THEME_SUPPORT;
 SVGViewApp *myapp = NULL;
 wxSemaphore MyInitSem;
 
@@ -412,12 +414,14 @@
 THREAD_RETURN_TYPE InitWxEntry(void* args)
 {
   wxEntry(myargc,myargv);
+  MyInitSem.Post();
   return 0;
 }
 
 """
 
-        text += """bool SVGViewApp::OnInit()
+        text += """
+bool SVGViewApp::OnInit()
 {
   #ifndef __WXMSW__
     setlocale(LC_NUMERIC, "C");
@@ -448,6 +452,12 @@
 
 void __cleanup_%(location)s()
 {
+  if(myapp){
+      wxCloseEvent event(wxEVT_CLOSE_WINDOW);
+      myapp->frame->AddPendingEvent(event);
+      myapp = NULL;
+  }
+  MyInitSem.Wait();
 }
 
 void __retrieve_%(location)s()
@@ -506,9 +516,8 @@
     def GenerateProgramInitFrame(self):
         text = """MainFrame::MainFrame(wxWindow *parent, const wxString& title, const wxPoint& pos,const wxSize& size, long style): wxFrame(parent, wxID_ANY, title, pos, size, style)
 {
-  wxFileName apppath(wxTheApp->argv[0]);
-  wxFileName svgfilepath(apppath.GetPath(), wxT("%s"));
-  wxFileName xmlfilepath(apppath.GetPath(), wxT("%s"));
+  wxFileName svgfilepath(wxTheApp->argv[1], wxT("%s"));
+  wxFileName xmlfilepath(wxTheApp->argv[1], wxT("%s"));
 
   m_svgCtrl = new Program(this);
   if (m_svgCtrl->LoadFiles(svgfilepath.GetFullPath(), xmlfilepath.GetFullPath()))
@@ -522,8 +531,7 @@
   }
   else
   {
-    printf("Error while opening files\\n");
-    exit(0);
+    printf("Error while opening SVGUI files\\n");
   }
 }
 
@@ -545,13 +553,19 @@
         current_location = "_".join(map(str, self.CurrentLocation))
         for element in self.Elements:
             element_type = GetElementType(element)
-            element_lock = """  if (COMPARE_AND_SWAP_VAL(&in_state_%d, CHANGED, GUI_BUSY) == CHANGED ||
+            element_lock = """
+  if (COMPARE_AND_SWAP_VAL(&in_state_%d, CHANGED, GUI_BUSY) == CHANGED ||
       COMPARE_AND_SWAP_VAL(&in_state_%d, UNCHANGED, GUI_BUSY) == UNCHANGED) {
 """%(element.getid(), element.getid())
-            element_unlock = """    COMPARE_AND_SWAP_VAL(&in_state_%d, GUI_BUSY, CHANGED);
+            element_unlock = """
+    COMPARE_AND_SWAP_VAL(&in_state_%d, GUI_BUSY, CHANGED);
+    event.Skip();
+  }else{
+      /* re post event for idle */
+      AddPendingEvent(event);
   }
-  else
-      ProcessEvent(event);
+}
+
 """%element.getid()
             element_name = element.getname()
                 
@@ -562,7 +576,6 @@
                 text += element_lock
                 text += "    _copy__IX%s_%d_1 = button->GetToggle();\n"%(current_location, element.getid())
                 text += element_unlock
-                text += "  event.Skip();\n}\n\n"
             elif element_type == ITEM_ROTATING:
                 text += """void Program::On%sChanging(wxScrollEvent& event)
 {
@@ -571,7 +584,6 @@
                 text += element_lock
                 text += "    _copy__ID%s_%d_1 = rotating->GetAngle();\n"%(current_location, element.getid())
                 text += element_unlock
-                text += "  event.Skip();\n}\n\n"
             elif element_type == ITEM_NOTEBOOK:
                 text += """void Program::On%sTabChanged(wxNotebookEvent& event)
 {
@@ -580,7 +592,6 @@
                 text += element_lock
                 text += "    _copy__IB%s_%d_1 = notebook->GetCurrentPage();\n"%(current_location, element.getid())
                 text += element_unlock
-                text += "  event.Skip();\n}\n\n"
             elif element_type == ITEM_TRANSFORM:
                 text += """void Program::On%sChanging(wxScrollEvent& event)
 {
@@ -590,7 +601,6 @@
                 text += "    _copy__ID%s_%d_1 = transform->GetX();\n"%(current_location, element.getid())
                 text += "    _copy__ID%s_%d_2 = transform->GetY();\n"%(current_location, element.getid())
                 text += element_unlock
-                text += "  event.Skip();\n}\n\n"
         
         text += "/* OnPlcOutEvent update GUI with provided IEC __Q* PLC output variables */\n"
         text += """void Program::OnPlcOutEvent(wxEvent& event)
@@ -599,7 +609,7 @@
   
   refreshing = true;
 
-  wxMutexGuiEnter();
+
 """
         for element in self.Elements:
             element_type = GetElementType(element)
@@ -659,7 +669,7 @@
 """%texts
             text += "    COMPARE_AND_SWAP_VAL(&out_state_%(id)d, GUI_BUSY, UNCHANGED);\n  }\n"%texts
             
-        text += """  wxMutexGuiLeave();
+        text += """
 
   refreshing = false;
 
@@ -716,7 +726,7 @@
         text += """  /* Replace this with determinist signal if called from RT */
   if (refresh && !refreshing) {
     wxCommandEvent event( EVT_PLC );
-    ProcessEvent(event);
+    AddPendingEvent(event);
     refresh = false;
   }
 };