20 # |
20 # |
21 #You should have received a copy of the GNU General Public |
21 #You should have received a copy of the GNU General Public |
22 #License along with this library; if not, write to the Free Software |
22 #License along with this library; if not, write to the Free Software |
23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
24 |
24 |
|
25 import re |
|
26 |
25 import wx |
27 import wx |
26 |
28 |
27 from graphics import * |
29 from graphics.FBD_Objects import FBD_Block |
28 from controls.LibraryPanel import LibraryPanel |
30 from controls.LibraryPanel import LibraryPanel |
|
31 from BlockPreviewDialog import BlockPreviewDialog |
29 |
32 |
30 #------------------------------------------------------------------------------- |
33 #------------------------------------------------------------------------------- |
31 # Create New Block Dialog |
34 # Create New Block Dialog |
32 #------------------------------------------------------------------------------- |
35 #------------------------------------------------------------------------------- |
33 |
36 |
34 class FBDBlockDialog(wx.Dialog): |
37 class FBDBlockDialog(BlockPreviewDialog): |
35 |
38 |
36 def __init__(self, parent, controller): |
39 def __init__(self, parent, controller, tagname): |
37 wx.Dialog.__init__(self, parent, |
40 BlockPreviewDialog.__init__(self, parent, controller, tagname, |
38 size=wx.Size(600, 450), title=_('Block Properties')) |
41 size=wx.Size(600, 450), title=_('Block Properties')) |
39 |
42 |
40 main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=10) |
43 main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=10) |
41 main_sizer.AddGrowableCol(0) |
44 main_sizer.AddGrowableCol(0) |
42 main_sizer.AddGrowableRow(0) |
45 main_sizer.AddGrowableRow(0) |
97 |
100 |
98 self.ExecutionControl = wx.CheckBox(self) |
101 self.ExecutionControl = wx.CheckBox(self) |
99 self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, self.ExecutionControl) |
102 self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, self.ExecutionControl) |
100 top_right_gridsizer.AddWindow(self.ExecutionControl, flag=wx.GROW) |
103 top_right_gridsizer.AddWindow(self.ExecutionControl, flag=wx.GROW) |
101 |
104 |
102 preview_label = wx.StaticText(self, label=_('Preview:')) |
105 right_gridsizer.AddWindow(self.PreviewLabel, flag=wx.GROW) |
103 right_gridsizer.AddWindow(preview_label, flag=wx.GROW) |
|
104 |
|
105 self.Preview = wx.Panel(self, |
|
106 style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER) |
|
107 self.Preview.SetBackgroundColour(wx.Colour(255,255,255)) |
|
108 setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE) |
|
109 setattr(self.Preview, "GetScaling", lambda:None) |
|
110 setattr(self.Preview, "GetBlockType", controller.GetBlockType) |
|
111 setattr(self.Preview, "IsOfType", controller.IsOfType) |
|
112 self.Preview.Bind(wx.EVT_PAINT, self.OnPaint) |
|
113 right_gridsizer.AddWindow(self.Preview, flag=wx.GROW) |
106 right_gridsizer.AddWindow(self.Preview, flag=wx.GROW) |
114 |
107 |
115 button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE) |
108 main_sizer.AddSizer(self.ButtonSizer, border=20, |
116 self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton()) |
|
117 main_sizer.AddSizer(button_sizer, border=20, |
|
118 flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
109 flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
119 |
110 |
120 self.SetSizer(main_sizer) |
111 self.SetSizer(main_sizer) |
121 |
|
122 self.Controller = controller |
|
123 |
112 |
124 self.BlockName.SetValue("") |
113 self.BlockName.SetValue("") |
125 self.BlockName.Enable(False) |
114 self.BlockName.Enable(False) |
126 self.Inputs.Enable(False) |
115 self.Inputs.Enable(False) |
127 self.Block = None |
116 self.CurrentBlockName = None |
128 self.MinBlockSize = None |
117 |
129 self.First = True |
118 self.LibraryPanel.SetBlockList(controller.GetBlockTypes(tagname)) |
130 |
|
131 self.PouNames = [] |
|
132 self.PouElementNames = [] |
|
133 |
|
134 self.LibraryPanel.SetFocus() |
119 self.LibraryPanel.SetFocus() |
135 |
|
136 def __del__(self): |
|
137 self.Controller = None |
|
138 |
|
139 def SetBlockList(self, blocklist): |
|
140 self.LibraryPanel.SetBlockList(blocklist) |
|
141 |
|
142 def SetPreviewFont(self, font): |
|
143 self.Preview.SetFont(font) |
|
144 |
120 |
145 def OnOK(self, event): |
121 def OnOK(self, event): |
146 message = None |
122 message = None |
147 selected = self.LibraryPanel.GetSelectedBlock() |
123 selected = self.LibraryPanel.GetSelectedBlock() |
148 block_name = self.BlockName.GetValue() |
124 block_name = self.BlockName.GetValue() |
149 name_enabled = self.BlockName.IsEnabled() |
125 name_enabled = self.BlockName.IsEnabled() |
150 if selected is None: |
126 if selected is None: |
151 message = _("Form isn't complete. Valid block type must be selected!") |
127 message = _("Form isn't complete. Valid block type must be selected!") |
152 elif name_enabled and block_name == "": |
128 elif name_enabled and block_name == "": |
153 message = _("Form isn't complete. Name must be filled!") |
129 message = _("Form isn't complete. Name must be filled!") |
154 elif name_enabled and not TestIdentifier(block_name): |
|
155 message = _("\"%s\" is not a valid identifier!") % block_name |
|
156 elif name_enabled and block_name.upper() in IEC_KEYWORDS: |
|
157 message = _("\"%s\" is a keyword. It can't be used!") % block_name |
|
158 elif name_enabled and block_name.upper() in self.PouNames: |
|
159 message = _("\"%s\" pou already exists!") % block_name |
|
160 elif name_enabled and block_name.upper() in self.PouElementNames: |
|
161 message = _("\"%s\" element for this pou already exists!") % block_name |
|
162 if message is not None: |
130 if message is not None: |
163 dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR) |
131 self.ShowMessage(message) |
164 dialog.ShowModal() |
132 elif name_enabled and self.TestBlockName(block_name): |
165 dialog.Destroy() |
133 BlockPreviewDialog.OnOK(self, event) |
166 else: |
134 |
167 self.EndModal(wx.ID_OK) |
|
168 |
|
169 def SetMinBlockSize(self, size): |
|
170 self.MinBlockSize = size |
|
171 |
|
172 def SetPouNames(self, pou_names): |
|
173 self.PouNames = [pou_name.upper() for pou_name in pou_names] |
|
174 |
|
175 def SetPouElementNames(self, element_names): |
|
176 self.PouElementNames = [element_name.upper() for element_name in element_names] |
|
177 |
|
178 def SetValues(self, values): |
135 def SetValues(self, values): |
179 blocktype = values.get("type", None) |
136 blocktype = values.get("type", None) |
|
137 default_name_model = re.compile("%s[0-9]+" % blocktype) |
180 if blocktype is not None: |
138 if blocktype is not None: |
181 self.LibraryPanel.SelectTreeItem(blocktype, values.get("inputs", None)) |
139 self.LibraryPanel.SelectTreeItem(blocktype, |
|
140 values.get("inputs", None)) |
182 for name, value in values.items(): |
141 for name, value in values.items(): |
183 if name == "name": |
142 if name == "name": |
184 self.BlockName.SetValue(value) |
143 self.DefaultBlockName = value |
|
144 if default_name_model.match(value) is None: |
|
145 self.CurrentBlockName = value |
|
146 self.BlockName.ChangeValue(value) |
185 elif name == "extension": |
147 elif name == "extension": |
186 self.Inputs.SetValue(value) |
148 self.Inputs.SetValue(value) |
187 elif name == "executionOrder": |
149 elif name == "executionOrder": |
188 self.ExecutionOrder.SetValue(value) |
150 self.ExecutionOrder.SetValue(value) |
189 elif name == "executionControl": |
151 elif name == "executionControl": |
197 values["width"], values["height"] = self.Block.GetSize() |
159 values["width"], values["height"] = self.Block.GetSize() |
198 values["extension"] = self.Inputs.GetValue() |
160 values["extension"] = self.Inputs.GetValue() |
199 values["executionOrder"] = self.ExecutionOrder.GetValue() |
161 values["executionOrder"] = self.ExecutionOrder.GetValue() |
200 values["executionControl"] = self.ExecutionControl.GetValue() |
162 values["executionControl"] = self.ExecutionControl.GetValue() |
201 return values |
163 return values |
202 |
164 |
203 def OnLibraryTreeItemSelected(self, event): |
165 def OnLibraryTreeItemSelected(self, event): |
204 values = self.LibraryPanel.GetSelectedBlock() |
166 values = self.LibraryPanel.GetSelectedBlock() |
205 if values is not None: |
167 blocktype = (self.Controller.GetBlockType(values["type"], |
206 blocktype = self.Controller.GetBlockType(values["type"], values["inputs"]) |
168 values["inputs"]) |
207 else: |
169 if values is not None else None) |
208 blocktype = None |
170 |
209 if blocktype is not None: |
171 if blocktype is not None: |
210 self.Inputs.SetValue(len(blocktype["inputs"])) |
172 self.Inputs.SetValue(len(blocktype["inputs"])) |
211 self.Inputs.Enable(blocktype["extensible"]) |
173 self.Inputs.Enable(blocktype["extensible"]) |
212 self.BlockName.Enable(blocktype["type"] != "function") |
174 else: |
213 wx.CallAfter(self.RefreshPreview) |
175 self.Inputs.SetValue(2) |
|
176 self.Inputs.Enable(False) |
|
177 |
|
178 if blocktype is not None and blocktype["type"] != "function": |
|
179 self.BlockName.Enable(True) |
|
180 self.BlockName.ChangeValue( |
|
181 self.CurrentBlockName |
|
182 if self.CurrentBlockName is not None |
|
183 else self.Controller.GenerateNewName( |
|
184 self.TagName, None, values["type"]+"%d", 0)) |
214 else: |
185 else: |
215 self.BlockName.Enable(False) |
186 self.BlockName.Enable(False) |
216 self.Inputs.Enable(False) |
187 self.BlockName.ChangeValue("") |
217 self.Inputs.SetValue(2) |
188 |
218 wx.CallAfter(self.ErasePreview) |
189 self.RefreshPreview() |
219 |
190 |
220 def OnNameChanged(self, event): |
191 def OnNameChanged(self, event): |
221 if self.BlockName.IsEnabled(): |
192 if self.BlockName.IsEnabled(): |
|
193 self.CurrentBlockName = self.BlockName.GetValue() |
222 self.RefreshPreview() |
194 self.RefreshPreview() |
223 event.Skip() |
195 event.Skip() |
224 |
196 |
225 def OnInputsChanged(self, event): |
197 def OnInputsChanged(self, event): |
226 if self.Inputs.IsEnabled(): |
198 if self.Inputs.IsEnabled(): |
254 blockname, |
218 blockname, |
255 extension = self.Inputs.GetValue(), |
219 extension = self.Inputs.GetValue(), |
256 inputs = values["inputs"], |
220 inputs = values["inputs"], |
257 executionControl = self.ExecutionControl.GetValue(), |
221 executionControl = self.ExecutionControl.GetValue(), |
258 executionOrder = self.ExecutionOrder.GetValue()) |
222 executionOrder = self.ExecutionOrder.GetValue()) |
259 width, height = self.MinBlockSize |
|
260 min_width, min_height = self.Block.GetMinSize() |
|
261 width, height = max(min_width, width), max(min_height, height) |
|
262 self.Block.SetSize(width, height) |
|
263 clientsize = self.Preview.GetClientSize() |
|
264 x = (clientsize.width - width) / 2 |
|
265 y = (clientsize.height - height) / 2 |
|
266 self.Block.SetPosition(x, y) |
|
267 self.Block.Draw(dc) |
|
268 else: |
223 else: |
269 self.Block = None |
224 self.Block = None |
270 |
225 BlockPreviewDialog.RefreshPreview(self) |
271 def OnPaint(self, event): |
|
272 if self.Block is not None: |
|
273 self.RefreshPreview() |
|
274 event.Skip() |
|