ProjectFrameOld.ts 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. import ScriptWidget = require("./ScriptWidget");
  2. import Editor = require("../editor/Editor");
  3. class ProjectFrame extends ScriptWidget {
  4. folderList: Atomic.UIListView;
  5. constructor(parent: Atomic.UIWidget) {
  6. super();
  7. this.load("AtomicEditor/editor/ui/projectframe.tb.txt");
  8. this.gravity = Atomic.UI_GRAVITY_TOP_BOTTOM;
  9. var projectviewcontainer = parent.getWidget("projectviewcontainer");
  10. projectviewcontainer.addChild(this);
  11. var foldercontainer = this.getWidget("foldercontainer");
  12. var folderList = this.folderList = new Atomic.UIListView();
  13. folderList.rootList.id = "folderList_";
  14. foldercontainer.addChild(folderList);
  15. // events
  16. this.subscribeToEvent("ProjectLoaded", (data) => this.handleProjectLoaded(data));
  17. }
  18. handleProjectLoaded(data) {
  19. this.refresh();
  20. }
  21. handleWidgetEvent(data): boolean {
  22. if (data.type == Atomic.UI_EVENT_TYPE_CLICK) {
  23. var fs = Atomic.getFileSystem();
  24. if (data.target && data.target.id.length) {
  25. var id = data.target.id;
  26. if (id == "folderList_") {
  27. var list = <Atomic.UISelectList> data.target;
  28. var selectedId = list.selectedItemID;
  29. if (fs.dirExists(selectedId)) {
  30. this.selectCurrentContentFolder(selectedId);
  31. }
  32. return true;
  33. }
  34. if (id == "..") {
  35. var parentPath = Atomic.getParentPath(this.currentContentFolder);
  36. this.selectCurrentContentFolder(parentPath);
  37. return true;
  38. }
  39. if (fs.dirExists(id)) {
  40. this.selectCurrentContentFolder(id);
  41. return true;
  42. }
  43. if (fs.fileExists(id)) {
  44. this.sendEvent("EditResource", { "path": id });
  45. return true;
  46. }
  47. }
  48. }
  49. return false;
  50. }
  51. refresh() {
  52. var cfolder = this.currentContentFolder;
  53. this.currentContentFolder = "";
  54. this.refreshFolders();
  55. }
  56. private refreshContent(fullpath: string) {
  57. var system = ToolCore.getToolSystem();
  58. var project = system.project;
  59. this.currentContentFolder = fullpath;
  60. var folders = new Array<string>();
  61. var content = new Array<string>();
  62. this.scanContentDirForContent(folders, content, fullpath);
  63. var container: Atomic.UILayout = <Atomic.UILayout> this.getWidget("contentcontainer");
  64. container.deleteAllChildren();
  65. if (fullpath != project.resourcePath) {
  66. var lp = new Atomic.UILayoutParams();
  67. lp.height = 20;
  68. var fd = new Atomic.UIFontDescription();
  69. fd.id = "Vera";
  70. fd.size = 11;
  71. var button = new Atomic.UIButton();
  72. button.gravity = Atomic.UI_GRAVITY_LEFT;
  73. button.text = ".. ";
  74. button.id = "..";
  75. button.skinBg = "TBButton.flat";
  76. button.layoutParams = lp;
  77. button.fontDescription = fd;
  78. container.addChild(button);
  79. }
  80. for (var folder of folders) {
  81. var contentID = Atomic.addTrailingSlash(fullpath + folder);
  82. container.addChild(this.createButtonLayout(contentID, folder));
  83. }
  84. for (var c of content) {
  85. var contentID = Atomic.addTrailingSlash(fullpath) + c;
  86. container.addChild(this.createButtonLayout(contentID, c));
  87. }
  88. }
  89. private recursiveAddFolder(parentItemID: number, fullpath: string, folderName: string) {
  90. var folderList = this.folderList;
  91. var childItemID = folderList.addChildItem(parentItemID, folderName, "Folder.icon", fullpath);
  92. var dirs = new Array<string>();
  93. this.scanDirForFolders(dirs, fullpath);
  94. for (var folder of dirs) {
  95. this.recursiveAddFolder(childItemID, fullpath + folder + "/", folder);
  96. }
  97. }
  98. private refreshFolders() {
  99. var system = ToolCore.getToolSystem();
  100. var project = system.project;
  101. var folderList = this.folderList;
  102. folderList.deleteAllItems();
  103. var resourcesID = folderList.addRootItem("Resources", "Folder.icon", project.resourcePath);
  104. var dirs = new Array<string>();
  105. this.scanDirForFolders(dirs, project.resourcePath);
  106. for (var folder of dirs) {
  107. this.recursiveAddFolder(resourcesID, project.resourcePath + folder + "/", folder);
  108. }
  109. folderList.setExpanded(resourcesID, true);
  110. this.refreshContent(project.resourcePath);
  111. folderList.rootList.value = 0;
  112. }
  113. private selectCurrentContentFolder(folder: string) {
  114. this.folderList.selectItemByID(folder);
  115. if (this.currentContentFolder != folder)
  116. this.refreshContent(folder);
  117. }
  118. private endsWith(str: string, suffix: string): boolean {
  119. return str && str.indexOf(suffix, str.length - suffix.length) !== -1;
  120. }
  121. private scanDirForFolders(dirs: Array<string>, fullpath: string) {
  122. var fileSystem = Atomic.getFileSystem();
  123. dirs.length = 0;
  124. var folders = fileSystem.scanDir(fullpath, "", Atomic.SCAN_DIRS, false);
  125. for (var folder of folders) {
  126. if (folder == "." || folder == ".." || this.endsWith(folder, "/..") || this.endsWith(folder, "/."))
  127. continue;
  128. dirs.push(folder);
  129. }
  130. }
  131. private scanContentDirForContent(folders: Array<string>, content: Array<string>, fullPath: string) {
  132. var fileSystem = Atomic.getFileSystem();
  133. folders.length = content.length = 0;
  134. var _folders = fileSystem.scanDir(fullPath, "", Atomic.SCAN_DIRS, false);
  135. for (var folder of _folders) {
  136. if (folder == "." || folder == ".." || this.endsWith(folder, "/..") || this.endsWith(folder, "/."))
  137. continue;
  138. folders.push(folder);
  139. }
  140. var _content = fileSystem.scanDir(fullPath, "", Atomic.SCAN_FILES, false);
  141. for (var c of _content) {
  142. content.push(c);
  143. }
  144. }
  145. private createButtonLayout(fullpath: string, text: string): Atomic.UILayout {
  146. var system = ToolCore.getToolSystem();
  147. var project = system.project;
  148. var fs = Atomic.getFileSystem();
  149. var pathinfo = Atomic.splitPath(fullpath);
  150. var bitmapID = "Folder.icon";
  151. if (fs.fileExists(fullpath)) {
  152. bitmapID = "FileBitmap";
  153. }
  154. if (pathinfo.ext == ".js") {
  155. if (project.isComponentsDirOrFile(fullpath)) {
  156. bitmapID = "ComponentBitmap";
  157. }
  158. else {
  159. bitmapID = "JavascriptBitmap";
  160. }
  161. }
  162. var blayout = new Atomic.UILayout();
  163. blayout.gravity = Atomic.UI_GRAVITY_LEFT;
  164. var spacer = new Atomic.UIWidget();
  165. spacer.rect = [0, 0, 8, 8];
  166. blayout.addChild(spacer);
  167. var button = new Atomic.UIButton();
  168. var lp = new Atomic.UILayoutParams;
  169. lp.height = 20;
  170. var fd = new Atomic.UIFontDescription();
  171. fd.id = "Vera";
  172. fd.size = 11;
  173. button.gravity = Atomic.UI_GRAVITY_LEFT;
  174. var image = new Atomic.UISkinImage(bitmapID);
  175. image.rect = [0, 0, 12, 12];
  176. image.gravity = Atomic.UI_GRAVITY_RIGHT;
  177. blayout.addChild(image);
  178. button.id = fullpath;
  179. button.layoutParams = lp;
  180. button.fontDescription = fd;
  181. button.text = text;
  182. button.skinBg = "TBButton.flat";
  183. blayout.addChild(button);
  184. return blayout;
  185. }
  186. private currentContentFolder: string;
  187. }
  188. export = ProjectFrame;