changeset 391 | 07447ee3538e |
parent 390 | 020420ad8914 |
child 396 | 9089bc4a92e5 |
child 413 | 127d524a5f1d |
390:020420ad8914 | 391:07447ee3538e |
---|---|
29 import wx.aui |
29 import wx.aui |
30 USE_AUI = True |
30 USE_AUI = True |
31 else: |
31 else: |
32 USE_AUI = False |
32 USE_AUI = False |
33 |
33 |
34 import os, re, platform, sys, time, traceback, getopt |
|
35 import cPickle |
|
36 |
|
37 CWD = os.path.split(os.path.realpath(__file__))[0] |
|
38 base_folder = os.path.split(CWD)[0] |
|
39 sys.path.append(base_folder) |
|
40 from docutils import * |
|
41 |
|
42 from types import TupleType |
|
43 |
|
44 __version__ = "$Revision: 1.130 $" |
|
45 |
|
46 if __name__ == '__main__': |
|
47 # Usage message displayed when help request or when error detected in |
|
48 # command line |
|
49 def usage(): |
|
50 print "\nUsage of PLCOpenEditor.py :" |
|
51 print "\n %s [Filepath]\n"%sys.argv[0] |
|
52 |
|
53 # Parse options given to PLCOpenEditor in command line |
|
54 try: |
|
55 opts, args = getopt.getopt(sys.argv[1:], "h", ["help"]) |
|
56 except getopt.GetoptError: |
|
57 # print help information and exit: |
|
58 usage() |
|
59 sys.exit(2) |
|
60 |
|
61 # Extract if help has been requested |
|
62 for o, a in opts: |
|
63 if o in ("-h", "--help"): |
|
64 usage() |
|
65 sys.exit() |
|
66 |
|
67 # Extract the optional filename to open |
|
68 fileOpen = None |
|
69 if len(args) > 1: |
|
70 usage() |
|
71 sys.exit() |
|
72 elif len(args) == 1: |
|
73 fileOpen = args[0] |
|
74 |
|
75 # Create wxApp (Need to create App before internationalization because of |
|
76 # Windows) |
|
77 app = wx.PySimpleApp() |
|
78 |
|
79 # Import module for internationalization |
|
80 import gettext |
|
81 import __builtin__ |
|
82 |
|
83 # Get folder containing translation files |
|
84 localedir = os.path.join(CWD,"locale") |
|
85 # Get the default language |
|
86 langid = wx.LANGUAGE_DEFAULT |
|
87 # Define translation domain (name of translation files) |
|
88 domain = "PLCOpenEditor" |
|
89 |
|
90 # Define locale for wx |
|
91 loc = __builtin__.__dict__.get('loc', None) |
|
92 if loc is None: |
|
93 loc = wx.Locale(langid) |
|
94 __builtin__.__dict__['loc'] = loc |
|
95 # Define location for searching translation files |
|
96 loc.AddCatalogLookupPathPrefix(localedir) |
|
97 # Define locale domain |
|
98 loc.AddCatalog(domain) |
|
99 |
|
100 if __name__ == '__main__': |
|
101 __builtin__.__dict__['_'] = wx.GetTranslation |
|
102 |
|
34 from SFCViewer import * |
103 from SFCViewer import * |
35 from LDViewer import * |
104 from LDViewer import * |
36 from Viewer import * |
105 from Viewer import * |
37 from TextViewer import * |
106 from TextViewer import * |
38 from GraphicViewer import * |
107 from GraphicViewer import * |
39 from RessourceEditor import * |
108 from RessourceEditor import * |
40 from DataTypeEditor import * |
109 from DataTypeEditor import * |
41 from PLCControler import * |
110 from PLCControler import * |
42 from plcopen.structures import LOCATIONDATATYPES |
111 from plcopen.structures import LOCATIONDATATYPES |
43 |
112 |
44 import os, re, platform, sys, time, traceback, getopt |
113 # Define PLCOpenEditor controls id |
45 |
|
46 base_folder = os.path.split(sys.path[0])[0] |
|
47 sys.path.append(base_folder) |
|
48 from docutils import * |
|
49 |
|
50 from types import TupleType |
|
51 |
|
52 __version__ = "$Revision$" |
|
53 |
|
54 CWD = os.path.split(os.path.realpath(__file__))[0] |
|
55 |
|
56 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORTREENOTEBOOK, |
114 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORTREENOTEBOOK, |
57 ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, |
115 ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, |
58 ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, |
116 ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, |
59 ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, |
117 ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, |
60 ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, |
118 ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, |
100 # - Item icon filename |
158 # - Item icon filename |
101 # - Item tooltip text |
159 # - Item tooltip text |
102 ToolBarItems = { |
160 ToolBarItems = { |
103 "FBD" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
161 "FBD" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
104 ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", |
162 ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", |
105 "add_comment.png", "Create a new comment"), |
163 "add_comment.png", _("Create a new comment")), |
106 (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
164 (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
107 ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", |
165 ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", |
108 "add_variable.png", "Create a new variable"), |
166 "add_variable.png", _("Create a new variable")), |
109 (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
167 (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
110 ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", |
168 ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", |
111 "add_block.png", "Create a new block"), |
169 "add_block.png", _("Create a new block")), |
112 (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
170 (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
113 ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", |
171 ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", |
114 "add_connection.png", "Create a new connection")], |
172 "add_connection.png", _("Create a new connection"))], |
115 "LD" : [(True, FREEDRAWING_MODE, |
173 "LD" : [(True, FREEDRAWING_MODE, |
116 ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", |
174 ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", |
117 "add_comment.png", "Create a new comment"), |
175 "add_comment.png", _("Create a new comment")), |
118 (True, FREEDRAWING_MODE, |
176 (True, FREEDRAWING_MODE, |
119 ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", |
177 ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", |
120 "add_powerrail.png", "Create a new power rail"), |
178 "add_powerrail.png", _("Create a new power rail")), |
121 (False, DRIVENDRAWING_MODE, |
179 (False, DRIVENDRAWING_MODE, |
122 ID_PLCOPENEDITORTOOLBARRUNG, "OnRungTool", |
180 ID_PLCOPENEDITORTOOLBARRUNG, "OnRungTool", |
123 "add_rung.png", "Create a new rung"), |
181 "add_rung.png", _("Create a new rung")), |
124 (True, FREEDRAWING_MODE, |
182 (True, FREEDRAWING_MODE, |
125 ID_PLCOPENEDITORTOOLBARCOIL, "OnCoilTool", |
183 ID_PLCOPENEDITORTOOLBARCOIL, "OnCoilTool", |
126 "add_coil.png", "Create a new coil"), |
184 "add_coil.png", _("Create a new coil")), |
127 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
185 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
128 ID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", |
186 ID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", |
129 "add_contact.png", "Create a new contact"), |
187 "add_contact.png", _("Create a new contact")), |
130 (False, DRIVENDRAWING_MODE, |
188 (False, DRIVENDRAWING_MODE, |
131 ID_PLCOPENEDITORTOOLBARBRANCH, "OnBranchTool", |
189 ID_PLCOPENEDITORTOOLBARBRANCH, "OnBranchTool", |
132 "add_branch.png", "Create a new branch"), |
190 "add_branch.png", _("Create a new branch")), |
133 (True, FREEDRAWING_MODE, |
191 (True, FREEDRAWING_MODE, |
134 ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", |
192 ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", |
135 "add_variable.png", "Create a new variable"), |
193 "add_variable.png", _("Create a new variable")), |
136 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
194 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
137 ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", |
195 ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", |
138 "add_block.png", "Create a new block"), |
196 "add_block.png", _("Create a new block")), |
139 (True, FREEDRAWING_MODE, |
197 (True, FREEDRAWING_MODE, |
140 ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", |
198 ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", |
141 "add_connection.png", "Create a new connection")], |
199 "add_connection.png", _("Create a new connection"))], |
142 "SFC" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
200 "SFC" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
143 ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", |
201 ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", |
144 "add_comment.png", "Create a new comment"), |
202 "add_comment.png", _("Create a new comment")), |
145 (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
203 (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
146 ID_PLCOPENEDITORTOOLBARINITIALSTEP, "OnInitialStepTool", |
204 ID_PLCOPENEDITORTOOLBARINITIALSTEP, "OnInitialStepTool", |
147 "add_initial_step.png", "Create a new initial step"), |
205 "add_initial_step.png", _("Create a new initial step")), |
148 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
206 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
149 ID_PLCOPENEDITORTOOLBARSTEP, "OnStepTool", |
207 ID_PLCOPENEDITORTOOLBARSTEP, "OnStepTool", |
150 "add_step.png", "Create a new step"), |
208 "add_step.png", _("Create a new step")), |
151 (True, FREEDRAWING_MODE, |
209 (True, FREEDRAWING_MODE, |
152 ID_PLCOPENEDITORTOOLBARTRANSITION, "OnTransitionTool", |
210 ID_PLCOPENEDITORTOOLBARTRANSITION, "OnTransitionTool", |
153 "add_transition.png", "Create a new transition"), |
211 "add_transition.png", _("Create a new transition")), |
154 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
212 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
155 ID_PLCOPENEDITORTOOLBARACTIONBLOCK, "OnActionBlockTool", |
213 ID_PLCOPENEDITORTOOLBARACTIONBLOCK, "OnActionBlockTool", |
156 "add_action.png", "Create a new action block"), |
214 "add_action.png", _("Create a new action block")), |
157 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
215 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
158 ID_PLCOPENEDITORTOOLBARDIVERGENCE, "OnDivergenceTool", |
216 ID_PLCOPENEDITORTOOLBARDIVERGENCE, "OnDivergenceTool", |
159 "add_divergence.png", "Create a new divergence"), |
217 "add_divergence.png", _("Create a new divergence")), |
160 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
218 (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, |
161 ID_PLCOPENEDITORTOOLBARJUMP, "OnJumpTool", |
219 ID_PLCOPENEDITORTOOLBARJUMP, "OnJumpTool", |
162 "add_jump.png", "Create a new jump"), |
220 "add_jump.png", _("Create a new jump")), |
163 (True, FREEDRAWING_MODE, |
221 (True, FREEDRAWING_MODE, |
164 ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", |
222 ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", |
165 "add_variable.png", "Create a new variable"), |
223 "add_variable.png", _("Create a new variable")), |
166 (True, FREEDRAWING_MODE, |
224 (True, FREEDRAWING_MODE, |
167 ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", |
225 ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", |
168 "add_block.png", "Create a new block"), |
226 "add_block.png", _("Create a new block")), |
169 (True, FREEDRAWING_MODE, |
227 (True, FREEDRAWING_MODE, |
170 ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", |
228 ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", |
171 "add_connection.png", "Create a new connection"), |
229 "add_connection.png", _("Create a new connection")), |
172 (True, FREEDRAWING_MODE, |
230 (True, FREEDRAWING_MODE, |
173 ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", |
231 ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", |
174 "add_powerrail.png", "Create a new power rail"), |
232 "add_powerrail.png", _("Create a new power rail")), |
175 (True, FREEDRAWING_MODE, |
233 (True, FREEDRAWING_MODE, |
176 ID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", |
234 ID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", |
177 "add_contact.png", "Create a new contact")], |
235 "add_contact.png", _("Create a new contact"))], |
178 "ST" : [], |
236 "ST" : [], |
179 "IL" : [] |
237 "IL" : [] |
180 } |
238 } |
181 |
239 |
182 #------------------------------------------------------------------------------- |
240 #------------------------------------------------------------------------------- |
220 parent_name = GetParentName(self.TypesTree, selected, parent_type) |
278 parent_name = GetParentName(self.TypesTree, selected, parent_type) |
221 remove_function(self.Controler, parent_name, name) |
279 remove_function(self.Controler, parent_name, name) |
222 else: |
280 else: |
223 remove_function(self.Controler, name) |
281 remove_function(self.Controler, name) |
224 else: |
282 else: |
225 self.ShowErrorMessage("\"%s\" is used by one or more POUs. It can't be removed!"%name) |
283 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name) |
226 return DeleteElementFunction |
284 return DeleteElementFunction |
227 |
285 |
228 #------------------------------------------------------------------------------- |
286 #------------------------------------------------------------------------------- |
229 # PLCOpenEditor Main Class |
287 # PLCOpenEditor Main Class |
230 #------------------------------------------------------------------------------- |
288 #------------------------------------------------------------------------------- |
289 |
|
290 UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES]) |
|
231 |
291 |
232 class PLCOpenEditor(wx.Frame): |
292 class PLCOpenEditor(wx.Frame): |
233 |
293 |
234 # Compatibility function for wx versions < 2.6 |
294 # Compatibility function for wx versions < 2.6 |
235 if wx.VERSION < (2, 6, 0): |
295 if wx.VERSION < (2, 6, 0): |
238 event(self, id, function) |
298 event(self, id, function) |
239 else: |
299 else: |
240 event(self, function) |
300 event(self, function) |
241 |
301 |
242 def _init_coll_MenuBar_Menus(self, parent): |
302 def _init_coll_MenuBar_Menus(self, parent): |
243 parent.Append(menu=self.FileMenu, title=u'File') |
303 parent.Append(menu=self.FileMenu, title=_(u'File')) |
244 if not self.Debug: |
304 if not self.Debug: |
245 parent.Append(menu=self.EditMenu, title=u'Edit') |
305 parent.Append(menu=self.EditMenu, title=_(u'Edit')) |
246 parent.Append(menu=self.DisplayMenu, title=u'Display') |
306 parent.Append(menu=self.DisplayMenu, title=_(u'Display')) |
247 parent.Append(menu=self.HelpMenu, title=u'Help') |
307 parent.Append(menu=self.HelpMenu, title=_(u'Help')) |
248 |
308 |
249 def _init_coll_FileMenu_Items(self, parent): |
309 def _init_coll_FileMenu_Items(self, parent): |
250 if self.ModeSolo: |
310 if self.ModeSolo: |
251 AppendMenu(parent, help='', id=wx.ID_NEW, |
311 AppendMenu(parent, help='', id=wx.ID_NEW, |
252 kind=wx.ITEM_NORMAL, text=u'New\tCTRL+N') |
312 kind=wx.ITEM_NORMAL, text=_(u'New\tCTRL+N')) |
253 AppendMenu(parent, help='', id=wx.ID_OPEN, |
313 AppendMenu(parent, help='', id=wx.ID_OPEN, |
254 kind=wx.ITEM_NORMAL, text=u'Open\tCTRL+O') |
314 kind=wx.ITEM_NORMAL, text=_(u'Open\tCTRL+O')) |
255 AppendMenu(parent, help='', id=wx.ID_CLOSE, |
315 AppendMenu(parent, help='', id=wx.ID_CLOSE, |
256 kind=wx.ITEM_NORMAL, text=u'Close Tab\tCTRL+W') |
316 kind=wx.ITEM_NORMAL, text=_(u'Close Tab\tCTRL+W')) |
257 if self.ModeSolo: |
317 if self.ModeSolo: |
258 AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL, |
318 AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL, |
259 kind=wx.ITEM_NORMAL, text=u'Close Project') |
319 kind=wx.ITEM_NORMAL, text=_(u'Close Project')) |
260 parent.AppendSeparator() |
320 parent.AppendSeparator() |
261 if not self.Debug: |
321 if not self.Debug: |
262 AppendMenu(parent, help='', id=wx.ID_SAVE, |
322 AppendMenu(parent, help='', id=wx.ID_SAVE, |
263 kind=wx.ITEM_NORMAL, text=u'Save\tCTRL+S') |
323 kind=wx.ITEM_NORMAL, text=_(u'Save\tCTRL+S')) |
264 if self.ModeSolo: |
324 if self.ModeSolo: |
265 AppendMenu(parent, help='', id=wx.ID_SAVEAS, |
325 AppendMenu(parent, help='', id=wx.ID_SAVEAS, |
266 kind=wx.ITEM_NORMAL, text=u'Save As...\tCTRL+SHIFT+S') |
326 kind=wx.ITEM_NORMAL, text=_(u'Save As...\tCTRL+SHIFT+S')) |
267 AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE, |
327 AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE, |
268 kind=wx.ITEM_NORMAL, text=u'Generate Program\tCTRL+G') |
328 kind=wx.ITEM_NORMAL, text=_(u'Generate Program\tCTRL+G')) |
269 parent.AppendSeparator() |
329 parent.AppendSeparator() |
270 AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP, |
330 AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP, |
271 kind=wx.ITEM_NORMAL, text=u'Page Setup') |
331 kind=wx.ITEM_NORMAL, text=_(u'Page Setup')) |
272 AppendMenu(parent, help='', id=wx.ID_PREVIEW, |
332 AppendMenu(parent, help='', id=wx.ID_PREVIEW, |
273 kind=wx.ITEM_NORMAL, text=u'Preview') |
333 kind=wx.ITEM_NORMAL, text=_(u'Preview')) |
274 AppendMenu(parent, help='', id=wx.ID_PRINT, |
334 AppendMenu(parent, help='', id=wx.ID_PRINT, |
275 kind=wx.ITEM_NORMAL, text=u'Print') |
335 kind=wx.ITEM_NORMAL, text=_(u'Print')) |
276 if not self.Debug: |
336 if not self.Debug: |
277 parent.AppendSeparator() |
337 parent.AppendSeparator() |
278 AppendMenu(parent, help='', id=wx.ID_PROPERTIES, |
338 AppendMenu(parent, help='', id=wx.ID_PROPERTIES, |
279 kind=wx.ITEM_NORMAL, text=u'Properties') |
339 kind=wx.ITEM_NORMAL, text=_(u'Properties')) |
280 parent.AppendSeparator() |
340 parent.AppendSeparator() |
281 if self.ModeSolo: |
341 if self.ModeSolo: |
282 AppendMenu(parent, help='', id=wx.ID_EXIT, |
342 AppendMenu(parent, help='', id=wx.ID_EXIT, |
283 kind=wx.ITEM_NORMAL, text=u'Quit\tCTRL+Q') |
343 kind=wx.ITEM_NORMAL, text=_(u'Quit\tCTRL+Q')) |
284 else: |
344 else: |
285 AppendMenu(parent, help='', id=wx.ID_STOP, |
345 AppendMenu(parent, help='', id=wx.ID_STOP, |
286 kind=wx.ITEM_NORMAL, text=u'Close\tCTRL+Q') |
346 kind=wx.ITEM_NORMAL, text=_(u'Close\tCTRL+Q')) |
287 |
347 |
288 if self.ModeSolo: |
348 if self.ModeSolo: |
289 self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW) |
349 self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW) |
290 self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN) |
350 self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN) |
291 self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE) |
351 self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE) |
307 else: |
367 else: |
308 self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_STOP) |
368 self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_STOP) |
309 |
369 |
310 def _init_coll_EditMenu_Items(self, parent): |
370 def _init_coll_EditMenu_Items(self, parent): |
311 AppendMenu(parent, help='', id=wx.ID_UNDO, |
371 AppendMenu(parent, help='', id=wx.ID_UNDO, |
312 kind=wx.ITEM_NORMAL, text=u'Undo\tCTRL+Z') |
372 kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z')) |
313 AppendMenu(parent, help='', id=wx.ID_REDO, |
373 AppendMenu(parent, help='', id=wx.ID_REDO, |
314 kind=wx.ITEM_NORMAL, text=u'Redo\tCTRL+Y') |
374 kind=wx.ITEM_NORMAL, text=_(u'Redo\tCTRL+Y')) |
315 AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, |
|
316 kind=wx.ITEM_CHECK, text=u'Enable Undo/Redo') |
|
317 parent.AppendSeparator() |
375 parent.AppendSeparator() |
318 AppendMenu(parent, help='', id=wx.ID_CUT, |
376 AppendMenu(parent, help='', id=wx.ID_CUT, |
319 kind=wx.ITEM_NORMAL, text=u'Cut\tCTRL+X') |
377 kind=wx.ITEM_NORMAL, text=_(u'Cut\tCTRL+X')) |
320 AppendMenu(parent, help='', id=wx.ID_COPY, |
378 AppendMenu(parent, help='', id=wx.ID_COPY, |
321 kind=wx.ITEM_NORMAL, text=u'Copy\tCTRL+C') |
379 kind=wx.ITEM_NORMAL, text=_(u'Copy\tCTRL+C')) |
322 AppendMenu(parent, help='', id=wx.ID_PASTE, |
380 AppendMenu(parent, help='', id=wx.ID_PASTE, |
323 kind=wx.ITEM_NORMAL, text=u'Paste\tCTRL+V') |
381 kind=wx.ITEM_NORMAL, text=_(u'Paste\tCTRL+V')) |
324 parent.AppendSeparator() |
382 parent.AppendSeparator() |
325 addmenu = wx.Menu(title='') |
383 addmenu = wx.Menu(title='') |
326 parent.AppendMenu(wx.ID_ADD, "Add Element", addmenu) |
384 parent.AppendMenu(wx.ID_ADD, _("Add Element"), addmenu) |
327 AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE, |
385 AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE, |
328 kind=wx.ITEM_NORMAL, text=u'Data Type') |
386 kind=wx.ITEM_NORMAL, text=_(u'Data Type')) |
329 AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION, |
387 AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION, |
330 kind=wx.ITEM_NORMAL, text=u'Function') |
388 kind=wx.ITEM_NORMAL, text=_(u'Function')) |
331 AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK, |
389 AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK, |
332 kind=wx.ITEM_NORMAL, text=u'Function Block') |
390 kind=wx.ITEM_NORMAL, text=_(u'Function Block')) |
333 AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM, |
391 AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM, |
334 kind=wx.ITEM_NORMAL, text=u'Program') |
392 kind=wx.ITEM_NORMAL, text=_(u'Program')) |
335 AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION, |
393 AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION, |
336 kind=wx.ITEM_NORMAL, text=u'Configuration') |
394 kind=wx.ITEM_NORMAL, text=_(u'Configuration')) |
337 AppendMenu(parent, help='', id=wx.ID_SELECTALL, |
395 AppendMenu(parent, help='', id=wx.ID_SELECTALL, |
338 kind=wx.ITEM_NORMAL, text=u'Select All\tCTRL+A') |
396 kind=wx.ITEM_NORMAL, text=_(u'Select All\tCTRL+A')) |
339 AppendMenu(parent, help='', id=wx.ID_DELETE, |
397 AppendMenu(parent, help='', id=wx.ID_DELETE, |
340 kind=wx.ITEM_NORMAL, text=u'Delete') |
398 kind=wx.ITEM_NORMAL, text=_(u'Delete')) |
341 self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO) |
399 self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO) |
342 self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO) |
400 self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO) |
343 self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO) |
401 self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO) |
344 self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT) |
402 self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT) |
345 self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY) |
403 self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY) |
357 self.Bind(wx.EVT_MENU, self.OnSelectAllMenu, id=wx.ID_SELECTALL) |
415 self.Bind(wx.EVT_MENU, self.OnSelectAllMenu, id=wx.ID_SELECTALL) |
358 self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE) |
416 self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE) |
359 |
417 |
360 def _init_coll_DisplayMenu_Items(self, parent): |
418 def _init_coll_DisplayMenu_Items(self, parent): |
361 AppendMenu(parent, help='', id=wx.ID_REFRESH, |
419 AppendMenu(parent, help='', id=wx.ID_REFRESH, |
362 kind=wx.ITEM_NORMAL, text=u'Refresh\tF5') |
420 kind=wx.ITEM_NORMAL, text=_(u'Refresh\tF5')) |
363 if not self.Debug and not self.ModeSolo: |
421 if not self.Debug and not self.ModeSolo: |
364 AppendMenu(parent, help='', id=wx.ID_CLEAR, |
422 AppendMenu(parent, help='', id=wx.ID_CLEAR, |
365 kind=wx.ITEM_NORMAL, text=u'Clear Errors\tCTRL+K') |
423 kind=wx.ITEM_NORMAL, text=_(u'Clear Errors\tCTRL+K')) |
366 parent.AppendSeparator() |
424 parent.AppendSeparator() |
367 zoommenu = wx.Menu(title='') |
425 zoommenu = wx.Menu(title='') |
368 parent.AppendMenu(wx.ID_ZOOM_FIT, "ZOOM", zoommenu) |
426 parent.AppendMenu(wx.ID_ZOOM_FIT, _("Zoom"), zoommenu) |
369 for idx, value in enumerate(ZOOM_FACTORS): |
427 for idx, value in enumerate(ZOOM_FACTORS): |
370 new_id = wx.NewId() |
428 new_id = wx.NewId() |
371 AppendMenu(zoommenu, help='', id=new_id, |
429 AppendMenu(zoommenu, help='', id=new_id, |
372 kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%") |
430 kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%") |
373 self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id) |
431 self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id) |
375 if not self.Debug and not self.ModeSolo: |
433 if not self.Debug and not self.ModeSolo: |
376 self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR) |
434 self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR) |
377 |
435 |
378 def _init_coll_HelpMenu_Items(self, parent): |
436 def _init_coll_HelpMenu_Items(self, parent): |
379 AppendMenu(parent, help='', id=wx.ID_HELP, |
437 AppendMenu(parent, help='', id=wx.ID_HELP, |
380 kind=wx.ITEM_NORMAL, text=u'PLCOpenEditor\tF1') |
438 kind=wx.ITEM_NORMAL, text=_(u'PLCOpenEditor\tF1')) |
381 #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS, |
439 #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS, |
382 # kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2') |
440 # kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2') |
383 #AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT, |
441 #AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT, |
384 # kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3') |
442 # kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3') |
385 if self.ModeSolo: |
443 if self.ModeSolo: |
386 AppendMenu(parent, help='', id=wx.ID_ABOUT, |
444 AppendMenu(parent, help='', id=wx.ID_ABOUT, |
387 kind=wx.ITEM_NORMAL, text=u'About') |
445 kind=wx.ITEM_NORMAL, text=_(u'About')) |
388 self.Bind(wx.EVT_MENU, self.OnPLCOpenEditorMenu, id=wx.ID_HELP) |
446 self.Bind(wx.EVT_MENU, self.OnPLCOpenEditorMenu, id=wx.ID_HELP) |
389 #self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS) |
447 #self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS) |
390 self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT) |
448 self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT) |
391 |
449 |
392 def _init_utils(self): |
450 def _init_utils(self): |
422 self.LibraryPanel.SetSizer(self.MainLibrarySizer) |
480 self.LibraryPanel.SetSizer(self.MainLibrarySizer) |
423 |
481 |
424 def _init_ctrls(self, prnt): |
482 def _init_ctrls(self, prnt): |
425 wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor', |
483 wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor', |
426 parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600), |
484 parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600), |
427 style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor') |
485 style=wx.DEFAULT_FRAME_STYLE, title=_(u'PLCOpenEditor')) |
428 self._init_utils() |
486 self._init_utils() |
429 self.SetClientSize(wx.Size(1000, 600)) |
487 self.SetClientSize(wx.Size(1000, 600)) |
430 self.SetMenuBar(self.MenuBar) |
488 self.SetMenuBar(self.MenuBar) |
431 self.Bind(wx.EVT_CLOSE, self.OnCloseFrame) |
489 self.Bind(wx.EVT_CLOSE, self.OnCloseFrame) |
432 |
490 |
434 self.AUIManager = wx.aui.AuiManager(self) |
492 self.AUIManager = wx.aui.AuiManager(self) |
435 self.AUIManager.SetDockSizeConstraint(0.5, 0.5) |
493 self.AUIManager.SetDockSizeConstraint(0.5, 0.5) |
436 self.Panes = {} |
494 self.Panes = {} |
437 |
495 |
438 self.TreeNoteBook = wx.aui.AuiNotebook(self) |
496 self.TreeNoteBook = wx.aui.AuiNotebook(self) |
439 self.AUIManager.AddPane(self.TreeNoteBook, wx.aui.AuiPaneInfo().Caption("Project").Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False)) |
497 self.AUIManager.AddPane(self.TreeNoteBook, wx.aui.AuiPaneInfo().Caption(_("Project")).Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False)) |
440 |
498 |
441 else: |
499 else: |
442 self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER, |
500 self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER, |
443 name='MainSplitter', parent=self, point=wx.Point(0, 0), |
501 name='MainSplitter', parent=self, point=wx.Point(0, 0), |
444 size=wx.Size(0, 0), style=wx.SP_3D) |
502 size=wx.Size(0, 0), style=wx.SP_3D) |
496 self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag, |
554 self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag, |
497 id=ID_PLCOPENEDITORINSTANCESTREE) |
555 id=ID_PLCOPENEDITORINSTANCESTREE) |
498 self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated, |
556 self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated, |
499 id=ID_PLCOPENEDITORINSTANCESTREE) |
557 id=ID_PLCOPENEDITORINSTANCESTREE) |
500 |
558 |
501 self.TreeNoteBook.AddPage(self.InstancesTree, "Instances") |
559 self.TreeNoteBook.AddPage(self.InstancesTree, _("Instances")) |
502 self.TreeNoteBook.AddPage(self.TypesTree, "Types") |
560 self.TreeNoteBook.AddPage(self.TypesTree, _("Types")) |
503 |
561 |
504 if USE_AUI: |
562 if USE_AUI: |
505 self.TabsOpened = wx.aui.AuiNotebook(self) |
563 self.TabsOpened = wx.aui.AuiNotebook(self) |
506 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, |
564 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, |
507 self.OnPouSelectedChanged) |
565 self.OnPouSelectedChanged) |
510 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG, |
568 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG, |
511 self.OnPageDragged) |
569 self.OnPageDragged) |
512 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane()) |
570 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane()) |
513 |
571 |
514 self.DebugVariablePanel = DebugVariablePanel(self, self.Controler) |
572 self.DebugVariablePanel = DebugVariablePanel(self, self.Controler) |
515 self.AUIManager.AddPane(self.DebugVariablePanel, wx.aui.AuiPaneInfo().Caption("Variables").Right().Layer(0).BestSize(wx.Size(250, 600)).CloseButton(False)) |
573 self.AUIManager.AddPane(self.DebugVariablePanel, wx.aui.AuiPaneInfo().Caption(_("Variables")).Right().Layer(0).BestSize(wx.Size(250, 600)).CloseButton(False)) |
516 else: |
574 else: |
517 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER, |
575 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER, |
518 name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0), |
576 name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0), |
519 size=wx.Size(0, 0), style=wx.SP_3D) |
577 size=wx.Size(0, 0), style=wx.SP_3D) |
520 self.SecondSplitter.SetMinimumPaneSize(1) |
578 self.SecondSplitter.SetMinimumPaneSize(1) |
533 |
591 |
534 self.DebugVariablePanel = DebugVariablePanel(self.SecondSplitter, self.Controler) |
592 self.DebugVariablePanel = DebugVariablePanel(self.SecondSplitter, self.Controler) |
535 |
593 |
536 self.SecondSplitter.SplitVertically(self.TabsOpened, self.DebugVariablePanel, -250) |
594 self.SecondSplitter.SplitVertically(self.TabsOpened, self.DebugVariablePanel, -250) |
537 else: |
595 else: |
538 self.TreeNoteBook.AddPage(self.TypesTree, "Types") |
596 self.TreeNoteBook.AddPage(self.TypesTree, _("Types")) |
539 self.TreeNoteBook.AddPage(self.InstancesTree, "Instances") |
597 self.TreeNoteBook.AddPage(self.InstancesTree, _("Instances")) |
540 |
598 |
541 if USE_AUI: |
599 if USE_AUI: |
542 ToolBar = wx.ToolBar(self, ID_PLCOPENEDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize, |
600 ToolBar = wx.ToolBar(self, ID_PLCOPENEDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize, |
543 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER) |
601 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER) |
544 ToolBar.SetToolBitmapSize(wx.Size(25, 25)) |
602 ToolBar.SetToolBitmapSize(wx.Size(25, 25)) |
545 ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, |
603 ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, |
546 wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, "Select an object") |
604 wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object")) |
547 ToolBar.Realize() |
605 ToolBar.Realize() |
548 self.Panes["ToolBar"] = ToolBar |
606 self.Panes["ToolBar"] = ToolBar |
549 self.AUIManager.AddPane(ToolBar, wx.aui.AuiPaneInfo(). |
607 self.AUIManager.AddPane(ToolBar, wx.aui.AuiPaneInfo(). |
550 Name("ToolBar").Caption("Toolbar"). |
608 Name("ToolBar").Caption(_("Toolbar")). |
551 ToolbarPane().Top(). |
609 ToolbarPane().Top(). |
552 LeftDockable(False).RightDockable(False)) |
610 LeftDockable(False).RightDockable(False)) |
553 else: |
611 else: |
554 self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, |
612 self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, |
555 ID_PLCOPENEDITORTOOLBAR, 'ToolBar') |
613 ID_PLCOPENEDITORTOOLBAR, 'ToolBar') |
556 self.ToolBar.SetToolBitmapSize(wx.Size(25, 25)) |
614 self.ToolBar.SetToolBitmapSize(wx.Size(25, 25)) |
557 self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, |
615 self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, |
558 wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, "Select an object") |
616 wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object")) |
559 self.ToolBar.Realize() |
617 self.ToolBar.Realize() |
560 |
618 |
561 self.Bind(wx.EVT_TOOL, self.OnSelectionTool, |
619 self.Bind(wx.EVT_TOOL, self.OnSelectionTool, |
562 id=ID_PLCOPENEDITORTOOLBARSELECTION) |
620 id=ID_PLCOPENEDITORTOOLBARSELECTION) |
563 |
621 |
564 if USE_AUI: |
622 if USE_AUI: |
565 self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler) |
623 self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler) |
566 self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variables").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False)) |
624 self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption(_("Variables")).Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False)) |
567 |
625 |
568 self.TabsOpened = wx.aui.AuiNotebook(self) |
626 self.TabsOpened = wx.aui.AuiNotebook(self) |
569 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, |
627 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, |
570 self.OnPouSelectedChanged) |
628 self.OnPouSelectedChanged) |
571 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, |
629 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, |
575 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane().MinSize(wx.Size(0, 0))) |
633 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane().MinSize(wx.Size(0, 0))) |
576 |
634 |
577 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL, |
635 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL, |
578 name='LibraryPanel', parent=self, pos=wx.Point(0, |
636 name='LibraryPanel', parent=self, pos=wx.Point(0, |
579 0), size=wx.Size(0, 0), style=0) |
637 0), size=wx.Size(0, 0), style=0) |
580 self.AUIManager.AddPane(self.LibraryPanel, wx.aui.AuiPaneInfo().Caption("Library").Right().Layer(0).BestSize(wx.Size(250, 400)).CloseButton(False)) |
638 self.AUIManager.AddPane(self.LibraryPanel, wx.aui.AuiPaneInfo().Caption(_("Library")).Right().Layer(0).BestSize(wx.Size(250, 400)).CloseButton(False)) |
581 else: |
639 else: |
582 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER, |
640 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER, |
583 name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0), |
641 name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0), |
584 size=wx.Size(0, 0), style=wx.SP_3D) |
642 size=wx.Size(0, 0), style=wx.SP_3D) |
585 self.SecondSplitter.SetMinimumPaneSize(1) |
643 self.SecondSplitter.SetMinimumPaneSize(1) |
775 |
833 |
776 def GetDrawingMode(self): |
834 def GetDrawingMode(self): |
777 return self.DrawingMode |
835 return self.DrawingMode |
778 |
836 |
779 def RefreshTitle(self): |
837 def RefreshTitle(self): |
780 name = "PLCOpenEditor" |
838 name = _("PLCOpenEditor") |
781 if self.Debug: |
839 if self.Debug: |
782 name += " (Debug)" |
840 name += _(" (Debug)") |
783 if self.Controler.HasOpenedProject() > 0: |
841 if self.Controler.HasOpenedProject() > 0: |
784 self.SetTitle("%s - %s"%(name, self.Controler.GetFilename())) |
842 self.SetTitle("%s - %s"%(name, self.Controler.GetFilename())) |
785 else: |
843 else: |
786 self.SetTitle(name) |
844 self.SetTitle(name) |
787 |
845 |
890 #------------------------------------------------------------------------------- |
948 #------------------------------------------------------------------------------- |
891 |
949 |
892 ## Function displaying an Error dialog in PLCOpenEditor. |
950 ## Function displaying an Error dialog in PLCOpenEditor. |
893 # @param message The message to display. |
951 # @param message The message to display. |
894 def ShowErrorMessage(self, message): |
952 def ShowErrorMessage(self, message): |
895 dialog = wx.MessageDialog(self, message, "Error", wx.OK|wx.ICON_ERROR) |
953 dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR) |
896 dialog.ShowModal() |
954 dialog.ShowModal() |
897 dialog.Destroy() |
955 dialog.Destroy() |
898 |
956 |
899 ## Function displaying an Error dialog in PLCOpenEditor. |
957 ## Function displaying an Error dialog in PLCOpenEditor. |
900 # @return False if closing cancelled. |
958 # @return False if closing cancelled. |
901 def CheckSaveBeforeClosing(self): |
959 def CheckSaveBeforeClosing(self): |
902 if not self.Controler.ProjectIsSaved(): |
960 if not self.Controler.ProjectIsSaved(): |
903 dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION) |
961 dialog = wx.MessageDialog(self, _("There are changes, do you want to save?"), _("Close Application"), wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION) |
904 answer = dialog.ShowModal() |
962 answer = dialog.ShowModal() |
905 dialog.Destroy() |
963 dialog.Destroy() |
906 if answer == wx.ID_YES: |
964 if answer == wx.ID_YES: |
907 self.SaveProject() |
965 self.SaveProject() |
908 elif answer == wx.ID_CANCEL: |
966 elif answer == wx.ID_CANCEL: |
968 filepath = self.Controler.GetFilePath() |
1026 filepath = self.Controler.GetFilePath() |
969 if filepath != "": |
1027 if filepath != "": |
970 directory = os.path.dirname(filepath) |
1028 directory = os.path.dirname(filepath) |
971 else: |
1029 else: |
972 directory = os.getcwd() |
1030 directory = os.getcwd() |
973 dialog = wx.FileDialog(self, "Choose a file", directory, "", "PLCOpen files (*.xml)|*.xml|All files|*.*", wx.OPEN) |
1031 dialog = wx.FileDialog(self, _("Choose a file"), directory, "", _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.OPEN) |
974 if dialog.ShowModal() == wx.ID_OK: |
1032 if dialog.ShowModal() == wx.ID_OK: |
975 filepath = dialog.GetPath() |
1033 filepath = dialog.GetPath() |
976 if os.path.isfile(filepath): |
1034 if os.path.isfile(filepath): |
977 self.DeleteAllPages() |
1035 self.DeleteAllPages() |
978 self.VariablePanelIndexer.RemoveAllPanels() |
1036 self.VariablePanelIndexer.RemoveAllPanels() |
1019 def OnSaveProjectAsMenu(self, event): |
1077 def OnSaveProjectAsMenu(self, event): |
1020 self.SaveProjectAs() |
1078 self.SaveProjectAs() |
1021 event.Skip() |
1079 event.Skip() |
1022 |
1080 |
1023 def OnGenerateProgramMenu(self, event): |
1081 def OnGenerateProgramMenu(self, event): |
1024 dialog = wx.FileDialog(self, "Choose a file", os.getcwd(), self.Controler.GetProgramFilePath(), "ST files (*.st)|*.st|All files|*.*", wx.SAVE|wx.CHANGE_DIR) |
1082 dialog = wx.FileDialog(self, _("Choose a file"), os.getcwd(), self.Controler.GetProgramFilePath(), _("ST files (*.st)|*.st|All files|*.*"), wx.SAVE|wx.CHANGE_DIR) |
1025 if dialog.ShowModal() == wx.ID_OK: |
1083 if dialog.ShowModal() == wx.ID_OK: |
1026 filepath = dialog.GetPath() |
1084 filepath = dialog.GetPath() |
1027 message_text = "" |
1085 message_text = "" |
1028 header, icon = "Done", wx.ICON_INFORMATION |
1086 header, icon = _("Done"), wx.ICON_INFORMATION |
1029 if os.path.isdir(os.path.dirname(filepath)): |
1087 if os.path.isdir(os.path.dirname(filepath)): |
1030 program, errors, warnings = self.Controler.GenerateProgram(filepath) |
1088 program, errors, warnings = self.Controler.GenerateProgram(filepath) |
1031 message_text += "".join(["warning: %s\n" for warning in warnings]) |
1089 message_text += "".join([_("warning: %s\n") for warning in warnings]) |
1032 if len(errors) > 0: |
1090 if len(errors) > 0: |
1033 message_text += "".join(["error: %s\n" for warning in warnings]) |
1091 message_text += "".join([_("error: %s\n") for warning in warnings]) |
1034 message_text += "Can't generate program to file %s!"%filepath |
1092 message_text += _("Can't generate program to file %s!")%filepath |
1035 header, icon = "Error", wx.ICON_ERROR |
1093 header, icon = _("Error"), wx.ICON_ERROR |
1036 else: |
1094 else: |
1037 message_text += "Program was successfully generated!" |
1095 message_text += _("Program was successfully generated!") |
1038 else: |
1096 else: |
1039 message_text += "%s is not a valid folder!"%os.path.dirname(filepath) |
1097 message_text += _("\"%s\" is not a valid folder!")%os.path.dirname(filepath) |
1040 header, icon = "Error", wx.ICON_ERROR |
1098 header, icon = _("Error"), wx.ICON_ERROR |
1041 message = wx.MessageDialog(self, message_text, header, wx.OK|icon) |
1099 message = wx.MessageDialog(self, message_text, header, wx.OK|icon) |
1042 message.ShowModal() |
1100 message.ShowModal() |
1043 message.Destroy() |
1101 message.Destroy() |
1044 dialog.Destroy() |
1102 dialog.Destroy() |
1045 event.Skip() |
1103 event.Skip() |
1055 filepath = self.Controler.GetFilePath() |
1113 filepath = self.Controler.GetFilePath() |
1056 if filepath != "": |
1114 if filepath != "": |
1057 directory, filename = os.path.split(filepath) |
1115 directory, filename = os.path.split(filepath) |
1058 else: |
1116 else: |
1059 directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties(self.Debug) |
1117 directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties(self.Debug) |
1060 dialog = wx.FileDialog(self, "Choose a file", directory, filename, "PLCOpen files (*.xml)|*.xml|All files|*.*", wx.SAVE|wx.OVERWRITE_PROMPT) |
1118 dialog = wx.FileDialog(self, _("Choose a file"), directory, filename, _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.SAVE|wx.OVERWRITE_PROMPT) |
1061 if dialog.ShowModal() == wx.ID_OK: |
1119 if dialog.ShowModal() == wx.ID_OK: |
1062 filepath = dialog.GetPath() |
1120 filepath = dialog.GetPath() |
1063 if os.path.isdir(os.path.dirname(filepath)): |
1121 if os.path.isdir(os.path.dirname(filepath)): |
1064 result = self.Controler.SaveXMLFile(filepath) |
1122 result = self.Controler.SaveXMLFile(filepath) |
1065 if not result: |
1123 if not result: |
1066 self.ShowErrorMessage("Can't save project to file %s!"%filepath) |
1124 self.ShowErrorMessage(_("Can't save project to file %s!")%filepath) |
1067 else: |
1125 else: |
1068 self.ShowErrorMessage("\"%s\" is not a valid folder!"%os.path.dirname(filepath)) |
1126 self.ShowErrorMessage(_("\"%s\" is not a valid folder!")%os.path.dirname(filepath)) |
1069 self.RefreshTitle() |
1127 self.RefreshTitle() |
1070 dialog.Destroy() |
1128 dialog.Destroy() |
1071 |
1129 |
1072 def OnPageSetupMenu(self, event): |
1130 def OnPageSetupMenu(self, event): |
1073 dialog = wx.PageSetupDialog(self, self.PageSetupData) |
1131 dialog = wx.PageSetupDialog(self, self.PageSetupData) |
1087 printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True) |
1145 printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True) |
1088 printout2 = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True) |
1146 printout2 = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True) |
1089 preview = wx.PrintPreview(printout, printout2, data) |
1147 preview = wx.PrintPreview(printout, printout2, data) |
1090 |
1148 |
1091 if preview.Ok(): |
1149 if preview.Ok(): |
1092 preview_frame = wx.PreviewFrame(preview, self, "Print preview") |
1150 preview_frame = wx.PreviewFrame(preview, self, _("Print preview")) |
1093 |
1151 |
1094 preview_frame.Initialize() |
1152 preview_frame.Initialize() |
1095 |
1153 |
1096 preview_frame.Show(True) |
1154 preview_frame.Show(True) |
1097 event.Skip() |
1155 event.Skip() |
1106 margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight()) |
1164 margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight()) |
1107 printer = wx.Printer(dialog_data) |
1165 printer = wx.Printer(dialog_data) |
1108 printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins) |
1166 printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins) |
1109 |
1167 |
1110 if not printer.Print(self, printout, True): |
1168 if not printer.Print(self, printout, True): |
1111 self.ShowErrorMessage("There was a problem printing.\nPerhaps your current printer is not set correctly?") |
1169 self.ShowErrorMessage(_("There was a problem printing.\nPerhaps your current printer is not set correctly?")) |
1112 printout.Destroy() |
1170 printout.Destroy() |
1113 event.Skip() |
1171 event.Skip() |
1114 |
1172 |
1115 def OnPropertiesMenu(self, event): |
1173 def OnPropertiesMenu(self, event): |
1116 self.ShowProperties() |
1174 self.ShowProperties() |
1401 def ResetSelectedItem(self): |
1459 def ResetSelectedItem(self): |
1402 self.SelectedItem = None |
1460 self.SelectedItem = None |
1403 |
1461 |
1404 def GenerateTypesTreeBranch(self, root, infos, topology=False): |
1462 def GenerateTypesTreeBranch(self, root, infos, topology=False): |
1405 to_delete = [] |
1463 to_delete = [] |
1406 self.TypesTree.SetItemText(root, infos["name"]) |
1464 item_name = infos["name"] |
1465 self.TypesTree.SetItemText(root, _(item_name)) |
|
1407 self.TypesTree.SetPyData(root, infos["type"]) |
1466 self.TypesTree.SetPyData(root, infos["type"]) |
1408 if infos.get("tagname", None) in self.Errors: |
1467 if infos.get("tagname", None) in self.Errors: |
1409 self.TypesTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0)) |
1468 self.TypesTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0)) |
1410 self.TypesTree.SetItemTextColour(root, wx.RED) |
1469 self.TypesTree.SetItemTextColour(root, wx.RED) |
1411 else: |
1470 else: |
1496 message = None |
1555 message = None |
1497 abort = False |
1556 abort = False |
1498 new_name = event.GetLabel() |
1557 new_name = event.GetLabel() |
1499 if new_name != "": |
1558 if new_name != "": |
1500 if not TestIdentifier(new_name): |
1559 if not TestIdentifier(new_name): |
1501 message = "\"%s\" is not a valid identifier!"%new_name |
1560 message = _("\"%s\" is not a valid identifier!")%new_name |
1502 elif new_name.upper() in IEC_KEYWORDS: |
1561 elif new_name.upper() in IEC_KEYWORDS: |
1503 message = "\"%s\" is a keyword. It can't be used!"%new_name |
1562 message = _("\"%s\" is a keyword. It can't be used!")%new_name |
1504 else: |
1563 else: |
1505 item = event.GetItem() |
1564 item = event.GetItem() |
1506 old_name = self.TypesTree.GetItemText(item) |
1565 old_name = self.TypesTree.GetItemText(item) |
1507 itemtype = self.TypesTree.GetPyData(item) |
1566 itemtype = self.TypesTree.GetPyData(item) |
1508 if itemtype == ITEM_PROJECT: |
1567 if itemtype == ITEM_PROJECT: |
1509 self.Controler.SetProjectProperties(name = new_name) |
1568 self.Controler.SetProjectProperties(name = new_name) |
1510 elif itemtype == ITEM_DATATYPE: |
1569 elif itemtype == ITEM_DATATYPE: |
1511 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames(self.Debug) if name != old_name]: |
1570 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames(self.Debug) if name != old_name]: |
1512 message = "\"%s\" data type already exists!"%new_name |
1571 message = _("\"%s\" data type already exists!")%new_name |
1513 abort = True |
1572 abort = True |
1514 if not abort: |
1573 if not abort: |
1515 self.Controler.ChangeDataTypeName(old_name, new_name) |
1574 self.Controler.ChangeDataTypeName(old_name, new_name) |
1516 self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), |
1575 self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), |
1517 self.Controler.ComputeDataTypeName(new_name)) |
1576 self.Controler.ComputeDataTypeName(new_name)) |
1518 self.RefreshPageTitles() |
1577 self.RefreshPageTitles() |
1519 elif itemtype == ITEM_POU: |
1578 elif itemtype == ITEM_POU: |
1520 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug) if name != old_name]: |
1579 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug) if name != old_name]: |
1521 message = "\"%s\" pou already exists!"%new_name |
1580 message = _("\"%s\" pou already exists!")%new_name |
1522 abort = True |
1581 abort = True |
1523 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]: |
1582 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]: |
1524 messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION) |
1583 messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION) |
1525 if messageDialog.ShowModal() == wx.ID_NO: |
1584 if messageDialog.ShowModal() == wx.ID_NO: |
1526 abort = True |
1585 abort = True |
1527 messageDialog.Destroy() |
1586 messageDialog.Destroy() |
1528 if not abort: |
1587 if not abort: |
1529 self.Controler.ChangePouName(old_name, new_name) |
1588 self.Controler.ChangePouName(old_name, new_name) |
1532 self.RefreshLibraryTree() |
1591 self.RefreshLibraryTree() |
1533 self.RefreshPageTitles() |
1592 self.RefreshPageTitles() |
1534 elif itemtype == ITEM_TRANSITION: |
1593 elif itemtype == ITEM_TRANSITION: |
1535 pou_name = GetParentName(self.TypesTree, item, ITEM_POU) |
1594 pou_name = GetParentName(self.TypesTree, item, ITEM_POU) |
1536 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]: |
1595 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]: |
1537 message = "A pou with \"%s\" as name exists!"%new_name |
1596 message = _("A pou with \"%s\" as name exists!")%new_name |
1538 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]: |
1597 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]: |
1539 message = "A variable with \"%s\" as name already exists in this pou!"%new_name |
1598 message = _("A variable with \"%s\" as name already exists in this pou!")%new_name |
1540 else: |
1599 else: |
1541 self.Controler.ChangePouTransitionName(pou_name, old_name, new_name) |
1600 self.Controler.ChangePouTransitionName(pou_name, old_name, new_name) |
1542 self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), |
1601 self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), |
1543 self.Controler.ComputePouTransitionName(pou_name, new_name)) |
1602 self.Controler.ComputePouTransitionName(pou_name, new_name)) |
1544 self.RefreshPageTitles() |
1603 self.RefreshPageTitles() |
1545 elif itemtype == ITEM_ACTION: |
1604 elif itemtype == ITEM_ACTION: |
1546 pou_name = GetParentName(self.TypesTree, item, ITEM_POU) |
1605 pou_name = GetParentName(self.TypesTree, item, ITEM_POU) |
1547 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]: |
1606 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]: |
1548 message = "A pou with \"%s\" as name exists!"%new_name |
1607 message = _("A pou with \"%s\" as name exists!")%new_name |
1549 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]: |
1608 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]: |
1550 message = "A variable with \"%s\" as name already exists in this pou!"%new_name |
1609 message = _("A variable with \"%s\" as name already exists in this pou!")%new_name |
1551 else: |
1610 else: |
1552 self.Controler.ChangePouActionName(pou_name, old_name, new_name) |
1611 self.Controler.ChangePouActionName(pou_name, old_name, new_name) |
1553 self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), |
1612 self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), |
1554 self.Controler.ComputePouActionName(pou_name, new_name)) |
1613 self.Controler.ComputePouActionName(pou_name, new_name)) |
1555 self.RefreshPageTitles() |
1614 self.RefreshPageTitles() |
1556 elif itemtype == ITEM_CONFIGURATION: |
1615 elif itemtype == ITEM_CONFIGURATION: |
1557 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug) if name != old_name]: |
1616 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug) if name != old_name]: |
1558 message = "\"%s\" config already exists!"%new_name |
1617 message = _("\"%s\" config already exists!")%new_name |
1559 abort = True |
1618 abort = True |
1560 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]: |
1619 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]: |
1561 messageDialog = wx.MessageDialog(self, "A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION) |
1620 messageDialog = wx.MessageDialog(self, _("A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION) |
1562 if messageDialog.ShowModal() == wx.ID_NO: |
1621 if messageDialog.ShowModal() == wx.ID_NO: |
1563 abort = True |
1622 abort = True |
1564 messageDialog.Destroy() |
1623 messageDialog.Destroy() |
1565 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]: |
1624 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]: |
1566 messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION) |
1625 messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION) |
1567 if messageDialog.ShowModal() == wx.ID_NO: |
1626 if messageDialog.ShowModal() == wx.ID_NO: |
1568 abort = True |
1627 abort = True |
1569 messageDialog.Destroy() |
1628 messageDialog.Destroy() |
1570 if not abort: |
1629 if not abort: |
1571 self.Controler.ChangeConfigurationName(old_name, new_name) |
1630 self.Controler.ChangeConfigurationName(old_name, new_name) |
1573 self.Controler.ComputeConfigurationName(new_name)) |
1632 self.Controler.ComputeConfigurationName(new_name)) |
1574 self.RefreshPageTitles() |
1633 self.RefreshPageTitles() |
1575 elif itemtype == ITEM_RESOURCE: |
1634 elif itemtype == ITEM_RESOURCE: |
1576 config_name = GetParentName(self.TypesTree, item, ITEM_CONFIGURATION) |
1635 config_name = GetParentName(self.TypesTree, item, ITEM_CONFIGURATION) |
1577 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug)]: |
1636 if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug)]: |
1578 message = "\"%s\" config already exists!"%new_name |
1637 message = _("\"%s\" config already exists!")%new_name |
1579 abort = True |
1638 abort = True |
1580 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]: |
1639 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]: |
1581 messageDialog = wx.MessageDialog(self, "A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION) |
1640 messageDialog = wx.MessageDialog(self, _("A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION) |
1582 if messageDialog.ShowModal() == wx.ID_NO: |
1641 if messageDialog.ShowModal() == wx.ID_NO: |
1583 abort = True |
1642 abort = True |
1584 messageDialog.Destroy() |
1643 messageDialog.Destroy() |
1585 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]: |
1644 elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]: |
1586 messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION) |
1645 messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION) |
1587 if messageDialog.ShowModal() == wx.ID_NO: |
1646 if messageDialog.ShowModal() == wx.ID_NO: |
1588 abort = True |
1647 abort = True |
1589 messageDialog.Destroy() |
1648 messageDialog.Destroy() |
1590 if not abort: |
1649 if not abort: |
1591 self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name) |
1650 self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name) |
1606 |
1665 |
1607 def OnTypesTreeItemActivated(self, event): |
1666 def OnTypesTreeItemActivated(self, event): |
1608 selected = event.GetItem() |
1667 selected = event.GetItem() |
1609 name = self.TypesTree.GetItemText(selected) |
1668 name = self.TypesTree.GetItemText(selected) |
1610 data = self.TypesTree.GetPyData(selected) |
1669 data = self.TypesTree.GetPyData(selected) |
1611 if name == "Properties": |
1670 if UNEDITABLE_NAMES_DICT.get(name, name) == "Properties": |
1612 self.ShowProperties() |
1671 self.ShowProperties() |
1613 if data == ITEM_DATATYPE: |
1672 if data == ITEM_DATATYPE: |
1614 self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name)) |
1673 self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name)) |
1615 elif data == ITEM_POU: |
1674 elif data == ITEM_POU: |
1616 self.EditProjectElement(data, self.Controler.ComputePouName(name)) |
1675 self.EditProjectElement(data, self.Controler.ComputePouName(name)) |
1733 type = self.TypesTree.GetPyData(item) |
1792 type = self.TypesTree.GetPyData(item) |
1734 if type == ITEM_POU: |
1793 if type == ITEM_POU: |
1735 menu = wx.Menu(title='') |
1794 menu = wx.Menu(title='') |
1736 if self.Controler.GetPouBodyType(name, self.Debug) == "SFC": |
1795 if self.Controler.GetPouBodyType(name, self.Debug) == "SFC": |
1737 new_id = wx.NewId() |
1796 new_id = wx.NewId() |
1738 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition") |
1797 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition")) |
1739 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id) |
1798 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id) |
1740 new_id = wx.NewId() |
1799 new_id = wx.NewId() |
1741 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Action") |
1800 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action")) |
1742 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id) |
1801 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id) |
1743 menu.AppendSeparator() |
1802 menu.AppendSeparator() |
1744 new_id = wx.NewId() |
1803 new_id = wx.NewId() |
1745 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Create A New POU From") |
1804 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Create a new POU from")) |
1746 self.Bind(wx.EVT_MENU, self.OnCreatePouFromMenu, id=new_id) |
1805 self.Bind(wx.EVT_MENU, self.OnCreatePouFromMenu, id=new_id) |
1747 pou_type = self.Controler.GetPouType(name, self.Debug) |
1806 pou_type = self.Controler.GetPouType(name, self.Debug) |
1748 if pou_type in ["function", "functionBlock"]: |
1807 if pou_type in ["function", "functionBlock"]: |
1749 change_menu = wx.Menu(title='') |
1808 change_menu = wx.Menu(title='') |
1750 if pou_type == "function": |
1809 if pou_type == "function": |
1751 new_id = wx.NewId() |
1810 new_id = wx.NewId() |
1752 AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Function Block") |
1811 AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Function Block")) |
1753 self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "functionBlock"), id=new_id) |
1812 self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "functionBlock"), id=new_id) |
1754 new_id = wx.NewId() |
1813 new_id = wx.NewId() |
1755 AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Program") |
1814 AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Program")) |
1756 self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "program"), id=new_id) |
1815 self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "program"), id=new_id) |
1757 menu.AppendMenu(wx.NewId(), "Change POU Type To", change_menu) |
1816 menu.AppendMenu(wx.NewId(), _("Change POU Type To"), change_menu) |
1758 new_id = wx.NewId() |
1817 new_id = wx.NewId() |
1759 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Rename") |
1818 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Rename")) |
1760 self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id) |
1819 self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id) |
1761 new_id = wx.NewId() |
1820 new_id = wx.NewId() |
1762 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete") |
1821 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete")) |
1763 self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id) |
1822 self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id) |
1764 self.PopupMenu(menu) |
1823 self.PopupMenu(menu) |
1765 elif type == ITEM_CONFIGURATION: |
1824 elif type == ITEM_CONFIGURATION: |
1766 menu = wx.Menu(title='') |
1825 menu = wx.Menu(title='') |
1767 new_id = wx.NewId() |
1826 new_id = wx.NewId() |
1768 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Resource") |
1827 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource")) |
1769 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id) |
1828 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id) |
1770 new_id = wx.NewId() |
1829 new_id = wx.NewId() |
1771 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete") |
1830 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete")) |
1772 self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id) |
1831 self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id) |
1773 self.PopupMenu(menu) |
1832 self.PopupMenu(menu) |
1774 elif type in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]: |
1833 elif type in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]: |
1775 menu = wx.Menu(title='') |
1834 menu = wx.Menu(title='') |
1776 new_id = wx.NewId() |
1835 new_id = wx.NewId() |
1777 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete") |
1836 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete")) |
1778 self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id) |
1837 self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id) |
1779 self.PopupMenu(menu) |
1838 self.PopupMenu(menu) |
1780 elif type in ITEMS_UNEDITABLE: |
1839 elif type in ITEMS_UNEDITABLE: |
1840 name = UNEDITABLE_NAMES_DICT[name] |
|
1781 if name == "Data Types": |
1841 if name == "Data Types": |
1782 menu = wx.Menu(title='') |
1842 menu = wx.Menu(title='') |
1783 new_id = wx.NewId() |
1843 new_id = wx.NewId() |
1784 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add DataType") |
1844 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add DataType")) |
1785 self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, id=new_id) |
1845 self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, id=new_id) |
1786 self.PopupMenu(menu) |
1846 self.PopupMenu(menu) |
1787 elif name in ["Functions", "Function Blocks", "Programs"]: |
1847 elif name in ["Functions", "Function Blocks", "Programs"]: |
1788 menu = wx.Menu(title='') |
1848 menu = wx.Menu(title='') |
1789 new_id = wx.NewId() |
1849 new_id = wx.NewId() |
1790 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Pou") |
1850 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Pou")) |
1791 self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions" : "function", "Function Blocks" : "functionBlock", "Programs" : "program"}[name]), id=new_id) |
1851 self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions" : "function", "Function Blocks" : "functionBlock", "Programs" : "program"}[name]), id=new_id) |
1792 self.PopupMenu(menu) |
1852 self.PopupMenu(menu) |
1793 elif name == "Configurations": |
1853 elif name == "Configurations": |
1794 menu = wx.Menu(title='') |
1854 menu = wx.Menu(title='') |
1795 new_id = wx.NewId() |
1855 new_id = wx.NewId() |
1796 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Configuration") |
1856 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Configuration")) |
1797 self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, id=new_id) |
1857 self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, id=new_id) |
1798 self.PopupMenu(menu) |
1858 self.PopupMenu(menu) |
1799 elif name == "Transitions": |
1859 elif name == "Transitions": |
1800 menu = wx.Menu(title='') |
1860 menu = wx.Menu(title='') |
1801 new_id = wx.NewId() |
1861 new_id = wx.NewId() |
1802 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition") |
1862 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition")) |
1803 parent = self.TypesTree.GetItemParent(item) |
1863 parent = self.TypesTree.GetItemParent(item) |
1804 parent_type = self.TypesTree.GetPyData(parent) |
1864 parent_type = self.TypesTree.GetPyData(parent) |
1805 while parent_type != ITEM_POU: |
1865 while parent_type != ITEM_POU: |
1806 parent = self.TypesTree.GetItemParent(parent) |
1866 parent = self.TypesTree.GetItemParent(parent) |
1807 parent_type = self.TypesTree.GetPyData(parent) |
1867 parent_type = self.TypesTree.GetPyData(parent) |
1808 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.TypesTree.GetItemText(parent)), id=new_id) |
1868 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.TypesTree.GetItemText(parent)), id=new_id) |
1809 self.PopupMenu(menu) |
1869 self.PopupMenu(menu) |
1810 elif name == "Actions": |
1870 elif name == "Actions": |
1811 menu = wx.Menu(title='') |
1871 menu = wx.Menu(title='') |
1812 new_id = wx.NewId() |
1872 new_id = wx.NewId() |
1813 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Action") |
1873 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action")) |
1814 parent = self.TypesTree.GetItemParent(item) |
1874 parent = self.TypesTree.GetItemParent(item) |
1815 parent_type = self.TypesTree.GetPyData(parent) |
1875 parent_type = self.TypesTree.GetPyData(parent) |
1816 while parent_type != ITEM_POU: |
1876 while parent_type != ITEM_POU: |
1817 parent = self.TypesTree.GetItemParent(parent) |
1877 parent = self.TypesTree.GetItemParent(parent) |
1818 parent_type = self.TypesTree.GetPyData(parent) |
1878 parent_type = self.TypesTree.GetPyData(parent) |
1819 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.TypesTree.GetItemText(parent)), id=new_id) |
1879 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.TypesTree.GetItemText(parent)), id=new_id) |
1820 self.PopupMenu(menu) |
1880 self.PopupMenu(menu) |
1821 elif name == "Resources": |
1881 elif name == "Resources": |
1822 menu = wx.Menu(title='') |
1882 menu = wx.Menu(title='') |
1823 new_id = wx.NewId() |
1883 new_id = wx.NewId() |
1824 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Resource") |
1884 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource")) |
1825 parent = self.TypesTree.GetItemParent(item) |
1885 parent = self.TypesTree.GetItemParent(item) |
1826 parent_type = self.TypesTree.GetPyData(parent) |
1886 parent_type = self.TypesTree.GetPyData(parent) |
1827 while parent_type != ITEM_CONFIGURATION: |
1887 while parent_type != ITEM_CONFIGURATION: |
1828 parent = self.TypesTree.GetItemParent(parent) |
1888 parent = self.TypesTree.GetItemParent(parent) |
1829 parent_type = self.TypesTree.GetPyData(parent) |
1889 parent_type = self.TypesTree.GetPyData(parent) |
1963 var_path = "%s.%s"%(parent_name, var_path) |
2023 var_path = "%s.%s"%(parent_name, var_path) |
1964 parent_item = self.InstancesTree.GetItemParent(parent_item) |
2024 parent_item = self.InstancesTree.GetItemParent(parent_item) |
1965 |
2025 |
1966 menu = wx.Menu(title='') |
2026 menu = wx.Menu(title='') |
1967 new_id = wx.NewId() |
2027 new_id = wx.NewId() |
1968 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Graphic Panel") |
2028 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Graphic Panel")) |
1969 self.Bind(wx.EVT_MENU, self.AddVariableGraphicFunction(var_path), id=new_id) |
2029 self.Bind(wx.EVT_MENU, self.AddVariableGraphicFunction(var_path), id=new_id) |
1970 new_id = wx.NewId() |
2030 new_id = wx.NewId() |
1971 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="CSV Log") |
2031 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("CSV Log")) |
1972 self.PopupMenu(menu) |
2032 self.PopupMenu(menu) |
1973 event.Skip() |
2033 event.Skip() |
1974 |
2034 |
1975 def AddVariableGraphicFunction(self, iec_path): |
2035 def AddVariableGraphicFunction(self, iec_path): |
1976 def AddVariableGraphic(event): |
2036 def AddVariableGraphic(event): |
2012 to_delete = [] |
2072 to_delete = [] |
2013 blocktypes = self.Controler.GetBlockTypes(debug = self.Debug) |
2073 blocktypes = self.Controler.GetBlockTypes(debug = self.Debug) |
2014 root = self.LibraryTree.GetRootItem() |
2074 root = self.LibraryTree.GetRootItem() |
2015 if not root.IsOk(): |
2075 if not root.IsOk(): |
2016 if wx.Platform == '__WXMSW__': |
2076 if wx.Platform == '__WXMSW__': |
2017 root = self.LibraryTree.AddRoot("Block Types") |
2077 root = self.LibraryTree.AddRoot(_("Block Types")) |
2018 self.LibraryTree.SetPyData(root, {"type" : CATEGORY}) |
2078 self.LibraryTree.SetPyData(root, {"type" : CATEGORY}) |
2019 else: |
2079 else: |
2020 root = self.LibraryTree.AddRoot("") |
2080 root = self.LibraryTree.AddRoot("") |
2021 if wx.VERSION >= (2, 6, 0): |
2081 if wx.VERSION >= (2, 6, 0): |
2022 category_item, root_cookie = self.LibraryTree.GetFirstChild(root) |
2082 category_item, root_cookie = self.LibraryTree.GetFirstChild(root) |
2023 else: |
2083 else: |
2024 category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0) |
2084 category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0) |
2025 for category in blocktypes: |
2085 for category in blocktypes: |
2086 category_name = category["name"] |
|
2026 if not category_item.IsOk(): |
2087 if not category_item.IsOk(): |
2027 category_item = self.LibraryTree.AppendItem(root, category["name"]) |
2088 category_item = self.LibraryTree.AppendItem(root, _(category_name)) |
2028 if wx.Platform != '__WXMSW__': |
2089 if wx.Platform != '__WXMSW__': |
2029 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie) |
2090 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie) |
2030 else: |
2091 else: |
2031 self.LibraryTree.SetItemText(category_item, category["name"]) |
2092 self.LibraryTree.SetItemText(category_item, _(category_name)) |
2032 self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY}) |
2093 self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY}) |
2033 if wx.VERSION >= (2, 6, 0): |
2094 if wx.VERSION >= (2, 6, 0): |
2034 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item) |
2095 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item) |
2035 else: |
2096 else: |
2036 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0) |
2097 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0) |
2059 selected = event.GetItem() |
2120 selected = event.GetItem() |
2060 pydata = self.LibraryTree.GetPyData(selected) |
2121 pydata = self.LibraryTree.GetPyData(selected) |
2061 if pydata is not None and pydata["type"] != CATEGORY: |
2122 if pydata is not None and pydata["type"] != CATEGORY: |
2062 blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"], debug = self.Debug) |
2123 blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"], debug = self.Debug) |
2063 if blocktype: |
2124 if blocktype: |
2064 self.LibraryComment.SetValue(blocktype["comment"]) |
2125 comment = blocktype["comment"] |
2126 self.LibraryComment.SetValue(_(comment) + blocktype.get("usage", "")) |
|
2065 else: |
2127 else: |
2066 self.LibraryComment.SetValue("") |
2128 self.LibraryComment.SetValue("") |
2067 else: |
2129 else: |
2068 self.LibraryComment.SetValue("") |
2130 self.LibraryComment.SetValue("") |
2069 event.Skip() |
2131 event.Skip() |
2292 #------------------------------------------------------------------------------- |
2354 #------------------------------------------------------------------------------- |
2293 # Add Project Elements Functions |
2355 # Add Project Elements Functions |
2294 #------------------------------------------------------------------------------- |
2356 #------------------------------------------------------------------------------- |
2295 |
2357 |
2296 def OnAddDataTypeMenu(self, event): |
2358 def OnAddDataTypeMenu(self, event): |
2297 dialog = DataTypeDialog(self, "Add a new data type", "Please enter data type name", "", wx.OK|wx.CANCEL) |
2359 dialog = DataTypeDialog(self, _("Add a new data type"), _("Please enter data type name"), "", wx.OK|wx.CANCEL) |
2298 dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames(self.Debug)) |
2360 dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames(self.Debug)) |
2299 if dialog.ShowModal() == wx.ID_OK: |
2361 if dialog.ShowModal() == wx.ID_OK: |
2300 self.Controler.ProjectAddDataType(dialog.GetValue()) |
2362 self.Controler.ProjectAddDataType(dialog.GetValue()) |
2301 self.RefreshTitle() |
2363 self.RefreshTitle() |
2302 self.RefreshEditMenu() |
2364 self.RefreshEditMenu() |
2349 dialog.Destroy() |
2411 dialog.Destroy() |
2350 event.Skip() |
2412 event.Skip() |
2351 return OnAddActionMenu |
2413 return OnAddActionMenu |
2352 |
2414 |
2353 def OnAddConfigurationMenu(self, event): |
2415 def OnAddConfigurationMenu(self, event): |
2354 dialog = ConfigurationNameDialog(self, "Please enter configuration name", "Add new configuration") |
2416 dialog = ConfigurationNameDialog(self, _("Please enter configuration name"), _("Add new configuration")) |
2355 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2417 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2356 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug)) |
2418 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug)) |
2357 if dialog.ShowModal() == wx.ID_OK: |
2419 if dialog.ShowModal() == wx.ID_OK: |
2358 value = dialog.GetValue() |
2420 value = dialog.GetValue() |
2359 self.Controler.ProjectAddConfiguration(value) |
2421 self.Controler.ProjectAddConfiguration(value) |
2364 dialog.Destroy() |
2426 dialog.Destroy() |
2365 event.Skip() |
2427 event.Skip() |
2366 |
2428 |
2367 def GenerateAddResourceFunction(self, config_name): |
2429 def GenerateAddResourceFunction(self, config_name): |
2368 def OnAddResourceMenu(event): |
2430 def OnAddResourceMenu(event): |
2369 dialog = ResourceNameDialog(self, "Please enter resource name", "Add new resource") |
2431 dialog = ResourceNameDialog(self, _("Please enter resource name"), _("Add new resource")) |
2370 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2432 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2371 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug)) |
2433 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug)) |
2372 if dialog.ShowModal() == wx.ID_OK: |
2434 if dialog.ShowModal() == wx.ID_OK: |
2373 value = dialog.GetValue() |
2435 value = dialog.GetValue() |
2374 self.Controler.ProjectAddConfigurationResource(config_name, value) |
2436 self.Controler.ProjectAddConfigurationResource(config_name, value) |
2394 return OnChangePouTypeMenu |
2456 return OnChangePouTypeMenu |
2395 |
2457 |
2396 def OnCreatePouFromMenu(self, event): |
2458 def OnCreatePouFromMenu(self, event): |
2397 selected = self.TypesTree.GetSelection() |
2459 selected = self.TypesTree.GetSelection() |
2398 if self.TypesTree.GetPyData(selected) == ITEM_POU: |
2460 if self.TypesTree.GetPyData(selected) == ITEM_POU: |
2399 dialog = PouNameDialog(self, "Please enter POU name", "Create a new POU from", "", wx.OK|wx.CANCEL) |
2461 dialog = PouNameDialog(self, _("Please enter POU name"), _("Create a new POU from"), "", wx.OK|wx.CANCEL) |
2400 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2462 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2401 if dialog.ShowModal() == wx.ID_OK: |
2463 if dialog.ShowModal() == wx.ID_OK: |
2402 self.Controler.ProjectCreatePouFrom(dialog.GetValue(), self.TypesTree.GetItemText(selected)) |
2464 self.Controler.ProjectCreatePouFrom(dialog.GetValue(), self.TypesTree.GetItemText(selected)) |
2403 self.RefreshTitle() |
2465 self.RefreshTitle() |
2404 self.RefreshEditMenu() |
2466 self.RefreshEditMenu() |
2424 self.RefreshTitle() |
2486 self.RefreshTitle() |
2425 self.RefreshEditMenu() |
2487 self.RefreshEditMenu() |
2426 self.RefreshTypesTree() |
2488 self.RefreshTypesTree() |
2427 self.RefreshToolBar() |
2489 self.RefreshToolBar() |
2428 else: |
2490 else: |
2429 message = wx.MessageDialog(self, "\"%s\" is used by one or more POUs. It can't be removed!"%name, "Error", wx.OK|wx.ICON_ERROR) |
2491 message = wx.MessageDialog(self, _("\"%s\" is used by one or more POUs. It can't be removed!")%name, _("Error"), wx.OK|wx.ICON_ERROR) |
2430 message.ShowModal() |
2492 message.ShowModal() |
2431 message.Destroy() |
2493 message.Destroy() |
2432 event.Skip() |
2494 event.Skip() |
2433 |
2495 |
2434 def OnRenamePouMenu(self, event): |
2496 def OnRenamePouMenu(self, event): |
2453 self.RefreshTypesTree() |
2515 self.RefreshTypesTree() |
2454 self.RefreshInstancesTree() |
2516 self.RefreshInstancesTree() |
2455 self.RefreshLibraryTree() |
2517 self.RefreshLibraryTree() |
2456 self.RefreshToolBar() |
2518 self.RefreshToolBar() |
2457 else: |
2519 else: |
2458 message = wx.MessageDialog(self, "\"%s\" is used by one or more POUs. It can't be removed!"%name, "Error", wx.OK|wx.ICON_ERROR) |
2520 message = wx.MessageDialog(self, _("\"%s\" is used by one or more POUs. It can't be removed!")%name, _("Error"), wx.OK|wx.ICON_ERROR) |
2459 message.ShowModal() |
2521 message.ShowModal() |
2460 message.Destroy() |
2522 message.Destroy() |
2461 event.Skip() |
2523 event.Skip() |
2462 |
2524 |
2463 def OnRemoveTransitionMenu(self, event): |
2525 def OnRemoveTransitionMenu(self, event): |
2539 self.RefreshTypesTree() |
2601 self.RefreshTypesTree() |
2540 self.RefreshInstancesTree() |
2602 self.RefreshInstancesTree() |
2541 event.Skip() |
2603 event.Skip() |
2542 |
2604 |
2543 def OnPLCOpenEditorMenu(self, event): |
2605 def OnPLCOpenEditorMenu(self, event): |
2544 wx.MessageBox("No documentation available.\nComing soon.") |
2606 wx.MessageBox(_("No documentation available.\nComing soon.")) |
2545 #event.Skip() |
2607 #event.Skip() |
2546 |
2608 |
2547 def OnPLCOpenMenu(self, event): |
2609 def OnPLCOpenMenu(self, event): |
2548 open_pdf(os.path.join(CWD, "plcopen", "TC6_XML_V101.pdf")) |
2610 open_pdf(os.path.join(CWD, "plcopen", "TC6_XML_V101.pdf")) |
2549 event.Skip() |
2611 event.Skip() |
2550 |
2612 |
2551 def OnAboutMenu(self, event): |
2613 def OnAboutMenu(self, event): |
2552 OpenHtmlFrame(self,"About PLCOpenEditor", os.path.join(CWD, "doc","about.html"), wx.Size(350, 350)) |
2614 OpenHtmlFrame(self,_("About PLCOpenEditor"), os.path.join(CWD, "doc","about.html"), wx.Size(350, 350)) |
2553 event.Skip() |
2615 event.Skip() |
2554 |
2616 |
2555 |
2617 |
2556 #------------------------------------------------------------------------------- |
2618 #------------------------------------------------------------------------------- |
2557 # Errors showing functions |
2619 # Errors showing functions |
2608 ] = [wx.NewId() for _init_ctrls in range(5)] |
2670 ] = [wx.NewId() for _init_ctrls in range(5)] |
2609 |
2671 |
2610 class ScalingPanel(wx.Panel): |
2672 class ScalingPanel(wx.Panel): |
2611 |
2673 |
2612 def _init_coll_ScalingPanelSizer_Items(self, parent): |
2674 def _init_coll_ScalingPanelSizer_Items(self, parent): |
2613 parent.AddWindow(self.staticText1, 0, border=10, flag=wx.GROW|wx.TOP|wx.LEFT) |
2675 parent.AddWindow(self.staticText1, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT) |
2614 parent.AddWindow(self.XScale, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT) |
2676 parent.AddWindow(self.XScale, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT) |
2615 parent.AddWindow(self.staticText2, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT) |
2677 parent.AddWindow(self.staticText2, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.BOTTOM|wx.LEFT) |
2616 parent.AddWindow(self.YScale, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT) |
2678 parent.AddWindow(self.YScale, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT) |
2617 |
2679 |
2618 def _init_coll_ScalingPanelSizer_Growables(self, parent): |
2680 def _init_coll_ScalingPanelSizer_Growables(self, parent): |
2619 parent.AddGrowableCol(1) |
2681 parent.AddGrowableCol(1) |
2620 |
2682 |
2621 def _init_sizers(self): |
2683 def _init_sizers(self): |
2622 self.ScalingPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=5) |
2684 self.ScalingPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5) |
2623 |
2685 |
2624 self._init_coll_ScalingPanelSizer_Items(self.ScalingPanelSizer) |
2686 self._init_coll_ScalingPanelSizer_Items(self.ScalingPanelSizer) |
2625 self._init_coll_ScalingPanelSizer_Growables(self.ScalingPanelSizer) |
2687 self._init_coll_ScalingPanelSizer_Growables(self.ScalingPanelSizer) |
2626 |
2688 |
2627 self.SetSizer(self.ScalingPanelSizer) |
2689 self.SetSizer(self.ScalingPanelSizer) |
2630 wx.Panel.__init__(self, id=ID_SCALINGPANEL, |
2692 wx.Panel.__init__(self, id=ID_SCALINGPANEL, |
2631 name='ScalingPanel', parent=prnt, pos=wx.Point(0, 0), |
2693 name='ScalingPanel', parent=prnt, pos=wx.Point(0, 0), |
2632 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
2694 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
2633 |
2695 |
2634 self.staticText1 = wx.StaticText(id=ID_SCALINGPANELSTATICTEXT1, |
2696 self.staticText1 = wx.StaticText(id=ID_SCALINGPANELSTATICTEXT1, |
2635 label='X Scale:', name='staticText1', parent=self, |
2697 label=_('X Scale:'), name='staticText1', parent=self, |
2636 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
2698 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2637 |
2699 |
2638 self.XScale = wx.SpinCtrl(id=ID_SCALINGPANELXSCALE, |
2700 self.XScale = wx.SpinCtrl(id=ID_SCALINGPANELXSCALE, |
2639 name='XScale', parent=self, pos=wx.Point(0, 0), |
2701 name='XScale', parent=self, pos=wx.Point(0, 0), |
2640 size=wx.Size(0, 24), style=0, min=0, max=2**16) |
2702 size=wx.Size(0, 24), style=0, min=0, max=2**16) |
2641 |
2703 |
2642 self.staticText2 = wx.StaticText(id=ID_SCALINGPANELSTATICTEXT2, |
2704 self.staticText2 = wx.StaticText(id=ID_SCALINGPANELSTATICTEXT2, |
2643 label='Y Scale:', name='staticText2', parent=self, |
2705 label=_('Y Scale:'), name='staticText2', parent=self, |
2644 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
2706 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2645 |
2707 |
2646 self.YScale = wx.SpinCtrl(id=ID_SCALINGPANELYSCALE, |
2708 self.YScale = wx.SpinCtrl(id=ID_SCALINGPANELYSCALE, |
2647 name='YScale', parent=self, pos=wx.Point(0, 0), |
2709 name='YScale', parent=self, pos=wx.Point(0, 0), |
2648 size=wx.Size(0, 24), style=0, min=0, max=2**16) |
2710 size=wx.Size(0, 24), style=0, min=0, max=2**16) |
2649 |
2711 |
2694 def _init_coll_flexGridSizer1_Growables(self, parent): |
2756 def _init_coll_flexGridSizer1_Growables(self, parent): |
2695 parent.AddGrowableCol(0) |
2757 parent.AddGrowableCol(0) |
2696 parent.AddGrowableRow(0) |
2758 parent.AddGrowableRow(0) |
2697 |
2759 |
2698 def _init_coll_ProjectPanelSizer_Items(self, parent): |
2760 def _init_coll_ProjectPanelSizer_Items(self, parent): |
2699 parent.AddWindow(self.staticText1, 0, border=10, flag=wx.GROW|wx.TOP|wx.LEFT) |
2761 parent.AddWindow(self.staticText1, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT) |
2700 parent.AddWindow(self.ProjectName, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT) |
2762 parent.AddWindow(self.ProjectName, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT) |
2701 parent.AddWindow(self.staticText2, 0, border=10, flag=wx.GROW|wx.LEFT) |
2763 parent.AddWindow(self.staticText2, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT) |
2702 parent.AddWindow(self.ProjectVersion, 0, border=10, flag=wx.GROW|wx.RIGHT) |
2764 parent.AddWindow(self.ProjectVersion, 0, border=10, flag=wx.GROW|wx.RIGHT) |
2703 parent.AddWindow(self.staticText3, 0, border=10, flag=wx.GROW|wx.LEFT) |
2765 parent.AddWindow(self.staticText3, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT) |
2704 parent.AddWindow(self.ProductName, 0, border=10, flag=wx.GROW|wx.RIGHT) |
2766 parent.AddWindow(self.ProductName, 0, border=10, flag=wx.GROW|wx.RIGHT) |
2705 parent.AddWindow(self.staticText4, 0, border=10, flag=wx.GROW|wx.LEFT) |
2767 parent.AddWindow(self.staticText4, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT) |
2706 parent.AddWindow(self.ProductVersion, 0, border=10, flag=wx.GROW|wx.RIGHT) |
2768 parent.AddWindow(self.ProductVersion, 0, border=10, flag=wx.GROW|wx.RIGHT) |
2707 parent.AddWindow(self.staticText5, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT) |
2769 parent.AddWindow(self.staticText5, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.BOTTOM|wx.LEFT) |
2708 parent.AddWindow(self.ProductRelease, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT) |
2770 parent.AddWindow(self.ProductRelease, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT) |
2709 |
2771 |
2710 def _init_coll_ProjectPanelSizer_Growables(self, parent): |
2772 def _init_coll_ProjectPanelSizer_Growables(self, parent): |
2711 parent.AddGrowableCol(1) |
2773 parent.AddGrowableCol(1) |
2712 |
2774 |
2713 def _init_coll_AuthorPanelSizer_Items(self, parent): |
2775 def _init_coll_AuthorPanelSizer_Items(self, parent): |
2714 parent.AddWindow(self.staticText6, 0, border=10, flag=wx.GROW|wx.TOP|wx.LEFT) |
2776 parent.AddWindow(self.staticText6, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT) |
2715 parent.AddWindow(self.CompanyName, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT) |
2777 parent.AddWindow(self.CompanyName, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT) |
2716 parent.AddWindow(self.staticText7, 0, border=10, flag=wx.GROW|wx.LEFT) |
2778 parent.AddWindow(self.staticText7, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT) |
2717 parent.AddWindow(self.CompanyURL, 0, border=10, flag=wx.GROW|wx.RIGHT) |
2779 parent.AddWindow(self.CompanyURL, 0, border=10, flag=wx.GROW|wx.RIGHT) |
2718 parent.AddWindow(self.staticText8, 0, border=10, flag=wx.GROW|wx.LEFT) |
2780 parent.AddWindow(self.staticText8, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT) |
2719 parent.AddWindow(self.AuthorName, 0, border=10, flag=wx.GROW|wx.RIGHT) |
2781 parent.AddWindow(self.AuthorName, 0, border=10, flag=wx.GROW|wx.RIGHT) |
2720 parent.AddWindow(self.staticText9, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT) |
2782 parent.AddWindow(self.staticText9, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.BOTTOM|wx.LEFT) |
2721 parent.AddWindow(self.Organization, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT) |
2783 parent.AddWindow(self.Organization, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT) |
2722 |
2784 |
2723 def _init_coll_AuthorPanelSizer_Growables(self, parent): |
2785 def _init_coll_AuthorPanelSizer_Growables(self, parent): |
2724 parent.AddGrowableCol(1) |
2786 parent.AddGrowableCol(1) |
2725 |
2787 |
2726 def _init_coll_GraphicsPanelSizer_Items(self, parent): |
2788 def _init_coll_GraphicsPanelSizer_Items(self, parent): |
2727 parent.AddWindow(self.staticText12, 0, border=10, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT) |
2789 parent.AddWindow(self.staticText12, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT|wx.RIGHT) |
2728 parent.AddSizer(self.GraphicsPageSizeSizer, 0, border=10, flag=wx.GROW|wx.LEFT|wx.RIGHT) |
2790 parent.AddSizer(self.GraphicsPageSizeSizer, 0, border=10, flag=wx.GROW|wx.LEFT|wx.RIGHT) |
2729 parent.AddWindow(self.staticText15, 0, border=10, flag=wx.GROW|wx.LEFT|wx.RIGHT) |
2791 parent.AddWindow(self.staticText15, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT) |
2730 parent.AddWindow(self.ScalingNotebook, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
2792 parent.AddWindow(self.ScalingNotebook, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
2731 |
2793 |
2732 def _init_coll_GraphicsPanelSizer_Growables(self, parent): |
2794 def _init_coll_GraphicsPanelSizer_Growables(self, parent): |
2733 parent.AddGrowableCol(0) |
2795 parent.AddGrowableCol(0) |
2734 parent.AddGrowableRow(3) |
2796 parent.AddGrowableRow(3) |
2735 |
2797 |
2736 def _init_coll_GraphicsPageSizeSizer_Items(self, parent): |
2798 def _init_coll_GraphicsPageSizeSizer_Items(self, parent): |
2737 parent.AddWindow(self.staticText13, 0, border=12, flag=wx.GROW|wx.LEFT) |
2799 parent.AddWindow(self.staticText13, 0, border=12, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT) |
2738 parent.AddWindow(self.PageWidth, 0, border=0, flag=wx.GROW) |
2800 parent.AddWindow(self.PageWidth, 0, border=0, flag=wx.GROW) |
2739 parent.AddWindow(self.staticText14, 0, border=12, flag=wx.GROW|wx.LEFT) |
2801 parent.AddWindow(self.staticText14, 0, border=12, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT) |
2740 parent.AddWindow(self.PageHeight, 0, border=0, flag=wx.GROW) |
2802 parent.AddWindow(self.PageHeight, 0, border=0, flag=wx.GROW) |
2741 |
2803 |
2742 def _init_coll_GraphicsPageSizeSizer_Growables(self, parent): |
2804 def _init_coll_GraphicsPageSizeSizer_Growables(self, parent): |
2743 parent.AddGrowableCol(1) |
2805 parent.AddGrowableCol(1) |
2744 |
2806 |
2745 def _init_coll_MiscellaneousPanelSizer_Items(self, parent): |
2807 def _init_coll_MiscellaneousPanelSizer_Items(self, parent): |
2746 parent.AddWindow(self.staticText10, 0, border=10, flag=wx.GROW|wx.TOP|wx.LEFT) |
2808 parent.AddWindow(self.staticText10, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT) |
2747 parent.AddWindow(self.Language, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT) |
2809 parent.AddWindow(self.Language, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT) |
2748 parent.AddWindow(self.staticText11, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT) |
2810 parent.AddWindow(self.staticText11, 0, border=10, flag=wx.BOTTOM|wx.LEFT) |
2749 parent.AddWindow(self.ContentDescription, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT) |
2811 parent.AddWindow(self.ContentDescription, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT) |
2750 |
2812 |
2751 def _init_coll_MiscellaneousPanelSizer_Growables(self, parent): |
2813 def _init_coll_MiscellaneousPanelSizer_Growables(self, parent): |
2752 parent.AddGrowableCol(1) |
2814 parent.AddGrowableCol(1) |
2753 parent.AddGrowableRow(1) |
2815 parent.AddGrowableRow(1) |
2754 |
2816 |
2755 def _init_sizers(self): |
2817 def _init_sizers(self): |
2756 self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
2818 self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
2757 self.ProjectPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=5, vgap=15) |
2819 self.ProjectPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=5, vgap=15) |
2758 self.AuthorPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=4, vgap=15) |
2820 self.AuthorPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=4, vgap=15) |
2759 self.GraphicsPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=5) |
2821 self.GraphicsPanelSizer = wx.FlexGridSizer(cols=1, hgap=5, rows=4, vgap=5) |
2760 self.GraphicsPageSizeSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=5) |
2822 self.GraphicsPageSizeSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5) |
2761 self.MiscellaneousPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=15) |
2823 self.MiscellaneousPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=15) |
2762 |
2824 |
2763 self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) |
2825 self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) |
2764 self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) |
2826 self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) |
2765 self._init_coll_ProjectPanelSizer_Items(self.ProjectPanelSizer) |
2827 self._init_coll_ProjectPanelSizer_Items(self.ProjectPanelSizer) |
2766 self._init_coll_ProjectPanelSizer_Growables(self.ProjectPanelSizer) |
2828 self._init_coll_ProjectPanelSizer_Growables(self.ProjectPanelSizer) |
2781 |
2843 |
2782 def _init_ctrls(self, prnt): |
2844 def _init_ctrls(self, prnt): |
2783 wx.Dialog.__init__(self, id=ID_PROJECTDIALOG, |
2845 wx.Dialog.__init__(self, id=ID_PROJECTDIALOG, |
2784 name='ProjectDialog', parent=prnt, pos=wx.Point(376, 223), |
2846 name='ProjectDialog', parent=prnt, pos=wx.Point(376, 223), |
2785 size=wx.Size(500, 350), style=wx.DEFAULT_DIALOG_STYLE, |
2847 size=wx.Size(500, 350), style=wx.DEFAULT_DIALOG_STYLE, |
2786 title='Project properties') |
2848 title=_('Project properties')) |
2787 self.SetClientSize(wx.Size(500, 350)) |
2849 self.SetClientSize(wx.Size(500, 350)) |
2788 |
2850 |
2789 self.MainNotebook = wx.Notebook(id=ID_PROJECTDIALOGMAINNOTEBOOK, |
2851 self.MainNotebook = wx.Notebook(id=ID_PROJECTDIALOGMAINNOTEBOOK, |
2790 name='MainNotebook', parent=self, pos=wx.Point(0, |
2852 name='MainNotebook', parent=self, pos=wx.Point(0, |
2791 0), size=wx.Size(0, 0), style=0) |
2853 0), size=wx.Size(0, 0), style=0) |
2795 self.ProjectPanel = wx.Panel(id=ID_PROJECTDIALOGPROJECTPANEL, |
2857 self.ProjectPanel = wx.Panel(id=ID_PROJECTDIALOGPROJECTPANEL, |
2796 name='ProjectPanel', parent=self.MainNotebook, pos=wx.Point(0, 0), |
2858 name='ProjectPanel', parent=self.MainNotebook, pos=wx.Point(0, 0), |
2797 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
2859 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
2798 |
2860 |
2799 self.staticText1 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT1, |
2861 self.staticText1 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT1, |
2800 label='Project Name (required):', name='staticText1', parent=self.ProjectPanel, |
2862 label=_('Project Name (required):'), name='staticText1', parent=self.ProjectPanel, |
2801 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2863 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2802 |
2864 |
2803 self.ProjectName = wx.TextCtrl(id=ID_PROJECTDIALOGPROJECTNAME, |
2865 self.ProjectName = wx.TextCtrl(id=ID_PROJECTDIALOGPROJECTNAME, |
2804 name='ProjectName', parent=self.ProjectPanel, pos=wx.Point(0, 0), |
2866 name='ProjectName', parent=self.ProjectPanel, pos=wx.Point(0, 0), |
2805 size=wx.Size(0, 24), style=0) |
2867 size=wx.Size(0, 24), style=0) |
2806 |
2868 |
2807 self.staticText2 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT2, |
2869 self.staticText2 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT2, |
2808 label='Project Version (optional):', name='staticText2', parent=self.ProjectPanel, |
2870 label=_('Project Version (optional):'), name='staticText2', parent=self.ProjectPanel, |
2809 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2871 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2810 |
2872 |
2811 self.ProjectVersion = wx.TextCtrl(id=ID_PROJECTDIALOGPROJECTVERSION, |
2873 self.ProjectVersion = wx.TextCtrl(id=ID_PROJECTDIALOGPROJECTVERSION, |
2812 name='ProjectVersion', parent=self.ProjectPanel, pos=wx.Point(0, 0), |
2874 name='ProjectVersion', parent=self.ProjectPanel, pos=wx.Point(0, 0), |
2813 size=wx.Size(0, 24), style=0) |
2875 size=wx.Size(0, 24), style=0) |
2814 |
2876 |
2815 self.staticText3 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT3, |
2877 self.staticText3 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT3, |
2816 label='Product Name (required):', name='staticText3', parent=self.ProjectPanel, |
2878 label=_('Product Name (required):'), name='staticText3', parent=self.ProjectPanel, |
2817 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2879 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2818 |
2880 |
2819 self.ProductName = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTNAME, |
2881 self.ProductName = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTNAME, |
2820 name='ProductName', parent=self.ProjectPanel, pos=wx.Point(0, 0), |
2882 name='ProductName', parent=self.ProjectPanel, pos=wx.Point(0, 0), |
2821 size=wx.Size(0, 24), style=0) |
2883 size=wx.Size(0, 24), style=0) |
2822 |
2884 |
2823 self.staticText4 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT4, |
2885 self.staticText4 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT4, |
2824 label='Product Version (required):', name='staticText4', parent=self.ProjectPanel, |
2886 label=_('Product Version (required):'), name='staticText4', parent=self.ProjectPanel, |
2825 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2887 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2826 |
2888 |
2827 self.ProductVersion = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTVERSION, |
2889 self.ProductVersion = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTVERSION, |
2828 name='ProductVersion', parent=self.ProjectPanel, pos=wx.Point(0, 0), |
2890 name='ProductVersion', parent=self.ProjectPanel, pos=wx.Point(0, 0), |
2829 size=wx.Size(0, 24), style=0) |
2891 size=wx.Size(0, 24), style=0) |
2830 |
2892 |
2831 self.staticText5 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT5, |
2893 self.staticText5 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT5, |
2832 label='Product Release (optional):', name='staticText5', parent=self.ProjectPanel, |
2894 label=_('Product Release (optional):'), name='staticText5', parent=self.ProjectPanel, |
2833 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2895 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2834 |
2896 |
2835 self.ProductRelease = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTRELEASE, |
2897 self.ProductRelease = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTRELEASE, |
2836 name='ProductRelease', parent=self.ProjectPanel, pos=wx.Point(0, 0), |
2898 name='ProductRelease', parent=self.ProjectPanel, pos=wx.Point(0, 0), |
2837 size=wx.Size(0, 24), style=0) |
2899 size=wx.Size(0, 24), style=0) |
2838 |
2900 |
2839 self.MainNotebook.AddPage(self.ProjectPanel, "Project") |
2901 self.MainNotebook.AddPage(self.ProjectPanel, _("Project")) |
2840 |
2902 |
2841 # Author Panel elements |
2903 # Author Panel elements |
2842 |
2904 |
2843 self.AuthorPanel = wx.Panel(id=ID_PROJECTDIALOGAUTHORPANEL, |
2905 self.AuthorPanel = wx.Panel(id=ID_PROJECTDIALOGAUTHORPANEL, |
2844 name='AuthorPanel', parent=self.MainNotebook, pos=wx.Point(0, 0), |
2906 name='AuthorPanel', parent=self.MainNotebook, pos=wx.Point(0, 0), |
2845 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
2907 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
2846 |
2908 |
2847 self.staticText6 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT6, |
2909 self.staticText6 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT6, |
2848 label='Company Name (required):', name='staticText6', parent=self.AuthorPanel, |
2910 label=_('Company Name (required):'), name='staticText6', parent=self.AuthorPanel, |
2849 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2911 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2850 |
2912 |
2851 self.CompanyName = wx.TextCtrl(id=ID_PROJECTDIALOGCOMPANYNAME, |
2913 self.CompanyName = wx.TextCtrl(id=ID_PROJECTDIALOGCOMPANYNAME, |
2852 name='CompanyName', parent=self.AuthorPanel, pos=wx.Point(0, 0), |
2914 name='CompanyName', parent=self.AuthorPanel, pos=wx.Point(0, 0), |
2853 size=wx.Size(0, 24), style=0) |
2915 size=wx.Size(0, 24), style=0) |
2854 |
2916 |
2855 self.staticText7 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT7, |
2917 self.staticText7 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT7, |
2856 label='Company URL (optional):', name='staticText7', parent=self.AuthorPanel, |
2918 label=_('Company URL (optional):'), name='staticText7', parent=self.AuthorPanel, |
2857 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2919 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2858 |
2920 |
2859 self.CompanyURL = wx.TextCtrl(id=ID_PROJECTDIALOGCOMPANYURL, |
2921 self.CompanyURL = wx.TextCtrl(id=ID_PROJECTDIALOGCOMPANYURL, |
2860 name='CompanyURL', parent=self.AuthorPanel, pos=wx.Point(0, 0), |
2922 name='CompanyURL', parent=self.AuthorPanel, pos=wx.Point(0, 0), |
2861 size=wx.Size(0, 24), style=0) |
2923 size=wx.Size(0, 24), style=0) |
2862 |
2924 |
2863 self.staticText8 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT8, |
2925 self.staticText8 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT8, |
2864 label='Author Name (optional):', name='staticText8', parent=self.AuthorPanel, |
2926 label=_('Author Name (optional):'), name='staticText8', parent=self.AuthorPanel, |
2865 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2927 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2866 |
2928 |
2867 self.AuthorName = wx.TextCtrl(id=ID_PROJECTDIALOGAUTHORNAME, |
2929 self.AuthorName = wx.TextCtrl(id=ID_PROJECTDIALOGAUTHORNAME, |
2868 name='AuthorName', parent=self.AuthorPanel, pos=wx.Point(0, 0), |
2930 name='AuthorName', parent=self.AuthorPanel, pos=wx.Point(0, 0), |
2869 size=wx.Size(0, 24), style=0) |
2931 size=wx.Size(0, 24), style=0) |
2870 |
2932 |
2871 self.staticText9 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT9, |
2933 self.staticText9 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT9, |
2872 label='Organization (optional):', name='staticText9', parent=self.AuthorPanel, |
2934 label=_('Organization (optional):'), name='staticText9', parent=self.AuthorPanel, |
2873 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2935 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2874 |
2936 |
2875 self.Organization = wx.TextCtrl(id=ID_PROJECTDIALOGORGANIZATION, |
2937 self.Organization = wx.TextCtrl(id=ID_PROJECTDIALOGORGANIZATION, |
2876 name='Organization', parent=self.AuthorPanel, pos=wx.Point(0, 0), |
2938 name='Organization', parent=self.AuthorPanel, pos=wx.Point(0, 0), |
2877 size=wx.Size(0, 24), style=0) |
2939 size=wx.Size(0, 24), style=0) |
2878 |
2940 |
2879 self.MainNotebook.AddPage(self.AuthorPanel, "Author") |
2941 self.MainNotebook.AddPage(self.AuthorPanel, _("Author")) |
2880 |
2942 |
2881 # Graphics Panel elements |
2943 # Graphics Panel elements |
2882 |
2944 |
2883 self.GraphicsPanel = wx.Panel(id=ID_PROJECTDIALOGGRAPHICSPANEL, |
2945 self.GraphicsPanel = wx.Panel(id=ID_PROJECTDIALOGGRAPHICSPANEL, |
2884 name='GraphicsPanel', parent=self.MainNotebook, pos=wx.Point(0, 0), |
2946 name='GraphicsPanel', parent=self.MainNotebook, pos=wx.Point(0, 0), |
2885 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
2947 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
2886 |
2948 |
2887 self.staticText12 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT12, |
2949 self.staticText12 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT12, |
2888 label='Page Size (optional):', name='staticText12', parent=self.GraphicsPanel, |
2950 label=_('Page Size (optional):'), name='staticText12', parent=self.GraphicsPanel, |
2889 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2951 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2890 |
2952 |
2891 self.staticText13 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT13, |
2953 self.staticText13 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT13, |
2892 label='Width:', name='staticText13', parent=self.GraphicsPanel, |
2954 label=_('Width:'), name='staticText13', parent=self.GraphicsPanel, |
2893 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
2955 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2894 |
2956 |
2895 self.PageWidth = wx.SpinCtrl(id=ID_PROJECTDIALOGPAGEWIDTH, |
2957 self.PageWidth = wx.SpinCtrl(id=ID_PROJECTDIALOGPAGEWIDTH, |
2896 name='PageWidth', parent=self.GraphicsPanel, pos=wx.Point(0, 0), |
2958 name='PageWidth', parent=self.GraphicsPanel, pos=wx.Point(0, 0), |
2897 size=wx.Size(0, 24), style=0, min=0, max=2**16) |
2959 size=wx.Size(0, 24), style=0, min=0, max=2**16) |
2898 |
2960 |
2899 self.staticText14 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT14, |
2961 self.staticText14 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT14, |
2900 label='Height:', name='staticText14', parent=self.GraphicsPanel, |
2962 label=_('Height:'), name='staticText14', parent=self.GraphicsPanel, |
2901 pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0) |
2963 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2902 |
2964 |
2903 self.PageHeight = wx.SpinCtrl(id=ID_PROJECTDIALOGPAGEHEIGHT, |
2965 self.PageHeight = wx.SpinCtrl(id=ID_PROJECTDIALOGPAGEHEIGHT, |
2904 name='PageHeight', parent=self.GraphicsPanel, pos=wx.Point(0, 0), |
2966 name='PageHeight', parent=self.GraphicsPanel, pos=wx.Point(0, 0), |
2905 size=wx.Size(0, 24), style=0, min=0, max=2**16) |
2967 size=wx.Size(0, 24), style=0, min=0, max=2**16) |
2906 |
2968 |
2907 self.staticText15 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT15, |
2969 self.staticText15 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT15, |
2908 label='Scaling:', name='staticText15', parent=self.GraphicsPanel, |
2970 label=_('Scaling:'), name='staticText15', parent=self.GraphicsPanel, |
2909 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2971 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2910 |
2972 |
2911 self.ScalingNotebook = wx.Notebook(id=ID_PROJECTDIALOGSCALINGNOTEBOOK, |
2973 self.ScalingNotebook = wx.Notebook(id=ID_PROJECTDIALOGSCALINGNOTEBOOK, |
2912 name='ScalingNotebook', parent=self.GraphicsPanel, pos=wx.Point(0, |
2974 name='ScalingNotebook', parent=self.GraphicsPanel, pos=wx.Point(0, |
2913 0), size=wx.Size(0, 0), style=0) |
2975 0), size=wx.Size(0, 0), style=0) |
2914 |
2976 |
2915 self.Scalings = {} |
2977 self.Scalings = {} |
2916 for language in ["FBD", "LD", "SFC"]: |
2978 for language, translation in [("FBD",_("FBD")), ("LD",_("LD")), ("SFC",_("SFC"))]: |
2917 window = ScalingPanel(self.ScalingNotebook) |
2979 window = ScalingPanel(self.ScalingNotebook) |
2918 self.Scalings[language] = window |
2980 self.Scalings[language] = window |
2919 self.ScalingNotebook.AddPage(window, language) |
2981 self.ScalingNotebook.AddPage(window, translation) |
2920 |
2982 |
2921 self.MainNotebook.AddPage(self.GraphicsPanel, "Graphics") |
2983 self.MainNotebook.AddPage(self.GraphicsPanel, _("Graphics")) |
2922 |
2984 |
2923 # Miscellaneous Panel elements |
2985 # Miscellaneous Panel elements |
2924 |
2986 |
2925 self.MiscellaneousPanel = wx.Panel(id=ID_PROJECTDIALOGMISCELLANEOUSPANEL, |
2987 self.MiscellaneousPanel = wx.Panel(id=ID_PROJECTDIALOGMISCELLANEOUSPANEL, |
2926 name='MiscellaneousPanel', parent=self.MainNotebook, pos=wx.Point(0, 0), |
2988 name='MiscellaneousPanel', parent=self.MainNotebook, pos=wx.Point(0, 0), |
2927 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
2989 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
2928 |
2990 |
2929 self.staticText10 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT10, |
2991 self.staticText10 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT10, |
2930 label='Language (optional):', name='staticText10', parent=self.MiscellaneousPanel, |
2992 label=_('Language (optional):'), name='staticText10', parent=self.MiscellaneousPanel, |
2931 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
2993 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2932 |
2994 |
2933 self.Language = wx.ComboBox(id=ID_PROJECTDIALOGLANGUAGE, |
2995 self.Language = wx.ComboBox(id=ID_PROJECTDIALOGLANGUAGE, |
2934 name='Language', parent=self.MiscellaneousPanel, pos=wx.Point(0, 0), |
2996 name='Language', parent=self.MiscellaneousPanel, pos=wx.Point(0, 0), |
2935 size=wx.Size(0, 28), style=wx.CB_READONLY) |
2997 size=wx.Size(0, 28), style=wx.CB_READONLY) |
2936 |
2998 |
2937 self.staticText11 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT11, |
2999 self.staticText11 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT11, |
2938 label='Content Description (optional):', name='staticText11', parent=self.MiscellaneousPanel, |
3000 label=_('Content Description (optional):'), name='staticText11', parent=self.MiscellaneousPanel, |
2939 pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0) |
3001 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
2940 |
3002 |
2941 self.ContentDescription = wx.TextCtrl(id=ID_PROJECTDIALOGCONTENTDESCRIPTION, |
3003 self.ContentDescription = wx.TextCtrl(id=ID_PROJECTDIALOGCONTENTDESCRIPTION, |
2942 name='ContentDescription', parent=self.MiscellaneousPanel, pos=wx.Point(0, 0), |
3004 name='ContentDescription', parent=self.MiscellaneousPanel, pos=wx.Point(0, 0), |
2943 size=wx.Size(0, 24), style=wx.TE_MULTILINE) |
3005 size=wx.Size(0, 24), style=wx.TE_MULTILINE) |
2944 |
3006 |
2945 self.MainNotebook.AddPage(self.MiscellaneousPanel, "Miscellaneous") |
3007 self.MainNotebook.AddPage(self.MiscellaneousPanel, _("Miscellaneous")) |
2946 |
3008 |
2947 self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE) |
3009 self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE) |
2948 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId()) |
3010 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId()) |
2949 |
3011 |
2950 self._init_sizers() |
3012 self._init_sizers() |
2951 |
3013 |
2952 def __init__(self, parent): |
3014 def __init__(self, parent): |
2953 self._init_ctrls(parent) |
3015 self._init_ctrls(parent) |
2954 |
3016 |
2955 languages = ["", "en-US", "fr-FR"] |
3017 languages = ["", "en-US", "fr-FR", "zh-CN"] |
2956 |
3018 |
2957 for language in languages: |
3019 for language in languages: |
2958 self.Language.Append(language) |
3020 self.Language.Append(language) |
2959 |
3021 |
2960 def OnOK(self, event): |
3022 def OnOK(self, event): |
2974 text += item |
3036 text += item |
2975 elif i == len(error) - 1: |
3037 elif i == len(error) - 1: |
2976 text += " and %s"%item |
3038 text += " and %s"%item |
2977 else: |
3039 else: |
2978 text += ", %s"%item |
3040 text += ", %s"%item |
2979 message = wx.MessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wx.OK|wx.ICON_ERROR) |
3041 message = wx.MessageDialog(self, _("Form isn't complete. %s must be filled!")%text, _("Error"), wx.OK|wx.ICON_ERROR) |
2980 message.ShowModal() |
3042 message.ShowModal() |
2981 message.Destroy() |
3043 message.Destroy() |
2982 else: |
3044 else: |
2983 self.EndModal(wx.ID_OK) |
3045 self.EndModal(wx.ID_OK) |
2984 |
3046 |
3051 if id is not None: |
3113 if id is not None: |
3052 event(self, id, function) |
3114 event(self, id, function) |
3053 else: |
3115 else: |
3054 event(self, function) |
3116 event(self, function) |
3055 |
3117 |
3056 def __init__(self, parent, message, caption = "Please enter text", defaultValue = "", |
3118 def __init__(self, parent, message, caption = _("Please enter text"), defaultValue = "", |
3057 style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition): |
3119 style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition): |
3058 wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos) |
3120 wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos) |
3059 |
3121 |
3060 self.DataTypeNames = [] |
3122 self.DataTypeNames = [] |
3061 if wx.VERSION >= (2, 8, 0): |
3123 if wx.VERSION >= (2, 8, 0): |
3066 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId()) |
3128 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId()) |
3067 |
3129 |
3068 def OnOK(self, event): |
3130 def OnOK(self, event): |
3069 datatype_name = self.GetSizer().GetItem(1).GetWindow().GetValue() |
3131 datatype_name = self.GetSizer().GetItem(1).GetWindow().GetValue() |
3070 if datatype_name == "": |
3132 if datatype_name == "": |
3071 message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR) |
3133 message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR) |
3072 message.ShowModal() |
3134 message.ShowModal() |
3073 message.Destroy() |
3135 message.Destroy() |
3074 elif not TestIdentifier(datatype_name): |
3136 elif not TestIdentifier(datatype_name): |
3075 message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR) |
3137 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%datatype_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3076 message.ShowModal() |
3138 message.ShowModal() |
3077 message.Destroy() |
3139 message.Destroy() |
3078 elif datatype_name.upper() in IEC_KEYWORDS: |
3140 elif datatype_name.upper() in IEC_KEYWORDS: |
3079 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR) |
3141 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%datatype_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3080 message.ShowModal() |
3142 message.ShowModal() |
3081 message.Destroy() |
3143 message.Destroy() |
3082 elif datatype_name.upper() in self.DataTypeNames: |
3144 elif datatype_name.upper() in self.DataTypeNames: |
3083 message = wx.MessageDialog(self, "\"%s\" data type already exists!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR) |
3145 message = wx.MessageDialog(self, _("\"%s\" data type already exists!")%datatype_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3084 message.ShowModal() |
3146 message.ShowModal() |
3085 message.Destroy() |
3147 message.Destroy() |
3086 else: |
3148 else: |
3087 self.EndModal(wx.ID_OK) |
3149 self.EndModal(wx.ID_OK) |
3088 |
3150 |
3098 |
3160 |
3099 [ID_POUDIALOG, ID_POUDIALOGPOUNAME, |
3161 [ID_POUDIALOG, ID_POUDIALOGPOUNAME, |
3100 ID_POUDIALOGPOUTYPE, ID_POUDIALOGLANGUAGE, ID_POUDIALOGSTATICTEXT1, |
3162 ID_POUDIALOGPOUTYPE, ID_POUDIALOGLANGUAGE, ID_POUDIALOGSTATICTEXT1, |
3101 ID_POUDIALOGSTATICTEXT2, ID_POUDIALOGSTATICTEXT3, |
3163 ID_POUDIALOGSTATICTEXT2, ID_POUDIALOGSTATICTEXT3, |
3102 ] = [wx.NewId() for _init_ctrls in range(7)] |
3164 ] = [wx.NewId() for _init_ctrls in range(7)] |
3165 |
|
3166 def GetTransitionLanguages(): |
|
3167 _ = lambda x : x |
|
3168 return [_("IL"), _("ST"), _("LD"), _("FBD")] |
|
3169 TRANSITION_LANGUAGES_DICT = dict([(_(language), language) for language in GetTransitionLanguages()]) |
|
3170 |
|
3171 def GetPouTypes(): |
|
3172 _ = lambda x : x |
|
3173 return [_("function"), _("functionBlock"), _("program")] |
|
3174 POU_TYPES_DICT = dict([(_(pou_type), pou_type) for pou_type in GetPouTypes()]) |
|
3175 |
|
3176 def GetPouLanguages(): |
|
3177 _ = lambda x : x |
|
3178 return [_("IL"), _("ST"), _("LD"), _("FBD"), _("SFC")] |
|
3179 POU_LANGUAGES_DICT = dict([(_(language), language) for language in GetPouLanguages()]) |
|
3103 |
3180 |
3104 class PouDialog(wx.Dialog): |
3181 class PouDialog(wx.Dialog): |
3105 if wx.VERSION < (2, 6, 0): |
3182 if wx.VERSION < (2, 6, 0): |
3106 def Bind(self, event, function, id = None): |
3183 def Bind(self, event, function, id = None): |
3107 if id is not None: |
3184 if id is not None: |
3116 def _init_coll_flexGridSizer1_Growables(self, parent): |
3193 def _init_coll_flexGridSizer1_Growables(self, parent): |
3117 parent.AddGrowableCol(0) |
3194 parent.AddGrowableCol(0) |
3118 parent.AddGrowableRow(0) |
3195 parent.AddGrowableRow(0) |
3119 |
3196 |
3120 def _init_coll_MainSizer_Items(self, parent): |
3197 def _init_coll_MainSizer_Items(self, parent): |
3121 parent.AddWindow(self.staticText1, 0, border=4, flag=wx.GROW|wx.TOP) |
3198 parent.AddWindow(self.staticText1, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
3122 parent.AddWindow(self.PouName, 0, border=0, flag=wx.GROW) |
3199 parent.AddWindow(self.PouName, 0, border=0, flag=wx.GROW) |
3123 parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP) |
3200 parent.AddWindow(self.staticText2, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
3124 parent.AddWindow(self.PouType, 0, border=0, flag=wx.GROW) |
3201 parent.AddWindow(self.PouType, 0, border=0, flag=wx.GROW) |
3125 parent.AddWindow(self.staticText3, 0, border=4, flag=wx.GROW|wx.TOP) |
3202 parent.AddWindow(self.staticText3, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
3126 parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW) |
3203 parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW) |
3127 |
3204 |
3128 def _init_coll_MainSizer_Growables(self, parent): |
3205 def _init_coll_MainSizer_Growables(self, parent): |
3129 parent.AddGrowableCol(1) |
3206 parent.AddGrowableCol(1) |
3130 |
3207 |
3131 def _init_sizers(self): |
3208 def _init_sizers(self): |
3132 self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
3209 self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
3133 self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=3, vgap=15) |
3210 self.MainSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=3, vgap=15) |
3134 |
3211 |
3135 self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) |
3212 self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) |
3136 self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) |
3213 self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) |
3137 self._init_coll_MainSizer_Items(self.MainSizer) |
3214 self._init_coll_MainSizer_Items(self.MainSizer) |
3138 self._init_coll_MainSizer_Growables(self.MainSizer) |
3215 self._init_coll_MainSizer_Growables(self.MainSizer) |
3141 |
3218 |
3142 def _init_ctrls(self, prnt): |
3219 def _init_ctrls(self, prnt): |
3143 wx.Dialog.__init__(self, id=ID_POUDIALOG, |
3220 wx.Dialog.__init__(self, id=ID_POUDIALOG, |
3144 name='PouDialog', parent=prnt, pos=wx.Point(376, 223), |
3221 name='PouDialog', parent=prnt, pos=wx.Point(376, 223), |
3145 size=wx.Size(300, 200), style=wx.DEFAULT_DIALOG_STYLE, |
3222 size=wx.Size(300, 200), style=wx.DEFAULT_DIALOG_STYLE, |
3146 title='Create a new POU') |
3223 title=_('Create a new POU')) |
3147 self.SetClientSize(wx.Size(300, 200)) |
3224 self.SetClientSize(wx.Size(300, 200)) |
3148 |
3225 |
3149 self.staticText1 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT1, |
3226 self.staticText1 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT1, |
3150 label='POU Name:', name='staticText1', parent=self, |
3227 label=_('POU Name:'), name='staticText1', parent=self, |
3151 pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0) |
3228 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
3152 |
3229 |
3153 self.PouName = wx.TextCtrl(id=ID_POUDIALOGPOUNAME, |
3230 self.PouName = wx.TextCtrl(id=ID_POUDIALOGPOUNAME, |
3154 name='POUName', parent=self, pos=wx.Point(0, 0), |
3231 name='POUName', parent=self, pos=wx.Point(0, 0), |
3155 size=wx.Size(0, 24), style=0) |
3232 size=wx.Size(0, 24), style=0) |
3156 |
3233 |
3157 self.staticText2 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT2, |
3234 self.staticText2 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT2, |
3158 label='POU Type:', name='staticText2', parent=self, |
3235 label=_('POU Type:'), name='staticText2', parent=self, |
3159 pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0) |
3236 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
3160 |
3237 |
3161 self.PouType = wx.ComboBox(id=ID_POUDIALOGPOUTYPE, |
3238 self.PouType = wx.ComboBox(id=ID_POUDIALOGPOUTYPE, |
3162 name='POUType', parent=self, pos=wx.Point(0, 0), |
3239 name='POUType', parent=self, pos=wx.Point(0, 0), |
3163 size=wx.Size(0, 28), style=wx.CB_READONLY) |
3240 size=wx.Size(0, 28), style=wx.CB_READONLY) |
3164 self.Bind(wx.EVT_COMBOBOX, self.OnTypeChanged, id=ID_POUDIALOGPOUTYPE) |
3241 self.Bind(wx.EVT_COMBOBOX, self.OnTypeChanged, id=ID_POUDIALOGPOUTYPE) |
3165 |
3242 |
3166 self.staticText3 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT3, |
3243 self.staticText3 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT3, |
3167 label='Language:', name='staticText3', parent=self, |
3244 label=_('Language:'), name='staticText3', parent=self, |
3168 pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0) |
3245 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
3169 |
3246 |
3170 self.Language = wx.ComboBox(id=ID_POUDIALOGLANGUAGE, |
3247 self.Language = wx.ComboBox(id=ID_POUDIALOGLANGUAGE, |
3171 name='Language', parent=self, pos=wx.Point(0, 0), |
3248 name='Language', parent=self, pos=wx.Point(0, 0), |
3172 size=wx.Size(0, 28), style=wx.CB_READONLY) |
3249 size=wx.Size(0, 28), style=wx.CB_READONLY) |
3173 |
3250 |
3177 self._init_sizers() |
3254 self._init_sizers() |
3178 |
3255 |
3179 def __init__(self, parent, pou_type = None): |
3256 def __init__(self, parent, pou_type = None): |
3180 self._init_ctrls(parent) |
3257 self._init_ctrls(parent) |
3181 |
3258 |
3182 for option in ["function", "functionBlock", "program"]: |
3259 for option in GetPouTypes(): |
3183 self.PouType.Append(option) |
3260 self.PouType.Append(_(option)) |
3184 if pou_type is not None: |
3261 if pou_type is not None: |
3185 self.PouType.SetStringSelection(pou_type) |
3262 self.PouType.SetStringSelection(_(pou_type)) |
3186 self.RefreshLanguage() |
3263 self.RefreshLanguage() |
3187 |
3264 |
3188 self.PouNames = [] |
3265 self.PouNames = [] |
3189 self.PouElementNames = [] |
3266 self.PouElementNames = [] |
3190 |
3267 |
3191 def OnOK(self, event): |
3268 def OnOK(self, event): |
3192 error = [] |
3269 error = [] |
3193 pou_name = self.PouName.GetValue() |
3270 pou_name = self.PouName.GetValue() |
3194 if pou_name == "": |
3271 if pou_name == "": |
3195 error.append("POU Name") |
3272 error.append(_("POU Name")) |
3196 if self.PouType.GetStringSelection() == "": |
3273 if self.PouType.GetSelection() == -1: |
3197 error.append("POU Type") |
3274 error.append(_("POU Type")) |
3198 if self.Language.GetStringSelection() == "": |
3275 if self.Language.GetSelection() == -1: |
3199 error.append("Language") |
3276 error.append(_("Language")) |
3200 if len(error) > 0: |
3277 if len(error) > 0: |
3201 text = "" |
3278 text = "" |
3202 for i, item in enumerate(error): |
3279 for i, item in enumerate(error): |
3203 if i == 0: |
3280 if i == 0: |
3204 text += item |
3281 text += item |
3205 elif i == len(error) - 1: |
3282 elif i == len(error) - 1: |
3206 text += " and %s"%item |
3283 text += _(" and %s")%item |
3207 else: |
3284 else: |
3208 text += ", %s"%item |
3285 text += _(", %s")%item |
3209 message = wx.MessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wx.OK|wx.ICON_ERROR) |
3286 message = wx.MessageDialog(self, _("Form isn't complete. %s must be filled!")%text, _("Error"), wx.OK|wx.ICON_ERROR) |
3210 message.ShowModal() |
3287 message.ShowModal() |
3211 message.Destroy() |
3288 message.Destroy() |
3212 elif not TestIdentifier(pou_name): |
3289 elif not TestIdentifier(pou_name): |
3213 message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%pou_name, "Error", wx.OK|wx.ICON_ERROR) |
3290 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%pou_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3214 message.ShowModal() |
3291 message.ShowModal() |
3215 message.Destroy() |
3292 message.Destroy() |
3216 elif pou_name.upper() in IEC_KEYWORDS: |
3293 elif pou_name.upper() in IEC_KEYWORDS: |
3217 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%pou_name, "Error", wx.OK|wx.ICON_ERROR) |
3294 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%pou_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3218 message.ShowModal() |
3295 message.ShowModal() |
3219 message.Destroy() |
3296 message.Destroy() |
3220 elif pou_name.upper() in self.PouNames: |
3297 elif pou_name.upper() in self.PouNames: |
3221 message = wx.MessageDialog(self, "\"%s\" pou already exists!"%pou_name, "Error", wx.OK|wx.ICON_ERROR) |
3298 message = wx.MessageDialog(self, _("\"%s\" pou already exists!")%pou_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3222 message.ShowModal() |
3299 message.ShowModal() |
3223 message.Destroy() |
3300 message.Destroy() |
3224 elif pou_name.upper() in self.PouElementNames: |
3301 elif pou_name.upper() in self.PouElementNames: |
3225 message = wx.MessageDialog(self, "A pou has an element with \"%s\" for name. It can generate a conflict. Do you wish to continue?"%pou_name, "Warning", wx.YES_NO|wx.ICON_EXCLAMATION) |
3302 message = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%pou_name, _("Warning"), wx.YES_NO|wx.ICON_EXCLAMATION) |
3226 result = message.ShowModal() |
3303 result = message.ShowModal() |
3227 message.Destroy() |
3304 message.Destroy() |
3228 if result == wx.ID_YES: |
3305 if result == wx.ID_YES: |
3229 self.EndModal(wx.ID_OK) |
3306 self.EndModal(wx.ID_OK) |
3230 else: |
3307 else: |
3231 self.EndModal(wx.ID_OK) |
3308 self.EndModal(wx.ID_OK) |
3232 |
3309 |
3233 def RefreshLanguage(self): |
3310 def RefreshLanguage(self): |
3234 selection = self.Language.GetStringSelection() |
3311 selection = POU_LANGUAGES_DICT.get(self.Language.GetStringSelection(), "") |
3235 self.Language.Clear() |
3312 self.Language.Clear() |
3236 for option in ["IL","ST","LD","FBD","SFC"]: |
3313 for language in GetPouLanguages(): |
3237 if option != "SFC" or self.PouType.GetStringSelection() != "function": |
3314 if language != "SFC" or POU_TYPES_DICT[self.PouType.GetStringSelection()] != "function": |
3238 self.Language.Append(option) |
3315 self.Language.Append(language) |
3239 if self.Language.FindString(selection) != wx.NOT_FOUND: |
3316 if self.Language.FindString(_(selection)) != wx.NOT_FOUND: |
3240 self.Language.SetStringSelection(selection) |
3317 self.Language.SetStringSelection(_(selection)) |
3241 |
3318 |
3242 def OnTypeChanged(self, event): |
3319 def OnTypeChanged(self, event): |
3243 self.RefreshLanguage() |
3320 self.RefreshLanguage() |
3244 event.Skip() |
3321 event.Skip() |
3245 |
3322 |
3252 def SetValues(self, values): |
3329 def SetValues(self, values): |
3253 for item, value in values.items(): |
3330 for item, value in values.items(): |
3254 if item == "pouName": |
3331 if item == "pouName": |
3255 self.PouName.SetValue(value) |
3332 self.PouName.SetValue(value) |
3256 elif item == "pouType": |
3333 elif item == "pouType": |
3257 self.PouType.SetStringSelection(value) |
3334 self.PouType.SetStringSelection(_(value)) |
3258 elif item == "language": |
3335 elif item == "language": |
3259 self.Language.SetStringSelection(value) |
3336 self.Language.SetStringSelection(_(POU_LANGUAGES_DICT)) |
3260 |
3337 |
3261 def GetValues(self): |
3338 def GetValues(self): |
3262 values = {} |
3339 values = {} |
3263 values["pouName"] = self.PouName.GetValue() |
3340 values["pouName"] = self.PouName.GetValue() |
3264 values["pouType"] = self.PouType.GetStringSelection() |
3341 values["pouType"] = POU_TYPES_DICT[self.PouType.GetStringSelection()] |
3265 values["language"] = self.Language.GetStringSelection() |
3342 values["language"] = POU_LANGUAGES_DICT[self.Language.GetStringSelection()] |
3266 return values |
3343 return values |
3267 |
3344 |
3268 |
3345 |
3269 #------------------------------------------------------------------------------- |
3346 #------------------------------------------------------------------------------- |
3270 # Create Pou Transition Dialog |
3347 # Create Pou Transition Dialog |
3272 |
3349 |
3273 [ID_POUTRANSITIONDIALOG, ID_POUTRANSITIONDIALOGTRANSITIONNAME, |
3350 [ID_POUTRANSITIONDIALOG, ID_POUTRANSITIONDIALOGTRANSITIONNAME, |
3274 ID_POUTRANSITIONDIALOGLANGUAGE, ID_POUTRANSITIONDIALOGSTATICTEXT1, |
3351 ID_POUTRANSITIONDIALOGLANGUAGE, ID_POUTRANSITIONDIALOGSTATICTEXT1, |
3275 ID_POUTRANSITIONDIALOGSTATICTEXT2, |
3352 ID_POUTRANSITIONDIALOGSTATICTEXT2, |
3276 ] = [wx.NewId() for _init_ctrls in range(5)] |
3353 ] = [wx.NewId() for _init_ctrls in range(5)] |
3354 |
|
3355 def GetTransitionLanguages(): |
|
3356 _ = lambda x : x |
|
3357 return [_("IL"), _("ST"), _("LD"), _("FBD")] |
|
3358 TRANSITION_LANGUAGES_DICT = dict([(_(language), language) for language in GetTransitionLanguages()]) |
|
3277 |
3359 |
3278 class PouTransitionDialog(wx.Dialog): |
3360 class PouTransitionDialog(wx.Dialog): |
3279 if wx.VERSION < (2, 6, 0): |
3361 if wx.VERSION < (2, 6, 0): |
3280 def Bind(self, event, function, id = None): |
3362 def Bind(self, event, function, id = None): |
3281 if id is not None: |
3363 if id is not None: |
3290 def _init_coll_flexGridSizer1_Growables(self, parent): |
3372 def _init_coll_flexGridSizer1_Growables(self, parent): |
3291 parent.AddGrowableCol(0) |
3373 parent.AddGrowableCol(0) |
3292 parent.AddGrowableRow(0) |
3374 parent.AddGrowableRow(0) |
3293 |
3375 |
3294 def _init_coll_MainSizer_Items(self, parent): |
3376 def _init_coll_MainSizer_Items(self, parent): |
3295 parent.AddWindow(self.staticText1, 0, border=4, flag=wx.GROW|wx.TOP) |
3377 parent.AddWindow(self.staticText1, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
3296 parent.AddWindow(self.TransitionName, 0, border=0, flag=wx.GROW) |
3378 parent.AddWindow(self.TransitionName, 0, border=0, flag=wx.GROW) |
3297 parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP) |
3379 parent.AddWindow(self.staticText2, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
3298 parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW) |
3380 parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW) |
3299 |
3381 |
3300 def _init_coll_MainSizer_Growables(self, parent): |
3382 def _init_coll_MainSizer_Growables(self, parent): |
3301 parent.AddGrowableCol(1) |
3383 parent.AddGrowableCol(1) |
3302 |
3384 |
3303 def _init_sizers(self): |
3385 def _init_sizers(self): |
3304 self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
3386 self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
3305 self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=15) |
3387 self.MainSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=15) |
3306 |
3388 |
3307 self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) |
3389 self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) |
3308 self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) |
3390 self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) |
3309 self._init_coll_MainSizer_Items(self.MainSizer) |
3391 self._init_coll_MainSizer_Items(self.MainSizer) |
3310 self._init_coll_MainSizer_Growables(self.MainSizer) |
3392 self._init_coll_MainSizer_Growables(self.MainSizer) |
3313 |
3395 |
3314 def _init_ctrls(self, prnt): |
3396 def _init_ctrls(self, prnt): |
3315 wx.Dialog.__init__(self, id=ID_POUTRANSITIONDIALOG, |
3397 wx.Dialog.__init__(self, id=ID_POUTRANSITIONDIALOG, |
3316 name='PouTransitionDialog', parent=prnt, pos=wx.Point(376, 223), |
3398 name='PouTransitionDialog', parent=prnt, pos=wx.Point(376, 223), |
3317 size=wx.Size(350, 200), style=wx.DEFAULT_DIALOG_STYLE, |
3399 size=wx.Size(350, 200), style=wx.DEFAULT_DIALOG_STYLE, |
3318 title='Create a new transition') |
3400 title=_('Create a new transition')) |
3319 self.SetClientSize(wx.Size(350, 160)) |
3401 self.SetClientSize(wx.Size(350, 160)) |
3320 |
3402 |
3321 self.staticText1 = wx.StaticText(id=ID_POUTRANSITIONDIALOGSTATICTEXT1, |
3403 self.staticText1 = wx.StaticText(id=ID_POUTRANSITIONDIALOGSTATICTEXT1, |
3322 label='Transition Name:', name='staticText1', parent=self, |
3404 label=_('Transition Name:'), name='staticText1', parent=self, |
3323 pos=wx.Point(0, 0), size=wx.Size(120, 17), style=0) |
3405 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
3324 |
3406 |
3325 self.TransitionName = wx.TextCtrl(id=ID_POUTRANSITIONDIALOGTRANSITIONNAME, |
3407 self.TransitionName = wx.TextCtrl(id=ID_POUTRANSITIONDIALOGTRANSITIONNAME, |
3326 name='TransitionName', parent=self, pos=wx.Point(0, 0), |
3408 name='TransitionName', parent=self, pos=wx.Point(0, 0), |
3327 size=wx.Size(0, 24), style=0) |
3409 size=wx.Size(0, 24), style=0) |
3328 |
3410 |
3329 self.staticText2 = wx.StaticText(id=ID_POUTRANSITIONDIALOGSTATICTEXT2, |
3411 self.staticText2 = wx.StaticText(id=ID_POUTRANSITIONDIALOGSTATICTEXT2, |
3330 label='Language:', name='staticText2', parent=self, |
3412 label=_('Language:'), name='staticText2', parent=self, |
3331 pos=wx.Point(0, 0), size=wx.Size(120, 17), style=0) |
3413 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
3332 |
3414 |
3333 self.Language = wx.ComboBox(id=ID_POUTRANSITIONDIALOGLANGUAGE, |
3415 self.Language = wx.ComboBox(id=ID_POUTRANSITIONDIALOGLANGUAGE, |
3334 name='Language', parent=self, pos=wx.Point(0, 0), |
3416 name='Language', parent=self, pos=wx.Point(0, 0), |
3335 size=wx.Size(0, 28), style=wx.CB_READONLY) |
3417 size=wx.Size(0, 28), style=wx.CB_READONLY) |
3336 |
3418 |
3340 self._init_sizers() |
3422 self._init_sizers() |
3341 |
3423 |
3342 def __init__(self, parent): |
3424 def __init__(self, parent): |
3343 self._init_ctrls(parent) |
3425 self._init_ctrls(parent) |
3344 |
3426 |
3345 for option in ["IL","ST","LD","FBD"]: |
3427 for language in GetTransitionLanguages(): |
3346 self.Language.Append(option) |
3428 self.Language.Append(_(language)) |
3347 |
3429 |
3348 self.PouNames = [] |
3430 self.PouNames = [] |
3349 self.PouElementNames = [] |
3431 self.PouElementNames = [] |
3350 |
3432 |
3351 def OnOK(self, event): |
3433 def OnOK(self, event): |
3352 error = [] |
3434 error = [] |
3353 transition_name = self.TransitionName.GetValue() |
3435 transition_name = self.TransitionName.GetValue() |
3354 if self.TransitionName.GetValue() == "": |
3436 if self.TransitionName.GetValue() == "": |
3355 error.append("Transition Name") |
3437 error.append(_("Transition Name")) |
3356 if self.Language.GetStringSelection() == "": |
3438 if self.Language.GetSelection() == -1: |
3357 error.append("Language") |
3439 error.append(_("Language")) |
3358 if len(error) > 0: |
3440 if len(error) > 0: |
3359 text = "" |
3441 text = "" |
3360 for i, item in enumerate(error): |
3442 for i, item in enumerate(error): |
3361 if i == 0: |
3443 if i == 0: |
3362 text += item |
3444 text += item |
3363 elif i == len(error) - 1: |
3445 elif i == len(error) - 1: |
3364 text += " and %s"%item |
3446 text += _(" and %s")%item |
3365 else: |
3447 else: |
3366 text += ", %s"%item |
3448 text += _(", %s")%item |
3367 message = wx.MessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wx.OK|wx.ICON_ERROR) |
3449 message = wx.MessageDialog(self, _("Form isn't complete. %s must be filled!")%text, _("Error"), wx.OK|wx.ICON_ERROR) |
3368 message.ShowModal() |
3450 message.ShowModal() |
3369 message.Destroy() |
3451 message.Destroy() |
3370 elif not TestIdentifier(transition_name): |
3452 elif not TestIdentifier(transition_name): |
3371 message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%transition_name, "Error", wx.OK|wx.ICON_ERROR) |
3453 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%transition_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3372 message.ShowModal() |
3454 message.ShowModal() |
3373 message.Destroy() |
3455 message.Destroy() |
3374 elif transition_name.upper() in IEC_KEYWORDS: |
3456 elif transition_name.upper() in IEC_KEYWORDS: |
3375 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%transition_name, "Error", wx.OK|wx.ICON_ERROR) |
3457 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%transition_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3376 message.ShowModal() |
3458 message.ShowModal() |
3377 message.Destroy() |
3459 message.Destroy() |
3378 elif transition_name.upper() in self.PouNames: |
3460 elif transition_name.upper() in self.PouNames: |
3379 message = wx.MessageDialog(self, "A pou with \"%s\" for name exists!"%transition_name, "Error", wx.OK|wx.ICON_ERROR) |
3461 message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%transition_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3380 message.ShowModal() |
3462 message.ShowModal() |
3381 message.Destroy() |
3463 message.Destroy() |
3382 elif transition_name.upper() in self.PouElementNames: |
3464 elif transition_name.upper() in self.PouElementNames: |
3383 message = wx.MessageDialog(self, "\"%s\" element for this pou already exists!"%transition_name, "Error", wx.OK|wx.ICON_ERROR) |
3465 message = wx.MessageDialog(self, _("\"%s\" element for this pou already exists!")%transition_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3384 message.ShowModal() |
3466 message.ShowModal() |
3385 message.Destroy() |
3467 message.Destroy() |
3386 else: |
3468 else: |
3387 self.EndModal(wx.ID_OK) |
3469 self.EndModal(wx.ID_OK) |
3388 |
3470 |
3395 def SetValues(self, values): |
3477 def SetValues(self, values): |
3396 for item, value in values.items(): |
3478 for item, value in values.items(): |
3397 if item == "transitionName": |
3479 if item == "transitionName": |
3398 self.TransitionName.SetValue(value) |
3480 self.TransitionName.SetValue(value) |
3399 elif item == "language": |
3481 elif item == "language": |
3400 self.Language.SetStringSelection(value) |
3482 self.Language.SetSelection(_(value)) |
3401 |
3483 |
3402 def GetValues(self): |
3484 def GetValues(self): |
3403 values = {} |
3485 values = {} |
3404 values["transitionName"] = self.TransitionName.GetValue() |
3486 values["transitionName"] = self.TransitionName.GetValue() |
3405 values["language"] = self.Language.GetStringSelection() |
3487 values["language"] = TRANSITION_LANGUAGES_DICT[self.Language.GetStringSelection()] |
3406 return values |
3488 return values |
3407 |
3489 |
3408 #------------------------------------------------------------------------------- |
3490 #------------------------------------------------------------------------------- |
3409 # Create Pou Action Dialog |
3491 # Create Pou Action Dialog |
3410 #------------------------------------------------------------------------------- |
3492 #------------------------------------------------------------------------------- |
3411 |
3493 |
3412 [ID_POUACTIONDIALOG, ID_POUACTIONDIALOGACTIONNAME, |
3494 [ID_POUACTIONDIALOG, ID_POUACTIONDIALOGACTIONNAME, |
3413 ID_POUACTIONDIALOGLANGUAGE, ID_POUACTIONDIALOGSTATICTEXT1, |
3495 ID_POUACTIONDIALOGLANGUAGE, ID_POUACTIONDIALOGSTATICTEXT1, |
3414 ID_POUACTIONDIALOGSTATICTEXT2, |
3496 ID_POUACTIONDIALOGSTATICTEXT2, |
3415 ] = [wx.NewId() for _init_ctrls in range(5)] |
3497 ] = [wx.NewId() for _init_ctrls in range(5)] |
3498 |
|
3499 def GetActionLanguages(): |
|
3500 _ = lambda x : x |
|
3501 return [_("IL"), _("ST"), _("LD"), _("FBD")] |
|
3502 ACTION_LANGUAGES_DICT = dict([(_(language), language) for language in GetActionLanguages()]) |
|
3416 |
3503 |
3417 class PouActionDialog(wx.Dialog): |
3504 class PouActionDialog(wx.Dialog): |
3418 if wx.VERSION < (2, 6, 0): |
3505 if wx.VERSION < (2, 6, 0): |
3419 def Bind(self, event, function, id = None): |
3506 def Bind(self, event, function, id = None): |
3420 if id is not None: |
3507 if id is not None: |
3429 def _init_coll_flexGridSizer1_Growables(self, parent): |
3516 def _init_coll_flexGridSizer1_Growables(self, parent): |
3430 parent.AddGrowableCol(0) |
3517 parent.AddGrowableCol(0) |
3431 parent.AddGrowableRow(0) |
3518 parent.AddGrowableRow(0) |
3432 |
3519 |
3433 def _init_coll_MainSizer_Items(self, parent): |
3520 def _init_coll_MainSizer_Items(self, parent): |
3434 parent.AddWindow(self.staticText1, 0, border=4, flag=wx.GROW|wx.TOP) |
3521 parent.AddWindow(self.staticText1, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
3435 parent.AddWindow(self.ActionName, 0, border=0, flag=wx.GROW) |
3522 parent.AddWindow(self.ActionName, 0, border=0, flag=wx.GROW) |
3436 parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP) |
3523 parent.AddWindow(self.staticText2, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
3437 parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW) |
3524 parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW) |
3438 |
3525 |
3439 def _init_coll_MainSizer_Growables(self, parent): |
3526 def _init_coll_MainSizer_Growables(self, parent): |
3440 parent.AddGrowableCol(1) |
3527 parent.AddGrowableCol(1) |
3441 |
3528 |
3442 def _init_sizers(self): |
3529 def _init_sizers(self): |
3443 self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
3530 self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
3444 self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=15) |
3531 self.MainSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=15) |
3445 |
3532 |
3446 self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) |
3533 self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) |
3447 self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) |
3534 self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) |
3448 self._init_coll_MainSizer_Items(self.MainSizer) |
3535 self._init_coll_MainSizer_Items(self.MainSizer) |
3449 self._init_coll_MainSizer_Growables(self.MainSizer) |
3536 self._init_coll_MainSizer_Growables(self.MainSizer) |
3452 |
3539 |
3453 def _init_ctrls(self, prnt): |
3540 def _init_ctrls(self, prnt): |
3454 wx.Dialog.__init__(self, id=ID_POUACTIONDIALOG, |
3541 wx.Dialog.__init__(self, id=ID_POUACTIONDIALOG, |
3455 name='PouActionDialog', parent=prnt, pos=wx.Point(376, 223), |
3542 name='PouActionDialog', parent=prnt, pos=wx.Point(376, 223), |
3456 size=wx.Size(320, 200), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER, |
3543 size=wx.Size(320, 200), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER, |
3457 title='Create a new action') |
3544 title=_('Create a new action')) |
3458 self.SetClientSize(wx.Size(320, 160)) |
3545 self.SetClientSize(wx.Size(320, 160)) |
3459 |
3546 |
3460 self.staticText1 = wx.StaticText(id=ID_POUACTIONDIALOGSTATICTEXT1, |
3547 self.staticText1 = wx.StaticText(id=ID_POUACTIONDIALOGSTATICTEXT1, |
3461 label='Action Name:', name='staticText1', parent=self, |
3548 label=_('Action Name:'), name='staticText1', parent=self, |
3462 pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0) |
3549 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
3463 |
3550 |
3464 self.ActionName = wx.TextCtrl(id=ID_POUACTIONDIALOGACTIONNAME, |
3551 self.ActionName = wx.TextCtrl(id=ID_POUACTIONDIALOGACTIONNAME, |
3465 name='ActionName', parent=self, pos=wx.Point(0, 0), |
3552 name='ActionName', parent=self, pos=wx.Point(0, 0), |
3466 size=wx.Size(0, 24), style=0) |
3553 size=wx.Size(0, 24), style=0) |
3467 |
3554 |
3468 self.staticText2 = wx.StaticText(id=ID_POUACTIONDIALOGSTATICTEXT2, |
3555 self.staticText2 = wx.StaticText(id=ID_POUACTIONDIALOGSTATICTEXT2, |
3469 label='Language:', name='staticText2', parent=self, |
3556 label=_('Language:'), name='staticText2', parent=self, |
3470 pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0) |
3557 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
3471 |
3558 |
3472 self.Language = wx.ComboBox(id=ID_POUACTIONDIALOGLANGUAGE, |
3559 self.Language = wx.ComboBox(id=ID_POUACTIONDIALOGLANGUAGE, |
3473 name='Language', parent=self, pos=wx.Point(0, 0), |
3560 name='Language', parent=self, pos=wx.Point(0, 0), |
3474 size=wx.Size(0, 28), style=wx.CB_READONLY) |
3561 size=wx.Size(0, 28), style=wx.CB_READONLY) |
3475 |
3562 |
3479 self._init_sizers() |
3566 self._init_sizers() |
3480 |
3567 |
3481 def __init__(self, parent): |
3568 def __init__(self, parent): |
3482 self._init_ctrls(parent) |
3569 self._init_ctrls(parent) |
3483 |
3570 |
3484 for option in ["IL","ST","LD","FBD"]: |
3571 for option in GetActionLanguages(): |
3485 self.Language.Append(option) |
3572 self.Language.Append(_(option)) |
3486 |
3573 |
3487 self.PouNames = [] |
3574 self.PouNames = [] |
3488 self.PouElementNames = [] |
3575 self.PouElementNames = [] |
3489 |
3576 |
3490 def OnOK(self, event): |
3577 def OnOK(self, event): |
3491 error = [] |
3578 error = [] |
3492 action_name = self.ActionName.GetValue() |
3579 action_name = self.ActionName.GetValue() |
3493 if action_name == "": |
3580 if action_name == "": |
3494 error.append("Action Name") |
3581 error.append(_("Action Name")) |
3495 if self.Language.GetStringSelection() == "": |
3582 if self.Language.GetSelection() == -1: |
3496 error.append("Language") |
3583 error.append(_("Language")) |
3497 if len(error) > 0: |
3584 if len(error) > 0: |
3498 text = "" |
3585 text = "" |
3499 for i, item in enumerate(error): |
3586 for i, item in enumerate(error): |
3500 if i == 0: |
3587 if i == 0: |
3501 text += item |
3588 text += item |
3502 elif i == len(error) - 1: |
3589 elif i == len(error) - 1: |
3503 text += " and %s"%item |
3590 text += _(" and %s")%item |
3504 else: |
3591 else: |
3505 text += ", %s"%item |
3592 text += _(", %s")%item |
3506 message = wx.MessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wx.OK|wx.ICON_ERROR) |
3593 message = wx.MessageDialog(self, _("Form isn't complete. %s must be filled!")%text, _("Error"), wx.OK|wx.ICON_ERROR) |
3507 message.ShowModal() |
3594 message.ShowModal() |
3508 message.Destroy() |
3595 message.Destroy() |
3509 elif not TestIdentifier(action_name): |
3596 elif not TestIdentifier(action_name): |
3510 message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%action_name, "Error", wx.OK|wx.ICON_ERROR) |
3597 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%action_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3511 message.ShowModal() |
3598 message.ShowModal() |
3512 message.Destroy() |
3599 message.Destroy() |
3513 elif action_name.upper() in IEC_KEYWORDS: |
3600 elif action_name.upper() in IEC_KEYWORDS: |
3514 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%action_name, "Error", wx.OK|wx.ICON_ERROR) |
3601 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%action_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3515 message.ShowModal() |
3602 message.ShowModal() |
3516 message.Destroy() |
3603 message.Destroy() |
3517 elif action_name.upper() in self.PouNames: |
3604 elif action_name.upper() in self.PouNames: |
3518 message = wx.MessageDialog(self, "A pou with \"%s\" for name exists!"%action_name, "Error", wx.OK|wx.ICON_ERROR) |
3605 message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%action_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3519 message.ShowModal() |
3606 message.ShowModal() |
3520 message.Destroy() |
3607 message.Destroy() |
3521 elif action_name.upper() in self.PouElementNames: |
3608 elif action_name.upper() in self.PouElementNames: |
3522 message = wx.MessageDialog(self, "\"%s\" element for this pou already exists!"%action_name, "Error", wx.OK|wx.ICON_ERROR) |
3609 message = wx.MessageDialog(self, _("\"%s\" element for this pou already exists!")%action_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3523 message.ShowModal() |
3610 message.ShowModal() |
3524 message.Destroy() |
3611 message.Destroy() |
3525 else: |
3612 else: |
3526 self.EndModal(wx.ID_OK) |
3613 self.EndModal(wx.ID_OK) |
3527 |
3614 |
3534 def SetValues(self, values): |
3621 def SetValues(self, values): |
3535 for item, value in values.items(): |
3622 for item, value in values.items(): |
3536 if item == "actionName": |
3623 if item == "actionName": |
3537 self.ActionName.SetValue(value) |
3624 self.ActionName.SetValue(value) |
3538 elif item == "language": |
3625 elif item == "language": |
3539 self.Language.SetStringSelection(value) |
3626 self.Language.SetStringSelection(_(value)) |
3540 |
3627 |
3541 def GetValues(self): |
3628 def GetValues(self): |
3542 values = {} |
3629 values = {} |
3543 values["actionName"] = self.ActionName.GetValue() |
3630 values["actionName"] = self.ActionName.GetValue() |
3544 values["language"] = self.Language.GetStringSelection() |
3631 values["language"] = ACTION_LANGUAGES_DICT[self.Language.GetStringSelection()] |
3545 return values |
3632 return values |
3546 |
3633 |
3547 #------------------------------------------------------------------------------- |
3634 #------------------------------------------------------------------------------- |
3548 # Configuration Name Dialog |
3635 # Configuration Name Dialog |
3549 #------------------------------------------------------------------------------- |
3636 #------------------------------------------------------------------------------- |
3555 if id is not None: |
3642 if id is not None: |
3556 event(self, id, function) |
3643 event(self, id, function) |
3557 else: |
3644 else: |
3558 event(self, function) |
3645 event(self, function) |
3559 |
3646 |
3560 def __init__(self, parent, message, caption = "Please enter configuration name", defaultValue = "", |
3647 def __init__(self, parent, message, caption = _("Please enter configuration name"), defaultValue = "", |
3561 style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition): |
3648 style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition): |
3562 wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos) |
3649 wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos) |
3563 |
3650 |
3564 self.PouNames = [] |
3651 self.PouNames = [] |
3565 self.PouElementNames = [] |
3652 self.PouElementNames = [] |
3572 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId()) |
3659 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId()) |
3573 |
3660 |
3574 def OnOK(self, event): |
3661 def OnOK(self, event): |
3575 config_name = self.GetSizer().GetItem(1).GetWindow().GetValue() |
3662 config_name = self.GetSizer().GetItem(1).GetWindow().GetValue() |
3576 if config_name == "": |
3663 if config_name == "": |
3577 message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR) |
3664 message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR) |
3578 message.ShowModal() |
3665 message.ShowModal() |
3579 message.Destroy() |
3666 message.Destroy() |
3580 elif not TestIdentifier(config_name): |
3667 elif not TestIdentifier(config_name): |
3581 message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%config_name, "Error", wx.OK|wx.ICON_ERROR) |
3668 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%config_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3582 message.ShowModal() |
3669 message.ShowModal() |
3583 message.Destroy() |
3670 message.Destroy() |
3584 elif config_name.upper() in IEC_KEYWORDS: |
3671 elif config_name.upper() in IEC_KEYWORDS: |
3585 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%config_name, "Error", wx.OK|wx.ICON_ERROR) |
3672 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%config_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3586 message.ShowModal() |
3673 message.ShowModal() |
3587 message.Destroy() |
3674 message.Destroy() |
3588 elif config_name.upper() in self.PouNames: |
3675 elif config_name.upper() in self.PouNames: |
3589 message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%config_name, "Error", wx.OK|wx.ICON_ERROR) |
3676 message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%config_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3590 message.ShowModal() |
3677 message.ShowModal() |
3591 message.Destroy() |
3678 message.Destroy() |
3592 elif config_name.upper() in self.PouElementNames: |
3679 elif config_name.upper() in self.PouElementNames: |
3593 message = wx.MessageDialog(self, "A pou has an element with \"%s\" for name. It can generate a conflict. Do you wish to continue?"%config_name, "Warning", wx.YES_NO|wx.ICON_EXCLAMATION) |
3680 message = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%config_name, _("Warning"), wx.YES_NO|wx.ICON_EXCLAMATION) |
3594 result = message.ShowModal() |
3681 result = message.ShowModal() |
3595 message.Destroy() |
3682 message.Destroy() |
3596 if result == wx.ID_YES: |
3683 if result == wx.ID_YES: |
3597 self.EndModal(wx.ID_OK) |
3684 self.EndModal(wx.ID_OK) |
3598 else: |
3685 else: |
3618 if id is not None: |
3705 if id is not None: |
3619 event(self, id, function) |
3706 event(self, id, function) |
3620 else: |
3707 else: |
3621 event(self, function) |
3708 event(self, function) |
3622 |
3709 |
3623 def __init__(self, parent, message, caption = "Please enter resource name", defaultValue = "", |
3710 def __init__(self, parent, message, caption = _("Please enter resource name"), defaultValue = "", |
3624 style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition): |
3711 style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition): |
3625 wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos) |
3712 wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos) |
3626 |
3713 |
3627 self.PouNames = [] |
3714 self.PouNames = [] |
3628 self.PouElementNames = [] |
3715 self.PouElementNames = [] |
3635 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId()) |
3722 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId()) |
3636 |
3723 |
3637 def OnOK(self, event): |
3724 def OnOK(self, event): |
3638 resource_name = self.GetSizer().GetItem(1).GetWindow().GetValue() |
3725 resource_name = self.GetSizer().GetItem(1).GetWindow().GetValue() |
3639 if resource_name == "": |
3726 if resource_name == "": |
3640 message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR) |
3727 message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR) |
3641 message.ShowModal() |
3728 message.ShowModal() |
3642 message.Destroy() |
3729 message.Destroy() |
3643 elif not TestIdentifier(resource_name): |
3730 elif not TestIdentifier(resource_name): |
3644 message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%resource_name, "Error", wx.OK|wx.ICON_ERROR) |
3731 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%resource_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3645 message.ShowModal() |
3732 message.ShowModal() |
3646 message.Destroy() |
3733 message.Destroy() |
3647 elif resource_name.upper() in IEC_KEYWORDS: |
3734 elif resource_name.upper() in IEC_KEYWORDS: |
3648 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%resource_name, "Error", wx.OK|wx.ICON_ERROR) |
3735 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%resource_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3649 message.ShowModal() |
3736 message.ShowModal() |
3650 message.Destroy() |
3737 message.Destroy() |
3651 elif resource_name.upper() in self.PouNames: |
3738 elif resource_name.upper() in self.PouNames: |
3652 message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%resource_name, "Error", wx.OK|wx.ICON_ERROR) |
3739 message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%resource_name, _("Error"), wx.OK|wx.ICON_ERROR) |
3653 message.ShowModal() |
3740 message.ShowModal() |
3654 message.Destroy() |
3741 message.Destroy() |
3655 elif resource_name.upper() in self.PouElementNames: |
3742 elif resource_name.upper() in self.PouElementNames: |
3656 message = wx.MessageDialog(self, "A pou has an element with \"%s\" for name. It can generate a conflict. Do you wish to continue?"%resource_name, "Warning", wx.YES_NO|wx.ICON_EXCLAMATION) |
3743 message = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%resource_name, _("Warning"), wx.YES_NO|wx.ICON_EXCLAMATION) |
3657 result = message.ShowModal() |
3744 result = message.ShowModal() |
3658 message.Destroy() |
3745 message.Destroy() |
3659 if result == wx.ID_YES: |
3746 if result == wx.ID_YES: |
3660 self.EndModal(wx.ID_OK) |
3747 self.EndModal(wx.ID_OK) |
3661 else: |
3748 else: |
3752 panel.ClearErrors() |
3839 panel.ClearErrors() |
3753 |
3840 |
3754 #------------------------------------------------------------------------------- |
3841 #------------------------------------------------------------------------------- |
3755 # Variables Editor Panel |
3842 # Variables Editor Panel |
3756 #------------------------------------------------------------------------------- |
3843 #------------------------------------------------------------------------------- |
3844 |
|
3845 def GetVariableTableColnames(location): |
|
3846 _ = lambda x : x |
|
3847 if location: |
|
3848 return ["#", _("Name"), _("Class"), _("Type"), _("Location"), _("Initial Value"), _("Retain"), _("Constant")] |
|
3849 return ["#", _("Name"), _("Class"), _("Type"), _("Initial Value"), _("Retain"), _("Constant")] |
|
3850 |
|
3851 def GetAlternativeOptions(): |
|
3852 _ = lambda x : x |
|
3853 return [_("Yes"), _("No")] |
|
3854 ALTERNATIVE_OPTIONS_DICT = dict([(_(option), option) for option in GetAlternativeOptions()]) |
|
3855 |
|
3856 def GetFilterChoiceTransfer(): |
|
3857 _ = lambda x : x |
|
3858 return {_("All"): _("All"), _("Interface"): _("Interface"), |
|
3859 _(" Input"): _("Input"), _(" Output"): _("Output"), _(" InOut"): _("InOut"), |
|
3860 _(" External"): _("External"), _("Variables"): _("Variables"), _(" Local"): _("Local"), |
|
3861 _(" Temp"): _("Temp"), _("Global"): _("Global")}#, _("Access") : _("Access")} |
|
3862 VARIABLE_CLASSES_DICT = dict([(_(_class), _class) for _class in GetFilterChoiceTransfer().itervalues()]) |
|
3757 |
3863 |
3758 class VariableTable(wx.grid.PyGridTableBase): |
3864 class VariableTable(wx.grid.PyGridTableBase): |
3759 |
3865 |
3760 """ |
3866 """ |
3761 A custom wx.grid.Grid Table using user supplied data |
3867 A custom wx.grid.Grid Table using user supplied data |
3778 return len(self.colnames) |
3884 return len(self.colnames) |
3779 |
3885 |
3780 def GetNumberRows(self): |
3886 def GetNumberRows(self): |
3781 return len(self.data) |
3887 return len(self.data) |
3782 |
3888 |
3783 def GetColLabelValue(self, col): |
3889 def GetColLabelValue(self, col, translate=True): |
3784 if col < len(self.colnames): |
3890 if col < len(self.colnames): |
3891 if translate: |
|
3892 return _(self.colnames[col]) |
|
3785 return self.colnames[col] |
3893 return self.colnames[col] |
3786 |
3894 |
3787 def GetRowLabelValues(self, row): |
3895 def GetRowLabelValues(self, row, translate=True): |
3788 return row |
3896 return row |
3789 |
3897 |
3790 def GetValue(self, row, col): |
3898 def GetValue(self, row, col): |
3791 if row < self.GetNumberRows(): |
3899 if row < self.GetNumberRows(): |
3792 if col == 0: |
3900 if col == 0: |
3793 return self.data[row]["Number"] |
3901 return self.data[row]["Number"] |
3794 name = str(self.data[row].get(self.GetColLabelValue(col), "")) |
3902 colname = self.GetColLabelValue(col, False) |
3795 return name |
3903 value = str(self.data[row].get(colname, "")) |
3904 if colname in ["Class", "Retain", "Constant"]: |
|
3905 return _(value) |
|
3906 return value |
|
3796 |
3907 |
3797 def SetValue(self, row, col, value): |
3908 def SetValue(self, row, col, value): |
3798 if col < len(self.colnames): |
3909 if col < len(self.colnames): |
3799 colname = self.GetColLabelValue(col) |
3910 colname = self.GetColLabelValue(col, False) |
3800 if colname == "Name": |
3911 if colname == "Name": |
3801 self.old_value = self.data[row][colname] |
3912 self.old_value = self.data[row][colname] |
3913 elif colname == "Class": |
|
3914 value = VARIABLE_CLASSES_DICT[value] |
|
3915 elif colname in ["Retain", "Constant"]: |
|
3916 value = ALTERNATIVE_OPTIONS_DICT[value] |
|
3802 self.data[row][colname] = value |
3917 self.data[row][colname] = value |
3803 |
3918 |
3804 def GetValueByName(self, row, colname): |
3919 def GetValueByName(self, row, colname): |
3805 if row < self.GetNumberRows(): |
3920 if row < self.GetNumberRows(): |
3806 return self.data[row].get(colname) |
3921 return self.data[row].get(colname) |
3852 appropriate renderer given the column name. |
3967 appropriate renderer given the column name. |
3853 |
3968 |
3854 Otherwise default to the default renderer. |
3969 Otherwise default to the default renderer. |
3855 """ |
3970 """ |
3856 |
3971 |
3857 typelist = None |
|
3858 accesslist = None |
|
3859 for row in range(self.GetNumberRows()): |
3972 for row in range(self.GetNumberRows()): |
3860 for col in range(self.GetNumberCols()): |
3973 for col in range(self.GetNumberCols()): |
3861 editor = None |
3974 editor = None |
3862 renderer = None |
3975 renderer = None |
3863 colname = self.GetColLabelValue(col) |
3976 colname = self.GetColLabelValue(col, False) |
3864 if col != 0 and self.GetValueByName(row, "Edit"): |
3977 if col != 0 and self.GetValueByName(row, "Edit"): |
3865 grid.SetReadOnly(row, col, False) |
3978 grid.SetReadOnly(row, col, False) |
3866 if colname == "Name": |
3979 if colname == "Name": |
3867 if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]: |
3980 if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]: |
3868 grid.SetReadOnly(row, col, True) |
3981 grid.SetReadOnly(row, col, True) |
3886 excluded = [] |
3999 excluded = [] |
3887 if self.Parent.PouIsUsed: |
4000 if self.Parent.PouIsUsed: |
3888 excluded.extend(["Input","Output","InOut"]) |
4001 excluded.extend(["Input","Output","InOut"]) |
3889 if self.Parent.IsFunctionBlockType(self.data[row]["Type"]): |
4002 if self.Parent.IsFunctionBlockType(self.data[row]["Type"]): |
3890 excluded.extend(["Local","Temp"]) |
4003 excluded.extend(["Local","Temp"]) |
3891 editor.SetParameters(",".join([choice for choice in self.Parent.ClassList if choice not in excluded])) |
4004 editor.SetParameters(",".join([_(choice) for choice in self.Parent.ClassList if choice not in excluded])) |
3892 elif colname in ["Retain", "Constant"]: |
4005 elif colname in ["Retain", "Constant"]: |
3893 editor = wx.grid.GridCellChoiceEditor() |
4006 editor = wx.grid.GridCellChoiceEditor() |
3894 editor.SetParameters(self.Parent.OptionList) |
4007 editor.SetParameters(",".join(map(_, self.Parent.OptionList))) |
3895 elif colname == "Type": |
4008 elif colname == "Type": |
3896 editor = wx.grid.GridCellTextEditor() |
4009 editor = wx.grid.GridCellTextEditor() |
3897 else: |
4010 else: |
3898 grid.SetReadOnly(row, col, True) |
4011 grid.SetReadOnly(row, col, True) |
3899 |
4012 |
3948 def OnDropText(self, x, y, data): |
4061 def OnDropText(self, x, y, data): |
3949 x, y = self.ParentWindow.VariablesGrid.CalcUnscrolledPosition(x, y) |
4062 x, y = self.ParentWindow.VariablesGrid.CalcUnscrolledPosition(x, y) |
3950 col = self.ParentWindow.VariablesGrid.XToCol(x) |
4063 col = self.ParentWindow.VariablesGrid.XToCol(x) |
3951 row = self.ParentWindow.VariablesGrid.YToRow(y - self.ParentWindow.VariablesGrid.GetColLabelSize()) |
4064 row = self.ParentWindow.VariablesGrid.YToRow(y - self.ParentWindow.VariablesGrid.GetColLabelSize()) |
3952 if col != wx.NOT_FOUND and row != wx.NOT_FOUND: |
4065 if col != wx.NOT_FOUND and row != wx.NOT_FOUND: |
3953 if self.ParentWindow.Table.GetColLabelValue(col) != "Location": |
4066 if self.ParentWindow.Table.GetColLabelValue(col, False) != "Location": |
3954 return |
4067 return |
3955 message = None |
4068 message = None |
3956 if not self.ParentWindow.Table.GetValueByName(row, "Edit"): |
4069 if not self.ParentWindow.Table.GetValueByName(row, "Edit"): |
3957 message = "Can't affect a location to a function block instance" |
4070 message = _("Can't affect a location to a function block instance") |
3958 elif self.ParentWindow.Table.GetValueByName(row, "Class") not in ["Local", "Global"]: |
4071 elif self.ParentWindow.Table.GetValueByName(row, "Class") not in ["Local", "Global"]: |
3959 message = "Can affect a location only to local or global variables" |
4072 message = _("Can affect a location only to local or global variables") |
3960 else: |
4073 else: |
3961 try: |
4074 try: |
3962 values = eval(data) |
4075 values = eval(data) |
3963 except: |
4076 except: |
3964 message = "Invalid value \"%s\" for location"%data |
4077 message = _("Invalid value \"%s\" for location")%data |
3965 values = None |
4078 values = None |
3966 if not isinstance(values, TupleType): |
4079 if not isinstance(values, TupleType): |
3967 message = "Invalid value \"%s\" for location"%data |
4080 message = _("Invalid value \"%s\" for location")%data |
3968 values = None |
4081 values = None |
3969 if values is not None and values[1] == "location": |
4082 if values is not None and values[1] == "location": |
3970 location = values[0] |
4083 location = values[0] |
3971 variable_type = self.ParentWindow.Table.GetValueByName(row, "Type") |
4084 variable_type = self.ParentWindow.Table.GetValueByName(row, "Type") |
3972 base_type = self.ParentWindow.Controler.GetBaseType(variable_type) |
4085 base_type = self.ParentWindow.Controler.GetBaseType(variable_type) |
3973 message = None |
4086 message = None |
3974 if location.startswith("%"): |
4087 if location.startswith("%"): |
3975 if base_type != values[2]: |
4088 if base_type != values[2]: |
3976 message = "Incompatible data types between \"%s\" and \"%s\""%(values[2], variable_type) |
4089 message = _("Incompatible data types between \"%s\" and \"%s\"")%(values[2], variable_type) |
3977 else: |
4090 else: |
3978 self.ParentWindow.Table.SetValue(row, col, location) |
4091 self.ParentWindow.Table.SetValue(row, col, location) |
3979 self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid) |
4092 self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid) |
3980 self.ParentWindow.SaveValues() |
4093 self.ParentWindow.SaveValues() |
3981 else: |
4094 else: |
3982 if location[0].isdigit() and base_type != "BOOL": |
4095 if location[0].isdigit() and base_type != "BOOL": |
3983 message = "Incompatible size of data between \"%s\" and \"BOOL\""%location |
4096 message = _("Incompatible size of data between \"%s\" and \"BOOL\"")%location |
3984 elif location[0] not in LOCATIONDATATYPES: |
4097 elif location[0] not in LOCATIONDATATYPES: |
3985 message = "Unrecognized data size \"%s\""%location[0] |
4098 message = _("Unrecognized data size \"%s\"")%location[0] |
3986 elif base_type not in LOCATIONDATATYPES[location[0]]: |
4099 elif base_type not in LOCATIONDATATYPES[location[0]]: |
3987 message = "Incompatible size of data between \"%s\" and \"%s\""%(location, variable_type) |
4100 message = _("Incompatible size of data between \"%s\" and \"%s\"")%(location, variable_type) |
3988 else: |
4101 else: |
3989 dialog = wx.SingleChoiceDialog(self.ParentWindow, "Select a variable class:", "Variable class", ["Input", "Output", "Memory"], wx.OK|wx.CANCEL) |
4102 dialog = wx.SingleChoiceDialog(self.ParentWindow, _("Select a variable class:"), _("Variable class"), ["Input", "Output", "Memory"], wx.OK|wx.CANCEL) |
3990 if dialog.ShowModal() == wx.ID_OK: |
4103 if dialog.ShowModal() == wx.ID_OK: |
3991 selected = dialog.GetSelection() |
4104 selected = dialog.GetSelection() |
3992 if selected == 0: |
4105 if selected == 0: |
3993 location = "%I" + location |
4106 location = "%I" + location |
3994 elif selected == 1: |
4107 elif selected == 1: |
4001 dialog.Destroy() |
4114 dialog.Destroy() |
4002 if message is not None: |
4115 if message is not None: |
4003 wx.CallAfter(self.ShowMessage, message) |
4116 wx.CallAfter(self.ShowMessage, message) |
4004 |
4117 |
4005 def ShowMessage(self, message): |
4118 def ShowMessage(self, message): |
4006 message = wx.MessageDialog(self.ParentWindow, message, "Error", wx.OK|wx.ICON_ERROR) |
4119 message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK|wx.ICON_ERROR) |
4007 message.ShowModal() |
4120 message.ShowModal() |
4008 message.Destroy() |
4121 message.Destroy() |
4009 |
4122 |
4010 [ID_VARIABLEEDITORPANEL, ID_VARIABLEEDITORPANELVARIABLESGRID, |
4123 [ID_VARIABLEEDITORPANEL, ID_VARIABLEEDITORPANELVARIABLESGRID, |
4011 ID_VARIABLEEDITORCONTROLPANEL, ID_VARIABLEEDITORPANELRETURNTYPE, |
4124 ID_VARIABLEEDITORCONTROLPANEL, ID_VARIABLEEDITORPANELRETURNTYPE, |
4109 name='ControlPanel', parent=self, pos=wx.Point(0, 0), |
4222 name='ControlPanel', parent=self, pos=wx.Point(0, 0), |
4110 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
4223 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) |
4111 self.ControlPanel.SetScrollRate(0, 10) |
4224 self.ControlPanel.SetScrollRate(0, 10) |
4112 |
4225 |
4113 self.staticText1 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT1, |
4226 self.staticText1 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT1, |
4114 label='Return Type:', name='staticText1', parent=self.ControlPanel, |
4227 label=_('Return Type:'), name='staticText1', parent=self.ControlPanel, |
4115 pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0) |
4228 pos=wx.Point(0, 0), size=wx.Size(145, 17), style=0) |
4116 |
4229 |
4117 self.ReturnType = wx.ComboBox(id=ID_VARIABLEEDITORPANELRETURNTYPE, |
4230 self.ReturnType = wx.ComboBox(id=ID_VARIABLEEDITORPANELRETURNTYPE, |
4118 name='ReturnType', parent=self.ControlPanel, pos=wx.Point(0, 0), |
4231 name='ReturnType', parent=self.ControlPanel, pos=wx.Point(0, 0), |
4119 size=wx.Size(145, 28), style=wx.CB_READONLY) |
4232 size=wx.Size(145, 28), style=wx.CB_READONLY) |
4120 self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, id=ID_VARIABLEEDITORPANELRETURNTYPE) |
4233 self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, id=ID_VARIABLEEDITORPANELRETURNTYPE) |
4121 |
4234 |
4122 self.staticText2 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT2, |
4235 self.staticText2 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT2, |
4123 label='Class Filter:', name='staticText2', parent=self.ControlPanel, |
4236 label=_('Class Filter:'), name='staticText2', parent=self.ControlPanel, |
4124 pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0) |
4237 pos=wx.Point(0, 0), size=wx.Size(145, 17), style=0) |
4125 |
4238 |
4126 self.ClassFilter = wx.ComboBox(id=ID_VARIABLEEDITORPANELCLASSFILTER, |
4239 self.ClassFilter = wx.ComboBox(id=ID_VARIABLEEDITORPANELCLASSFILTER, |
4127 name='ClassFilter', parent=self.ControlPanel, pos=wx.Point(0, 0), |
4240 name='ClassFilter', parent=self.ControlPanel, pos=wx.Point(0, 0), |
4128 size=wx.Size(145, 28), style=wx.CB_READONLY) |
4241 size=wx.Size(145, 28), style=wx.CB_READONLY) |
4129 self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, id=ID_VARIABLEEDITORPANELCLASSFILTER) |
4242 self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, id=ID_VARIABLEEDITORPANELCLASSFILTER) |
4130 |
4243 |
4131 self.AddButton = wx.Button(id=ID_VARIABLEEDITORPANELADDBUTTON, label='Add', |
4244 self.AddButton = wx.Button(id=ID_VARIABLEEDITORPANELADDBUTTON, label=_('Add'), |
4132 name='AddButton', parent=self.ControlPanel, pos=wx.Point(0, 0), |
4245 name='AddButton', parent=self.ControlPanel, pos=wx.Point(0, 0), |
4133 size=wx.Size(72, 32), style=0) |
4246 size=wx.DefaultSize, style=0) |
4134 self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_VARIABLEEDITORPANELADDBUTTON) |
4247 self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_VARIABLEEDITORPANELADDBUTTON) |
4135 |
4248 |
4136 self.DeleteButton = wx.Button(id=ID_VARIABLEEDITORPANELDELETEBUTTON, label='Delete', |
4249 self.DeleteButton = wx.Button(id=ID_VARIABLEEDITORPANELDELETEBUTTON, label=_('Delete'), |
4137 name='DeleteButton', parent=self.ControlPanel, pos=wx.Point(0, 0), |
4250 name='DeleteButton', parent=self.ControlPanel, pos=wx.Point(0, 0), |
4138 size=wx.Size(72, 32), style=0) |
4251 size=wx.DefaultSize, style=0) |
4139 self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_VARIABLEEDITORPANELDELETEBUTTON) |
4252 self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_VARIABLEEDITORPANELDELETEBUTTON) |
4140 |
4253 |
4141 self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^', |
4254 self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^', |
4142 name='UpButton', parent=self.ControlPanel, pos=wx.Point(0, 0), |
4255 name='UpButton', parent=self.ControlPanel, pos=wx.Point(0, 0), |
4143 size=wx.Size(32, 32), style=0) |
4256 size=wx.Size(32, 32), style=0) |
4156 self.Controler = controler |
4269 self.Controler = controler |
4157 self.ElementType = element_type |
4270 self.ElementType = element_type |
4158 |
4271 |
4159 self.Filter = "All" |
4272 self.Filter = "All" |
4160 self.FilterChoices = [] |
4273 self.FilterChoices = [] |
4161 self.FilterChoiceTransfer = {"All" : "All", "Interface" : "Interface", |
4274 self.FilterChoiceTransfer = GetFilterChoiceTransfer() |
4162 " Input" : "Input", " Output" : "Output", " InOut" : "InOut", |
|
4163 " External" : "External", "Variables" : "Variables", " Local" : "Local", |
|
4164 " Temp" : "Temp", "Global" : "Global", "Access" : "Access"} |
|
4165 |
4275 |
4166 if element_type in ["config", "resource"]: |
4276 if element_type in ["config", "resource"]: |
4167 self.DefaultTypes = {"All" : "Global"} |
4277 self.DefaultTypes = {"All" : "Global"} |
4168 self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True} |
4278 self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True} |
4169 else: |
4279 else: |
4170 self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"} |
4280 self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"} |
4171 self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True} |
4281 self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True} |
4172 if element_type in ["config", "resource"] or element_type in ["program", "transition", "action"]: |
4282 if element_type in ["config", "resource"] or element_type in ["program", "transition", "action"]: |
4173 self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"]) |
4283 self.Table = VariableTable(self, [], GetVariableTableColnames(True)) |
4174 if element_type not in ["config", "resource"]: |
4284 if element_type not in ["config", "resource"]: |
4175 self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp","Global","Access"] |
4285 self.FilterChoices = ["All", "Interface", " Input", " Output", " InOut", " External", "Variables", " Local", " Temp"]#,"Access"] |
4176 else: |
4286 else: |
4177 self.FilterChoices = ["All","Global","Access"] |
4287 self.FilterChoices = ["All", "Global"]#,"Access"] |
4178 self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70] |
4288 self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70] |
4179 self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER] |
4289 self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER] |
4180 else: |
4290 else: |
4181 self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Initial Value", "Retain", "Constant"]) |
4291 self.Table = VariableTable(self, [], GetVariableTableColnames(False)) |
4182 self.FilterChoices = ["All","Interface"," Input"," Output"," InOut"," External","Variables"," Local"," Temp"] |
4292 if element_type == "function": |
4293 self.FilterChoices = ["All", "Interface", " Input", " Output", " InOut", "Variables", " Local", " Temp"] |
|
4294 else: |
|
4295 self.FilterChoices = ["All", "Interface", " Input", " Output", " InOut", " External", "Variables", " Local", " Temp"] |
|
4183 self.ColSizes = [40, 120, 70, 80, 120, 60, 70] |
4296 self.ColSizes = [40, 120, 70, 80, 120, 60, 70] |
4184 self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER] |
4297 self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER] |
4185 for choice in self.FilterChoices: |
4298 for choice in self.FilterChoices: |
4186 self.ClassFilter.Append(choice) |
4299 self.ClassFilter.Append(_(choice)) |
4187 reverse_transfer = {} |
4300 reverse_transfer = {} |
4188 for filter, choice in self.FilterChoiceTransfer.items(): |
4301 for filter, choice in self.FilterChoiceTransfer.items(): |
4189 reverse_transfer[choice] = filter |
4302 reverse_transfer[choice] = filter |
4190 self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter]) |
4303 self.ClassFilter.SetStringSelection(_(reverse_transfer[self.Filter])) |
4191 self.RefreshTypeList() |
4304 self.RefreshTypeList() |
4192 |
4305 |
4193 self.OptionList = "Yes,No" |
4306 self.OptionList = GetAlternativeOptions() |
4194 |
4307 |
4195 if element_type == "function": |
4308 if element_type == "function": |
4196 for base_type in self.Controler.GetBaseTypes(): |
4309 for base_type in self.Controler.GetBaseTypes(): |
4197 self.ReturnType.Append(base_type) |
4310 self.ReturnType.Append(base_type) |
4198 self.ReturnType.Enable(True) |
4311 self.ReturnType.Enable(True) |
4205 self.VariablesGrid.SetRowLabelSize(0) |
4318 self.VariablesGrid.SetRowLabelSize(0) |
4206 for col in range(self.Table.GetNumberCols()): |
4319 for col in range(self.Table.GetNumberCols()): |
4207 attr = wx.grid.GridCellAttr() |
4320 attr = wx.grid.GridCellAttr() |
4208 attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE) |
4321 attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE) |
4209 self.VariablesGrid.SetColAttr(col, attr) |
4322 self.VariablesGrid.SetColAttr(col, attr) |
4210 self.VariablesGrid.SetColSize(col, self.ColSizes[col]) |
4323 self.VariablesGrid.SetColMinimalWidth(col, self.ColSizes[col]) |
4324 self.VariablesGrid.AutoSizeColumn(col, False) |
|
4211 |
4325 |
4212 def SetTagName(self, tagname): |
4326 def SetTagName(self, tagname): |
4213 self.TagName = tagname |
4327 self.TagName = tagname |
4214 |
4328 |
4215 def IsFunctionBlockType(self, name): |
4329 def IsFunctionBlockType(self, name): |
4325 row, col = event.GetRow(), event.GetCol() |
4439 row, col = event.GetRow(), event.GetCol() |
4326 colname = self.Table.GetColLabelValue(col) |
4440 colname = self.Table.GetColLabelValue(col) |
4327 value = self.Table.GetValue(row, col) |
4441 value = self.Table.GetValue(row, col) |
4328 if colname == "Name" and value != "": |
4442 if colname == "Name" and value != "": |
4329 if not TestIdentifier(value): |
4443 if not TestIdentifier(value): |
4330 message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%value, "Error", wx.OK|wx.ICON_ERROR) |
4444 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%value, _("Error"), wx.OK|wx.ICON_ERROR) |
4331 message.ShowModal() |
4445 message.ShowModal() |
4332 message.Destroy() |
4446 message.Destroy() |
4333 event.Veto() |
4447 event.Veto() |
4334 elif value.upper() in IEC_KEYWORDS: |
4448 elif value.upper() in IEC_KEYWORDS: |
4335 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%value, "Error", wx.OK|wx.ICON_ERROR) |
4449 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%value, _("Error"), wx.OK|wx.ICON_ERROR) |
4336 message.ShowModal() |
4450 message.ShowModal() |
4337 message.Destroy() |
4451 message.Destroy() |
4338 event.Veto() |
4452 event.Veto() |
4339 elif value.upper() in self.PouNames: |
4453 elif value.upper() in self.PouNames: |
4340 message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%value, "Error", wx.OK|wx.ICON_ERROR) |
4454 message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%value, _("Error"), wx.OK|wx.ICON_ERROR) |
4341 message.ShowModal() |
4455 message.ShowModal() |
4342 message.Destroy() |
4456 message.Destroy() |
4343 event.Veto() |
4457 event.Veto() |
4344 elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]: |
4458 elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]: |
4345 message = wx.MessageDialog(self, "A variable with \"%s\" as name exists in this pou!"%value, "Error", wx.OK|wx.ICON_ERROR) |
4459 message = wx.MessageDialog(self, _("A variable with \"%s\" as name already exists in this pou!")%value, _("Error"), wx.OK|wx.ICON_ERROR) |
4346 message.ShowModal() |
4460 message.ShowModal() |
4347 message.Destroy() |
4461 message.Destroy() |
4348 event.Veto() |
4462 event.Veto() |
4349 else: |
4463 else: |
4350 self.SaveValues(False) |
4464 self.SaveValues(False) |
4372 base_menu = wx.Menu(title='') |
4486 base_menu = wx.Menu(title='') |
4373 for base_type in self.Controler.GetBaseTypes(): |
4487 for base_type in self.Controler.GetBaseTypes(): |
4374 new_id = wx.NewId() |
4488 new_id = wx.NewId() |
4375 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type) |
4489 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type) |
4376 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id) |
4490 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id) |
4377 type_menu.AppendMenu(wx.NewId(), "Base Types", base_menu) |
4491 type_menu.AppendMenu(wx.NewId(), _("Base Types"), base_menu) |
4378 datatype_menu = wx.Menu(title='') |
4492 datatype_menu = wx.Menu(title='') |
4379 for datatype in self.Controler.GetDataTypes(basetypes = False, debug = self.ParentWindow.Debug): |
4493 for datatype in self.Controler.GetDataTypes(basetypes = False, debug = self.ParentWindow.Debug): |
4380 new_id = wx.NewId() |
4494 new_id = wx.NewId() |
4381 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype) |
4495 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype) |
4382 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id) |
4496 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id) |
4383 type_menu.AppendMenu(wx.NewId(), "User Data Types", datatype_menu) |
4497 type_menu.AppendMenu(wx.NewId(), _("User Data Types"), datatype_menu) |
4384 functionblock_menu = wx.Menu(title='') |
4498 functionblock_menu = wx.Menu(title='') |
4385 bodytype = self.Controler.GetEditedElementBodyType(self.TagName, self.ParentWindow.Debug) |
4499 bodytype = self.Controler.GetEditedElementBodyType(self.TagName, self.ParentWindow.Debug) |
4386 pouname, poutype = self.Controler.GetEditedElementType(self.TagName, self.ParentWindow.Debug) |
4500 pouname, poutype = self.Controler.GetEditedElementType(self.TagName, self.ParentWindow.Debug) |
4387 if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]: |
4501 if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]: |
4388 for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName, self.ParentWindow.Debug): |
4502 for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName, self.ParentWindow.Debug): |
4389 new_id = wx.NewId() |
4503 new_id = wx.NewId() |
4390 AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type) |
4504 AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type) |
4391 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id) |
4505 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id) |
4392 type_menu.AppendMenu(wx.NewId(), "Function Block Types", functionblock_menu) |
4506 type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu) |
4393 rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col)) |
4507 rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col)) |
4394 self.VariablesGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.VariablesGrid.GetColLabelSize()) |
4508 self.VariablesGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.VariablesGrid.GetColLabelSize()) |
4395 event.Veto() |
4509 event.Veto() |
4396 else: |
4510 else: |
4397 event.Skip() |
4511 event.Skip() |
4493 |
4607 |
4494 #------------------------------------------------------------------------------- |
4608 #------------------------------------------------------------------------------- |
4495 # Debug Variables Panel |
4609 # Debug Variables Panel |
4496 #------------------------------------------------------------------------------- |
4610 #------------------------------------------------------------------------------- |
4497 |
4611 |
4612 def GetDebugVariablesTableColnames(): |
|
4613 _ = lambda x : x |
|
4614 return [_("Variable"), _("Value")] |
|
4615 |
|
4498 class VariableTableItem(DebugDataConsumer): |
4616 class VariableTableItem(DebugDataConsumer): |
4499 |
4617 |
4500 def __init__(self, parent, variable, value): |
4618 def __init__(self, parent, variable, value): |
4501 DebugDataConsumer.__init__(self) |
4619 DebugDataConsumer.__init__(self) |
4502 self.Parent = parent |
4620 self.Parent = parent |
4543 return len(self.colnames) |
4661 return len(self.colnames) |
4544 |
4662 |
4545 def GetNumberRows(self): |
4663 def GetNumberRows(self): |
4546 return len(self.data) |
4664 return len(self.data) |
4547 |
4665 |
4548 def GetColLabelValue(self, col): |
4666 def GetColLabelValue(self, col, translate=True): |
4549 if col < len(self.colnames): |
4667 if col < len(self.colnames): |
4668 if translate: |
|
4669 return _(self.colnames[col]) |
|
4550 return self.colnames[col] |
4670 return self.colnames[col] |
4551 |
4671 |
4552 def GetRowLabelValues(self, row): |
4672 def GetRowLabelValues(self, row, translate=True): |
4553 return row |
4673 return row |
4554 |
4674 |
4555 def GetValue(self, row, col): |
4675 def GetValue(self, row, col): |
4556 if row < self.GetNumberRows(): |
4676 if row < self.GetNumberRows(): |
4557 return self.GetValueByName(row, self.GetColLabelValue(col)) |
4677 return self.GetValueByName(row, self.GetColLabelValue(col, False)) |
4558 return "" |
4678 return "" |
4559 |
4679 |
4560 def SetValue(self, row, col, value): |
4680 def SetValue(self, row, col, value): |
4561 if col < len(self.colnames): |
4681 if col < len(self.colnames): |
4562 self.SetValueByName(row, self.GetColLabelValue(col), value) |
4682 self.SetValueByName(row, self.GetColLabelValue(col, False), value) |
4563 |
4683 |
4564 def GetValueByName(self, row, colname): |
4684 def GetValueByName(self, row, colname): |
4565 if row < self.GetNumberRows(): |
4685 if row < self.GetNumberRows(): |
4566 if colname == "Variable": |
4686 if colname == "Variable": |
4567 return self.data[row].GetVariable() |
4687 return self.data[row].GetVariable() |
4659 row = self.ParentWindow.Table.GetNumberRows() |
4779 row = self.ParentWindow.Table.GetNumberRows() |
4660 message = None |
4780 message = None |
4661 try: |
4781 try: |
4662 values = eval(data) |
4782 values = eval(data) |
4663 except: |
4783 except: |
4664 message = "Invalid value \"%s\" for debug variable"%data |
4784 message = _("Invalid value \"%s\" for debug variable")%data |
4665 values = None |
4785 values = None |
4666 if not isinstance(values, TupleType): |
4786 if not isinstance(values, TupleType): |
4667 message = "Invalid value \"%s\" for debug variable"%data |
4787 message = _("Invalid value \"%s\" for debug variable")%data |
4668 values = None |
4788 values = None |
4669 if values is not None and values[1] == "debug": |
4789 if values is not None and values[1] == "debug": |
4670 self.ParentWindow.InsertValue(row, values[0]) |
4790 self.ParentWindow.InsertValue(row, values[0]) |
4671 if message is not None: |
4791 if message is not None: |
4672 wx.CallAfter(self.ShowMessage, message) |
4792 wx.CallAfter(self.ShowMessage, message) |
4673 |
4793 |
4674 def ShowMessage(self, message): |
4794 def ShowMessage(self, message): |
4675 message = wx.MessageDialog(self.ParentWindow, message, "Error", wx.OK|wx.ICON_ERROR) |
4795 message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK|wx.ICON_ERROR) |
4676 message.ShowModal() |
4796 message.ShowModal() |
4677 message.Destroy() |
4797 message.Destroy() |
4678 |
4798 |
4679 [ID_DEBUGVARIABLEPANEL, ID_DEBUGVARIABLEPANELVARIABLESGRID, |
4799 [ID_DEBUGVARIABLEPANEL, ID_DEBUGVARIABLEPANELVARIABLESGRID, |
4680 ID_DEBUGVARIABLEPANELUPBUTTON, ID_DEBUGVARIABLEPANELDOWNBUTTON, |
4800 ID_DEBUGVARIABLEPANELUPBUTTON, ID_DEBUGVARIABLEPANELDOWNBUTTON, |
4737 self.DownButton = wx.Button(id=ID_DEBUGVARIABLEPANELDOWNBUTTON, label='v', |
4857 self.DownButton = wx.Button(id=ID_DEBUGVARIABLEPANELDOWNBUTTON, label='v', |
4738 name='DownButton', parent=self, pos=wx.Point(0, 0), |
4858 name='DownButton', parent=self, pos=wx.Point(0, 0), |
4739 size=wx.Size(32, 32), style=0) |
4859 size=wx.Size(32, 32), style=0) |
4740 self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_DEBUGVARIABLEPANELDOWNBUTTON) |
4860 self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_DEBUGVARIABLEPANELDOWNBUTTON) |
4741 |
4861 |
4742 self.DeleteButton = wx.Button(id=ID_DEBUGVARIABLEPANELDELETEBUTTON, label='Delete', |
4862 self.DeleteButton = wx.Button(id=ID_DEBUGVARIABLEPANELDELETEBUTTON, label=_('Delete'), |
4743 name='DeleteButton', parent=self, pos=wx.Point(0, 0), |
4863 name='DeleteButton', parent=self, pos=wx.Point(0, 0), |
4744 size=wx.Size(72, 32), style=0) |
4864 size=wx.Size(72, 32), style=0) |
4745 self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_DEBUGVARIABLEPANELDELETEBUTTON) |
4865 self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_DEBUGVARIABLEPANELDELETEBUTTON) |
4746 |
4866 |
4747 self._init_sizers() |
4867 self._init_sizers() |
4750 self._init_ctrls(parent) |
4870 self._init_ctrls(parent) |
4751 DebugViewer.__init__(self, controler, True) |
4871 DebugViewer.__init__(self, controler, True) |
4752 self.Controler = controler |
4872 self.Controler = controler |
4753 self.HasNewData = False |
4873 self.HasNewData = False |
4754 |
4874 |
4755 self.Table = DebugVariableTable(self, [], ["Variable", "Value"]) |
4875 self.Table = DebugVariableTable(self, [], GetDebugVariablesTableColnames()) |
4756 self.VariablesGrid.SetTable(self.Table) |
4876 self.VariablesGrid.SetTable(self.Table) |
4757 self.VariablesGrid.SetRowLabelSize(0) |
4877 self.VariablesGrid.SetRowLabelSize(0) |
4758 |
4878 |
4759 for col in range(self.Table.GetNumberCols()): |
4879 for col in range(self.Table.GetNumberCols()): |
4760 attr = wx.grid.GridCellAttr() |
4880 attr = wx.grid.GridCellAttr() |
4875 dc.SetFont(wx.Font(fontsize, wx.DEFAULT, wx.NORMAL, wx.NORMAL)) |
4995 dc.SetFont(wx.Font(fontsize, wx.DEFAULT, wx.NORMAL, wx.NORMAL)) |
4876 dc.SetTextForeground(wx.BLACK) |
4996 dc.SetTextForeground(wx.BLACK) |
4877 block_name = " - ".join(self.Viewer.GetTagName().split("::")[1:]) |
4997 block_name = " - ".join(self.Viewer.GetTagName().split("::")[1:]) |
4878 text_width, text_height = dc.GetTextExtent(block_name) |
4998 text_width, text_height = dc.GetTextExtent(block_name) |
4879 dc.DrawText(block_name, margin_left, margin_top - text_height - self.TextMargin) |
4999 dc.DrawText(block_name, margin_left, margin_top - text_height - self.TextMargin) |
4880 dc.DrawText("Page: %d" % page, margin_left, margin_top + area_height + self.TextMargin) |
5000 dc.DrawText(_("Page: %d") % page, margin_left, margin_top + area_height + self.TextMargin) |
4881 |
5001 |
4882 # Calculate the position on the DC for centering the graphic |
5002 # Calculate the position on the DC for centering the graphic |
4883 posX = area_width * ((page - 1) % self.PageGrid[0]) |
5003 posX = area_width * ((page - 1) % self.PageGrid[0]) |
4884 posY = area_height * ((page - 1) / self.PageGrid[0]) |
5004 posY = area_height * ((page - 1) / self.PageGrid[0]) |
4885 |
5005 |
4905 Max_Traceback_List_Size = 20 |
5025 Max_Traceback_List_Size = 20 |
4906 |
5026 |
4907 def Display_Exception_Dialog(e_type,e_value,e_tb): |
5027 def Display_Exception_Dialog(e_type,e_value,e_tb): |
4908 trcbck_lst = [] |
5028 trcbck_lst = [] |
4909 for i,line in enumerate(traceback.extract_tb(e_tb)): |
5029 for i,line in enumerate(traceback.extract_tb(e_tb)): |
4910 trcbck = " " + str(i+1) + ". " |
5030 trcbck = " " + str(i+1) + _(". ") |
4911 if line[0].find(os.getcwd()) == -1: |
5031 if line[0].find(os.getcwd()) == -1: |
4912 trcbck += "file : " + str(line[0]) + ", " |
5032 trcbck += _("file : ") + str(line[0]) + _(", ") |
4913 else: |
5033 else: |
4914 trcbck += "file : " + str(line[0][len(os.getcwd()):]) + ", " |
5034 trcbck += _("file : ") + str(line[0][len(os.getcwd()):]) + _(", ") |
4915 trcbck += "line : " + str(line[1]) + ", " + "function : " + str(line[2]) |
5035 trcbck += _("line : ") + str(line[1]) + _(", ") + _("function : ") + str(line[2]) |
4916 trcbck_lst.append(trcbck) |
5036 trcbck_lst.append(trcbck) |
4917 |
5037 |
4918 # Allow clicking.... |
5038 # Allow clicking.... |
4919 cap = wx.Window_GetCapture() |
5039 cap = wx.Window_GetCapture() |
4920 if cap: |
5040 if cap: |
4921 cap.ReleaseMouse() |
5041 cap.ReleaseMouse() |
4922 |
5042 |
4923 dlg = wx.SingleChoiceDialog(None, |
5043 dlg = wx.SingleChoiceDialog(None, |
4924 """ |
5044 _(""" |
4925 An error happens. |
5045 An error happens. |
4926 |
5046 |
4927 Click on OK for saving an error report. |
5047 Click on OK for saving an error report. |
4928 |
5048 |
4929 Please contact LOLITech at: |
5049 Please contact LOLITech at: |
4930 +33 (0)3 29 57 60 42 |
5050 +33 (0)3 29 57 60 42 |
4931 bugs_PLCOpenEditor@lolitech.fr |
5051 bugs_PLCOpenEditor@lolitech.fr |
4932 |
5052 |
4933 |
5053 |
4934 Error: |
5054 Error: |
4935 """ + |
5055 """) + |
4936 str(e_type) + " : " + str(e_value), |
5056 str(e_type) + _(" : ") + str(e_value), |
4937 "Error", |
5057 _("Error"), |
4938 trcbck_lst) |
5058 trcbck_lst) |
4939 try: |
5059 try: |
4940 res = (dlg.ShowModal() == wx.ID_OK) |
5060 res = (dlg.ShowModal() == wx.ID_OK) |
4941 finally: |
5061 finally: |
4942 dlg.Destroy() |
5062 dlg.Destroy() |
4943 |
5063 |
4944 return res |
5064 return res |
4945 |
5065 |
4946 def Display_Error_Dialog(e_value): |
5066 def Display_Error_Dialog(e_value): |
4947 message = wx.MessageDialog(None, str(e_value), "Error", wx.OK|wx.ICON_ERROR) |
5067 message = wx.MessageDialog(None, str(e_value), _("Error"), wx.OK|wx.ICON_ERROR) |
4948 message.ShowModal() |
5068 message.ShowModal() |
4949 message.Destroy() |
5069 message.Destroy() |
4950 |
5070 |
4951 def get_last_traceback(tb): |
5071 def get_last_traceback(tb): |
4952 while tb.tb_next: |
5072 while tb.tb_next: |
5000 |
5120 |
5001 #sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args) |
5121 #sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args) |
5002 sys.excepthook = handle_exception |
5122 sys.excepthook = handle_exception |
5003 |
5123 |
5004 if __name__ == '__main__': |
5124 if __name__ == '__main__': |
5005 def usage(): |
|
5006 print "\nUsage of PLCOpenEditor.py :" |
|
5007 print "\n %s [Filepath]\n"%sys.argv[0] |
|
5008 |
|
5009 try: |
|
5010 opts, args = getopt.getopt(sys.argv[1:], "h", ["help"]) |
|
5011 except getopt.GetoptError: |
|
5012 # print help information and exit: |
|
5013 usage() |
|
5014 sys.exit(2) |
|
5015 |
|
5016 for o, a in opts: |
|
5017 if o in ("-h", "--help"): |
|
5018 usage() |
|
5019 sys.exit() |
|
5020 |
|
5021 fileOpen = None |
|
5022 if len(args) > 1: |
|
5023 usage() |
|
5024 sys.exit() |
|
5025 elif len(args) == 1: |
|
5026 fileOpen = args[0] |
|
5027 |
|
5028 app = wx.PySimpleApp() |
|
5029 wx.InitAllImageHandlers() |
5125 wx.InitAllImageHandlers() |
5030 |
5126 |
5031 # Install a exception handle for bug reports |
5127 # Install a exception handle for bug reports |
5032 AddExceptHook(os.getcwd(),__version__) |
5128 AddExceptHook(os.getcwd(),__version__) |
5033 |
5129 |