TextViewer.py
author lbessard
Thu, 06 Dec 2007 18:05:29 +0100
changeset 125 394d9f168258
parent 122 e6faee0c271b
child 136 858ff1a52d20
permissions -rw-r--r--
Adding support for execution order in PLCGenerator
Adding support for derived data types (struct not supported yet)
Fixed refresh bug with windows on Viewers
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
     1
#!/usr/bin/env python
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
     3
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
     4
#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
     5
#based on the plcopen standard. 
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
     6
#
58
39cd981ff242 Changing file headers
lbessard
parents: 56
diff changeset
     7
#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
     8
#
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
     9
#See COPYING file for copyrights details.
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    10
#
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    11
#This library is free software; you can redistribute it and/or
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    12
#modify it under the terms of the GNU General Public
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    13
#License as published by the Free Software Foundation; either
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    14
#version 2.1 of the License, or (at your option) any later version.
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    15
#
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    16
#This library is distributed in the hope that it will be useful,
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    17
#but WITHOUT ANY WARRANTY; without even the implied warranty of
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    18
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
58
39cd981ff242 Changing file headers
lbessard
parents: 56
diff changeset
    19
#General Public License for more details.
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    20
#
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    21
#You should have received a copy of the GNU General Public
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    22
#License along with this library; if not, write to the Free Software
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    23
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    24
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    25
import wx
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
    26
import wx.stc
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    27
from types import *
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    28
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    29
import re
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    30
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    31
#-------------------------------------------------------------------------------
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    32
#                         Textual programs Viewer class
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    33
#-------------------------------------------------------------------------------
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    34
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    35
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    36
NEWLINE = "\n"
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    37
NUMBERS = [str(i) for i in xrange(10)]
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    38
LETTERS = ['_']
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    39
for i in xrange(26):
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    40
    LETTERS.append(chr(ord('a') + i))
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    41
    LETTERS.append(chr(ord('A') + i))
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    42
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
    43
[STC_PLC_WORD, STC_PLC_COMMENT, STC_PLC_NUMBER, STC_PLC_VARIABLE, 
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
    44
 STC_PLC_FUNCTION, STC_PLC_JUMP] = range(6)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    45
[SPACE, WORD, NUMBER, COMMENT] = range(4)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    46
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
    47
[ID_TEXTVIEWER,
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    48
] = [wx.NewId() for _init_ctrls in range(1)]
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    49
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    50
if wx.Platform == '__WXMSW__':
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    51
    faces = { 'times': 'Times New Roman',
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    52
              'mono' : 'Courier New',
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    53
              'helv' : 'Arial',
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    54
              'other': 'Comic Sans MS',
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    55
              'size' : 10,
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    56
             }
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    57
else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    58
    faces = { 'times': 'Times',
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    59
              'mono' : 'Courier',
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    60
              'helv' : 'Helvetica',
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    61
              'other': 'new century schoolbook',
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    62
              'size' : 12,
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    63
             }
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    64
re_texts = {}
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    65
re_texts["letter"] = "[A-Za-z]"
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    66
re_texts["digit"] = "[0-9]"
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    67
re_texts["identifier"] = "((?:%(letter)s|(?:_(?:%(letter)s|%(digit)s)))(?:_?(?:%(letter)s|%(digit)s))*)"%re_texts
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    68
IDENTIFIER_MODEL = re.compile(re_texts["identifier"])
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    69
LABEL_MODEL = re.compile("[ \t\n]%(identifier)s:[ \t\n]"%re_texts)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
    70
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    71
def GetCursorPos(old, new):
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    72
    old_length = len(old)
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    73
    new_length = len(new)
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    74
    common_length = min(old_length, new_length)
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    75
    i = 0
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    76
    for i in xrange(common_length):
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    77
        if old[i] != new[i]:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    78
            break
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    79
    if old_length < new_length:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    80
        if common_length > 0 and old[i] != new[i]:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    81
            return i + new_length - old_length
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    82
        else:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    83
            return i + new_length - old_length + 1
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    84
    elif old_length > new_length or i < min(old_length, new_length) - 1:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    85
        if common_length > 0 and old[i] != new[i]:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    86
            return i
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    87
        else:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    88
            return i + 1
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    89
    else:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    90
        return None
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
    91
