[a37b2b]: plugins / workspace.py Maximize Restore History

Download this file

workspace.py    148 lines (119 with data), 5.4 kB

  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
'''
This software is licensed under the GPL (GNU General Public License) version 2
as it appears here: http://www.gnu.org/copyleft/gpl.html
It is also included with this archive as `gpl.txt <gpl.txt>`_.
'''
#system imports
import os
#site-packages imports
import wx
#local imports
import filehistory
#Why should I use an object when a closure works just as well?
#God this is such a hack, but it makes me smile.
def WorkspaceMenu(parentmenu, parentwindow, workspaces, workspace_order):
def OnCloseAll(event):
self = parentwindow
sel = self.control.GetSelection()
cnt = self.control.GetPageCount()
try:
for i in xrange(cnt):
win = self.control.GetPage(i).GetWindow1()
#Yeah, I know that using a function that is placed in the
#module's namespace AFTER import is bad form, but I do it
#anyways.
if isdirty(win):
self.control.SetSelection(i)
self.sharedsave(win)
except cancelled:
event.Skip()
return
self.starting = 1
for i in xrange(cnt-1, -1, -1):
self.OnClose(None, i, self.control.GetPage(i).GetWindow1())
self.starting = 0
def OnSave(event):
#check for dirty and unnamed files...
self = parentwindow
sel = self.control.GetSelection()
cnt = self.control.GetPageCount()
d = 0
l = []
for i in xrange(cnt):
win = self.control.GetPage(i).GetWindow1()
data = os.path.join(win.dirname, win.filename).encode('ascii')
d += win.dirty and data == ' '
if data != ' ':
l.append(data)
if d:
self.dialog("Cannot save workspace with\nmodified untitled documents.", "Workspace Save Aborted!")
return
#get the name of the workspace
while 1:
dlg = wx.TextEntryDialog(parentwindow, "What would you like this workspace to be called?", "Workspace name", pos=(0,0))
if openmenu.last:
dlg.SetValue(openmenu.last)
rslt = dlg.ShowModal()
workspacename = dlg.GetValue()
dlg.Destroy()
if rslt != wx.ID_OK:
self.SetStatusText("Workspace save cancelled")
return
wn = workspacename.strip()
#check for usable name
if not wn:
self.SetStatusText("Workspace save cancelled")
return
#check for unused name
if wn.lower() in [i.lower() for i in workspace_order]:
if self.dialog("Are you sure you want to replace\nthe pre-existing workspace:\n%s"%wn.lower(), "Duplicate Workspace", wx.YES_NO) != wx.ID_YES:
continue
break
#remove potential duplicates
workspace_order[:] = [i for i in workspace_order if i.lower() != wn.lower() or openmenu.ItemRemove(i) or deletemenu.ItemRemove(i)]
x = dict(workspaces)
workspaces.clear()
for i in workspace_order:
workspaces[i] = x[i]
#handle workspace ordering
workspace_order.insert(0, wn)
workspaces[wn] = l
openmenu.ItemAdd(wn)
deletemenu.ItemAdd(wn)
def OnOpen(label):
## print "opening workspace"
#handle ordering of workspaces
if label in workspace_order:
workspace_order.remove(label)
workspace_order.insert(0, label)
#fetch the workspace
ws = workspaces.get(label, [])
#open all documents in the workspace
parentwindow.OnDrop(ws)
def OnDelete(label):
## print "deleting workspace..."
#delete the workspace and fix workspace order
if label in workspace_order:
workspace_order.remove(label)
workspaces.pop(label, None)
#code that actually modifies the menu
if 1:
closeall = wx.NewId()
parentmenu.Append(closeall, "Close All Documents",
"Closes all open documents, asking to save changes on modified files")
wx.EVT_MENU(parentwindow, closeall, OnCloseAll)
parentmenu.AppendSeparator()
nwksid = wx.NewId()
parentmenu.Append(nwksid, "Save Workspace",
"Saves the current workspace, aborts if modified and unnamed files are open")
wx.EVT_MENU(parentwindow, nwksid, OnSave)
openmenu = filehistory.FileHistory(parentwindow, callback=[OnOpen], seq=workspace_order)
deletemenu = filehistory.FileHistory(parentwindow, remove=1,
callback=[openmenu.ItemRemove, OnDelete],
seq=workspace_order,
delmsg=("Are you sure you want to delete the workspace:\n%s",
"Delete Workspace?"))
openmenu.callback.append(deletemenu.ItemAdd)
parentmenu.AppendMenu(wx.NewId(), "Open Workspace", openmenu)
parentmenu.AppendMenu(wx.NewId(), "Delete Workspace", deletemenu)
parentmenu.AppendSeparator()