SearchResultPanel.py
author laurent
Mon, 10 Oct 2011 02:22:26 +0200
changeset 571 79af7b821233
parent 566 6014ef82a98a
child 572 1af3cc2b207c
permissions -rw-r--r--
Fixing search in project feature for Windows
566
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
     1
#!/usr/bin/env python
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
     3
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
     4
#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
     5
#based on the plcopen standard. 
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
     6
#
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
     7
#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
     8
#
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
     9
#See COPYING file for copyrights details.
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    10
#
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    11
#This library is free software; you can redistribute it and/or
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    12
#modify it under the terms of the GNU General Public
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    13
#License as published by the Free Software Foundation; either
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    14
#version 2.1 of the License, or (at your option) any later version.
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    15
#
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    16
#This library is distributed in the hope that it will be useful,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    17
#but WITHOUT ANY WARRANTY; without even the implied warranty of
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    18
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    19
#General Public License for more details.
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    20
#
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    21
#You should have received a copy of the GNU General Public
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    22
#License along with this library; if not, write to the Free Software
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    23
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    24
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    25
from types import TupleType
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    26
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    27
import wx
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    28
import wx.lib.agw.customtreectrl as CT
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    29
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    30
from PLCControler import *
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    31
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    32
CWD = os.path.split(os.path.realpath(__file__))[0]
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    33
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    34
def GenerateName(infos):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    35
    if infos[0] in ["input", "output"]:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    36
        return "%s %d:" % (infos[0], infos[1])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    37
    return "%s:" % infos[0]
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    38
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    39
#-------------------------------------------------------------------------------
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    40
#                            Search Result Panel
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    41
#-------------------------------------------------------------------------------
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    42
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    43
[ID_SEARCHRESULTPANEL, ID_SEARCHRESULTPANELHEADERLABEL,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    44
 ID_SEARCHRESULTPANELSEARCHRESULTSTREE, ID_SEARCHRESULTPANELRESETBUTTON, 
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    45
] = [wx.NewId() for _init_ctrls in range(4)]
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    46
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    47
class SearchResultPanel(wx.Panel):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    48
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    49
    if wx.VERSION < (2, 6, 0):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    50
        def Bind(self, event, function, id = None):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    51
            if id is not None:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    52
                event(self, id, function)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    53
            else:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    54
                event(self, function)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    55
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    56
    def _init_coll_MainSizer_Items(self, parent):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    57
        parent.AddSizer(self.HeaderSizer, 0, border=0, flag=wx.GROW)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    58
        parent.AddWindow(self.SearchResultsTree, 1, border=0, flag=wx.GROW)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    59
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    60
    def _init_coll_MainSizer_Growables(self, parent):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    61
        parent.AddGrowableCol(0)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    62
        parent.AddGrowableRow(1)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    63
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    64
    def _init_coll_HeaderSizer_Items(self, parent):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    65
        parent.AddWindow(self.HeaderLabel, 1, border=5, flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    66
        parent.AddWindow(self.ResetButton, 0, border=0, flag=0)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    67
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    68
    def _init_coll_HeaderSizer_Growables(self, parent):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    69
        parent.AddGrowableCol(0)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    70
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    71
    def _init_sizers(self):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    72
        self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    73
        self.HeaderSizer = wx.BoxSizer(wx.HORIZONTAL)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    74
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    75
        self._init_coll_MainSizer_Items(self.MainSizer)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    76
        self._init_coll_MainSizer_Growables(self.MainSizer)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    77
        self._init_coll_HeaderSizer_Items(self.HeaderSizer)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    78
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    79
        self.SetSizer(self.MainSizer)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    80
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    81
    def _init_ctrls(self, prnt):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    82
        wx.Panel.__init__(self, id=ID_SEARCHRESULTPANEL,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    83
              name='SearchResultPanel', parent=prnt, pos=wx.Point(0, 0),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    84
              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    85
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    86
        self.HeaderLabel = wx.StaticText(id=ID_SEARCHRESULTPANELHEADERLABEL,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    87
              name='HeaderLabel', parent=self,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    88
              pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    89
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    90
        self.SearchResultsTree = CT.CustomTreeCtrl(id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    91
              name="SearchResultsTree", parent=self,
571
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
    92
              pos=wx.Point(0, 0), style=CT.TR_HAS_BUTTONS|CT.TR_NO_LINES|CT.TR_HAS_VARIABLE_ROW_HEIGHT)
566
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    93
        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnSearchResultsTreeItemActivated,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    94
              id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    95
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    96
        self.ResetButton = wx.Button(id=ID_SEARCHRESULTPANELRESETBUTTON, label=_('Reset'),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    97
              name='ResetButton', parent=self, pos=wx.Point(0, 0),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    98
              size=wx.DefaultSize, style=0)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
    99
        self.Bind(wx.EVT_BUTTON, self.OnResetButton, 
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   100
              id=ID_SEARCHRESULTPANELRESETBUTTON)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   101
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   102
        self._init_sizers()
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   103
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   104
    def __init__(self, parent, window):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   105
        self._init_ctrls(parent)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   106
        self.ParentWindow = window
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   107
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   108
        # Define Tree item icon list
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   109
        self.TreeImageList = wx.ImageList(16, 16)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   110
        self.TreeImageDict = {}
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   111
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   112
        # Icons for other items
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   113
        for imgname, itemtype in [
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   114
            #editables
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   115
            ("PROJECT",        ITEM_PROJECT),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   116
            ("TRANSITION",     ITEM_TRANSITION),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   117
            ("ACTION",         ITEM_ACTION),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   118
            ("CONFIGURATION",  ITEM_CONFIGURATION),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   119
            ("RESOURCE",       ITEM_RESOURCE),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   120
            ("DATATYPE",       ITEM_DATATYPE),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   121
            ("ACTION",         "action_block"),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   122
            ("IL",             "IL"),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   123
            ("ST",             "ST")]:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   124
            self.TreeImageDict[itemtype]=self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%imgname)))
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   125
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   126
        for itemtype in ["function", "functionBlock", "program",
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   127
                         "comment", "block", "io_variable",
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   128
                         "connector", "contact", "coil",
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   129
                         "step", "transition", "jump", 
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   130
                         "var_local", "var_input", 
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   131
                         "var_inout", "var_output"]:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   132
            self.TreeImageDict[itemtype]=self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%itemtype.upper())))
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   133
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   134
        # Assign icon list to TreeCtrl
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   135
        self.SearchResultsTree.SetImageList(self.TreeImageList)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   136
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   137
        self.ResetSearchResults()
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   138
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   139
    def SetSearchResults(self, criteria, search_results):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   140
        self.Criteria = criteria