121
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
    92
if wx.VERSION >= (2, 8, 0):
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
    93
    import wx.aui
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
    94
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
    95
    class TextMDIViewer(wx.aui.AuiMDIChildFrame):
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
    96
        def __init__(self, parent, tagname, window, controler):
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
    97
            wx.aui.AuiMDIChildFrame.__init__(self, parent, -1, title = "")
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
    98
            
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
    99
            sizer = wx.BoxSizer(wx.HORIZONTAL)
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   100
            
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   101
            self.Viewer = TextViewer(self, tagname, window, controler)
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   102
            
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   103
            sizer.AddWindow(self.Viewer, 1, border=0, flag=wx.GROW)
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   104
            
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   105
            self.SetSizer(sizer)
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   106
        
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   107
        def GetViewer(self):
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   108
            return self.Viewer
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   109
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   110
class TextViewer(wx.stc.StyledTextCtrl):
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   111
    
113
9eeaebd867aa Adding support for wxpython 2.4
lbessard
parents: 98
diff changeset
   112
    if wx.VERSION < (2, 6, 0):
9eeaebd867aa Adding support for wxpython 2.4
lbessard
parents: 98
diff changeset
   113
        def Bind(self, event, function, id = None):
9eeaebd867aa Adding support for wxpython 2.4
lbessard
parents: 98
diff changeset
   114
            if id is not None:
9eeaebd867aa Adding support for wxpython 2.4
lbessard
parents: 98
diff changeset
   115
                event(self, id, function)
9eeaebd867aa Adding support for wxpython 2.4
lbessard
parents: 98
diff changeset
   116
            else:
9eeaebd867aa Adding support for wxpython 2.4
lbessard
parents: 98
diff changeset
   117
                event(self, function)
9eeaebd867aa Adding support for wxpython 2.4
lbessard
parents: 98
diff changeset
   118
    
121
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   119
    def __init__(self, parent, tagname, window, controler):
80
c798a68c5560 Lots of bugs fixed
lbessard
parents: 79
diff changeset
   120
        wx.stc.StyledTextCtrl.__init__(self, parent, ID_TEXTVIEWER, size=wx.Size(0, 0), style=0)
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   121
        
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   122
        self.CmdKeyAssign(ord('+'), wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_ZOOMIN)
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   123
        self.CmdKeyAssign(ord('-'), wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_ZOOMOUT)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   124
        
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   125
        self.SetViewWhiteSpace(False)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   126
        
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   127
        self.SetLexer(wx.stc.STC_LEX_CONTAINER)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   128
        
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   129
        # Global default styles for all languages
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   130
        self.StyleSetSpec(wx.stc.STC_STYLE_DEFAULT, "face:%(mono)s,size:%(size)d" % faces)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   131
        self.StyleClearAll()  # Reset all to be like the default
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   132
        
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   133
        self.StyleSetSpec(wx.stc.STC_STYLE_LINENUMBER,  "back:#C0C0C0,size:%(size)d" % faces)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   134
        self.SetSelBackground(1, "#E0E0E0")
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   135
        
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   136
        # Highlighting styles
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   137
        self.StyleSetSpec(STC_PLC_WORD, "fore:#00007F,bold,size:%(size)d" % faces)
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   138
        self.StyleSetSpec(STC_PLC_VARIABLE, "fore:#7F0000,size:%(size)d" % faces)
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   139
        self.StyleSetSpec(STC_PLC_FUNCTION, "fore:#7F7F00,size:%(size)d" % faces)
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   140
        self.StyleSetSpec(STC_PLC_COMMENT, "fore:#7F7F7F,size:%(size)d" % faces)
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   141
        self.StyleSetSpec(STC_PLC_NUMBER, "fore:#007F7F,size:%(size)d" % faces)
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   142
        self.StyleSetSpec(STC_PLC_JUMP, "fore:#007F00,size:%(size)d" % faces)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   143
        
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   144
        # Indicators styles
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   145
        self.IndicatorSetStyle(0, wx.stc.STC_INDIC_SQUIGGLE)
