dialogs/SFCTransitionDialog.py
changeset 409 34c9f624c2fe
child 534 d506a353b3d3
equal deleted inserted replaced
408:0e389fa5b160 409:34c9f624c2fe
       
     1 # -*- coding: utf-8 -*-
       
     2 
       
     3 #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
       
     4 #based on the plcopen standard. 
       
     5 #
       
     6 #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
       
     7 #
       
     8 #See COPYING file for copyrights details.
       
     9 #
       
    10 #This library is free software; you can redistribute it and/or
       
    11 #modify it under the terms of the GNU General Public
       
    12 #License as published by the Free Software Foundation; either
       
    13 #version 2.1 of the License, or (at your option) any later version.
       
    14 #
       
    15 #This library is distributed in the hope that it will be useful,
       
    16 #but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    17 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    18 #General Public License for more details.
       
    19 #
       
    20 #You should have received a copy of the GNU General Public
       
    21 #License along with this library; if not, write to the Free Software
       
    22 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
       
    23 
       
    24 import wx
       
    25 
       
    26 from graphics import *
       
    27 
       
    28 #-------------------------------------------------------------------------------
       
    29 #                          Edit Transition Content Dialog
       
    30 #-------------------------------------------------------------------------------
       
    31 
       
    32 [ID_SFCTRANSITIONDIALOG, ID_SFCTRANSITIONDIALOGSPACER, 
       
    33  ID_SFCTRANSITIONDIALOGREFERENCE, ID_SFCTRANSITIONDIALOGINLINE, 
       
    34  ID_SFCTRANSITIONDIALOGPRIORITY, ID_SFCTRANSITIONDIALOGPREVIEW, 
       
    35  ID_SFCTRANSITIONDIALOGRADIOBUTTON1, ID_SFCTRANSITIONDIALOGRADIOBUTTON2, 
       
    36  ID_SFCTRANSITIONDIALOGRADIOBUTTON3, ID_SFCTRANSITIONDIALOGSTATICTEXT1, 
       
    37  ID_SFCTRANSITIONDIALOGSTATICTEXT2, ID_SFCTRANSITIONDIALOGSTATICTEXT3, 
       
    38 ] = [wx.NewId() for _init_ctrls in range(12)]
       
    39 
       
    40 class SFCTransitionDialog(wx.Dialog):
       
    41     
       
    42     if wx.VERSION < (2, 6, 0):
       
    43         def Bind(self, event, function, id = None):
       
    44             if id is not None:
       
    45                 event(self, id, function)
       
    46             else:
       
    47                 event(self, function)
       
    48     
       
    49     def _init_coll_flexGridSizer1_Items(self, parent):
       
    50         parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
       
    51         parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
       
    52         
       
    53     def _init_coll_flexGridSizer1_Growables(self, parent):
       
    54         parent.AddGrowableCol(0)
       
    55         parent.AddGrowableRow(0)
       
    56     
       
    57     def _init_coll_MainSizer_Items(self, parent):
       
    58         parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
       
    59         parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
       
    60     
       
    61     def _init_coll_LeftGridSizer_Items(self, parent):
       
    62         parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
       
    63         parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
       
    64         parent.AddWindow(self.Reference, 0, border=0, flag=wx.GROW)
       
    65         parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
       
    66         parent.AddWindow(self.Inline, 0, border=0, flag=wx.GROW)
       
    67         parent.AddWindow(self.radioButton3, 0, border=0, flag=wx.GROW)
       
    68         parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
       
    69         parent.AddWindow(self.Priority, 0, border=0, flag=wx.GROW)
       
    70         parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
       
    71     
       
    72     def _init_coll_LeftGridSizer_Growables(self, parent):
       
    73         parent.AddGrowableCol(0)
       
    74         parent.AddGrowableRow(6)
       
    75             
       
    76     def _init_coll_RightGridSizer_Items(self, parent):
       
    77         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
       
    78         parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
       
    79         
       
    80     def _init_coll_RightGridSizer_Growables(self, parent):
       
    81         parent.AddGrowableCol(0)
       
    82         parent.AddGrowableRow(1)
       
    83 
       
    84     def _init_sizers(self):
       
    85         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
       
    86         self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
       
    87         self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=9, vgap=5)
       
    88         self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
       
    89 
       
    90         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
       
    91         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
       
    92         self._init_coll_MainSizer_Items(self.MainSizer)
       
    93         self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
       
    94         self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
       
    95         self._init_coll_RightGridSizer_Items(self.RightGridSizer)
       
    96         self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
       
    97 
       
    98         self.SetSizer(self.flexGridSizer1)
       
    99 
       
   100     def _init_ctrls(self, prnt, ctrler):
       
   101         wx.Dialog.__init__(self, id=ID_SFCTRANSITIONDIALOG,
       
   102               name='SFCTransitionDialog', parent=prnt, pos=wx.Point(376, 223),
       
   103               size=wx.Size(350, 300), style=wx.DEFAULT_DIALOG_STYLE,
       
   104               title=_('Edit transition'))
       
   105         self.SetClientSize(wx.Size(350, 300))
       
   106 
       
   107         self.staticText1 = wx.StaticText(id=ID_SFCTRANSITIONDIALOGSTATICTEXT1,
       
   108               label=_('Type:'), name='staticText1', parent=self,
       
   109               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   110 
       
   111         self.staticText2 = wx.StaticText(id=ID_SFCTRANSITIONDIALOGSTATICTEXT2,
       
   112               label=_('Preview:'), name='staticText2', parent=self,
       
   113               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   114 
       
   115         self.staticText3 = wx.StaticText(id=ID_SFCTRANSITIONDIALOGSTATICTEXT3,
       
   116               label=_('Priority:'), name='staticText3', parent=self,
       
   117               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   118         
       
   119         self.radioButton1 = wx.RadioButton(id=ID_SFCTRANSITIONDIALOGRADIOBUTTON1,
       
   120               label=_('Reference'), name='radioButton1', parent=self,
       
   121               pos=wx.Point(0, 0), size=wx.Size(0, 24), style=wx.RB_GROUP)
       
   122         self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_SFCTRANSITIONDIALOGRADIOBUTTON1)
       
   123         self.radioButton1.SetValue(True)
       
   124 
       
   125         self.Reference = wx.ComboBox(id=ID_SFCTRANSITIONDIALOGREFERENCE,
       
   126               name='Reference', parent=self, pos=wx.Point(0, 0), 
       
   127               size=wx.Size(0, 28), style=wx.CB_READONLY)
       
   128         self.Bind(wx.EVT_COMBOBOX, self.OnReferenceChanged, id=ID_SFCTRANSITIONDIALOGREFERENCE)
       
   129 
       
   130         self.radioButton2 = wx.RadioButton(id=ID_SFCTRANSITIONDIALOGRADIOBUTTON2,
       
   131               label=_('Inline'), name='radioButton2', parent=self,
       
   132               pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
       
   133         self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_SFCTRANSITIONDIALOGRADIOBUTTON2)
       
   134         self.radioButton2.SetValue(False)
       
   135 
       
   136         self.Inline = wx.TextCtrl(id=ID_SFCTRANSITIONDIALOGINLINE,
       
   137               name='Inline', parent=self, pos=wx.Point(0, 0),
       
   138               size=wx.Size(0, 24), style=0)
       
   139         self.Bind(wx.EVT_TEXT, self.OnInlineChanged, id=ID_SFCTRANSITIONDIALOGINLINE)
       
   140         self.Inline.Enable(False)
       
   141         
       
   142         self.radioButton3 = wx.RadioButton(id=ID_SFCTRANSITIONDIALOGRADIOBUTTON3,
       
   143               label=_('Connection'), name='radioButton3', parent=self,
       
   144               pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
       
   145         self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_SFCTRANSITIONDIALOGRADIOBUTTON3)
       
   146         self.radioButton3.SetValue(False)
       
   147         if not self.Connection:
       
   148             self.radioButton3.Hide()
       
   149 
       
   150         self.Priority = wx.SpinCtrl(id=ID_SFCTRANSITIONDIALOGPRIORITY,
       
   151               name='Priority', parent=self, pos=wx.Point(0, 0),
       
   152               size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0)
       
   153         self.Bind(wx.EVT_TEXT, self.OnPriorityChanged, id=ID_SFCTRANSITIONDIALOGPRIORITY)
       
   154 
       
   155         self.Preview = wx.Panel(id=ID_SFCTRANSITIONDIALOGPREVIEW,
       
   156               name='Preview', parent=self, pos=wx.Point(0, 0),
       
   157               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
       
   158         self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
       
   159         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
       
   160         setattr(self.Preview, "RefreshTransitionModel", lambda x:None)
       
   161         setattr(self.Preview, "GetScaling", lambda:None)
       
   162         setattr(self.Preview, "IsOfType", ctrler.IsOfType)
       
   163 
       
   164         self.Spacer = wx.Panel(id=ID_SFCTRANSITIONDIALOGSPACER,
       
   165               name='Spacer', parent=self, pos=wx.Point(0, 0),
       
   166               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
       
   167 
       
   168         self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
       
   169         if wx.VERSION >= (2, 5, 0):
       
   170             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
       
   171             self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
       
   172         else:
       
   173             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
       
   174             wx.EVT_PAINT(self.Preview, self.OnPaint)
       
   175         
       
   176         self._init_sizers()
       
   177 
       
   178     def __init__(self, parent, controler, connection):
       
   179         self.Connection = connection
       
   180         self._init_ctrls(parent, controler)
       
   181         self.Transition = None
       
   182         self.MinTransitionSize = None
       
   183         
       
   184         self.Element = SFC_Transition(self.Preview)
       
   185     
       
   186     def SetPreviewFont(self, font):
       
   187         self.Preview.SetFont(font)
       
   188     
       
   189     def SetElementSize(self, size):
       
   190         min_width, min_height = self.Element.GetMinSize()
       
   191         width, height = max(min_width, size[0]), max(min_height, size[1])
       
   192         self.Element.SetSize(width, height)
       
   193     
       
   194     def OnOK(self, event):
       
   195         error = []
       
   196         if self.radioButton1.GetValue() and self.Reference.GetStringSelection() == "":
       
   197             error.append(_("Reference"))
       
   198         if self.radioButton2.GetValue() and self.Inline.GetValue() == "":
       
   199             error.append(_("Inline"))
       
   200         if len(error) > 0:
       
   201             text = ""
       
   202             for i, item in enumerate(error):
       
   203                 if i == 0:
       
   204                     text += item
       
   205                 elif i == len(error) - 1:
       
   206                     text += _(" and %s")%item
       
   207                 else:
       
   208                     text += _(", %s")%item 
       
   209             message = wx.MessageDialog(self, _("Form isn't complete. %s must be filled!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
       
   210             message.ShowModal()
       
   211             message.Destroy()
       
   212         else:
       
   213             self.EndModal(wx.ID_OK)
       
   214 
       
   215     def OnTypeChanged(self, event):
       
   216         if self.radioButton1.GetValue():
       
   217             self.Element.SetType("reference", self.Reference.GetStringSelection())
       
   218             self.Reference.Enable(True)
       
   219             self.Inline.Enable(False)
       
   220         elif self.radioButton2.GetValue():
       
   221             self.Element.SetType("inline", self.Inline.GetValue())
       
   222             self.Reference.Enable(False)
       
   223             self.Inline.Enable(True)
       
   224         else:
       
   225             self.Element.SetType("connection")
       
   226             self.Reference.Enable(False)
       
   227             self.Inline.Enable(False)
       
   228         self.RefreshPreview()
       
   229         event.Skip()
       
   230 
       
   231     def OnReferenceChanged(self, event):
       
   232         self.Element.SetType("reference", self.Reference.GetStringSelection())
       
   233         self.RefreshPreview()
       
   234         event.Skip()
       
   235 
       
   236     def OnInlineChanged(self, event):
       
   237         self.Element.SetType("inline", self.Inline.GetValue())
       
   238         self.RefreshPreview()
       
   239         event.Skip()
       
   240 
       
   241     def OnPriorityChanged(self, event):
       
   242         self.Element.SetPriority(int(self.Priority.GetValue()))
       
   243         self.RefreshPreview()
       
   244         event.Skip()
       
   245 
       
   246     def SetTransitions(self, transitions):
       
   247         self.Reference.Append("")
       
   248         for transition in transitions:
       
   249             self.Reference.Append(transition)
       
   250 
       
   251     def SetValues(self, values):
       
   252         if values["type"] == "reference":
       
   253             self.radioButton1.SetValue(True)
       
   254             self.radioButton2.SetValue(False)
       
   255             self.radioButton3.SetValue(False)
       
   256             self.Reference.Enable(True)
       
   257             self.Inline.Enable(False)
       
   258             self.Reference.SetStringSelection(values["value"])
       
   259             self.Element.SetType("reference", values["value"])
       
   260         elif values["type"] == "inline":
       
   261             self.radioButton1.SetValue(False)
       
   262             self.radioButton2.SetValue(True)
       
   263             self.radioButton3.SetValue(False)
       
   264             self.Reference.Enable(False)
       
   265             self.Inline.Enable(True)
       
   266             self.Inline.SetValue(values["value"])
       
   267             self.Element.SetType("inline", values["value"])
       
   268         elif values["type"] == "connection" and self.Connection:
       
   269             self.radioButton1.SetValue(False)
       
   270             self.radioButton2.SetValue(False)
       
   271             self.radioButton3.SetValue(True)
       
   272             self.Reference.Enable(False)
       
   273             self.Inline.Enable(False)
       
   274             self.Element.SetType("connection")
       
   275         self.Priority.SetValue(values["priority"])
       
   276         self.Element.SetPriority(values["priority"])
       
   277         self.RefreshPreview()
       
   278         
       
   279     def GetValues(self):
       
   280         values = {"priority" : int(self.Priority.GetValue())}
       
   281         if self.radioButton1.GetValue():
       
   282             values["type"] = "reference"
       
   283             values["value"] = self.Reference.GetStringSelection()
       
   284         elif self.radioButton2.GetValue():
       
   285             values["type"] = "inline"
       
   286             values["value"] = self.Inline.GetValue()
       
   287         else:
       
   288             values["type"] = "connection"
       
   289             values["value"] = None
       
   290         return values
       
   291 
       
   292     def RefreshPreview(self):
       
   293         dc = wx.ClientDC(self.Preview)
       
   294         dc.SetFont(self.Preview.GetFont())
       
   295         dc.Clear()
       
   296         clientsize = self.Preview.GetClientSize()
       
   297         posx, posy = self.Element.GetPosition()
       
   298         rect = self.Element.GetBoundingBox()
       
   299         diffx, diffy = posx - rect.x, posy - rect.y
       
   300         self.Element.SetPosition((clientsize.width - rect.width) / 2 + diffx, (clientsize.height - rect.height) / 2 + diffy)
       
   301         self.Element.Draw(dc)
       
   302 
       
   303     def OnPaint(self, event):
       
   304         self.RefreshPreview()
       
   305         event.Skip()