Change-Id: If95cb839ad81ca2a842ff7f6926847ac3928d8f2 Former-commit-id: 77e1a4d8f5237e5fae930c1e00589c752f8b3738
192 lines
5.7 KiB
Python
192 lines
5.7 KiB
Python
##
|
|
# This software was developed and / or modified by Raytheon Company,
|
|
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
|
#
|
|
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
|
# This software product contains export-restricted data whose
|
|
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
|
# to non-U.S. persons whether in the United States or abroad requires
|
|
# an export license or other authorization.
|
|
#
|
|
# Contractor Name: Raytheon Company
|
|
# Contractor Address: 6825 Pine Street, Suite 340
|
|
# Mail Stop B8
|
|
# Omaha, NE 68106
|
|
# 402.291.0100
|
|
#
|
|
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
|
# further licensing information.
|
|
##
|
|
#
|
|
# Name:
|
|
# SearchDialog.py
|
|
# GFS1-NHD:A3649.0000-SCRIPT;10
|
|
#
|
|
# Status:
|
|
# DELIVERED
|
|
#
|
|
# History:
|
|
# Revision 10 (DELIVERED)
|
|
# Created: 01-OCT-2007 10:41:33 OBERFIEL
|
|
# Surrounded tag_ranges() call with exception handling.
|
|
#
|
|
# Revision 9 (DELIVERED)
|
|
# Created: 07-MAY-2005 11:38:02 OBERFIEL
|
|
# Added Item Header Block
|
|
#
|
|
# Revision 8 (DELIVERED)
|
|
# Created: 01-OCT-2004 13:42:40 TROJAN
|
|
# spr 6400
|
|
#
|
|
# Revision 7 (APPROVED)
|
|
# Created: 12-JUL-2004 12:05:38 OBERFIEL
|
|
# Fixed missing BusyTkDialog messages
|
|
#
|
|
# Revision 6 (APPROVED)
|
|
# Created: 01-JUL-2004 14:59:50 OBERFIEL
|
|
# Update
|
|
#
|
|
# Revision 5 (DELIVERED)
|
|
# Created: 05-NOV-2003 19:10:16 OBERFIEL
|
|
# Initial version for 2.0
|
|
#
|
|
# Revision 4 (DELIVERED)
|
|
# Created: 24-APR-2003 14:54:51 TROJAN
|
|
# sprs 5055, 5056, 5057, 5070
|
|
#
|
|
# Revision 3 (DELIVERED)
|
|
# Created: 30-OCT-2001 20:15:25 PCMS
|
|
# Correcting heirarchy of dialog boxes.
|
|
#
|
|
# Revision 2 (DELIVERED)
|
|
# Created: 02-OCT-2001 17:48:49 PCMS
|
|
# Updating for gui changes
|
|
#
|
|
# Revision 1 (DELIVERED)
|
|
# Created: 20-AUG-2001 20:32:00 MOELLER
|
|
# Initial version
|
|
#
|
|
# Change Document History:
|
|
# 1:
|
|
# Change Document: GFS1-NHD_SPR_7337
|
|
# Action Date: 19-MAR-2008 08:04:02
|
|
# Relationship Type: In Response to
|
|
# Status: CLOSED
|
|
# Title: AvnFPS: Fixes from ATAN 893 flight category testing
|
|
#
|
|
#
|
|
from Tkinter import *
|
|
import Pmw
|
|
import Busy
|
|
|
|
class Dialog(Pmw.Dialog):
|
|
"""For use by EditDialog and its derivatives"""
|
|
def __init__(self, parent, text, **kw):
|
|
self._replacepattern = '?'
|
|
self._history = []
|
|
self._text = text
|
|
optiondefs = ()
|
|
self.defineoptions(kw, optiondefs)
|
|
Pmw.Dialog.__init__(self, parent)
|
|
self.withdraw()
|
|
|
|
self.configure(buttons=('Close',), defaultbutton=0)
|
|
|
|
interior = self.interior()
|
|
|
|
self.__findentry = Pmw.EntryField(interior, labelpos='w',
|
|
label_text='Find what:', validate=None)
|
|
self.__replaceentry = Pmw.EntryField(interior, labelpos='w',
|
|
label_text='Replace by:', validate=None)
|
|
entries = (self.__findentry, self.__replaceentry)
|
|
for entry in entries:
|
|
entry.pack(side='top', fill='x', expand='no',
|
|
padx=5, pady=5)
|
|
Pmw.alignlabels(entries)
|
|
|
|
self.__buttonbox = Pmw.ButtonBox(interior, padx=0, pady=0)
|
|
self.__buttonbox.add('Find', command=self.__find)
|
|
self.__buttonbox.add('Replace', command=self.__replace)
|
|
self.__buttonbox.add('Replace All', command=self.__replaceAll)
|
|
self.__buttonbox.add('Undo', command=self.__undo)
|
|
self.__buttonbox.pack(side=TOP, expand=NO, fill=X)
|
|
self.__buttonbox.alignbuttons()
|
|
|
|
self.initialiseoptions(Dialog)
|
|
|
|
def __find(self, quiet=0):
|
|
self._searchpattern = self.__findentry.get().rstrip().upper()
|
|
if not self._searchpattern:
|
|
return 0
|
|
self._text.selection_clear()
|
|
tkLength = IntVar()
|
|
last_pos = self._text.index('insert')
|
|
next_pos = self._text.search(self._searchpattern, last_pos,
|
|
nocase=1, count=tkLength)
|
|
if not next_pos:
|
|
if not quiet:
|
|
Busy.showinfo('Pattern not found',
|
|
self.interior())
|
|
return 0
|
|
self._text.see(next_pos)
|
|
len = tkLength.get()
|
|
self._text.tag_add(SEL, next_pos, '%s + %d char' % \
|
|
(next_pos, len))
|
|
self._text.mark_set('insert', '%s + %d char' % (next_pos, len))
|
|
return 1
|
|
|
|
def __replace(self):
|
|
pattern = self.__replaceentry.get().rstrip().upper()
|
|
if not pattern and self._replacepattern:
|
|
if not Busy.askokcancel('Replace with empty string?',
|
|
self.interior()):
|
|
return -1
|
|
self._replacepattern = pattern
|
|
if not self.__find(1):
|
|
return 0
|
|
# prevent infinite loop
|
|
if self._replacepattern == self._searchpattern:
|
|
return 0
|
|
try:
|
|
(start, end) = self._text.tag_ranges(SEL)
|
|
except ValueError:
|
|
return 0
|
|
|
|
self._text.delete(start, end)
|
|
repend = '%s + %d char' % (start, len(self._replacepattern))
|
|
if self._replacepattern:
|
|
self._text.insert(start, self._replacepattern)
|
|
self._text.tag_add(SEL, start, repend)
|
|
self._history.append((start, repend, self._searchpattern))
|
|
ll = len(self._history)
|
|
if ll > 16:
|
|
self._history = self._history[-16:]
|
|
return 1
|
|
|
|
def __replaceAll(self):
|
|
n = 0
|
|
while 1:
|
|
rc = self.__replace()
|
|
if rc == -1:
|
|
return
|
|
elif rc == 0:
|
|
break
|
|
n += 1
|
|
if n == 0:
|
|
Busy.showwarning('Replace failed', self.interior())
|
|
else:
|
|
Busy.showinfo('Replaced %d occurences' % n,
|
|
self.interior())
|
|
|
|
def __undo(self):
|
|
ll = len(self._history)
|
|
if ll == 0:
|
|
Busy.showwarning('Nothing to undo', self.interior())
|
|
return
|
|
(start, end, pattern) = self._history[-1]
|
|
self._text.delete(start, end)
|
|
self._text.insert(start, pattern)
|
|
del self._history[-1]
|
|
|
|
def setText(self, text):
|
|
self._text = text
|