90
2245e8776086 Adding support support for using PLCOpenEditor with Beremiz
lbessard
parents: 80
diff changeset
   146
        if window and controler:
2245e8776086 Adding support support for using PLCOpenEditor with Beremiz
lbessard
parents: 80
diff changeset
   147
            self.IndicatorSetForeground(0, wx.RED)
2245e8776086 Adding support support for using PLCOpenEditor with Beremiz
lbessard
parents: 80
diff changeset
   148
        else:
2245e8776086 Adding support support for using PLCOpenEditor with Beremiz
lbessard
parents: 80
diff changeset
   149
            self.IndicatorSetForeground(0, wx.WHITE)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   150
        
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   151
        # Line numbers in the margin
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   152
        self.SetMarginType(1, wx.stc.STC_MARGIN_NUMBER)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   153
        self.SetMarginWidth(1, 50)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   154
        
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   155
        # Indentation size
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   156
        self.SetTabWidth(2)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   157
        self.SetUseTabs(0)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   158
        
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   159
        self.Keywords = []
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   160
        self.Variables = []
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   161
        self.Functions = []
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   162
        self.Jumps = []
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   163
        self.EnumeratedValues = []
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   164
        self.TextChanged = False
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   165
        self.DisableEvents = True
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   166
        self.TextSyntax = "ST"
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   167
        self.CurrentAction = None
121
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   168
        self.TagName = tagname
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   169
        
90
2245e8776086 Adding support support for using PLCOpenEditor with Beremiz
lbessard
parents: 80
diff changeset
   170
        self.ParentWindow = window
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   171
        self.Controler = controler
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   172
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   173
        self.SetModEventMask(wx.stc.STC_MOD_BEFOREINSERT|wx.stc.STC_MOD_BEFOREDELETE)
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   174
79
b22f661cbcfb Fixed ws indent problem
etisserant
parents: 73
diff changeset
   175
        self.Bind(wx.stc.EVT_STC_STYLENEEDED, self.OnStyleNeeded, id=ID_TEXTVIEWER)
116
58b9b84e385f Adding support in xmlclass for timezone in datetime and for not paying attention to xml comments
lbessard
parents: 113
diff changeset
   176
        if controler:
73
f2529e34e4b7 Prevent problems showing ST code after failed build
etisserant
parents: 68
diff changeset
   177
            self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
f2529e34e4b7 Prevent problems showing ST code after failed build
etisserant
parents: 68
diff changeset
   178
            self.Bind(wx.stc.EVT_STC_DO_DROP, self.OnDoDrop, id=ID_TEXTVIEWER)
f2529e34e4b7 Prevent problems showing ST code after failed build
etisserant
parents: 68
diff changeset
   179
            self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
f2529e34e4b7 Prevent problems showing ST code after failed build
etisserant
parents: 68
diff changeset
   180
            self.Bind(wx.stc.EVT_STC_MODIFIED, self.OnModification, id=ID_TEXTVIEWER)
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   181
    
121
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   182
    def SetTagName(self, tagname):
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   183
        self.TagName = tagname
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   184
        
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   185
    def GetTagName(self):
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   186
        return self.TagName
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   187
    
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   188
    def IsViewing(self, tagname):
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   189
        return self.TagName == tagname
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   190
    
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   191
    def SetMode(self, mode):
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   192
        pass
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   193
    
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   194
    def OnModification(self, event):
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   195
        if not self.DisableEvents:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   196
            mod_type = event.GetModificationType()
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   197
            if not (mod_type&wx.stc.STC_PERFORMED_UNDO or mod_type&wx.stc.STC_PERFORMED_REDO):
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   198
                if mod_type&wx.stc.STC_MOD_BEFOREINSERT:
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   199
                    if self.CurrentAction == None:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   200
                        self.StartBuffering()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   201
                    elif self.CurrentAction[0] != "Add" or self.CurrentAction[1] != event.GetPosition() - 1:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   202
                        self.Controler.EndBuffering()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   203
                        self.StartBuffering()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   204
                    self.CurrentAction = ("Add", event.GetPosition())
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   205
                elif mod_type&wx.stc.STC_MOD_BEFOREDELETE:
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   206
                    if self.CurrentAction == None:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   207
                        self.StartBuffering()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   208
                    elif self.CurrentAction[0] != "Delete" or self.CurrentAction[1] != event.GetPosition() + 1:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   209
                        self.Controler.EndBuffering()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   210
                        self.StartBuffering()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   211
                    self.CurrentAction = ("Delete", event.GetPosition())
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   212
        event.Skip()
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   213
    
