#   Programmer: Franz Steinhaeusler
#   E-mail:     francescoa@users.sourceforge.net
#   Note:       You must reply to the verification e-mail to get through.
#
#   Copyright 2004-2005 Franz Steinhaeusler
#
#   Distributed under the terms of the GPL (GNU Public License)
#
#    DrPython is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

#Plugin
#FindFiles

#10.08.2004 initial version 0.0.0
#07.09.2004         version 0.0.1
#28.08.2004         version 0.0.2
#03.10.2004         version 0.0.3
#11.10.2004         version 0.0.4
#until 20.10.2004   version 0.0.5
#26.10.2004         version 0.0.6
#27.10.2004         version 0.0.7
#Bugfix: Thanks Dan Pozmanter: if there was no history file, then an exception occured.
#until 23.11.2004   version 0.0.8
#until 21.01.2005   version 0.0.9


#for changes please view the changelog file

#for pychecker
#import sys
#sys.path.append('c:/Eigene Dateien/python/drpython')

import wx
import drScrolledMessageDialog
import os
import re
import drPrefsFile
import wx.lib.mixins.listctrl  as  listmix
import cStringIO

def OnAbout(DrFrame):
    Version = "0.0.9"
    NameAndVersion = "FindFiles:\n\nVersion: " + Version + "\n"
    AboutString = NameAndVersion + "By Franz Steinhaeusler\n\nReleased under the GPL."
    drScrolledMessageDialog.ShowMessage(DrFrame, AboutString, "About")

def OnHelp(DrFrame):
    drScrolledMessageDialog.ShowMessage(DrFrame, "FindFiles", "Help")

def OnPreferences(DrFrame):
    d = FindFilesPrefsDialog(DrFrame, -1)
    d.ShowModal()
    d.Destroy()


class FindFilesPrefsDialog(wx.Dialog):

    def __init__(self, parent, id):

        wx.Dialog.__init__(self, parent, id, "FindFiles Preferences", wx.Point(50, 50), \
                        wx.Size(220, 160), wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.THICK_FRAME | wx.RESIZE_BORDER)

        self.parent = parent

        self.chkSaveSizePosition = wx.RadioBox(self, -1, "Size/Position", \
                                            choices = ["Do not save", "Save manually", "Save automatically"],\
                                            style = wx.RA_SPECIFY_ROWS)

        self.chkSaveSizePosition.SetSelection(self.parent.FindFiles_savesizeposition)

        self.theSizer = wx.FlexGridSizer(5, 3, 5, 10)

        self.theSizer.Add(self.chkSaveSizePosition, 1, wx.GROW)
        self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)
        self.theSizer.Add(wx.StaticText(self, -1, "   "), 1, wx.SHAPED)

        self.SetAutoLayout(True)
        self.SetSizer(self.theSizer)

        self.buttonSizer = wx.BoxSizer(wx.HORIZONTAL)

        self.btnCancel = wx.Button(self, wx.ID_CANCEL, "&Close")
        self.btnSave = wx.Button(self, wx.ID_OK, "&Save")
        self.btnSave.SetDefault()

        self.buttonSizer.Add(self.btnCancel, 1, wx.SHAPED)
        self.buttonSizer.Add(self.btnSave, 1, wx.GROW)

        self.theSizer.Add(self.buttonSizer, 0, wx.SHAPED | wx.ALIGN_CENTER)
        self.theSizer.Add(wx.StaticText(self, -1, "   "), 0, wx.SHAPED | wx.ALIGN_CENTER)
        self.theSizer.Add(wx.StaticText(self, -1, "   "), 0, wx.SHAPED | wx.ALIGN_CENTER)

        if parent.PLATFORM_IS_WIN:
            self.SetSizerAndFit(self.theSizer)

        self.Bind(wx.EVT_BUTTON,  self.OnbtnClose, id = wx.ID_CANCEL)
        self.Bind(wx.EVT_BUTTON,  self.OnbtnSave, id = wx.ID_OK)
        self.Bind(wx.EVT_RADIOBOX,  self.OnSizePos, id = -1)

    def OnSizePos (self, event):
        if event.GetSelection() == 0:
            if os.path.exists (self.parent.pluginsdatdirectory + '/FindFiles.sizepos.dat'):
                answer = wx.MessageBox("Delete sizeandposition entries?", "Warning", wx.YES_NO | wx.ICON_QUESTION)
                if answer == wx.YES:
                    os.remove(self.parent.pluginsdatdirectory + '/FindFiles.sizepos.dat')


    def OnbtnClose(self, event):
        self.EndModal(0)

    def OnbtnSave (self, event):
        self.parent.FindFiles_savesizeposition = int(self.chkSaveSizePosition.GetSelection())
        f = file(self.parent.pluginspreferencesdirectory + "/FindFiles.preferences.dat", 'w')
        f.write("<findfiles.savesizeposition>" + str(self.parent.FindFiles_savesizeposition) + "</findfiles.savesizeposition>\n")
        f.close()


