File: Browser.py

package info (click to toggle)
spe 0.8.2a%2Brepack-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 4,812 kB
  • ctags: 6,555
  • sloc: python: 45,491; makefile: 146; sh: 2
file content (226 lines) | stat: -rwxr-xr-x 8,155 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#!/usr/bin/env python
# generated by wxGlade 0.3.2 on Mon Apr 12 02:14:33 2004

####(c)www.stani.be-------------------------------------------------------------

import _spe.info
INFO=_spe.info.copy()

INFO['description']=\
"""File browser as tab."""

__doc__=INFO['doc']%INFO

####wxGlade---------------------------------------------------------------------

CURRENT = "Current folder"

import wx
import _spe.help

class wxgPanel(wx.Panel):
    def __init__(self, *args, **kwds):
        # begin wxGlade: wxgPanel.__init__
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)
        self.split = wx.SplitterWindow(self, -1)
        self.sideBar = wx.Panel(self.split, -1)
        self.folderNew = wx.BitmapButton(self.sideBar, -1, wx.Bitmap("folder_new.png", wx.BITMAP_TYPE_ANY))
        self.folderDelete = wx.BitmapButton(self.sideBar, -1, wx.Bitmap("folder_delete.png", wx.BITMAP_TYPE_ANY))
        self.depthLabel = wx.StaticText(self.sideBar, -1, "Depth")
        self.depth = wx.SpinCtrl(self.sideBar, -1, "0", min=0, max=100)
        self.folderList = wx.ListBox(self.sideBar, -1, choices=["Current folder"])
        self.fileList = wx.ListCtrl(self.split, -1, style=wx.LC_LIST)

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: wxgPanel.__set_properties
        self.folderNew.SetSize((24, 24))
        self.folderDelete.SetSize((24, 24))
        self.folderList.SetSelection(0)
        self.split.SplitVertically(self.sideBar, self.fileList, 229)
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: wxgPanel.__do_layout
        main = wx.BoxSizer(wx.HORIZONTAL)
        sideBarSizer = wx.BoxSizer(wx.VERTICAL)
        controls = wx.BoxSizer(wx.HORIZONTAL)
        controls.Add(self.folderNew, 0, 0, 0)
        controls.Add(self.folderDelete, 0, 0, 0)
        controls.Add(self.depthLabel, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL, 10)
        controls.Add(self.depth, 1, wx.LEFT|wx.EXPAND, 4)
        sideBarSizer.Add(controls, 0, wx.EXPAND, 0)
        sideBarSizer.Add(self.folderList, 1, wx.EXPAND, 0)
        self.sideBar.SetAutoLayout(1)
        self.sideBar.SetSizer(sideBarSizer)
        sideBarSizer.Fit(self.sideBar)
        sideBarSizer.SetSizeHints(self.sideBar)
        main.Add(self.split, 1, wx.EXPAND, 0)
        self.SetAutoLayout(1)
        self.SetSizer(main)
        main.Fit(self)
        main.SetSizeHints(self)
        # end wxGlade

# end of class wxgPanel

####Custom----------------------------------------------------------------------

import os,types
import sm.osx, sm.scriptutils

##if sys.platform == 'win32':
##    wx.LC_LIST  = wx.LC_LIST|wx.LC_SMALL_ICON
##else:
##    wx.LC_LIST  = wx.LC_LIST

