CdbTable.hx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package hide.view;
  2. class CdbTable extends hide.ui.View<{}> {
  3. var tabContents : Array<Element>;
  4. var editor : hide.comp.cdb.Editor;
  5. var currentSheet : String;
  6. var tabCache : String;
  7. var tabs : hide.comp.Tabs;
  8. var view : cdb.DiffFile.ConfigView;
  9. public function new( ?state ) {
  10. super(state);
  11. editor = new hide.comp.cdb.Editor(config, {
  12. copy : () -> (ide.database.save() : Any),
  13. load : (v:Any) -> ide.database.load((v:String)),
  14. save : function() {
  15. ide.saveDatabase();
  16. haxe.Timer.delay(syncTabs,0);
  17. }
  18. }, this);
  19. undo = editor.undo;
  20. currentSheet = this.config.get("cdb.currentSheet");
  21. view = cast this.config.get("cdb.view");
  22. }
  23. public function goto( s : cdb.Sheet, line : Int, column : Int ) {
  24. var sheets = [for( s in getSheets() ) s.name];
  25. var index = sheets.indexOf(s.name);
  26. if( index < 0 ) return;
  27. tabs.currentTab = tabContents[index].parent();
  28. editor.setFilter(null);
  29. editor.cursor.setDefault(line, column);
  30. editor.focus();
  31. haxe.Timer.delay(() -> editor.cursor.update(), 1); // scroll
  32. }
  33. function syncTabs() {
  34. if( getTabCache() != tabCache || editor.getCurrentSheet() != currentSheet ) {
  35. currentSheet = editor.getCurrentSheet();
  36. rebuild();
  37. }
  38. }
  39. function getSheets() {
  40. return [for( s in ide.database.sheets ) if( !s.props.hide && (view == null || view.exists(s.name)) ) s];
  41. }
  42. function getTabCache() {
  43. return [for( s in getSheets() ) s.name].join("|");
  44. }
  45. override function onActivate() {
  46. if( editor != null ) editor.focus();
  47. }
  48. function setEditor(index:Int) {
  49. var sheets = getSheets();
  50. editor.pushCursorState();
  51. editor.show(sheets[index],tabContents[index]);
  52. currentSheet = editor.getCurrentSheet();
  53. ide.currentConfig.set("cdb.currentSheet", sheets[index].name);
  54. haxe.Timer.delay(editor.focus,1);
  55. }
  56. override function onDisplay() {
  57. var sheets = getSheets();
  58. if( sheets.length == 0 ) {
  59. element.html("No CDB sheet created, <a href='#'>create one</a>");
  60. element.find("a").click(function(_) {
  61. var sheet = ide.createDBSheet();
  62. if( sheet == null ) return;
  63. rebuild();
  64. });
  65. return;
  66. }
  67. element.addClass("cdb-view");
  68. element.toggleClass("cdb-diff", @:privateAccess ide.databaseDiff != null);
  69. tabs = new hide.comp.Tabs(element, true);
  70. tabCache = getTabCache();
  71. tabContents = [];
  72. for( sheet in sheets ) {
  73. var tab = tabs == null ? element : tabs.createTab(sheet.name);
  74. var sc = new hide.comp.Scrollable(tab);
  75. tabContents.push(sc.element);
  76. }
  77. if( tabs != null ) {
  78. tabs.onTabChange = setEditor;
  79. tabs.onTabRightClick = function(index) {
  80. editor.popupSheet(getSheets()[index], function() {
  81. var newSheets = getSheets();
  82. var delta = newSheets.length - sheets.length;
  83. var sshow = null;
  84. if( delta > 0 )
  85. sshow = newSheets[index+1];
  86. else if( delta < 0 )
  87. sshow = newSheets[index-1];
  88. else
  89. sshow = newSheets[index]; // rename
  90. if( sshow != null )
  91. currentSheet = sshow.name;
  92. if( getTabCache() != tabCache )
  93. rebuild();
  94. applyCategories(ide.projectConfig.dbCategories);
  95. });
  96. };
  97. }
  98. if( sheets.length > 0 ) {
  99. var idx = 0;
  100. for( i in 0...sheets.length )
  101. if( sheets[i].name == currentSheet ) {
  102. idx = i;
  103. break;
  104. }
  105. tabs.currentTab = tabContents[idx].parent();
  106. }
  107. applyCategories(ide.projectConfig.dbCategories);
  108. watch(@:privateAccess ide.databaseFile, () -> syncTabs());
  109. }
  110. public function applyCategories(cats: Array<String>) {
  111. var sheets = getSheets();
  112. var header = @:privateAccess tabs.header;
  113. for(i in 0...sheets.length) {
  114. var props = hide.comp.cdb.Editor.getSheetProps(sheets[i]);
  115. var show = cats == null || props.categories == null || cats.filter(c -> props.categories.indexOf(c) >= 0).length > 0;
  116. var tab = header.find('[index=$i]');
  117. tab.toggleClass("hidden", !show);
  118. tab.toggleClass("cat", props.categories != null);
  119. tab[0].className = ~/(cat-[^\s]+)/g.replace(tab[0].className, "");
  120. if(props.categories != null)
  121. for(c in props.categories)
  122. tab.addClass("cat-" + c);
  123. }
  124. editor.refresh();
  125. }
  126. override public function onDragDrop( items : Array<String>, isDrop : Bool ) {
  127. if( items.length == 0 )
  128. return false;
  129. var path = ide.makeRelative(items[0]);
  130. var cell = getCellFromMousePos(ide.mouseX, ide.mouseY);
  131. if( cell == null )
  132. return false;
  133. return cell.dragDropFile(path, isDrop);
  134. }
  135. public function getCellFromMousePos( x : Int, y : Int ) : Null<hide.comp.cdb.Cell> {
  136. var pickedEl = js.Browser.document.elementFromPoint(x, y);
  137. var el = pickedEl;
  138. while (el != null) {
  139. var cellRoot = new Element(el);
  140. var cell : hide.comp.cdb.Cell = cellRoot.prop("cellComp");
  141. if (cell != null) return cell;
  142. el = el.parentElement;
  143. }
  144. return null;
  145. }
  146. override function getTitle() {
  147. return "CDB"+ @:privateAccess (ide.databaseDiff != null ? " - "+ide.databaseDiff : "");
  148. }
  149. static var _ = hide.ui.View.register(CdbTable);
  150. }