def Plugin(DrFrame):

    class DirComboBox (wx.ComboBox):
        def __init__(self, parent, id, name, pos, size):
            wx.ComboBox.__init__(self, parent, id, name, pos, size, style=wx.CB_DROPDOWN)
            self.SetBackgroundColour(wx.Colour(244, 244, 232))

            self.parent = parent
            self.focuschanged = False
            self.focusstate = False
            self.refresh = False
            self.Bind(wx.EVT_KILL_FOCUS,  self.OnKillFocus)
            self.Bind(wx.EVT_SET_FOCUS,  self.OnSetFocus)
            self.Bind(wx.EVT_IDLE,  self.OnIdle)

        #workaround for wxPython-bug (at least on wxMSW)
        def OnIdle(self, event):
            if self.focuschanged:
                if self.focusstate == True:
                    pass
                else:
                    if self.refresh:
                        self.OnKillFocusAction(event)
                self.focuschanged = False
            event.Skip()

        def OnKillFocus (self, event):
            if self.parent.allow:
                #on gtk, the event is always fired properly
                #otherwise this circumstantial code is needed for windows
                if DrFrame.PLATFORM_IS_WIN:
                    self.focuschanged = True
                    self.focusstate = False
                    self.refresh = True
                    focuswindow = wx.Window.FindFocus()
                    #this findfocus returen on gkt ALWAYS None, so don't care for it
                    if isinstance (focuswindow, wx.Button):
                        if focuswindow.GetLabel() == "&Browse":
                            self.refresh = False
                    else:
                        if focuswindow is None:
                            #changed to another app
                            self.refresh = False
                else:
                    self.OnKillFocusAction(event)
                    event.Skip()
            event.Skip()

        def OnSetFocus (self, event):
            if self.parent.allow:
                self.focuschanged = True
                self.focusstate = True
            event.Skip()

        def OnKillFocusAction(self, event):
            self.parent.OnDirectorySelect(event)
            #self.parent.btnOk.SetDefault()

    class FileTextCtrl (wx.TextCtrl):
        def __init__(self, parent, id, name, pos, size):
            wx.TextCtrl.__init__(self, parent, id, name, pos, size)
            self.SetBackgroundColour(wx.Colour(244, 244, 232))
            self.parent = parent
            self.Bind(wx.EVT_CHAR,  self.OnChar)


        def OnChar(self, event):
            listctrlkeys = [wx.WXK_DOWN, wx.WXK_UP, wx.WXK_NEXT, wx.WXK_PRIOR]
            kcode = event.GetKeyCode()
            if kcode in listctrlkeys:
                keyindex = listctrlkeys.index (kcode)
                singlestep = False
                pagestep = False
                #singlestep
                if keyindex < 2:
                    singlestep = True
                    singleinc = False
                    if keyindex == 0:
                        singleinc = True
                else:
                    #pagestep
                    if keyindex < 4:
                        pagestep = True
                        pageinc = False
                        if keyindex == 2:
                            pageinc = True
                    else:
                        if keyindex < 6:
                            if event.ControlDown():
                                to_end = False
                                if keyindex ==  4:
                                    to_end = True
                        else:
                            sortfname = False
                            if keyindex == 6:
                                sortfname = True

                self.parent.results.SetFocus()

                if keyindex < 6:
                    index = -1
                    olditem = -1

                    itemcount = self.parent.results.GetItemCount()
                    #deselect all former selected items
                    for i in range (itemcount):
                        index = self.parent.results.GetNextItem(index, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED)
                        if index == -1:
                            break
                        self.parent.results.SetItemState(index, wx.LIST_STATE_FOCUSED , wx.LIST_STATE_SELECTED|wx.LIST_STATE_FOCUSED)
                        olditem = index

                    if itemcount > 0:
                        if singlestep:
                            if singleinc:
                                newindex = olditem + 1
                                if newindex >= itemcount:
                                    newindex = 0
                            else:
                                newindex = olditem - 1
                                if newindex < 0:
                                    newindex = itemcount - 1
                        else:
                            if pagestep:
                                singleitemhight = self.parent.results.GetItemRect(0)[3]
                                clienthight = self.parent.results.GetClientSize()[1] - 3# on windows -3
                                #todo: does it fit on gkt? not so accurate, doesn't matter, should function so halfway
                                visibleitems = (clienthight - singleitemhight) / singleitemhight
                                to_jump = visibleitems -1
                                if to_jump < 1:
                                    to_jump = 1
                                if not pageinc:
                                    to_jump = - to_jump
                                newindex = olditem + to_jump
                                if newindex >= itemcount:
                                    newindex = itemcount - 1
                                if newindex < 0:
                                    newindex = 0
                            else:
                                if to_end:
                                    newindex = itemcount - 1
                                else:
                                    newindex = 0
                        self.parent.results.SetItemState(newindex, wx.LIST_STATE_SELECTED|wx.LIST_STATE_FOCUSED , wx.LIST_STATE_SELECTED|wx.LIST_STATE_FOCUSED)
                        self.parent.results.EnsureVisible(newindex)

            else:
                event.Skip()

            self.SetFocus()


    class FileListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
        def __init__(self, parent, ID, pos, size, style):
            wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
            self.SetBackgroundColour(wx.Colour(244, 244, 232))
            listmix.ListCtrlAutoWidthMixin.__init__(self)

    class EditDlg(wx.Dialog):
        def __init__(self, parent, id, title):
            wx.Dialog.__init__(self, parent, id, title, wx.DefaultPosition, (400, 400), #wx.DefaultSize,
                wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.THICK_FRAME | wx.RESIZE_BORDER)

            self.parent = parent

            self.filtertxtControl = wx.TextCtrl (self, -1, self.parent.parent.FindFiles_filterfilemask)
            self.historyentries = wx.ListBox (self, -1, style = wx.LB_SINGLE)
            self.btnOk = wx.Button (self, 5001, "&Ok")
            self.btnDelete = wx.Button (self, 5002, "&Delete")
            topSizer = wx.FlexGridSizer(10, 2, 10, 10)
            topSizer.AddGrowableCol(1)
            topSizer.Add(wx.StaticText(self, -1, "  "), 0)
            topSizer.Add(wx.StaticText(self, -1, "  "), 0)
            topSizer.Add(wx.StaticText(self, -1, "  "), 0)
            topSizer.Add(wx.StaticText(self, -1, "example (without quotes): 'cpp;h;py;pyw;txt;log;bat;dat'"), 0)
            topSizer.Add(wx.StaticText(self, -1, "File Extensions:"), 0)
            topSizer.Add(self.filtertxtControl, 1, wx.GROW)
            topSizer.Add(wx.StaticText(self, -1, "  "), 0)
            topSizer.Add(wx.StaticText(self, -1, "  "), 0)
            topSizer.Add(wx.StaticText(self, -1, "History Entries: "), 0)
            topSizer.Add(self.historyentries, 1, wx.GROW)
            topSizer.Add(wx.StaticText(self, -1, "  "), 0)
            topSizer.Add(wx.StaticText(self, -1, "  "), 0)
            topSizer.Add(self.btnOk, 1, 0)
            topSizer.Add(self.btnDelete, 1, wx.GROW)
            topSizer.Add(wx.StaticText(self, -1, "  "), 0)
            topSizer.Add(wx.StaticText(self, -1, "  "), 0)
            self.SetSizer(topSizer)

            if self.parent.parent.DirectoryHistory:
                for i in self.parent.parent.DirectoryHistory:
                    self.historyentries.Append (i)

            self.Bind(wx.EVT_BUTTON,  self.OnbtnDelete, id = 5002)
            self.Bind(wx.EVT_BUTTON,  self.OnbtnOk, id = 5001)

        def OnbtnDelete (self, event):
            if self.historyentries.GetCount():
                sel = self.historyentries.GetStringSelection ()
                if sel:
                    if sel == self.parent.txtDirectory.GetValue():
                        self.parent.parent.ShowMessage("You cannot delete the currently selected item\nit is selected now", "Error")
                        return


                    answer = wx.MessageBox("Are you sure?", "Delete Entry?", wx.YES_NO | wx.ICON_QUESTION)
                    if answer == wx.NO:
                        return

                    index = self.parent.parent.DirectoryHistory.index (sel)
                    self.parent.parent.DirectoryHistory.pop (index)

                    #also from list

                    for i in range (len (self.parent.parent.FindFiles_AllFiles)):
                        if sel in self.parent.parent.FindFiles_AllFiles[i][0]:
                            self.parent.parent.FindFiles_AllFiles.pop (i)
                            break

                    self.historyentries.Clear()
                    if self.parent.parent.DirectoryHistory:
                        for i in self.parent.parent.DirectoryHistory:
                            self.historyentries.Append (i)
                    self.parent.WriteSavedFiles ()

                    #von parent auch aus history entfernen
                    for i in range (self.parent.txtDirectory.GetCount()):
                        if self.parent.txtDirectory.GetString(i) == sel:
                            self.parent.txtDirectory.Delete (i)
                            break

        def OnbtnOk (self, event):
            self.parent.parent.FindFiles_filterfilemask = self.filtertxtControl.GetValue()
            self.Destroy()

    class drFindFilesDialog(wx.Dialog):
        def __init__(self, parent, id, title):

            self.ID_REFRESH = 1001
            self.ID_CHKSUBDIR = 1002
            self.ID_CHKFILTER = 1003
            self.ID_EDIT = 1004
            self.ID_BROWSE = 1005
            self.ID_SETTINGS = 1006
            self.ID_ABOUT = 1007
            self.ID_HELP = 1008
            self.ID_CBOXDIRECTORY_FOCUS = 1009
            self.ID_CBOXFILENAME_FOCUS = 1010
            self.ID_RESULTS_FOCUS = 1011
            self.ID_PREFERENCES = 1012
            self.ID_SORTNAME_FOCUS = 1013
            self.ID_SORTPATH_FOCUS = 1014

            self.parent = parent
            self.allow = False
            self.maxhistoryentries = 10
            self.oldsortcolumn = -1
            self.listfiles = []


            wx.Dialog.__init__(self, parent, id, title, wx.DefaultPosition, (760, 438),\
                wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.THICK_FRAME | wx.RESIZE_BORDER)
            self.txtDirectory = DirComboBox(self, 5001, "", wx.DefaultPosition, (550, -1))
            self.txtFileName = FileTextCtrl(self, 5002, "", wx.DefaultPosition, (550, -1))
            self.results = FileListCtrl (self, -1, wx.DefaultPosition, (550, 300), wx.LC_REPORT|wx.SUNKEN_BORDER )
            self.results.InsertColumn(0, "Filename",  wx.LIST_FORMAT_LEFT, 150)
            self.results.InsertColumn(1, "Path",  wx.LIST_FORMAT_LEFT,400)
            self.btnBrowse = wx.Button(self, self.ID_BROWSE, "&Browse", size = (90, -1))
            self.btnRefresh = wx.Button(self, self.ID_REFRESH, "&Refresh", size = (90, -1))
            self.chksubdir = wx.CheckBox(self, self.ID_CHKSUBDIR, "Sub&Dirs:", style = wx.ALIGN_RIGHT)
            self.chkfilter = wx.CheckBox(self, self.ID_CHKFILTER, "&Filter:", style = wx.ALIGN_RIGHT)
            self.btnEdit = wx.Button(self, self.ID_EDIT, "&Edit", size = (90, -1))
            self.btnOk = wx.Button(self, wx.ID_OK, "Selec&t", size = (90, -1))
            self.btnSaveSize = wx.Button(self, self.ID_SETTINGS, "Sa&ve Size", size = (90, -1))
            self.btnPreferences = wx.Button(self, self.ID_PREFERENCES, "&Preferences", size = (90, -1))
            self.btnAbout = wx.Button(self, self.ID_ABOUT, "&About", size = (90, -1))
            self.btnHelp = wx.Button(self, self.ID_HELP, "&Help", size = (90, -1))
            self.btnClose = wx.Button(self, wx.ID_CANCEL, "&Close", size = (90, -1))
            self.savefile = DrFrame.pluginsdatdirectory + "/FindFilesSavedFiles.log"
            self.historyfile = DrFrame.pluginsdatdirectory + "/FindFilesHistory.log"

            self.il = wx.ImageList(16, 16)
            try:
                self.sm_up = self.il.Add(self.getSmallUpArrowBitmap())
            except:
                self.sm_up = -1
            try:
                self.sm_dn = self.il.Add(self.getSmallDnArrowBitmap())
            except:
                self.sm_dn = -1
            try:
                self.loaded = self.il.Add(self.getFileLoadedBitmap())
            except:
                self.loaded = -1
            try:
                self.modified = self.il.Add(self.getFileModifiedBitmap())
            except:
                self.modified = -1

            self.results.SetImageList(self.il, wx.IMAGE_LIST_SMALL)


            if not DrFrame.FindFiles_fileloaded:
                DrFrame.FindFiles_AllFiles = []
                DrFrame.DirectoryHistory = []
                self.LoadSavedFiles()
                DrFrame.FindFiles_fileloaded = True
            else:
                if DrFrame.DirectoryHistory:
                    for i in DrFrame.DirectoryHistory:
                        self.txtDirectory.Append (i)
                    self.txtDirectory.SetValue (DrFrame.DirectoryHistory[0])

            self.cur_index = 0
            try:
                for l in range (len(DrFrame.FindFiles_AllFiles)):
                    if DrFrame.FindFiles_AllFiles[l][0] == DrFrame.DirectoryHistory[0]:
                            self.cur_index = l
                            break
            except:
                pass

            self.chkfilter.SetValue (DrFrame.FindFiles_filter)
            self.chksubdir.SetValue (DrFrame.FindFiles_subdir)
            self.btnSaveSize.Enable (self.parent.FindFiles_savesizeposition == 1)
            if DrFrame.FindFiles_AllFiles:
                self.OnRefreshFileList()
            self.olddir = ''
            if DrFrame.DirectoryHistory:
                self.olddir = DrFrame.DirectoryHistory[0]
            commandSizer = wx.BoxSizer(wx.VERTICAL)
            commandSizer.Add((0, 5), 0, wx.ALL, 0)
            commandSizer.Add(self.btnBrowse, 0, wx.ALL, 0)
            commandSizer.Add((0, 8), 0, wx.ALL, 0)
            commandSizer.Add(self.btnRefresh, 0, wx.ALL, 0)
            commandSizer.Add((0, 20), 0, wx.ALL, 0)
            commandSizer.Add(self.chksubdir, 0, wx.ALL, 0)
            commandSizer.Add((0, 20), 0, wx.ALL, 0)
            commandSizer.Add(self.chkfilter, 0, wx.ALL, 0)
            commandSizer.Add((0, 10), 0, wx.ALL, 0)
            commandSizer.Add(self.btnEdit, 0, wx.ALL, 0)
            commandSizer.Add((0, 15), 0, wx.ALL, 0)
            commandSizer.Add(self.btnOk, 0, wx.ALL, 0)
            commandSizer.Add((0, 15), 0, wx.ALL, 0)
            commandSizer.Add(self.btnSaveSize, 0, wx.ALL, 0)
            commandSizer.Add((0, 15), 0, wx.ALL, 0)
            commandSizer.Add(self.btnPreferences, 0, wx.ALL, 0)
            commandSizer.Add((0, 15), 0, wx.ALL, 0)
            commandSizer.Add(self.btnAbout, 0, wx.ALL, 0)
            commandSizer.Add((0, 15), 0, wx.ALL, 0)
            commandSizer.Add(self.btnHelp, 0, wx.ALL, 0)
            commandSizer.Add((0, 15), 0, wx.ALL, 0)
            commandSizer.Add(self.btnClose, 0, wx.ALL, 0)

            topSizer = wx.FlexGridSizer(2, 2, 10, 10)
            topSizer.AddGrowableCol(1)
            topSizer.Add(wx.StaticText(self, -1, "Director&y:"), 0)
            topSizer.Add(self.txtDirectory, 1, wx.GROW)
            topSizer.Add(wx.StaticText(self, -1, "File&Name: "), 0)
            topSizer.Add(self.txtFileName, 1, wx.GROW)

            leftSizer = wx.BoxSizer(wx.VERTICAL)
            leftSizer.Add(topSizer, 0, wx.EXPAND | wx.ALL, 5)
            leftSizer.Add(self.results, 1, wx.EXPAND | wx.ALL, 5)

            newSizer = wx.BoxSizer(wx.HORIZONTAL)
            newSizer.Add(leftSizer,1, wx.EXPAND | wx.ALL, 10)
            newSizer.Add(commandSizer,0, wx.ALIGN_TOP | wx.ALL, 10)
            self.SetSizer(newSizer)

            self.results.SetItemState(0, wx.LIST_STATE_SELECTED|wx.LIST_STATE_FOCUSED , wx.LIST_STATE_SELECTED|wx.LIST_STATE_FOCUSED)
            self.SetSizeHints(500, 438)

            self.txtFileName.SetFocus()
            wx.CallAfter(self.txtDirectory.SetMark, 0, 0)
            self.btnOk.SetDefault()

            tbl = wx.AcceleratorTable([(wx.ACCEL_ALT, ord('Y'), self.ID_CBOXDIRECTORY_FOCUS)
                                        ,(wx.ACCEL_ALT, ord('N'), self.ID_CBOXFILENAME_FOCUS)
                                        ,(wx.ACCEL_ALT, ord('L'), self.ID_RESULTS_FOCUS)
                                        ,(wx.ACCEL_NORMAL, wx.WXK_F3, self.ID_SORTNAME_FOCUS)
                                        ,(wx.ACCEL_NORMAL, wx.WXK_F2, self.ID_SORTPATH_FOCUS)])

            self.SetAcceleratorTable(tbl)

            self.Bind(wx.EVT_BUTTON,  self.OnbtnRefresh, id = self.ID_REFRESH)
            self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemSelected, id = -1)
            self.Bind(wx.EVT_TEXT, self.OnKeyDown, id = 5002)
            self.Bind(wx.EVT_BUTTON, self.OnbtnClose, id = wx.ID_CANCEL)
            self.Bind(wx.EVT_BUTTON, self.OnItemSelected, id = wx.ID_OK)
            self.Bind(wx.EVT_CHECKBOX, self.OnCheckSubDir, id = self.ID_CHKSUBDIR)
            self.Bind(wx.EVT_CHECKBOX, self.OnCheckFilter, id = self.ID_CHKFILTER)
            self.Bind(wx.EVT_BUTTON, self.OnEdit, id = self.ID_EDIT)
            self.Bind(wx.EVT_BUTTON, self.OnBrowse, id = self.ID_BROWSE)
            self.Bind(wx.EVT_BUTTON, self.OnSettings, id = self.ID_SETTINGS)
            self.Bind(wx.EVT_BUTTON, self.OnPreferences, id = self.ID_PREFERENCES)
            self.Bind(wx.EVT_BUTTON, self.OnAbout, id = self.ID_ABOUT)
            self.Bind(wx.EVT_BUTTON, self.OnHelp, id = self.ID_HELP)
            self.Bind(wx.EVT_MENU,  self.OnCBoxSearchDirectoryFocus, id = self.ID_CBOXDIRECTORY_FOCUS)
            self.Bind(wx.EVT_MENU,  self.OnCBoxFileNameSetFocus, id = self.ID_CBOXFILENAME_FOCUS)
            self.Bind(wx.EVT_MENU,  self.OnResultsSetFocus, id = self.ID_RESULTS_FOCUS)
            self.Bind(wx.EVT_MENU,  self.OnSortName, id = self.ID_SORTNAME_FOCUS)
            self.Bind(wx.EVT_MENU,  self.OnSortPath, id = self.ID_SORTPATH_FOCUS)
            self.Bind(wx.EVT_LIST_COL_CLICK, self.OnHeaderClick, id = -1)
            if self.parent.FindFiles_savesizeposition:
                self.parent.LoadDialogSizeAndPosition(self, 'FindFiles.sizepos.dat', self.parent.pluginsdatdirectory)

            self.allow = True

            if DrFrame.FindFiles_lastentered != '':
                self.txtFileName.SetValue (DrFrame.FindFiles_lastentered)
                self.txtFileName.SetSelection (0, len(DrFrame.FindFiles_lastentered))
                self.OnRefreshFileList()


        def OnSortName (self, event):
            self.nCol = 0
            self.SortHeader()

        def OnSortPath (self, event):
            self.nCol = 1
            self.SortHeader()

        def OnHeaderClick(self, event):
            self.nCol = event.GetColumn()
            self.SortHeader()
            event.Skip()


        def columnSorter(self, key1, key2):
            #lowercase is best solution
            if not self.sort_asc:
                #isn't this cool?
                key1, key2 = key2, key1
            item1 = self.listfiles[key1][self.nCol].lower()
            item2 = self.listfiles[key2][self.nCol].lower()
            if item1 == item2:
                return 0
            elif item1 < item2:
                return -1
            else:
                return 1

        def SortHeader(self, newsort = True):
            self.reorderd = True
            if newsort:
                if self.oldsortcolumn != -1:
                    self.results.ClearColumnImage(self.oldsortcolumn)

                if self.oldsortcolumn != self.nCol:
                    self.sort_asc = True
                    self.oldsortcolumn = self.nCol
                else:
                    self.sort_asc = not self.sort_asc

                if self.sort_asc:
                    idx = self.sm_up
                else:
                    idx = self.sm_dn
                self.results.SetColumnImage(self.nCol, idx)
            else:
                if self.oldsortcolumn == -1:
                    return
            self.results.SortItems(self.columnSorter)

            nItem = self.results.GetNextItem(-1, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED)
            self.results.EnsureVisible(nItem)



        def getSmallUpArrowBitmap(self):
            return wx.BitmapFromImage(self.getSmallUpArrowImage())

        def getSmallUpArrowImage(self):
            stream = cStringIO.StringIO(self.getSmallUpArrowData())
            return wx.ImageFromStream(stream)

        def getSmallDnArrowBitmap(self):
            return wx.BitmapFromImage(self.getSmallDnArrowImage())

        def getSmallDnArrowImage(self):
            stream = cStringIO.StringIO(self.getSmallDnArrowData())
            return wx.ImageFromStream(stream)

        def getFileLoadedBitmap(self):
            return wx.BitmapFromImage(self.getFileLoadedImage())

        def getFileLoadedImage(self):
            stream = cStringIO.StringIO(self.getFileLoadedData())
            return wx.ImageFromStream(stream)

        def getFileModifiedBitmap(self):
            return wx.BitmapFromImage(self.getFileModifiedImage())

        def getFileModifiedImage(self):
            stream = cStringIO.StringIO(self.getFileModifiedData())
            return wx.ImageFromStream(stream)

        def OnPreferences(self, event):
            OnPreferences(self.parent)
            self.btnSaveSize.Enable (self.parent.FindFiles_savesizeposition == 1)

        def OnCloseW (self, event):
            if self.parent.FindFiles_savesizeposition == 2:
                self.parent.SaveDialogSizeAndPosition(self, 'FindFiles.sizepos.dat', self.parent.pluginsdatdirectory)
            DrFrame.Raise()
            DrFrame.SetFocus()
            DrFrame.txtDocument.SetFocus()

            if event is not None:
                event.Skip()

        def OnCBoxSearchDirectoryFocus(self, event):
            self.txtDirectory.SetFocus()

        def OnCBoxFileNameSetFocus(self, event):
            self.txtFileName.SetFocus()

        def OnResultsSetFocus(self, event):
            self.results.SetFocus()

        def OnHelp (self, event):
            OnHelp(DrFrame)

        def OnAbout (self, event):
            OnAbout(DrFrame)

        def OnBrowse (self, event):
            path = self.txtDirectory.GetValue().strip()
            paths = path.split(';')
            lastdir = ""
            while len (paths) > 0:
                lastdir = paths.pop()
                if os.path.exists(lastdir):
                    break
            d = wx.DirDialog(self, "Add Directory:", lastdir, style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON|wx.MAXIMIZE_BOX|wx.THICK_FRAME)
            if d.ShowModal() == wx.ID_OK:
                if path:
                    path += ';'
                newpath = d.GetPath()
                newpath = newpath.replace ('\\', "/")
                path += newpath
                self.txtDirectory.SetValue(path)
            wx.CallAfter(self.txtDirectory.SetMark, len (path), len (path))
            self.txtDirectory.SetFocus()

        def OnSettings (self, event):
            if self.parent.FindFiles_savesizeposition == 1:
                self.parent.SaveDialogSizeAndPosition(self, 'FindFiles.sizepos.dat', self.parent.pluginsdatdirectory)

        def SaveDialogSizePosColumn(self, dialog, dialogfile):
            f = file(self.parent.pluginsdatdirectory + '/' + dialogfile, 'w')
            x, y = dialog.GetSizeTuple()
            px, py = dialog.GetPositionTuple()

            f.write("<findfiles.SizePos>\n")
            f.write(str(x) + '\n' + str(y) + '\n' + str(px) + '\n' + str(py) + '\n')
            f.write("</findfiles.SizePos>\n")
            f.close()

        def OnCheckSubDir (self, event):
            DrFrame.FindFiles_subdir = event.IsChecked()
            self.OnRefreshFileList ()

        def OnCheckFilter (self, event):
            DrFrame.FindFiles_filter = event.IsChecked()
            self.OnRefreshFileList ()

        def OnEdit (self, event):
            d = EditDlg(self, -1, "Edit")
            answer = d.ShowModal()


        def OnbtnClose(self, event):
            focuswindow = self.FindFocus()
            if DrFrame.PLATFORM_IS_WIN: #don't know what I meant with that
                p = focuswindow.GetParent()
                if p.GetTitle() == "Edit":
                    p.Destroy()
                    return

            self.WriteHistoryFile()
            self.OnCloseW(None)
            self.Destroy()


        def OnDirectorySelect (self, event, str = ''):
            if not str:
                cdir = self.txtDirectory.GetValue().strip()
            else:
                cdir = str
            cdir = cdir.replace("\\", "/")
            if cdir != self.olddir:
                self.olddir = cdir
                for l in range (len(DrFrame.FindFiles_AllFiles)):
                    if cdir == DrFrame.FindFiles_AllFiles[l][0]:
                        self.cur_index = l
                        self.OnRefreshFileList()
                        break
                else:
                    self.OnbtnRefresh(None)
                    if self.results.GetItemCount () < 1:
                        return

                if cdir in DrFrame.DirectoryHistory:
                    index = DrFrame.DirectoryHistory.index (cdir)
                    DrFrame.DirectoryHistory.pop (index)
                DrFrame.DirectoryHistory.insert (0, cdir)
                if len (DrFrame.DirectoryHistory) > self.maxhistoryentries:
                    deldir = DrFrame.DirectoryHistory.pop()
                    for l in range (len(DrFrame.FindFiles_AllFiles)):
                        if deldir in DrFrame.FindFiles_AllFiles[l][0]:
                            DrFrame.FindFiles_AllFiles.pop (l)
                            break


                self.txtDirectory.Clear ()
                for i in DrFrame.DirectoryHistory:
                    self.txtDirectory.Append (i)
                wx.CallAfter (self.txtDirectory.SetValue, cdir)

        def OnKeyDown (self, event):
            self.OnRefreshFileList()

        def testIgnoreDirectories (self, cdir):
            for i in self.ignoredirectories:
                if cdir.lower().find(i.lower()) != -1:
                    return True
            return False



        def listDir(self, cdir, dir_data, subdir, ignorelist):
            matches = []
            x = 0
            l = len(dir_data)

            if self.testIgnoreDirectories(cdir):
                return matches

            while x < l:
                filename = os.path.normpath(cdir + "/" + dir_data[x])
                filename = filename.replace("\\", "/")

                if subdir:
                    if not os.path.islink(filename):
                        if os.path.isdir(filename):
                            try:
                                matches.extend(self.listDir (filename, os.listdir(filename), subdir, ignorelist))
                            except:
                                pass
                        else:
                            matches.append(filename)
                else:
                    matches.append(filename)
                x = x + 1

            return matches

        def OnItemSelected (self, event):

            #thanks to Peter Damoc from wxython-user mailing-list for this hack!
            if self.FindFocus() == self.txtDirectory:
                self.txtFileName.SetFocus()
                return

            if self.results.GetItemCount () > 0:
                self.WriteHistoryFile()
                nItem = -1
                for i in range (self.results.GetItemCount()):
                    nItem = self.results.GetNextItem(nItem, wx.LIST_NEXT_ALL, wx.LIST_STATE_SELECTED)
                    if nItem == -1:
                        break

                    a = self.getColumnText(nItem, 1)
                    if DrFrame.PLATFORM_IS_WIN:
                        a = a.replace("\\", "/")

                    alreadyopen = DrFrame.GetAlreadyOpen()

                    if a in alreadyopen:
                        i = alreadyopen.index(a)
                        DrFrame.setDocumentTo(i)
                    elif os.path.exists(a):
                        DrFrame.OpenFile(a, True, False)
                    else:
                        wx.MessageBox("The file '%s'does not exist!" % a, "Please check the path!", wx.ICON_EXCLAMATION)
                    DrFrame.FindFiles_lastentered = self.txtFileName.GetValue()

                self.Destroy()

        def getColumnText(self, index, col):
            item = self.results.GetItem(index, col)
            return item.GetText()

        def OnRefreshFileList (self):
            self.results.DeleteAllItems()
            txtFilePattern = self.txtFileName.GetValue()
            lookdir = False
            try:
                if txtFilePattern != '':
                    if txtFilePattern[0] == '=':
                        u = re.compile('.' + txtFilePattern[1:], re.IGNORECASE)
                        lookdir = True
                    elif txtFilePattern[0] == '*':
                        u = re.compile('.' + txtFilePattern, re.IGNORECASE)
                    else:
                        txtFilePattern = txtFilePattern.replace ('.', '\\.')
                        txtFilePattern = txtFilePattern.replace ('*', '.*')
                        u = re.compile('^' + txtFilePattern, re.IGNORECASE)
                else:
                    u = re.compile('^' + self.txtFileName.GetValue(), re.IGNORECASE)
            except:
                #invalid regex pattern
                return
            # todo: setup switch case? makes more sense for linux
            index = 0

            directories = self.txtDirectory.GetValue().strip().split (';')
            if DrFrame.FindFiles_filterfilemask != '':
                pattern = DrFrame.FindFiles_filterfilemask.lower().split (';')
            self.listfiles = []
            farray = map(lambda x: x.filename, DrFrame.txtDocumentArray)
            for i in DrFrame.FindFiles_AllFiles[self.cur_index][1]:
                if lookdir:
                    f = u.search (i)
                else:
                    f = u.search (os.path.split(i)[1])
                if f:
                    #checkbox subdir
                    if not DrFrame.FindFiles_subdir:
                        i = i.replace ("\\", "/")
                        if not os.path.dirname(i) in directories:
                            continue
                    if DrFrame.FindFiles_filter:
                        if DrFrame.FindFiles_filterfilemask != '':
                            if not os.path.splitext(i)[1][1:].lower() in pattern:
                                continue
                    self.listfiles.append ([os.path.split(i)[1], i])

                    fname = self.listfiles[index][0]
                    idx = -1
                    if i in farray:
                        idx = self.loaded
                        findex = farray.index(i)
                        if DrFrame.txtDocumentArray[findex].GetModify():
                            idx = self.modified

                    self.results.InsertImageStringItem(index, fname, idx)
                    self.results.SetStringItem(index, 1, self.listfiles[index][1])
                    self.results.SetItemData(index, index)


                    index += 1

            self.results.SetItemState(0, wx.LIST_STATE_SELECTED|wx.LIST_STATE_FOCUSED , wx.LIST_STATE_SELECTED|wx.LIST_STATE_FOCUSED)
            if self.oldsortcolumn != -1:
                self.SortHeader(False)

        def FeedListBox(self):
            if DrFrame.FindFiles_AllFiles:
                self.results.DeleteAllItems()
                index = 0
                self.listfiles = []
                farray = map(lambda x: x.filename, DrFrame.txtDocumentArray)

                for i in DrFrame.FindFiles_AllFiles[self.cur_index][1]:
                    self.listfiles.append ([os.path.split(i)[1], i])

                    fname = self.listfiles[index][0]
                    idx = -1
                    if i in farray:
                        idx = self.loaded
                        findex = farray.index(i)
                        if DrFrame.txtDocumentArray[findex].GetModify():
                            idx = self.modified

                    self.results.InsertImageStringItem(index, fname, -1)
                    self.results.SetStringItem(index, 1, self.listfiles[index][1])
                    self.results.SetItemData(index, index)
                    index += 1
                self.results.SetItemState(0, wx.LIST_STATE_SELECTED|wx.LIST_STATE_FOCUSED , wx.LIST_STATE_SELECTED|wx.LIST_STATE_FOCUSED)
                if self.oldsortcolumn != -1:
                    self.SortHeader(False)

        def LoadSavedFiles(self):
            if os.path.exists(self.savefile):
                f = file(self.savefile, 'r')
                next_Path = False
                index = 0
                while True:
                    line = f.readline().rstrip().split('\n')
                    line = line [0]
                    if line == '':
                        break
                    if line == '</Directory>':
                        continue
                    elif line == '<Directory>':
                        next_Path = True
                    else:
                        #directory entry?
                        if next_Path:
                            next_Path = False
                            t = [[], []]
                            DrFrame.FindFiles_AllFiles.append (t)
                            index = len (DrFrame.FindFiles_AllFiles) - 1
                            DrFrame.FindFiles_AllFiles[index][0] = line
                        else:
                            DrFrame.FindFiles_AllFiles[index][1].append (line)
                            #next file
                f.close ()
            if os.path.exists(self.historyfile):
                f = file(self.historyfile, 'r')
                text = f.read()
                f.close()

                settings = ''
                settings = drPrefsFile.GetPrefFromText(settings, text, "findfiles.settings", False)
                settings = settings.split ('\n')
                settings.pop (0)
                try:
                    DrFrame.FindFiles_filterfilemask = settings [0]
                    DrFrame.FindFiles_filter = eval (settings[1])
                    DrFrame.FindFiles_subdir = eval (settings[2])
                except:
                    pass
                historyentries = ''
                historyentries = drPrefsFile.GetPrefFromText(historyentries, text, "findfiles.history", False)
                historyentries = historyentries.split ('\n')
                DrFrame.DirectoryHistory=[]
                for line in historyentries:
                    if line != '':
                        DrFrame.DirectoryHistory.append (line)
            else:
                for i in DrFrame.FindFiles_AllFiles:
                    DrFrame.DirectoryHistory.append (i[0])

            self.txtDirectory.Clear()
            for i in DrFrame.DirectoryHistory:
                self.txtDirectory.Append (i)
            if DrFrame.DirectoryHistory:
                self.txtDirectory.SetValue (DrFrame.DirectoryHistory[0])


        def WriteHistoryFile(self):
            f = file(self.historyfile, 'w')
            f.write("<findfiles.settings>\n")
            f.write(DrFrame.FindFiles_filterfilemask + "\n")
            f.write(str (DrFrame.FindFiles_filter) + "\n")
            f.write(str (DrFrame.FindFiles_subdir) + "\n")
            f.write("</findfiles.settings>\n")
            f.write("<findfiles.history>\n")
            for i in DrFrame.DirectoryHistory:
                f.write(i + "\n")
            f.write("</findfiles.history>\n")
            f.close()


        def WriteSavedFiles(self):
            f = file(self.savefile, 'w')

            #write cache or "history" file
            for i in range (len(DrFrame.FindFiles_AllFiles)):
                directory = DrFrame.FindFiles_AllFiles[i][0]
                f.write("<Directory>\n")
                f.write(directory + '\n')

                for files in DrFrame.FindFiles_AllFiles[i][1]:
                    f.write(files + '\n')
                f.write("</Directory>\n")
            f.close()

        def OnbtnRefresh (self, event):
            cdir = self.txtDirectory.GetValue().strip()
            cdir = cdir.replace("\\", "/")
            filelist = []
            dirs = cdir.split (';')
            self.ignoredirectories = []
            directories = []

            for i in dirs:
                if i[0] == '-':
                    self.ignoredirectories.append (i[1:])
                else:
                    directories.append (i)

            for i in directories:
                if os.path.exists(i):
                    filelist += self.listDir(i, os.listdir(i), 1, self.ignoredirectories)
            self.cur_index = 0
            self.results.DeleteAllItems()

            if filelist:
                #dictionary as alternative: but in list, sorting stays kept
                for l in range (len(DrFrame.FindFiles_AllFiles)):
                    if cdir == DrFrame.FindFiles_AllFiles[l][0]:
                        self.cur_index = l
                        DrFrame.FindFiles_AllFiles[self.cur_index][1] = []
                        break
                else:
                    t = [[], []]
                    DrFrame.FindFiles_AllFiles.append (t)
                    self.cur_index = len (DrFrame.FindFiles_AllFiles) - 1
                    DrFrame.FindFiles_AllFiles[self.cur_index][0] = cdir


                for i in filelist:

                    DrFrame.FindFiles_AllFiles[self.cur_index][1].append (i)#
                self.WriteSavedFiles()
                self.OnRefreshFileList ()