class Panel(wxgPanel):
    #---constructors
    def __init__(self, panel, *args, **kwds):
        """Arguments come from the parent frame."""
        wx.Bitmap           = panel.app.bitmap
        wx.LC_LIST          = panel.LIST_STYLE
        wxgPanel.__init__(self, parent=panel, id=-1)
        self.panel          = panel
        self.imageList      = wx.ImageList(16,16)
        self.pyIcon         = self.imageList.Add(wx.Bitmap('source_py.png'))
        self.fileList.SetImageList(self.imageList, wx.IMAGE_LIST_SMALL)
        self.split.SetMinimumPaneSize(1)
        self.SetDropTarget(DropAdd(self.add))
        self.SetHelpText(_spe.help.BROWSER)
        self.__events__()


    #---events
    def __events__(self):
        wx.EVT_BUTTON(self.folderNew,-1,self.onFolderNew)
        wx.EVT_BUTTON(self.folderDelete,-1,self.onFolderDelete)
        wx.EVT_LISTBOX(self.folderList,-1, self.onFolderSelect)
        wx.EVT_LIST_ITEM_SELECTED(self.fileList,-1,self.onFileSelect)
        wx.EVT_LIST_ITEM_RIGHT_CLICK(self.fileList,-1,self.onFileRightClick)
        wx.EVT_LIST_ITEM_MIDDLE_CLICK(self.fileList,-1,self.onFileMiddleClick)
        self.folderList.GetSelection()

    def onFileSelect(self,event):
        file=self.files[event.GetIndex()][1]
        self.panel.openList(file)

    def onFileRightClick(self,event):
        file=self.files[event.GetIndex()][1]
        sm.scriptutils.run(file)

    def onFileMiddleClick(self,event):
        file=self.files[event.GetIndex()][1]
        sm.scriptutils.importMod(file)

    def onFolderNew(self,event):
        """When add button clicked, add directory with browse dir dialog."""
        folder = self.folderList.GetStringSelection()
        if folder == 'Current folder':
            folder = self.getCurrentFolder()
        
        print "-----name : ", folder
        dlg = wx.DirDialog(self,defaultPath=folder )        
        if dlg.ShowModal() == wx.ID_OK:
            dir = dlg.GetPath()
            self.add(dir)
        dlg.Destroy()

    def onFolderDelete(self,event):
        """When remove button clicked, remove folder from listbox"""
        index = self.folderList.GetSelection()
        self.deleteFolder(index)

    def onFolderSelect(self,event):
        """Display a list of files when the user clicks a folder."""
        ## Todo: Figure out why this event gets called twice.
        # When SPE is launched the first time you click on any folder in the browser
        #  it generates two selection events.  However after that first click events
        #  get generated normally.

        self.panel.busyShow()
        recursion=self.depth.GetValue()
        folder=event.GetString()
        
        print "this is the value of folder here : ",folder
        if folder == 'Current folder':
            folder = self.getCurrentFolder()
            self.add(folder)

        if not os.path.exists(folder):
            index = event.GetInt()
            self.deleteFolder(index)

        self.setFileList(folder, recursion)

        self.panel.busyHide()

    #---methods
    #---New Methods added by Sam Widmer
    def deleteFolder(self, index):
        """Delete the folder listbox item @ index and clear the file listcontrol
        this method also will not delete the Current folder item"""
        if index > 0:
            self.folderList.Delete(index)
            self.setFileList('',0)

    def getCurrentFolder(self):
        """Returns the folder path that the 'Current folder' item references"""
        try:
            filename = self.panel.childActive.fileName
        except:
            filename = ''

        if filename in ('unnamed', ''):
            folder = os.getcwd()
        else:
            folder = os.path.dirname(self.panel.childActive.fileName)
        return folder

    def setFileList(self, folder, recursion):
        """Set self.files, clear and add files to the files listcontrol"""
        self.fileList.DeleteAllItems()
        self.files = []
        try:
            self.fileList.SetColumnWidth(-1,300)
        except:
            pass

        if os.path.exists(folder):
            flen = len(folder)+1
            if folder[-1] in ['\\','/']: flen -= 1
            self.files=[(file[flen:], file)
                        for file in sm.osx.listdirR(folder,recursion,['.py','.pyw'])]
            self.files.sort()
            for i, file in enumerate(self.files):
                self.fileList.InsertImageStringItem(i, file[0], self.pyIcon)
    # End of new methods

    def add(self,folders):
        """Add folders to the listbox."""
        if type(folders) not in [types.ListType,types.TupleType]:
            folders=[folders]
        already = self.getFolders()
        for folder in folders:
            if folder not in already:
                if os.path.exists(folder):
                    self.folderList.Append(folder)

    def getFolders(self):
        return [self.folderList.GetString(index) for index in range(self.folderList.GetCount())]

class DropAdd(wx.FileDropTarget):
    """Adds a file to browser when dropped on browser tab."""
    def __init__(self,add):
        wx.FileDropTarget.__init__(self)
        self.add=add
    def OnDropFiles(self,x,y,fileNames):
        fileNames=[dir for dir in fileNames if os.path.isdir(dir)]
        if fileNames:
            self.add(fileNames)
            return 1
        else: return 0