47
2b2f8d88e6d3 Interface changed to show pou interface at the bottom of the window
lbessard
parents: 27
diff changeset
   214
    def OnDoDrop(self, event):
50
4610aafc884e Bugs fixed
lbessard
parents: 47
diff changeset
   215
        try:
4610aafc884e Bugs fixed
lbessard
parents: 47
diff changeset
   216
            values = eval(event.GetDragText())
4610aafc884e Bugs fixed
lbessard
parents: 47
diff changeset
   217
        except:
4610aafc884e Bugs fixed
lbessard
parents: 47
diff changeset
   218
            values = event.GetDragText()
47
2b2f8d88e6d3 Interface changed to show pou interface at the bottom of the window
lbessard
parents: 27
diff changeset
   219
        if isinstance(values, tuple):
53
4988262d03e3 *** empty log message ***
lbessard
parents: 50
diff changeset
   220
            if values[1] in ["functionBlock", "program", "location"]:
47
2b2f8d88e6d3 Interface changed to show pou interface at the bottom of the window
lbessard
parents: 27
diff changeset
   221
                event.SetDragText("")
122
e6faee0c271b Adding support for Project Tree selected item following current item edited.
lbessard
parents: 121
diff changeset
   222
            elif values[1] == "function":
e6faee0c271b Adding support for Project Tree selected item following current item edited.
lbessard
parents: 121
diff changeset
   223
                event.SetDragText(values[0])
121
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   224
            elif values[1] != "location":
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   225
                if values[3] == self.TagName:
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   226
                    event.SetDragText(values[0])
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   227
                else:
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   228
                    event.SetDragText("")
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   229
                    message = wx.MessageDialog(self.ParentWindow, "Variable don't belong to this POU!", "Error", wx.OK|wx.ICON_ERROR)
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   230
                    message.ShowModal()
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   231
                    message.Destroy()
47
2b2f8d88e6d3 Interface changed to show pou interface at the bottom of the window
lbessard
parents: 27
diff changeset
   232
        event.Skip()
2b2f8d88e6d3 Interface changed to show pou interface at the bottom of the window
lbessard
parents: 27
diff changeset
   233
    
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   234
    def SetTextSyntax(self, syntax):
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   235
        self.TextSyntax = syntax
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   236
    
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   237
    def SetKeywords(self, keywords):
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   238
        self.Keywords = [keyword.upper() for keyword in keywords]
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   239
        self.Colourise(0, -1)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   240
    
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   241
    def RefreshJumpList(self):
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   242
        self.Jumps = [jump.upper() for jump in LABEL_MODEL.findall(self.GetText())]
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   243
        self.Colourise(0, -1)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   244
    
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   245
    # Buffer the last model state
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   246
    def RefreshBuffer(self):
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   247
        self.Controler.BufferProject()
116
58b9b84e385f Adding support in xmlclass for timezone in datetime and for not paying attention to xml comments
lbessard
parents: 113
diff changeset
   248
        if self.ParentWindow:
58b9b84e385f Adding support in xmlclass for timezone in datetime and for not paying attention to xml comments
lbessard
parents: 113
diff changeset
   249
            self.ParentWindow.RefreshTitle()
58b9b84e385f Adding support in xmlclass for timezone in datetime and for not paying attention to xml comments
lbessard
parents: 113
diff changeset
   250
            self.ParentWindow.RefreshEditMenu()
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   251
    
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   252
    def StartBuffering(self):
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   253
        self.Controler.StartBuffering()
