浏览代码

Files sort

Arthur Yefimov 4 年之前
父节点
当前提交
e3bc3c122b
共有 2 个文件被更改,包括 38 次插入2 次删除
  1. 14 2
      src/Editor.Mod
  2. 24 0
      src/StrList.Mod

+ 14 - 2
src/Editor.Mod

@@ -90,6 +90,16 @@ BEGIN C := c(OV.ColumnList); w := C.parent(FileDialog);
   OV.EditSetCaption(w.edtFilename, s)
 END FileDialogListChange;
 
+PROCEDURE FileNamesCmp(IN a, b: ARRAY OF CHAR): INTEGER;
+VAR r, i: INTEGER;
+BEGIN
+  IF (a[0] = '[') & (b[0] # '[') OR (a = '[..]') THEN r := -1
+  ELSIF (a[0] # '[') & (b[0] = '[') OR (b = '[..]') THEN r := 1
+  ELSE
+    IF a < b THEN i := -1 ELSIF a = b THEN i := 0 ELSE i := 1 END
+  END ;
+RETURN r END FileNamesCmp;
+
 PROCEDURE FileDialogUpdateFileList*(c: FileDialog);
 VAR L: StrList.List;
   r: Dir.Rec;
@@ -98,13 +108,15 @@ BEGIN L := c.colFiles.items;
   StrList.Clear(L);
   Dir.First(r, c.path);
   WHILE ~r.eod DO
-    IF r.isDir THEN s := r.name$;
+    IF ~r.isDir THEN StrList.Append(L, r.name)
+    ELSIF r.name # '.' THEN
+      s := r.name$;
       Strings.Insert('[', 0, s); Strings.Append(']', s);
       StrList.Append(L, s)
-    ELSE StrList.Append(L, r.name)
     END;
     Dir.Next(r)
   END;
+  StrList.Sort(L, FileNamesCmp)
 END FileDialogUpdateFileList;
 
 PROCEDURE InitFileDialog*(c: FileDialog; type: INTEGER);

+ 24 - 0
src/StrList.Mod

@@ -1,4 +1,5 @@
 MODULE StrList;
+IMPORT Out;
 
 TYPE
   Item = POINTER TO ItemDesc;
@@ -14,6 +15,8 @@ TYPE
     count: INTEGER
   END;
 
+  CmpProc* = PROCEDURE (a, b: ARRAY OF CHAR): INTEGER;
+
 PROCEDURE Clear*(L: List);
 BEGIN L.first := NIL; L.last := NIL; L.cur := NIL;
   L.count := 0; L.eol := FALSE
@@ -62,4 +65,25 @@ BEGIN p := L.first;
   L.cur := p
 END SetPos;
 
+PROCEDURE Sort*(L: List; cmp: CmpProc);
+VAR next, first, last, p, t: Item;
+BEGIN NEW(first); first.next := NIL;
+  p := L.first;
+  WHILE p # NIL DO (* Loop body works with p.next *)
+    next := p.next;
+    Out.String(p.s);Out.Ln;
+
+    (* Find place for item q in list [first] *)
+    t := first;
+    WHILE (t.next # NIL) & (cmp(t.next.s, p.s) < 0) DO t := t.next END;
+    (* Insert q before t.next *)
+    p.next := t.next; t.next := p;
+
+    p := next
+  END;
+
+  IF first.next = NIL THEN last := NIL ELSE last := p END;
+  L.first := first.next; L.last := last; L.cur := NIL; L.eol := FALSE
+END Sort;
+
 END StrList.