WMFileManager.Mod 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. MODULE WMFileManager; (** AUTHOR "ug"; PURPOSE "file manager"; *)
  2. IMPORT Files, Modules, WMGraphics, WMProperties,
  3. WMEditors, WMSystemComponents, WMComponents, WMStandardComponents, WMMessages, WMRestorable, Strings,
  4. WM := WMWindowManager;
  5. CONST
  6. WindowWidth = 500; WindowHeight = 400; FileNameLength = Files.NameLength;
  7. TYPE
  8. KillerMsg = OBJECT
  9. END KillerMsg;
  10. FileListPanel* = OBJECT (WMComponents.VisualComponent)
  11. VAR pathProp*, filterProp : WMProperties.StringProperty;
  12. filterEdit : WMEditors.Editor;
  13. list* : WMSystemComponents.FileList;
  14. PROCEDURE &Init*;
  15. BEGIN
  16. Init^;
  17. SetNameAsString(StrFileListPanel);
  18. (* new properties *)
  19. NEW(pathProp, FileListPathProt, NIL, NIL); properties.Add(pathProp);
  20. NEW(filterProp, FileListFilterProt, NIL, NIL); properties.Add(filterProp);
  21. NEW(filterEdit); filterEdit.alignment.Set(WMComponents.AlignTop);
  22. filterEdit.bounds.SetHeight(25); AddContent(filterEdit);
  23. filterEdit.text.onTextChanged.Add(TextChanged);
  24. filterEdit.multiLine.Set(FALSE);
  25. filterEdit.tv.showBorder.Set(TRUE);
  26. filterEdit.tv.textAlignV.Set(WMGraphics.AlignCenter);
  27. NEW(list);
  28. list.alignment.Set(WMComponents.AlignClient);
  29. AddContent(list)
  30. END Init;
  31. PROCEDURE TextChanged(sender, data : ANY);
  32. VAR str : ARRAY FileNameLength (* was 128*) OF CHAR;
  33. BEGIN
  34. filterEdit.GetAsString(str);
  35. filterProp.Set(Strings.NewString(str))
  36. END TextChanged;
  37. PROCEDURE PropertyChanged*(sender, data : ANY);
  38. BEGIN
  39. IF data = pathProp THEN
  40. list.StartNewPath(pathProp.Get())
  41. ELSIF (data = filterProp) THEN
  42. list.StartNewFilter(filterProp.Get())
  43. ELSE PropertyChanged^(sender, data)
  44. END
  45. END PropertyChanged;
  46. END FileListPanel;
  47. Window* = OBJECT (WMComponents.FormWindow)
  48. VAR label: WMStandardComponents.Label;
  49. tree : WMSystemComponents.DirectoryTree;
  50. flistPanel : FileListPanel;
  51. vol, cap, free, files : WMStandardComponents.Label;
  52. PROCEDURE CreateForm(): WMComponents.VisualComponent;
  53. VAR
  54. sidePanel, panel, status : WMStandardComponents.Panel;
  55. toolbar: WMStandardComponents.Panel;
  56. button : WMStandardComponents.Button;
  57. resizerH : WMStandardComponents.Resizer;
  58. BEGIN
  59. NEW(panel); panel.alignment.Set(WMComponents.AlignClient); panel.fillColor.Set(LONGINT(0FFFFFFFFH)); panel.takesFocus.Set(TRUE);
  60. NEW(toolbar); toolbar.fillColor.Set(LONGINT(0FFFFFFFFH)); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  61. panel.AddContent(toolbar);
  62. NEW(button); button.alignment.Set(WMComponents.AlignLeft); button.caption.SetAOC("Refresh FileSystems");
  63. toolbar.AddContent(button); button.bounds.SetWidth(150); button.onClick.Add(RefreshHandler);
  64. NEW(button); button.alignment.Set(WMComponents.AlignLeft); button.caption.SetAOC("Toggle Properties");
  65. toolbar.AddContent(button); button.bounds.SetWidth(150); button.onClick.Add(TogglePropsHandler);
  66. NEW(status); status.alignment.Set(WMComponents.AlignBottom); status.bounds.SetHeight(20);
  67. panel.AddContent(status); status.fillColor.Set(LONGINT(0CCCCCCFFH));
  68. NEW(label); label.bounds.SetWidth(100); label.caption.SetAOC(" Volume: "); label.alignment.Set(WMComponents.AlignLeft);
  69. status.AddContent(label);
  70. NEW(vol); vol.bounds.SetWidth(100); vol.caption.SetAOC("-"); vol.alignment.Set(WMComponents.AlignLeft);
  71. status.AddContent(vol);
  72. NEW(label); label.bounds.SetWidth(100); label.caption.SetAOC(" Size: "); label.alignment.Set(WMComponents.AlignLeft);
  73. status.AddContent(label);
  74. NEW(cap); cap.bounds.SetWidth(100); cap.caption.SetAOC("-"); cap.alignment.Set(WMComponents.AlignLeft);
  75. status.AddContent(cap);
  76. NEW(label); label.bounds.SetWidth(100); label.caption.SetAOC(" Free: "); label.alignment.Set(WMComponents.AlignLeft);
  77. status.AddContent(label);
  78. NEW(free); free.bounds.SetWidth(100); free.caption.SetAOC("-"); free.alignment.Set(WMComponents.AlignLeft);
  79. status.AddContent(free);
  80. NEW(label); label.bounds.SetWidth(100); label.caption.SetAOC(" Files: "); label.alignment.Set(WMComponents.AlignLeft);
  81. status.AddContent(label);
  82. NEW(files); files.bounds.SetWidth(100); files.caption.SetAOC("-"); files.alignment.Set(WMComponents.AlignLeft);
  83. status.AddContent(files);
  84. NEW(sidePanel); sidePanel.alignment.Set(WMComponents.AlignLeft); sidePanel.bounds.SetWidth(200);
  85. NEW(resizerH); resizerH.alignment.Set(WMComponents.AlignRight); resizerH.bounds.SetWidth(4);
  86. sidePanel.AddContent(resizerH);
  87. NEW(tree); tree.alignment.Set(WMComponents.AlignClient);
  88. sidePanel.AddContent(tree);
  89. panel.AddContent(sidePanel);
  90. NEW(flistPanel); flistPanel.alignment.Set(WMComponents.AlignClient);
  91. panel.AddContent(flistPanel);
  92. RETURN panel
  93. END CreateForm;
  94. PROCEDURE &New*(c : WMRestorable.Context);
  95. VAR vc : WMComponents.VisualComponent; s : Strings.String;
  96. BEGIN
  97. IncCount;
  98. vc := CreateForm();
  99. tree.onPathChanged.Add(PathChanged);
  100. IF (c # NIL) THEN
  101. Init(c.r - c.l, c.b - c.t, FALSE);
  102. ELSE
  103. Init(WindowWidth, WindowHeight, FALSE);
  104. END;
  105. SetContent(vc);
  106. SetTitle(Strings.NewString("File Manager"));
  107. SetIcon(WMGraphics.LoadImage("WMIcons.tar://WMFileManager.png", TRUE));
  108. IF c # NIL THEN
  109. (* restore the desktop *)
  110. WMRestorable.AddByContext(SELF, c);
  111. ELSE
  112. WM.DefaultAddWindow(SELF);
  113. END;
  114. s := tree.currentPath.Get();
  115. END New;
  116. PROCEDURE PathChanged(sender, data : ANY);
  117. BEGIN
  118. flistPanel.pathProp.Set(tree.currentPath.Get());
  119. UpdateStatus(tree.currentPath.Get());
  120. END PathChanged;
  121. PROCEDURE UpdateStatus(alias : Strings.String);
  122. VAR sfree, total, nfiles, i: LONGINT; fs: Files.FileSystem; ft: Files.FileSystemTable;
  123. temp : ARRAY 32 OF CHAR;
  124. BEGIN
  125. Files.GetList(ft);
  126. IF ft # NIL THEN
  127. FOR i := 0 TO LEN(ft)-1 DO
  128. fs := ft[i];
  129. COPY(fs.prefix, temp);
  130. Strings.Append(temp, ":");
  131. IF (alias^ = temp) THEN
  132. IF fs.vol # NIL THEN
  133. vol.caption.SetAOC(alias^);
  134. sfree := ENTIER(fs.vol.Available()/1024.0D0 * fs.vol.blockSize);
  135. total := ENTIER(fs.vol.size/1024.0D0 * fs.vol.blockSize);
  136. Strings.IntToStr(total, temp); Strings.Append(temp, " KB");
  137. cap.caption.SetAOC(temp);
  138. Strings.IntToStr(sfree, temp); Strings.Append(temp, " KB");
  139. free.caption.SetAOC(temp);
  140. nfiles := flistPanel.list.GetNofFiles();
  141. Strings.IntToStr(nfiles, temp);
  142. files.caption.SetAOC(temp);
  143. END;
  144. END;
  145. END
  146. END;
  147. END UpdateStatus;
  148. PROCEDURE Close;
  149. BEGIN
  150. Close^;
  151. DecCount;
  152. END Close;
  153. PROCEDURE RefreshHandler(sender, data: ANY);
  154. BEGIN
  155. tree.Refresh;
  156. END RefreshHandler;
  157. PROCEDURE TogglePropsHandler(sender, data: ANY);
  158. BEGIN
  159. flistPanel.list.ToggleProps;
  160. END TogglePropsHandler;
  161. PROCEDURE Handle(VAR x: WMMessages.Message);
  162. BEGIN
  163. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN Close
  164. ELSIF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS WMRestorable.Storage) THEN
  165. x.ext(WMRestorable.Storage).Add("FileManager", "WMFileManager.Restore", SELF, NIL)
  166. ELSE Handle^(x)
  167. END
  168. END Handle;
  169. END Window;
  170. VAR
  171. nofWindows : LONGINT;
  172. FileListPathProt : WMProperties.StringProperty;
  173. FileListFilterProt : WMProperties.StringProperty;
  174. StrFileListPanel : Strings.String;
  175. PROCEDURE Open*;
  176. VAR win : Window;
  177. BEGIN
  178. NEW(win, NIL);
  179. END Open;
  180. PROCEDURE Restore*(context : WMRestorable.Context);
  181. VAR win : Window;
  182. BEGIN
  183. NEW(win, context)
  184. END Restore;
  185. PROCEDURE InitStrings;
  186. BEGIN
  187. StrFileListPanel := Strings.NewString("FileListPanel");
  188. END InitStrings;
  189. PROCEDURE InitPrototypes;
  190. BEGIN
  191. NEW(FileListPathProt, NIL, Strings.NewString("Path"), Strings.NewString("contains the displayed path"));
  192. NEW(FileListFilterProt, NIL, Strings.NewString("Filter"), Strings.NewString("display filename filter"));
  193. END InitPrototypes;
  194. PROCEDURE IncCount;
  195. BEGIN {EXCLUSIVE}
  196. INC(nofWindows);
  197. END IncCount;
  198. PROCEDURE DecCount;
  199. BEGIN {EXCLUSIVE}
  200. DEC(nofWindows);
  201. END DecCount;
  202. PROCEDURE Cleanup;
  203. VAR die : KillerMsg;
  204. msg : WMMessages.Message;
  205. m : WM.WindowManager;
  206. BEGIN {EXCLUSIVE}
  207. NEW(die);
  208. msg.ext := die;
  209. msg.msgType := WMMessages.MsgExt;
  210. m := WM.GetDefaultManager();
  211. m.Broadcast(msg);
  212. AWAIT(nofWindows = 0)
  213. END Cleanup;
  214. BEGIN
  215. InitStrings;
  216. InitPrototypes;
  217. Modules.InstallTermHandler(Cleanup);
  218. END WMFileManager.
  219. SystemTools.Free WMFileManager WMSystemComponents ~
  220. WMFileManager.Open ~