116
58b9b84e385f Adding support in xmlclass for timezone in datetime and for not paying attention to xml comments
lbessard
parents: 113
diff changeset
   254
        if self.ParentWindow:
58b9b84e385f Adding support in xmlclass for timezone in datetime and for not paying attention to xml comments
lbessard
parents: 113
diff changeset
   255
            self.ParentWindow.RefreshTitle()
58b9b84e385f Adding support in xmlclass for timezone in datetime and for not paying attention to xml comments
lbessard
parents: 113
diff changeset
   256
            self.ParentWindow.RefreshEditMenu()
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   257
    
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   258
    def ResetBuffer(self):
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   259
        if self.CurrentAction != None:
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   260
            self.Controler.EndBuffering()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   261
            self.CurrentAction = None
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   262
    
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   263
    def RefreshView(self):
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   264
        self.ResetBuffer()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   265
        self.DisableEvents = True
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   266
        old_cursor_pos = self.GetCurrentPos()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   267
        old_text = self.GetText()
121
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   268
        new_text = self.Controler.GetEditedElementText(self.TagName)
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   269
        self.SetText(new_text)
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   270
        new_cursor_pos = GetCursorPos(old_text, new_text)
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   271
        if new_cursor_pos != None:
80
c798a68c5560 Lots of bugs fixed
lbessard
parents: 79
diff changeset
   272
            self.GotoPos(new_cursor_pos)
c798a68c5560 Lots of bugs fixed
lbessard
parents: 79
diff changeset
   273
        else:
c798a68c5560 Lots of bugs fixed
lbessard
parents: 79
diff changeset
   274
            self.GotoPos(old_cursor_pos)
c798a68c5560 Lots of bugs fixed
lbessard
parents: 79
diff changeset
   275
        self.ScrollToColumn(0)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   276
        self.RefreshJumpList()
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   277
        self.EmptyUndoBuffer()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   278
        self.DisableEvents = False
121
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   279
        
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   280
        words = self.TagName.split("::")
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   281
        self.Variables = [variable["Name"].upper() for variable in self.Controler.GetEditedElementInterfaceVars(self.TagName)]
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   282
        if self.Controler.GetEditedElementType(self.TagName)[1] == "function" or words[0] == "T" and self.TextSyntax == "IL":
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   283
            self.Variables.append(words[-1].upper())
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   284
        
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   285
        self.Functions = []
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   286
        for category in self.Controler.GetBlockTypes(self.TagName):
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   287
            for blocktype in category["list"]:
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   288
                if blocktype["type"] == "function" and blocktype["name"] not in self.Keywords and blocktype["name"] not in self.Variables:
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   289
                    self.Functions.append(blocktype["name"].upper())
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   290
        
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   291
        self.EnumeratedValues = []
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   292
        for value in self.Controler.GetEnumeratedDataValues():
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   293
            self.EnumeratedValues.append(value.upper())
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   294
        
121
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   295
        self.Colourise(0, -1)
