def __init__(self,scr,title = "Svn Browse",filename="",path = ".",revision = ""): """ takes the curses window to pop up over, title to display, will dynamically size to parent window """ max_y,max_x = scr.getmaxyx() pw = (max_x - 4) lw = pw / 3 self.rw = pw - lw ph = (max_y - 5) / 2 cx = max_x / 2 y = 1 (dirpath, dirnames, filenames) = get_dir(path) self.dirpath = dirpath revisions = None diff = None self.filename = filename self.old_diff = "Normal Diff" fidx = 0 if self.filename in filenames: fidx = filenames.index(filename) + len(dirnames) revisions = get_revisions(os.path.join(self.dirpath,self.filename)) if revision: diff = get_diff( revision, os.path.join(self.dirpath,self.filename),False,self.rw-2) self.files = FileListBox("files",1,1,y,ph,lw,"Files",fidx,dirnames+filenames) y += ph self.revisions = StreamSelectComponent("revisions",2,1,y,lw,ph,"Revisions",revisions,r"^r[0-9]+ \|") y += ph self.diff = StreamSelectComponent("diff",3,lw+1,1,self.rw,ph*2,"Diff",diff) self.path = StaticText("path",cx - (pw/2), y,"Path: ", pw-6, "%s"%(os.path.join(self.dirpath,self.filename))) y += 1 self.revision = StaticText("revision",cx - (pw/2), y,"Revision: ", pw-10, revision ) y += 1 self.diffstyle = Toggle("diffstyle",4,2,y,15,0,["Normal Diff","Two Column Diff","Blame"]) dialog.Dialog.__init__(self,scr,"SvnBrowseDialog", max_y, max_x, [ dialog.Frame(title), self.files, self.revisions, self.diff, self.path, self.revision, self.diffstyle, dialog.Button("open",5,2+((max_x-4)/3),y,"OPEN",dialog.Component.CMP_KEY_OK), dialog.Button("cancel",6,2+(((max_x-4)/3)*2),y,"CANCEL",dialog.Component.CMP_KEY_CANCEL)])
class SvnBrowseDialog(dialog.Dialog): """ dialog subclass that implements a svn browse dialog with a list of files, a list of revisions, and a diff viewer window """ def __init__(self,scr,title = "Svn Browse",filename="",path = ".",revision = ""): """ takes the curses window to pop up over, title to display, will dynamically size to parent window """ max_y,max_x = scr.getmaxyx() pw = (max_x - 4) lw = pw / 3 self.rw = pw - lw ph = (max_y - 5) / 2 cx = max_x / 2 y = 1 (dirpath, dirnames, filenames) = get_dir(path) self.dirpath = dirpath revisions = None diff = None self.filename = filename self.old_diff = "Normal Diff" fidx = 0 if self.filename in filenames: fidx = filenames.index(filename) + len(dirnames) revisions = get_revisions(os.path.join(self.dirpath,self.filename)) if revision: diff = get_diff( revision, os.path.join(self.dirpath,self.filename),False,self.rw-2) self.files = FileListBox("files",1,1,y,ph,lw,"Files",fidx,dirnames+filenames) y += ph self.revisions = StreamSelectComponent("revisions",2,1,y,lw,ph,"Revisions",revisions,r"^r[0-9]+ \|") y += ph self.diff = StreamSelectComponent("diff",3,lw+1,1,self.rw,ph*2,"Diff",diff) self.path = StaticText("path",cx - (pw/2), y,"Path: ", pw-6, "%s"%(os.path.join(self.dirpath,self.filename))) y += 1 self.revision = StaticText("revision",cx - (pw/2), y,"Revision: ", pw-10, revision ) y += 1 self.diffstyle = Toggle("diffstyle",4,2,y,15,0,["Normal Diff","Two Column Diff","Blame"]) dialog.Dialog.__init__(self,scr,"SvnBrowseDialog", max_y, max_x, [ dialog.Frame(title), self.files, self.revisions, self.diff, self.path, self.revision, self.diffstyle, dialog.Button("open",5,2+((max_x-4)/3),y,"OPEN",dialog.Component.CMP_KEY_OK), dialog.Button("cancel",6,2+(((max_x-4)/3)*2),y,"CANCEL",dialog.Component.CMP_KEY_CANCEL)]) def handle(self,ch): """ handles found file selection, populating the preview window, new searches, and opening a file """ focus_index = self.current focus_field = self.focus_list[self.current][1] ret_ch = dialog.Dialog.handle(self,ch) if ch in [keytab.KEYTAB_SPACE,keytab.KEYTAB_CR]: if focus_field == self.files: (item,selection) = focus_field.getvalue() path = selection[item] if path.startswith("<DIR> "): (self.dirpath, dirnames, filenames) = get_dir(os.path.join(self.dirpath,path[6:])) self.path.setvalue(os.path.abspath(self.dirpath)) self.revision.setvalue("") focus_field.setvalue((0,dirnames+filenames)) else: self.filename = path self.revisions.setstream(get_revisions(os.path.join(self.dirpath,self.filename))) self.path.setvalue(os.path.abspath(os.path.join(self.dirpath,self.filename))) self.revision.setvalue("") self.diff.setstream(None) self.current = focus_index elif focus_field == self.revisions: fields = focus_field.getvalue().split("|") twocolumn = False (item, selection) = self.diffstyle.getvalue() if item == 1: twocolumn = True self.diff.setstream(get_diff(fields[0][1:].strip(),os.path.join(self.dirpath,self.filename),twocolumn,self.rw-2)) self.revision.setvalue(fields[0][1:].strip()) self.current = focus_index elif focus_field == self.diffstyle: if self.revision.getvalue() and self.diffstyle.getvalue() != self.old_diff: twocolumn = False (item, selection) = self.diffstyle.getvalue() if item == 1: twocolumn = True self.old_diff = self.diffstyle.getvalue() if item == 2: self.diff.setstream(get_file_blame(os.path.join(self.dirpath,self.filename))) else: self.diff.setstream(get_diff(self.revision.getvalue(),os.path.join(self.dirpath,self.filename),twocolumn,self.rw-2)) return ret_ch