diff --git a/twander.py b/twander.py index cd5186e..bd59b05 100755 --- a/twander.py +++ b/twander.py @@ -6,7 +6,7 @@ # Program Information PROGNAME = "twander" -RCSID = "$Id: twander.py,v 3.109 2003/02/27 00:49:39 tundra Exp $" +RCSID = "$Id: twander.py,v 3.110 2003/02/28 00:19:27 tundra Exp $" VERSION = RCSID.split()[2] # Copyright Information @@ -278,7 +278,7 @@ NONAVIGATE = FALSE # TRUE means that all directory navigation is prevented REFRESHINT = 3000 # Interval (ms) for automatic refresh QUOTECHAR = '\"' # Character to use when quoting Built-In Variables -SORTBYFIELD = 7 # Field to use as sort key +SORTBYFIELD = "Name" # Field to use as sort key SORTREVERSE = FALSE # Reverse specified sort order? SORTSEPARATE = TRUE # Separate Directories and Files in sorted displays? USETHREADS = TRUE # Use threads on Unix? @@ -307,16 +307,27 @@ fNONE = "None" fPERMISSIONS = "Permissions" -fLINKS = "Link Count" +fLINKS = "Links" fOWNER = "Owner" fGROUP = "Group" fLENGTH = "Length" -fDATE = "Date/Time" +fDATE = "Time" fNAME = "Name" -FieldNames = [fNONE, fPERMISSIONS, fLINKS, fOWNER, fGROUP, fLENGTH, fDATE, fNAME] -MAXSORTFIELD = len(FieldNames) +# Associate each legal field name with the corresponding sortkey field position +# Note that fNONE indicates that no sorting is to be done, so there +# is no real associated sortkey field. + +Name2Key = {} +index = -1 + +for x in [fNONE, fPERMISSIONS, fLINKS, fOWNER, fGROUP, fLENGTH, fDATE, fNAME]: + Name2Key[x.lower()] = index + index += 1 + +MAXSORTFIELD = len(Name2Key) + ##### # System-Related Defaults @@ -550,14 +561,14 @@ TTLFILES = "Total Files:" TTLSIZE = "Total Size:" -TTLSORTFLD = "Sort By" +TTLSORTFLD = "Sort By:" TTLSORTREV = "Rev:" TTLSORTSEP = "Sep:" # Convert Logical Values Into Yes/No String -YesOrNo = {True:"Yes", False:"No"} +YesOrNo = {True:"YES", False:"N0"} # Menu Button Titles @@ -613,6 +624,7 @@ wBADEXE = "Could Not Execute Command:\n\n%s" wBADRHS = "Ignoring Line %s.\nOption Assignment Has Bad Righthand Side:\n\n%s" wBADSCNUM = "Ignoring Line %s.\nShortcut Number Must Be From 1-12:\n\n%s" +wBADSORTFLD = "Don't Know How To Sort By: %s\n\nWill Sort By Name Instead." wCONFOPEN = "Cannot Open Configuration File:\n%s" wDIRSCREDEF = "Ignoring Line %s.\nDirectory Shortcut Defined More Than Once:\n\n%s" wDUPKEY = "Ignoring Line %s.\nFound Duplicate Command Key '%s':\n\n%s" @@ -1607,14 +1619,14 @@ # Sort Selection Keys - All Bound To A Common Handler ##### - self.DirList.bind(self.KeyBindings["SORTBY0"], lambda event : KeySetSortParm(parm=0)) - self.DirList.bind(self.KeyBindings["SORTBY1"], lambda event : KeySetSortParm(parm=1)) - self.DirList.bind(self.KeyBindings["SORTBY2"], lambda event : KeySetSortParm(parm=2)) - self.DirList.bind(self.KeyBindings["SORTBY3"], lambda event : KeySetSortParm(parm=3)) - self.DirList.bind(self.KeyBindings["SORTBY4"], lambda event : KeySetSortParm(parm=4)) - self.DirList.bind(self.KeyBindings["SORTBY5"], lambda event : KeySetSortParm(parm=5)) - self.DirList.bind(self.KeyBindings["SORTBY6"], lambda event : KeySetSortParm(parm=6)) - self.DirList.bind(self.KeyBindings["SORTBY7"], lambda event : KeySetSortParm(parm=7)) + self.DirList.bind(self.KeyBindings["SORTBY0"], lambda event : KeySetSortParm(parm=fNONE)) + self.DirList.bind(self.KeyBindings["SORTBY1"], lambda event : KeySetSortParm(parm=fPERMISSIONS)) + self.DirList.bind(self.KeyBindings["SORTBY2"], lambda event : KeySetSortParm(parm=fLINKS)) + self.DirList.bind(self.KeyBindings["SORTBY3"], lambda event : KeySetSortParm(parm=fOWNER)) + self.DirList.bind(self.KeyBindings["SORTBY4"], lambda event : KeySetSortParm(parm=fGROUP)) + self.DirList.bind(self.KeyBindings["SORTBY5"], lambda event : KeySetSortParm(parm=fLENGTH)) + self.DirList.bind(self.KeyBindings["SORTBY6"], lambda event : KeySetSortParm(parm=fDATE)) + self.DirList.bind(self.KeyBindings["SORTBY7"], lambda event : KeySetSortParm(parm=fNAME)) self.DirList.bind(self.KeyBindings["SORTREV"], lambda event : KeySetSortParm(parm=-1)) self.DirList.bind(self.KeyBindings["SORTSEP"], lambda event : KeySetSortParm(parm=-2)) @@ -1743,7 +1755,7 @@ mainwin.title("%s %s %s: %s %s %s %s %s %s %s %s %s %s %s" % (PROGNAME, VERSION, FULLNAME, UI.CurrentDir, TTLFILES, str(self.DirList.size()), TTLSIZE, FileLength(self.TotalSize), - TTLSORTFLD, FieldNames[SORTBYFIELD], TTLSORTREV, YesOrNo[SORTREVERSE], + TTLSORTFLD, SORTBYFIELD.upper(), TTLSORTREV, YesOrNo[SORTREVERSE], TTLSORTSEP, YesOrNo[SORTSEPARATE])) # End of method 'twanderUI.UpdateTitle()' @@ -2592,15 +2604,15 @@ def KeySetSortParm(parm): global SORTBYFIELD, SORTREVERSE, SORTSEPARATE - if (0 <= parm <= MAXSORTFIELD): - SORTBYFIELD = parm - - elif parm == -1: + if parm == -1: SORTREVERSE = not SORTREVERSE elif parm == -2: SORTSEPARATE = not SORTSEPARATE + else: + SORTBYFIELD = parm + LoadHelpMenu() RefreshDirList() @@ -2828,10 +2840,18 @@ ##### # Return Ordered List Of Directories & Files For Current Root +# Posts A Warning Message If SORTBYFIELD Is Out Of Range ##### def BuildDirList(currentdir): - global UI + global UI, SORTBYFIELD + + # Check to see if SORTBYFIELD makes sense + + if SORTBYFIELD.lower() not in Name2Key.keys(): + WrnMsg(wBADSORTFLD % SORTBYFIELD) + SORTBYFIELD = fNAME + LoadHelpMenu() UI.TotalSize = 0 @@ -2863,6 +2883,8 @@ # Get and sort directory contents filelist = os.listdir(currentdir) + keyindex = Name2Key[SORTBYFIELD.lower()] + for x in range(len(filelist)): # Get File/Dir name @@ -2877,8 +2899,8 @@ # the user expresses it as a 1-relative value. # Collapse case on Win32 when sorting by name - sortkey = fields[SORTBYFIELD-1] - if OSNAME == 'nt' and (FieldNames[SORTBYFIELD] == fNAME): + sortkey = fields[keyindex] + if OSNAME == 'nt' and (SORTBYFIELD.lower() == fNAME.lower()): sortkey = sortkey.lower @@ -2946,20 +2968,23 @@ fList.append(fileinfo[index][0]) + if UI.DetailsOn: + dotdot = [FileDetails(".." + PSEP, currentdir)[0],] + else: + dotdot = [".." + PSEP,] + + + # Return the results # Entry to move up one directory is always first, # no matter what the sort. This is necessary because # OSs like Win32 like to use '$' in file names which # sorts before "." - if UI.DetailsOn: - dList.insert(0, FileDetails(".." + PSEP, currentdir)[0]) - else: - dList.insert(0, ".." + PSEP) - - - # Return the results - return dList + fList + if SORTREVERSE: + return dotdot + fList + dList + else: + return dotdot + dList + fList # The user requested Drive List View. else: @@ -3808,12 +3833,13 @@ UI.OptionsNumeric = {"DEBUGLEVEL":DEBUGLEVEL, "FSZ":FSZ, "MFSZ":MFSZ, "HFSZ":HFSZ, "HEIGHT":HEIGHT, "MAXMENU":MAXMENU, "MAXMENUBUF":MAXMENUBUF, "MAXNESTING":MAXNESTING, - "REFRESHINT":REFRESHINT, "SORTBYFIELD":SORTBYFIELD, "STARTX":STARTX, "STARTY":STARTY, "WIDTH":WIDTH} + "REFRESHINT":REFRESHINT, "STARTX":STARTX, "STARTY":STARTY, "WIDTH":WIDTH} -UI.OptionsString = {"BCOLOR":BCOLOR, "FCOLOR":FCOLOR, "FNAME":FNAME, "FWT":FWT, # Main Font/Colors - "MBCOLOR":MBCOLOR, "MFCOLOR":MFCOLOR, "MFNAME":MFNAME, "MFWT":MFWT, # Menu Font/Colors - "HBCOLOR":HBCOLOR, "HFCOLOR":HFCOLOR, "HFNAME":HFNAME, "HFWT":HFWT, # Help Font/Colors - "MBARCOL":MBARCOL, "QUOTECHAR":QUOTECHAR, "STARTDIR":STARTDIR, "CMDSHELL":CMDSHELL} # Other +UI.OptionsString = {"BCOLOR":BCOLOR, "FCOLOR":FCOLOR, "FNAME":FNAME, "FWT":FWT, # Main Font/Colors + "MBCOLOR":MBCOLOR, "MFCOLOR":MFCOLOR, "MFNAME":MFNAME, "MFWT":MFWT, # Menu Font/Colors + "HBCOLOR":HBCOLOR, "HFCOLOR":HFCOLOR, "HFNAME":HFNAME, "HFWT":HFWT, # Help Font/Colors + "MBARCOL":MBARCOL, "QUOTECHAR":QUOTECHAR, "SORTBYFIELD":SORTBYFIELD, # Other + "STARTDIR":STARTDIR, "CMDSHELL":CMDSHELL} # Prepare storage for key bindings UI.KeyBindings = {}