98
ec5d7af033d8 Added support for wire type compatibility check
lbessard
parents: 90
diff changeset
   296
    
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   297
    def OnStyleNeeded(self, event):
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   298
        self.TextChanged = True
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   299
        line = self.LineFromPosition(self.GetEndStyled())
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   300
        if line == 0:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   301
            start_pos = 0
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   302
        else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   303
            start_pos = self.GetLineEndPosition(line - 1) + 1
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   304
        end_pos = event.GetPosition()
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   305
        self.StartStyling(start_pos, 0xff)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   306
        
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   307
        i = start_pos
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   308
        state = SPACE
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   309
        line = ""
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   310
        word = ""
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   311
        while i < end_pos:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   312
            char = chr(self.GetCharAt(i)).upper()
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   313
            line += char
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   314
            if char == NEWLINE:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   315
                if state == COMMENT:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   316
                    self.SetStyling(i - start_pos + 1, STC_PLC_COMMENT)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   317
                elif state == NUMBER:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   318
                    self.SetStyling(i - start_pos, STC_PLC_NUMBER)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   319
                elif state == WORD:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   320
                    if word in self.Keywords:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   321
                        self.SetStyling(i - start_pos, STC_PLC_WORD)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   322
                    elif word in self.Variables:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   323
                        self.SetStyling(i - start_pos, STC_PLC_VARIABLE)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   324
                    elif word in self.Functions:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   325
                        self.SetStyling(i - start_pos, STC_PLC_FUNCTION)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   326
                    elif word in self.Jumps:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   327
                        self.SetStyling(i - start_pos, STC_PLC_JUMP)
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   328
                    elif word in self.EnumeratedValues:
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   329
                        self.SetStyling(i - start_pos, STC_PLC_NUMBER)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   330
                    else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   331
                        self.SetStyling(i - start_pos, 31)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   332
                        if self.GetCurrentPos() < start_pos or self.GetCurrentPos() > i:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   333
                            self.StartStyling(start_pos, wx.stc.STC_INDICS_MASK)
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   334
                            self.SetStyling(i - start_pos, wx.stc.STC_INDIC0_MASK)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   335
                            self.StartStyling(i, 0xff)    
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   336
                else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   337
                    self.SetStyling(i - start_pos, 31)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   338
                start_pos = i
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   339
                state = SPACE
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   340
                line = ""
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   341
            elif line.endswith("(*") and state != COMMENT:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   342
                self.SetStyling(i - start_pos - 1, 31)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   343
                start_pos = i
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   344
                state = COMMENT
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   345
            elif state == COMMENT:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   346
                if line.endswith("*)"):
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   347
                    self.SetStyling(i - start_pos + 2, STC_PLC_COMMENT)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   348
                    start_pos = i + 1
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   349
                    state = SPACE
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   350
            elif char in LETTERS:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   351
                if state == NUMBER:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   352
                    word = "#"
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   353
                    state = WORD
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   354
                elif state == SPACE:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   355
                    self.SetStyling(i - start_pos, 31)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   356
                    word = char
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   357
                    start_pos = i
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   358
                    state = WORD
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   359
                else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   360
                    word += char
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   361
            elif char in NUMBERS or char == '.' and state != WORD:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   362
                if state == SPACE:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   363
                    self.SetStyling(i - start_pos, 31)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   364
                    start_pos = i
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   365
                    state = NUMBER
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   366
                if state == WORD and char != '.':
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   367
                    word += char
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   368
            else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   369
                if state == WORD:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   370
                    if word in self.Keywords:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   371
                        self.SetStyling(i - start_pos, STC_PLC_WORD)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   372
                    elif word in self.Variables:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   373
                        self.SetStyling(i - start_pos, STC_PLC_VARIABLE)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   374
                    elif word in self.Functions:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   375
                        self.SetStyling(i - start_pos, STC_PLC_FUNCTION)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   376
                    elif word in self.Jumps:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   377
                        self.SetStyling(i - start_pos, STC_PLC_JUMP)
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   378
                    elif word in self.EnumeratedValues:
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   379
                        self.SetStyling(i - start_pos, STC_PLC_NUMBER)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   380
                    else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   381
                        self.SetStyling(i - start_pos, 31)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   382
                        if self.GetCurrentPos() < start_pos or self.GetCurrentPos() > i:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   383
                            self.StartStyling(start_pos, wx.stc.STC_INDICS_MASK)
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   384
                            self.SetStyling(i - start_pos, wx.stc.STC_INDIC0_MASK)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   385
                            self.StartStyling(i, 0xff)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   386
                    word = ""
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   387
                    start_pos = i
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   388
                    state = SPACE
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   389
                elif state == NUMBER:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   390
                    self.SetStyling(i - start_pos, STC_PLC_NUMBER)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   391
                    start_pos = i
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   392
                    state = SPACE
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   393
            i += 1
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   394
        if state == COMMENT:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   395
            self.SetStyling(i - start_pos + 2, STC_PLC_COMMENT)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   396
        elif state == NUMBER:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   397
            self.SetStyling(i - start_pos, STC_PLC_NUMBER)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   398
        elif state == WORD:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   399
            if word in self.Keywords:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   400
                self.SetStyling(i - start_pos, STC_PLC_WORD)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   401
            elif word in self.Variables:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   402
                self.SetStyling(i - start_pos, STC_PLC_VARIABLE)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   403
            elif word in self.Functions:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   404
                self.SetStyling(i - start_pos, STC_PLC_FUNCTION)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   405
            elif word in self.Jumps:
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   406
                self.SetStyling(i - start_pos, STC_PLC_JUMP)