#----------------------------------------------------------------------
        def getSmallUpArrowData(self):
            return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
\x00\x00<IDATx\x9ccddbf\xa0\x040Q\xa4{h\x18\xf0\xff\xdf\xdf\xffd\x1b\x00\xd3\
\x8c\xcf\x10\x9c\x06\xa0k\xc2e\x08m\xc2\x00\x97m\xd8\xc41\x0c \x14h\xe8\xf2\
\x8c\xa3)q\x10\x18\x00\x00R\xd8#\xec\x95{\xc4\x11\x00\x00\x00\x00IEND\xaeB`\
\x82'


#----------------------------------------------------------------------
        def getSmallDnArrowData(self):
            return \
"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
\x00\x00HIDATx\x9ccddbf\xa0\x040Q\xa4{\xd4\x00\x06\x06\x06\x06\x06\x16t\x81\
\xff\xff\xfe\xfe'\xa4\x89\x91\x89\x99\x11\xa7\x0b\x90%\ti\xc6j\x00>C\xb0\x89\
\xd3.\x10\xd1m\xc3\xe5*\xbc.\x80i\xc2\x17.\x8c\xa3y\x81\x01\x00\xa1\x0e\x04e\
\x1d\xc4;\xb7\x00\x00\x00\x00IEND\xaeB`\x82"

        def getFileLoadedData(self):
            return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
\x00\x01\xddIDATx\x9c\xa5\x92?kTQ\x10\xc5\x7f\xf7\xde]\xf7\x8f\xa0Ub\xc0\x80\
\x84,v"\xd6\xa2\x8d\xb5\x08\xe2w\xb0\xb3\xf03\xf8q\xc4*\x95\x8d\xc8\xa2h\x08\
\x82\x85h\xa3\xc1$l\x88\x86\xc5,f\xf3\xde\x9b;3\x16\xbb\xfbvMP\x0b\x0f\x1c\
\xe62\xf7\xce\x993\xdc\t\xee\xee\xfc\x07\x1a\x00W\xee?\xe3\xee\x9d\x1e7\xd6\
\x8fp\xc0\\Q\xcbS*\xea\x19s\x83i\xaf\xad\xed5\xfaov\x19<\xbd7\x11XZ\xba\xc0\
\xad\x9b=z\xab\x1f\xc9V!f\x88\x1ab\x99\xec\x19\x98\x99\x0c\x00\xbc|\xb5\xc9\
\xf2\xe5u\x063\x07\x93\xab\xc0J\\A=#.x4B\x8a\xc4\x18\x891Lc$\xa5\xc4\xa5k\
\xc7\xec\x7f\x1e\xcfG\x98\x89\xb7\xacE\xd6D+\xb6\xeb\xc7\xa7cJ\x89\x18\xc6\
\x98\xfa\\\xc0\xddQ\x9b$\x16;\xfd)fsdQ@\r$;1FB\x08\x7f-\x06\xc8\xea\x88\xda\
\\\xc0\xdc\xa9t.0\x83\x99af\xa8j\x9ds\xf7\xb3\x02j\xce\xf6\x8f\xc0\x93~\xa2\
\x10\xa3\x10\xa5\x14\xa5\xccF)V\x9f+1\xaal\x949\x91\x17G0sJ1\xfa\x9f\x0e\xe9\
\xa5\x1d\x9a\xcd&\t\xe8N\t\xb0w\xa4\xbc\xde\xeb\xb2\xb6|\x9es\x8dx\xd6A!FV\
\xe7\xd1\xed6\xef\xbf5\xb8\xbe\xdaau\xf9bm}\xe3\xdd>/\x06\x115\xa7\xcaV;\x88\
\x00\xeaN)\x8a\x9a1\x1a\x8dx\xb8\x01[\xdb#NNNjjV\x9a\xcd&\xea\x01\xc9F\xb6S#\
\x14\xa2\x93\xef\x11\x01@D\x18\x8f\xc7\xb5\x03U\xa5\xddnc\x9e15\xf2o#8\x94\
\xd9PuRJ<\x7f0\xa4\xd5j\x9d\x11\xe8v\xbbx\xf9\x13\xd1\xf9\xde4\x00\x8a\xe3\
\x82\xc1\xd7\xef\xe4\xa3\x82\x0f;B\xa7\xd3\x01d\xca\t\xbe\x1cdtxHU\x8c\xa9D\
\xa8\x0e\x0e&\x0b\xec\xee\x1eB\x80\xab\x8f\xc1\xe6\x05\xff\xc4\xf0-\x0c7\xf9\
\x05\xc2\xc6H\xf5\xa6\xe7\x172\x00\x00\x00\x00IEND\xaeB`\x82'

        def getFileModifiedData(self):
            return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