571
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   141
        self.SearchResults = {}
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   142
        self.ElementsOrder = []
566
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   143
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   144
        for infos, start, end, text in search_results:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   145
            if infos[0] not in self.ElementsOrder:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   146
                self.ElementsOrder.append(infos[0])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   147
            
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   148
            results = self.SearchResults.setdefault(infos[0], [])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   149
            results.append((infos, start, end, text))
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   150
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   151
        self.RefreshView()
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   152
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   153
    def ResetSearchResults(self):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   154
        self.Criteria = None
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   155
        self.ElementsOrder = []
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   156
        self.SearchResults = {}
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   157
        self.RefreshView()
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   158
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   159
    def RefreshView(self):
571
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   160
        self.SearchResultsTree.DeleteAllItems()
566
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   161
        if self.Criteria is None:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   162
            self.HeaderLabel.SetLabel(_("No search results available."))
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   163
            self.ResetButton.Enable(False)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   164
        else:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   165
            matches_number = 0
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   166
            search_results_tree_infos = {"name": _("Project '%s':") % self.ParentWindow.Controler.GetProjectName(),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   167
                                         "type": ITEM_PROJECT,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   168
                                         "data": None,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   169
                                         "text": None,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   170
                                         "matches": None,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   171
                                        }
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   172
            search_results_tree_children = search_results_tree_infos.setdefault("children", [])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   173
            for tagname in self.ElementsOrder:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   174
                results = self.SearchResults.get(tagname, [])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   175
                matches_number += len(results)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   176
                
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   177
                words = tagname.split("::")
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   178
                
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   179
                element_type = self.ParentWindow.Controler.GetElementType(tagname)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   180
                if element_type == ITEM_POU:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   181
                    element_type = self.ParentWindow.Controler.GetPouType(words[1])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   182
                
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   183
                element_infos = {"name": words[-1],
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   184
                                 "type": element_type,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   185
                                 "data": tagname,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   186
                                 "text": None,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   187
                                 "matches": len(results)}
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   188
                
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   189
                children = element_infos.setdefault("children", [])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   190
                for infos, start, end, text in results:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   191
                    child_type = infos[1]
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   192
                    if child_type == "body":
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   193
                        child_name = "body"
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   194
                        if element_type == ITEM_TRANSITION:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   195
                            child_type = self.ParentWindow.Controler.GetTransitionBodyType(words[1], words[2])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   196
                        elif element_type == ITEM_ACTION:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   197
                            child_type = self.ParentWindow.Controler.GetActionBodyType(words[1], words[2])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   198
                        else:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   199
                            child_type = self.ParentWindow.Controler.GetPouBodyType(words[1])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   200
                    else:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   201
                        child_name = GenerateName(infos[3:])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   202
                    child_infos = {"name": child_name,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   203
                                   "type": child_type,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   204
                                   "data": (infos, start, end ,None),
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   205
                                   "text": text,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   206
                                   "matches": 1,
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   207
                                   "children": [],
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   208
                                  }
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   209
                    children.append(child_infos)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   210
                
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   211
                if len(words) > 2:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   212
                    for _element_infos in search_results_tree_children:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   213
                        if _element_infos["name"] == words[1]:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   214
                            _element_infos["matches"] += len(children)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   215
                            _element_infos["children"].append(element_infos)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   216
                            break
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   217
                else:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   218
                    search_results_tree_children.append(element_infos)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   219
            
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   220
            if matches_number < 2:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   221
                header_format = _("'%s' - %d match in project")
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   222
            else:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   223
                header_format = _("'%s' - %d matches in project")
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   224
            
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   225
            self.HeaderLabel.SetLabel(header_format % (self.Criteria["raw_pattern"], matches_number))
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   226
            self.ResetButton.Enable(True)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   227
            
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   228
            if matches_number > 0:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   229
                root = self.SearchResultsTree.GetRootItem()
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   230
                if root is None:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   231
                    root = self.SearchResultsTree.AddRoot(search_results_tree_infos["name"])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   232
                self.GenerateSearchResultsTreeBranch(root, search_results_tree_infos)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   233
                self.SearchResultsTree.Expand(root)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   234
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   235
    def GetTextCtrlClickFunction(self, item):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   236
        def OnTextCtrlClick(event):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   237
            self.SearchResultsTree.SelectItem(item)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   238
            event.Skip()
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   239
        return OnTextCtrlClick
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   240
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   241
    def GetTextCtrlDClickFunction(self, item):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   242
        def OnTextCtrlDClick(event):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   243
            self.ShowSearchResults(item)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   244
            event.Skip()
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   245
        return OnTextCtrlDClick
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   246
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   247
    def GenerateSearchResultsTreeBranch(self, root, infos):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   248
        to_delete = []
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   249
        if infos["name"] == "body":
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   250
            item_name = "%d:" % infos["data"][1][0]
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   251
        else:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   252
            item_name = infos["name"]
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   253
        
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   254
        self.SearchResultsTree.SetItemText(root, item_name)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   255
        self.SearchResultsTree.SetPyData(root, infos["data"])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   256
        self.SearchResultsTree.SetItemBackgroundColour(root, wx.WHITE)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   257
        self.SearchResultsTree.SetItemTextColour(root, wx.BLACK)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   258
        if infos["type"] is not None:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   259
            if infos["type"] == ITEM_POU:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   260
                self.SearchResultsTree.SetItemImage(root, self.TreeImageDict[self.ParentWindow.Controler.GetPouType(infos["name"])])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   261
            else:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   262
                self.SearchResultsTree.SetItemImage(root, self.TreeImageDict[infos["type"]])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   263
        
