21 #You should have received a copy of the GNU General Public |
21 #You should have received a copy of the GNU General Public |
22 #License along with this library; if not, write to the Free Software |
22 #License along with this library; if not, write to the Free Software |
23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
24 |
24 |
25 import re |
25 import re |
26 |
26 from plcopen.plcopen import * |
27 import wx |
27 import wx |
28 |
|
29 RE_ESCAPED_CHARACTERS = ".*+()[]?:|{}^$<>=-," |
|
30 |
|
31 def EscapeText(text): |
|
32 text = text.replace('\\', '\\\\') |
|
33 for c in RE_ESCAPED_CHARACTERS: |
|
34 text = text.replace(c, '\\' + c) |
|
35 return text |
|
36 |
28 |
37 #------------------------------------------------------------------------------- |
29 #------------------------------------------------------------------------------- |
38 # Search In Project Dialog |
30 # Search In Project Dialog |
39 #------------------------------------------------------------------------------- |
31 #------------------------------------------------------------------------------- |
40 |
32 |
97 |
90 |
98 self.ElementsList = wx.CheckListBox(self) |
91 self.ElementsList = wx.CheckListBox(self) |
99 self.ElementsList.Enable(False) |
92 self.ElementsList.Enable(False) |
100 scope_sizer.AddWindow(self.ElementsList, 1, border=5, |
93 scope_sizer.AddWindow(self.ElementsList, 1, border=5, |
101 flag=wx.GROW|wx.TOP|wx.RIGHT|wx.BOTTOM) |
94 flag=wx.GROW|wx.TOP|wx.RIGHT|wx.BOTTOM) |
102 |
95 |
103 self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE) |
96 buttons_sizer = wx.BoxSizer(wx.HORIZONTAL) |
104 ok_button = self.ButtonSizer.GetAffirmativeButton() |
97 main_sizer.AddSizer(buttons_sizer, border=20, |
105 ok_button.SetLabel(_('Search')) |
98 flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_RIGHT) |
106 self.Bind(wx.EVT_BUTTON, self.OnOK, ok_button) |
99 |
107 main_sizer.AddSizer(self.ButtonSizer, border=20, |
100 self.FindButton = wx.Button(self, label=_("Find")) |
108 flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT) |
101 self.FindButton.SetDefault() |
|
102 self.Bind(wx.EVT_BUTTON, self.OnFindButton, self.FindButton) |
|
103 buttons_sizer.AddWindow(self.FindButton, border=5, flag=wx.RIGHT) |
|
104 |
|
105 self.CloseButton = wx.Button(self, label=_("Close")) |
|
106 self.Bind(wx.EVT_BUTTON, self.OnCloseButton, self.CloseButton) |
|
107 buttons_sizer.AddWindow(self.CloseButton) |
109 |
108 |
110 self.SetSizer(main_sizer) |
109 self.SetSizer(main_sizer) |
111 |
110 |
112 for name, label in GetElementsChoices(): |
111 for name, label in GetElementsChoices(): |
113 self.ElementsList.Append(_(label)) |
112 self.ElementsList.Append(_(label)) |
114 |
113 self.infosPrev = {} |
|
114 self.criteria = {} |
115 self.Pattern.SetFocus() |
115 self.Pattern.SetFocus() |
|
116 self.RefreshButtonsState() |
|
117 |
|
118 def RefreshButtonsState(self): |
|
119 find_pattern = self.Pattern.GetValue() |
|
120 self.FindButton.Enable(find_pattern != "") |
116 |
121 |
117 def GetCriteria(self): |
122 def GetCriteria(self): |
118 raw_pattern = pattern = self.Pattern.GetValue() |
123 return self.criteria |
119 if not self.CaseSensitive.GetValue(): |
124 |
120 pattern = pattern.upper() |
125 def FindPatternChanged(self, event): |
121 if not self.RegularExpression.GetValue(): |
126 self.RefreshButtonsState() |
122 pattern = EscapeText(pattern) |
127 event.Skip() |
123 criteria = { |
128 def OnScopeChanged(self, event): |
124 "raw_pattern": raw_pattern, |
129 self.ElementsList.Enable(self.OnlyElements.GetValue()) |
125 "pattern": re.compile(pattern), |
130 event.Skip() |
|
131 |
|
132 def OnCloseButton(self, event): |
|
133 self.EndModal(wx.ID_CANCEL) |
|
134 |
|
135 def OnFindButton(self, event): |
|
136 message = None |
|
137 infos = { |
|
138 "find_pattern": self.Pattern.GetValue(), |
126 "case_sensitive": self.CaseSensitive.GetValue(), |
139 "case_sensitive": self.CaseSensitive.GetValue(), |
127 "regular_expression": self.RegularExpression.GetValue(), |
140 "regular_expression": self.RegularExpression.GetValue(), |
128 } |
141 } |
129 if self.WholeProject.GetValue(): |
142 if self.WholeProject.GetValue(): |
130 criteria["filter"] = "all" |
143 infos["filter"] = "all" |
131 elif self.OnlyElements.GetValue(): |
144 elif self.OnlyElements.GetValue(): |
132 criteria["filter"] = [] |
145 infos["filter"] = [] |
133 for index, (name, label) in enumerate(GetElementsChoices()): |
146 for index, (name, label) in enumerate(GetElementsChoices()): |
134 if self.ElementsList.IsChecked(index): |
147 if self.ElementsList.IsChecked(index): |
135 criteria["filter"].append(name) |
148 infos["filter"].append(name) |
136 return criteria |
149 |
137 |
150 if self.infosPrev != infos: |
138 def OnScopeChanged(self, event): |
151 try: |
139 self.ElementsList.Enable(self.OnlyElements.GetValue()) |
152 self.criteria = infos |
140 event.Skip() |
153 CompilePattern(self.criteria) |
141 |
154 self.infosPrev = infos |
142 def OnOK(self, event): |
155 except: |
143 message = None |
156 self.criteria.clear() |
144 if self.Pattern.GetValue() == "": |
|
145 message = _("Form isn't complete. Pattern to search must be filled!") |
|
146 else: |
|
147 wrong_pattern = False |
|
148 if self.RegularExpression.GetValue(): |
|
149 try: |
|
150 re.compile(self.Pattern.GetValue()) |
|
151 except: |
|
152 wrong_pattern = True |
|
153 if wrong_pattern: |
|
154 message = _("Syntax error in regular expression of pattern to search!") |
157 message = _("Syntax error in regular expression of pattern to search!") |
155 |
158 |
156 if message is not None: |
159 if message is not None: |
157 dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR) |
160 dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR) |
158 dialog.ShowModal() |
161 dialog.ShowModal() |