\x00\x01\xe3IDATx\x9c\xa5\x93\xbdjTA\x14\x80\xbf\x99\xc9\xee\xb2\x12c\x14Q0D\
\x14\x1ba\xed\xd2\x08b\x91\xd6\xd6\xc2\'\xb0\xf3\x01\xc4\xda\x17\xb0\xf3%D+\
\x11\r"H@\xd0BC\x10d%\x85,"A\xa3\xac\xe1\xde;?\xe7\x1c\x8b\xdd\xec\xde\x08\
\xda\xe4\xc0p\xa6\x98\xf9\xce\xc793\xce\xcc\x8c#\xc4\x02\xc0\xab\xa5S\xac\
\xde\xbc\xc5\xee\xd5u\x9c9\x8a*E\xa1\x14Cd\xb2W5\x0ej\r^?\xe3\xdb\xcb\xa7\\\
\xab\xf7&\x80\xc53\xe7\xb8\xb8~\x83t\xf9:1))\x1a\x12\x05\xa2\xa1\xd9p@hU\xdd\
\xdcx\xc2\x95\xb3\x97\xe6\x06\x00\x1e\xe3\xe4\x8a\x91\xb3RJA\xc4\xe1=x\x1fp.\
\xe0\xbd\xc7{O\x08\x01\xf7h\x85\xbc\xb3{\x18\x00\x9e\x85\x9e@(t\x9d\x9b\x1d\
\xfe;\x87\x10\xf8\xe9\x1c\xaaq\x0e03Ld\x82iU\xfaW6QHy\x0ep"X\x8ex\xefq\xce\
\xfd\xf72\x80\xe5\x8c\xe5\xd6\x14L\x14\x9a4\x03\x1c\x84\xaa\xa2\xaa\xc8\xd4\
\xee\xc0\x96"hJm\x80\xe0wF,\xdf}\x00U\x83V5\x12#\x163\xda4h\x93\xb0\x98\xd04\
\xc9\xfd:R\x17i5Q\x05\x9a\xc8xc\x93\xe1\xe0<\x9dN\x07z@\xaf\x03K\x9dI\xe9/_\
\xc9[\x9f\xb8\xb0x\x02\xdf\xed\xa2\xed\x1e\x98\x08T\r\x14\xa1\xdc\xbbM\xf7\
\xddG:k\x03\x8e\xaf\xae\xcc\xd4\x7f<~\xc1\xc2\xdbmL\xa6\xfa\xa5Lg7\xed\x816\
\x11-\x85\xf1xL\xbas\x9f\xea\xcd{\xea\xba\x9e-\x91\xcc1<\xbe\x08\xa4L\xc2\
\xe6\x06\xaa\x82\xd45&B\xce\x13\xb5\x9c3UU\xcd\x0cD\x84e\x02N\x14Q=\x0c\xf0\
\xc5a1C\x11B\x08\xec=\x7fH\xaf\xd7\xc3Z\x00\'\xc2i\x02\xbf\xcd\xa80\n\xad16\
\xcd>\xdfG\x9f\xc9\xa5\xc2>l\xd1\xed\xf71 \xce\x9f)n8d\x97\x9a_&\xecc\x8c\
\xd8g\rpG\xfd\xce\x7f\x00\x84\xd8)\x90\xe6\x1ct\xb0\x00\x00\x00\x00IEND\xaeB\
`\x82'


    def OnFindFiles(event):
        d = drFindFilesDialog(DrFrame, -1, "Find Files")
        d.Show()


    DrFrame.FindFiles_fileloaded = False
    DrFrame.FindFiles_filter = False
    DrFrame.FindFiles_subdir = True
    DrFrame.FindFiles_filterfilemask = "cpp;h;py;pyw;txt;log"
    DrFrame.FindFiles_savesizeposition = 0
    DrFrame.FindFiles_lastentered = ''


    if os.path.exists(DrFrame.pluginspreferencesdirectory + "/FindFiles.preferences.dat"):
        f = file(DrFrame.pluginspreferencesdirectory + "/FindFiles.preferences.dat", 'r')
        text = f.read()
        f.close()
        DrFrame.FindFiles_savesizeposition= drPrefsFile.GetPrefFromText(DrFrame.FindFiles_savesizeposition, text, "findfiles.savesizeposition", True)


    ID_FINDFILES = DrFrame.GetNewId()


    DrFrame.Bind(wx.EVT_MENU, OnFindFiles, id = ID_FINDFILES)

    DrFrame.AddPluginShortcutFunction("FindFiles", "Find Files", OnFindFiles)
    DrFrame.AddPluginPopUpMenuFunction("FindFiles", "Find Files", OnFindFiles)

    DrFrame.LoadPluginShortcuts('FindFiles')
    DrFrame.searchmenu.AppendSeparator()
    DrFrame.searchmenu.Append(ID_FINDFILES, DrFrame.GetPluginMenuLabel('FindFiles', 'Find Files', 'Find Files'))