125
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   407
            elif word in self.EnumeratedValues:
394d9f168258 Adding support for execution order in PLCGenerator
lbessard
parents: 122
diff changeset
   408
                self.SetStyling(i - start_pos, STC_PLC_NUMBER)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   409
            else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   410
                self.SetStyling(i - start_pos, 31)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   411
        else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   412
            self.SetStyling(i - start_pos, 31)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   413
        event.Skip()
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   414
    
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   415
    def Cut(self):
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   416
        self.ResetBuffer()
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   417
        self.CmdKeyExecute(wx.stc.STC_CMD_CUT)
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   418
        self.RefreshBuffer()
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   419
    
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   420
    def Copy(self):
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   421
        self.CmdKeyExecute(wx.stc.STC_CMD_COPY)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   422
    
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   423
    def Paste(self):
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   424
        self.ResetBuffer()
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   425
        self.CmdKeyExecute(wx.stc.STC_CMD_PASTE)
56
7187e1c00975 Adding support for Undo/Redo and Unsaved File On Close detection
lbessard
parents: 53
diff changeset
   426
        self.RefreshBuffer()
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   427
    
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   428
    def RefreshModel(self):
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   429
        if self.TextChanged:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   430
            self.RefreshJumpList()
121
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   431
            self.Controler.SetEditedElementText(self.TagName, self.GetText())
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   432
    
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   433
    def OnKeyDown(self, event):
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   434
        if self.CallTipActive():
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   435
            self.CallTipCancel()
121
40b91ba978db Improving PLCOpenEditor for using wx2.8 AUI
lbessard
parents: 116
diff changeset
   436
        key = event.GetKeyCode()
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   437
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   438
        # Code completion
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   439
        if key == wx.WXK_SPACE and event.ControlDown():
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   440
            
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   441
            line = self.GetCurrentLine()
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   442
            if line == 0:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   443
                start_pos = 0
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   444
            else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   445
                start_pos = self.GetLineEndPosition(line - 1) + 1
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   446
            end_pos = self.GetCurrentPos()
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   447
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   448
            lineText = self.GetTextRange(start_pos, end_pos).replace("\t", " ")
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   449
            words = lineText.split(" ")
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   450
            words = [word for i, word in enumerate(words) if word != '' or i == len(words) - 1]
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   451
                        
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   452
            kw = []
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   453
            
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   454
            if self.TextSyntax == "IL":
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   455
                if len(words) == 1:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   456
                    kw = self.Keywords
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   457
                elif len(words) == 2:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   458
                    if words[0].upper() in ["CAL", "CALC", "CALNC"]:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   459
                        kw = self.Functions
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   460
                    elif words[0].upper() in ["JMP", "JMPC", "JMPNC"]:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   461
                        kw = self.Jumps
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   462
                    else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   463
                        kw = self.Variables
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   464
            else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   465
                kw = self.Keywords + self.Variables + self.Functions
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   466
            if len(kw) > 0:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   467
                kw.sort()
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   468
                self.AutoCompSetIgnoreCase(True)
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   469
                self.AutoCompShow(len(words[-1]), " ".join(kw))
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   470
        else:
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   471
            self.TextChanged = False
64
dd6f693e46a1 Cleaning code for using only wxPython 2.6 class naming
lbessard
parents: 58
diff changeset
   472
            wx.CallAfter(self.RefreshModel)
27
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   473
            event.Skip()
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   474
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   475
    def OnKillFocus(self, event):
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   476
        self.AutoCompCancel()
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   477
        event.Skip()
dae55dd9ee14 Current developping version
lbessard
parents:
diff changeset
   478