29 |
29 |
30 #------------------------------------------------------------------------------- |
30 #------------------------------------------------------------------------------- |
31 # Create New Block Dialog |
31 # Create New Block Dialog |
32 #------------------------------------------------------------------------------- |
32 #------------------------------------------------------------------------------- |
33 |
33 |
34 [ID_FBDBLOCKDIALOG, ID_FBDBLOCKDIALOGNAME, |
|
35 ID_FBDBLOCKDIALOGTYPETREE, ID_FBDBLOCKDIALOGTYPEDESC, |
|
36 ID_FBDBLOCKDIALOGINPUTS, ID_FBDBLOCKDIALOGPREVIEW, |
|
37 ID_FBDBLOCKDIALOGEXECUTIONORDER, ID_FBDBLOCKDIALOGEXECUTIONCONTROL, |
|
38 ID_FBDBLOCKDIALOGSTATICTEXT1, ID_FBDBLOCKDIALOGSTATICTEXT2, |
|
39 ID_FBDBLOCKDIALOGSTATICTEXT3, ID_FBDBLOCKDIALOGSTATICTEXT4, |
|
40 ID_FBDBLOCKDIALOGSTATICTEXT5, ID_FBDBLOCKDIALOGSTATICTEXT6, |
|
41 ] = [wx.NewId() for _init_ctrls in range(14)] |
|
42 |
|
43 [CATEGORY, BLOCK] = range(2) |
|
44 |
|
45 class FBDBlockDialog(wx.Dialog): |
34 class FBDBlockDialog(wx.Dialog): |
46 |
35 |
47 if wx.VERSION < (2, 6, 0): |
36 def __init__(self, parent, controller): |
48 def Bind(self, event, function, id = None): |
37 wx.Dialog.__init__(self, parent, |
49 if id is not None: |
38 size=wx.Size(600, 400), title=_('Block Properties')) |
50 event(self, id, function) |
39 |
51 else: |
40 main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=10) |
52 event(self, function) |
41 main_sizer.AddGrowableCol(0) |
53 |
42 main_sizer.AddGrowableRow(0) |
54 def _init_coll_flexGridSizer1_Items(self, parent): |
43 |
55 parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT) |
44 column_sizer = wx.BoxSizer(wx.HORIZONTAL) |
56 parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
45 main_sizer.AddSizer(column_sizer, border=20, |
57 |
46 flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT) |
58 def _init_coll_flexGridSizer1_Growables(self, parent): |
47 |
59 parent.AddGrowableCol(0) |
48 type_staticbox = wx.StaticBox(self, label=_('Type:')) |
60 parent.AddGrowableRow(0) |
49 left_staticboxsizer = wx.StaticBoxSizer(type_staticbox, wx.VERTICAL) |
61 |
50 column_sizer.AddSizer(left_staticboxsizer, 1, border=5, |
62 def _init_coll_MainSizer_Items(self, parent): |
51 flag=wx.GROW|wx.RIGHT) |
63 parent.AddSizer(self.LeftBoxSizer, 1, border=5, flag=wx.GROW|wx.RIGHT) |
52 |
64 parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT) |
|
65 |
|
66 def _init_coll_LeftBoxSizer_Items(self, parent): |
|
67 parent.AddWindow(self.LibraryPanel, 1, border=5, flag=wx.GROW|wx.TOP) |
|
68 |
|
69 def _init_coll_RightGridSizer_Items(self, parent): |
|
70 parent.AddSizer(self.RightUpGridSizer, 0, border=0, flag=wx.GROW) |
|
71 parent.AddWindow(self.staticText6, 0, border=0, flag=wx.GROW) |
|
72 parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW) |
|
73 |
|
74 def _init_coll_RightGridSizer_Growables(self, parent): |
|
75 parent.AddGrowableCol(0) |
|
76 parent.AddGrowableRow(2) |
|
77 |
|
78 def _init_coll_RightUpGridSizer_Items(self, parent): |
|
79 parent.AddWindow(self.staticText2, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
|
80 parent.AddWindow(self.BlockName, 0, border=0, flag=wx.GROW) |
|
81 parent.AddWindow(self.staticText3, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
|
82 parent.AddWindow(self.Inputs, 0, border=0, flag=wx.GROW) |
|
83 parent.AddWindow(self.staticText4, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
|
84 parent.AddWindow(self.ExecutionOrder, 0, border=0, flag=wx.GROW) |
|
85 parent.AddWindow(self.staticText5, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP) |
|
86 parent.AddWindow(self.ExecutionControl, 0, border=0, flag=wx.GROW) |
|
87 |
|
88 def _init_coll_RightUpGridSizer_Growables(self, parent): |
|
89 parent.AddGrowableCol(1) |
|
90 |
|
91 def _init_sizers(self): |
|
92 self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) |
|
93 self.MainSizer = wx.BoxSizer(wx.HORIZONTAL) |
|
94 self.LeftBoxSizer = wx.StaticBoxSizer(self.staticbox1, wx.VERTICAL) |
|
95 self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5) |
|
96 self.RightUpGridSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=4, vgap=5) |
|
97 |
|
98 self._init_coll_flexGridSizer1_Items(self.flexGridSizer1) |
|
99 self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1) |
|
100 self._init_coll_MainSizer_Items(self.MainSizer) |
|
101 self._init_coll_LeftBoxSizer_Items(self.LeftBoxSizer) |
|
102 self._init_coll_RightGridSizer_Items(self.RightGridSizer) |
|
103 self._init_coll_RightGridSizer_Growables(self.RightGridSizer) |
|
104 self._init_coll_RightUpGridSizer_Items(self.RightUpGridSizer) |
|
105 self._init_coll_RightUpGridSizer_Growables(self.RightUpGridSizer) |
|
106 |
|
107 self.SetSizer(self.flexGridSizer1) |
|
108 |
|
109 def _init_ctrls(self, prnt): |
|
110 wx.Dialog.__init__(self, id=ID_FBDBLOCKDIALOG, |
|
111 name='FBDBlockDialog', parent=prnt, |
|
112 size=wx.Size(600, 400), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER, |
|
113 title=_('Block Properties')) |
|
114 self.SetClientSize(wx.Size(600, 400)) |
|
115 |
|
116 self.staticbox1 = wx.StaticBox(id=ID_FBDBLOCKDIALOGSTATICTEXT1, |
|
117 label=_('Type:'), name='staticBox1', parent=self, |
|
118 pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0) |
|
119 |
|
120 self.staticText2 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT2, |
|
121 label=_('Name:'), name='staticText2', parent=self, |
|
122 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
123 |
|
124 self.staticText3 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT2, |
|
125 label=_('Inputs:'), name='staticText4', parent=self, |
|
126 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
127 |
|
128 self.staticText4 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT4, |
|
129 label=_('Execution Order:'), name='staticText4', parent=self, |
|
130 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
131 |
|
132 self.staticText5 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT5, |
|
133 label=_('Execution Control:'), name='staticText5', parent=self, |
|
134 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
135 |
|
136 self.staticText6 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT6, |
|
137 label=_('Preview:'), name='staticText6', parent=self, |
|
138 pos=wx.Point(0, 0), size=wx.DefaultSize, style=0) |
|
139 |
|
140 self.LibraryPanel = LibraryPanel(self) |
53 self.LibraryPanel = LibraryPanel(self) |
141 |
54 self.LibraryPanel.SetController(controller) |
142 self.BlockName = wx.TextCtrl(id=ID_FBDBLOCKDIALOGNAME, value='', |
55 setattr(self.LibraryPanel, "_OnTreeItemSelected", |
143 name='BlockName', parent=self, pos=wx.Point(0, 0), |
56 self.OnLibraryTreeItemSelected) |
144 size=wx.Size(0, 24), style=0) |
57 left_staticboxsizer.AddWindow(self.LibraryPanel, 1, border=5, |
145 self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_FBDBLOCKDIALOGNAME) |
58 flag=wx.GROW|wx.TOP) |
146 |
59 |
147 self.Inputs = wx.SpinCtrl(id=ID_FBDBLOCKDIALOGINPUTS, |
60 right_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5) |
148 name='Inputs', parent=self, pos=wx.Point(0, 0), |
61 right_gridsizer.AddGrowableCol(0) |
149 size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=2, max=20) |
62 right_gridsizer.AddGrowableRow(2) |
150 self.Bind(wx.EVT_SPINCTRL, self.OnInputsChanged, id=ID_FBDBLOCKDIALOGINPUTS) |
63 column_sizer.AddSizer(right_gridsizer, 1, border=5, |
151 |
64 flag=wx.GROW|wx.LEFT) |
152 self.ExecutionOrder = wx.SpinCtrl(id=ID_FBDBLOCKDIALOGEXECUTIONORDER, |
65 |
153 name='ExecutionOrder', parent=self, pos=wx.Point(0, 0), |
66 top_right_gridsizer = wx.FlexGridSizer(cols=2, hgap=0, rows=4, vgap=5) |
154 size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0) |
67 top_right_gridsizer.AddGrowableCol(1) |
155 self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, id=ID_FBDBLOCKDIALOGEXECUTIONORDER) |
68 right_gridsizer.AddSizer(top_right_gridsizer, flag=wx.GROW) |
156 |
69 |
157 self.ExecutionControl = wx.CheckBox(id=ID_FBDBLOCKDIALOGEXECUTIONCONTROL, |
70 name_label = wx.StaticText(self, label=_('Name:')) |
158 name='ExecutionControl', parent=self, pos=wx.Point(0, 0), |
71 top_right_gridsizer.AddWindow(name_label, |
159 size=wx.Size(0, 24), style=0) |
72 flag=wx.ALIGN_CENTER_VERTICAL) |
160 self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, id=ID_FBDBLOCKDIALOGEXECUTIONCONTROL) |
73 |
161 |
74 self.BlockName = wx.TextCtrl(self) |
162 self.Preview = wx.Panel(id=ID_FBDBLOCKDIALOGPREVIEW, |
75 self.Bind(wx.EVT_TEXT, self.OnNameChanged, self.BlockName) |
163 name='Preview', parent=self, pos=wx.Point(0, 0), |
76 top_right_gridsizer.AddWindow(self.BlockName, flag=wx.GROW) |
164 size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER) |
77 |
|
78 inputs_label = wx.StaticText(self, label=_('Inputs:')) |
|
79 top_right_gridsizer.AddWindow(inputs_label, |
|
80 flag=wx.ALIGN_CENTER_VERTICAL) |
|
81 |
|
82 self.Inputs = wx.SpinCtrl(self, min=2, max=20, |
|
83 style=wx.SP_ARROW_KEYS) |
|
84 self.Bind(wx.EVT_SPINCTRL, self.OnInputsChanged, self.Inputs) |
|
85 top_right_gridsizer.AddWindow(self.Inputs, flag=wx.GROW) |
|
86 |
|
87 execution_order_label = wx.StaticText(self, label=_('Execution Order:')) |
|
88 top_right_gridsizer.AddWindow(execution_order_label, |
|
89 flag=wx.ALIGN_CENTER_VERTICAL) |
|
90 |
|
91 self.ExecutionOrder = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS) |
|
92 self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, self.ExecutionOrder) |
|
93 top_right_gridsizer.AddWindow(self.ExecutionOrder, flag=wx.GROW) |
|
94 |
|
95 execution_control_label = wx.StaticText(self, label=_('Execution Control:')) |
|
96 top_right_gridsizer.AddWindow(execution_control_label, |
|
97 flag=wx.ALIGN_CENTER_VERTICAL) |
|
98 |
|
99 self.ExecutionControl = wx.CheckBox(self) |
|
100 self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, self.ExecutionControl) |
|
101 top_right_gridsizer.AddWindow(self.ExecutionControl, flag=wx.GROW) |
|
102 |
|
103 preview_label = wx.StaticText(self, label=_('Preview:')) |
|
104 right_gridsizer.AddWindow(preview_label, flag=wx.GROW) |
|
105 |
|
106 self.Preview = wx.Panel(self, |
|
107 style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER) |
165 self.Preview.SetBackgroundColour(wx.Colour(255,255,255)) |
108 self.Preview.SetBackgroundColour(wx.Colour(255,255,255)) |
166 setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE) |
109 setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE) |
167 setattr(self.Preview, "GetScaling", lambda:None) |
110 setattr(self.Preview, "GetScaling", lambda:None) |
168 setattr(self.Preview, "GetBlockType", self.Controler.GetBlockType) |
111 setattr(self.Preview, "GetBlockType", controller.GetBlockType) |
169 setattr(self.Preview, "IsOfType", self.Controler.IsOfType) |
112 setattr(self.Preview, "IsOfType", controller.IsOfType) |
170 |
113 self.Preview.Bind(wx.EVT_PAINT, self.OnPaint) |
171 self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE) |
114 right_gridsizer.AddWindow(self.Preview, flag=wx.GROW) |
172 if wx.VERSION >= (2, 5, 0): |
115 |
173 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId()) |
116 button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE) |
174 self.Preview.Bind(wx.EVT_PAINT, self.OnPaint) |
117 self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton()) |
175 else: |
118 main_sizer.AddSizer(button_sizer, border=20, |
176 self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId()) |
119 flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
177 wx.EVT_PAINT(self.Preview, self.OnPaint) |
120 |
178 |
121 self.SetSizer(main_sizer) |
179 self._init_sizers() |
122 |
180 |
123 self.Controller = controller |
181 def __init__(self, parent, controler): |
124 |
182 self.Controler = controler |
|
183 self._init_ctrls(parent) |
|
184 self.BlockName.SetValue("") |
125 self.BlockName.SetValue("") |
185 self.BlockName.Enable(False) |
126 self.BlockName.Enable(False) |
186 self.Inputs.Enable(False) |
127 self.Inputs.Enable(False) |
187 self.Block = None |
128 self.Block = None |
188 self.MinBlockSize = None |
129 self.MinBlockSize = None |
189 self.First = True |
130 self.First = True |
190 |
131 |
191 self.PouNames = [] |
132 self.PouNames = [] |
192 self.PouElementNames = [] |
133 self.PouElementNames = [] |
193 |
134 |
194 self.LibraryPanel.SetControler(controler) |
|
195 setattr(self.LibraryPanel, "_OnTreeItemSelected", self.OnLibraryTreeItemSelected) |
|
196 self.LibraryPanel.SetFocus() |
135 self.LibraryPanel.SetFocus() |
197 |
136 |
198 def SetBlockList(self, blocklist): |
137 def SetBlockList(self, blocklist): |
199 self.LibraryPanel.SetBlockList(blocklist) |
138 self.LibraryPanel.SetBlockList(blocklist) |
200 |
139 |
201 def SetPreviewFont(self, font): |
140 def SetPreviewFont(self, font): |
202 self.Preview.SetFont(font) |
141 self.Preview.SetFont(font) |
203 |
142 |
204 def OnOK(self, event): |
143 def OnOK(self, event): |
|
144 message = None |
205 selected = self.LibraryPanel.GetSelectedBlock() |
145 selected = self.LibraryPanel.GetSelectedBlock() |
206 block_name = self.BlockName.GetValue() |
146 block_name = self.BlockName.GetValue() |
207 name_enabled = self.BlockName.IsEnabled() |
147 name_enabled = self.BlockName.IsEnabled() |
208 if selected is None: |
148 if selected is None: |
209 message = wx.MessageDialog(self, _("Form isn't complete. Valid block type must be selected!"), _("Error"), wx.OK|wx.ICON_ERROR) |
149 message = _("Form isn't complete. Valid block type must be selected!") |
210 message.ShowModal() |
|
211 message.Destroy() |
|
212 elif name_enabled and block_name == "": |
150 elif name_enabled and block_name == "": |
213 message = wx.MessageDialog(self, _("Form isn't complete. Name must be filled!"), _("Error"), wx.OK|wx.ICON_ERROR) |
151 message = _("Form isn't complete. Name must be filled!") |
214 message.ShowModal() |
|
215 message.Destroy() |
|
216 elif name_enabled and not TestIdentifier(block_name): |
152 elif name_enabled and not TestIdentifier(block_name): |
217 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR) |
153 message = _("\"%s\" is not a valid identifier!") % block_name |
218 message.ShowModal() |
|
219 message.Destroy() |
|
220 elif name_enabled and block_name.upper() in IEC_KEYWORDS: |
154 elif name_enabled and block_name.upper() in IEC_KEYWORDS: |
221 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR) |
155 message = _("\"%s\" is a keyword. It can't be used!") % block_name |
222 message.ShowModal() |
|
223 message.Destroy() |
|
224 elif name_enabled and block_name.upper() in self.PouNames: |
156 elif name_enabled and block_name.upper() in self.PouNames: |
225 message = wx.MessageDialog(self, _("\"%s\" pou already exists!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR) |
157 message = _("\"%s\" pou already exists!") % block_name |
226 message.ShowModal() |
|
227 message.Destroy() |
|
228 elif name_enabled and block_name.upper() in self.PouElementNames: |
158 elif name_enabled and block_name.upper() in self.PouElementNames: |
229 message = wx.MessageDialog(self, _("\"%s\" element for this pou already exists!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR) |
159 message = _("\"%s\" element for this pou already exists!") % block_name |
230 message.ShowModal() |
160 if message is not None: |
231 message.Destroy() |
161 dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR) |
|
162 dialog.ShowModal() |
|
163 dialog.Destroy() |
232 else: |
164 else: |
233 self.EndModal(wx.ID_OK) |
165 self.EndModal(wx.ID_OK) |
234 |
166 |
235 def SetMinBlockSize(self, size): |
167 def SetMinBlockSize(self, size): |
236 self.MinBlockSize = size |
168 self.MinBlockSize = size |