571
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   264
        text = None
566
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   265
        if infos["text"] is not None:
571
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   266
            text = infos["text"]
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   267
            start, end = infos["data"][1:3]
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   268
            text_lines = infos["text"].splitlines()
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   269
            start_idx = start[1]
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   270
            end_idx = reduce(lambda x, y: x + y, map(lambda x: len(x) + 1, text_lines[:end[0] - start[0]]), end[1] + 1)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   271
            style = wx.TextAttr(wx.BLACK, wx.Colour(206, 204, 247))
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   272
        elif infos["type"] is not None and infos["matches"] > 1:
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   273
            text = _("(%d matches)") % infos["matches"]
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   274
            start_idx, end_idx = 0, len(text)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   275
            style = wx.TextAttr(wx.Colour(0, 127, 174))
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   276
        
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   277
        if text is not None:
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   278
            background_colour = self.SearchResultsTree.GetBackgroundColour()
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   279
            if wx.Platform != '__WXMSW__':
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   280
                text_ctrl = wx.TextCtrl(id=-1, parent=self.SearchResultsTree, pos=wx.Point(0, 0), 
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   281
                        value=text, style=wx.BORDER_NONE|wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_RICH2)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   282
                width, height = text_ctrl.GetTextExtent(text)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   283
                text_ctrl.SetClientSize(wx.Size(width + 1, height))
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   284
                self.SearchResultsTree.SetItemWindow(root, text_ctrl)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   285
            else:
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   286
                panel = wx.Panel(id=-1, parent=self.SearchResultsTree)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   287
                panel.SetBackgroundColour(background_colour)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   288
                sizer = wx.BoxSizer(wx.HORIZONTAL)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   289
                if len(text.splitlines()) > 1:
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   290
                    text_ctrl = wx.TextCtrl(id=-1, parent=panel, pos=wx.Point(0, 0), 
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   291
                          value=text, style=wx.BORDER_NONE|wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_RICH2)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   292
                else:
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   293
                    text_ctrl = wx.TextCtrl(id=-1, parent=panel, pos=wx.Point(0, 0), 
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   294
                           value=text, size=wx.Size(0, 13), style=wx.BORDER_NONE|wx.TE_READONLY|wx.TE_RICH2)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   295
                width, height = text_ctrl.GetTextExtent(text)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   296
                sizer.AddWindow(text_ctrl, 1, border=0, flags=wx.ALIGN_CENTER_VERTICAL)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   297
                panel.SetSizer(sizer)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   298
                panel.SetClientSize(wx.Size(width + 1, height + 5))
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   299
                self.SearchResultsTree.SetItemWindow(root, panel)
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   300
            
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   301
            text_ctrl.SetBackgroundColour(background_colour)
566
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   302
            text_ctrl.Bind(wx.EVT_LEFT_DOWN, self.GetTextCtrlClickFunction(root))
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   303
            text_ctrl.Bind(wx.EVT_LEFT_DCLICK, self.GetTextCtrlDClickFunction(root))
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   304
            text_ctrl.SetInsertionPoint(0)
571
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   305
            text_ctrl.SetStyle(start_idx, end_idx, style)
566
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   306
            
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   307
        if wx.VERSION >= (2, 6, 0):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   308
            item, root_cookie = self.SearchResultsTree.GetFirstChild(root)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   309
        else:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   310
            item, root_cookie = self.SearchResultsTree.GetFirstChild(root, 0)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   311
        for child in infos["children"]:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   312
            if item is None:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   313
                item = self.SearchResultsTree.AppendItem(root, "")
571
79af7b821233 Fixing search in project feature for Windows
laurent
parents: 566
diff changeset
   314
                item, root_cookie = self.SearchResultsTree.GetNextChild(root, root_cookie)
566
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   315
            self.GenerateSearchResultsTreeBranch(item, child)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   316
            item, root_cookie = self.SearchResultsTree.GetNextChild(root, root_cookie)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   317
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   318
    def ShowSearchResults(self, item):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   319
        data = self.SearchResultsTree.GetPyData(item)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   320
        if isinstance(data, TupleType):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   321
            search_results = [data]
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   322
        else:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   323
            search_results = self.SearchResults.get(data, [])
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   324
        for infos, start, end, text in search_results:
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   325
            self.ParentWindow.ShowSearchResult(infos, start, end)
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   326
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   327
    def OnSearchResultsTreeItemActivated(self, event):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   328
        self.ShowSearchResults(event.GetItem())
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   329
        event.Skip()
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   330
    
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   331
    def OnResetButton(self, event):
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   332
        self.ResetSearchResults()
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   333
        self.ParentWindow.ClearSearchResults()
6014ef82a98a Adding support for searching text or regular expression in whole project
laurent
parents:
diff changeset
   334
        event.Skip()