SubTable.hx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package hide.comp.cdb;
  2. class SubTable extends Table {
  3. var insertedTR : Element;
  4. var slider : Element;
  5. public var cell : Cell;
  6. public function new(editor, cell:Cell) {
  7. this.editor = editor;
  8. this.cell = cell;
  9. parent = cell.table;
  10. var sheet = makeSubSheet();
  11. var line = cell.line;
  12. if( line.subTable != null ) throw "assert";
  13. line.subTable = this;
  14. var mode : Table.DisplayMode = switch( cell.column.type ) {
  15. case TProperties: Properties;
  16. default: Table;
  17. };
  18. insertedTR = new Element("<tr>").addClass(cell.column.type == TProperties ? "props" : "list");
  19. var group;
  20. if( editor.displayMode == AllProperties && cell.table.parent == null ) {
  21. group = new Element("<td>").attr("colspan","2").appendTo(insertedTR);
  22. } else if( mode == Properties ) {
  23. var count = cell.columnIndex + 1;
  24. if (count < 3 && cell.table.columns.length >= 8)
  25. count += 2; // fix when a lot of columns but the subproperty is on the left
  26. group = new Element("<td>").attr("colspan",""+(count+1)).appendTo(insertedTR);
  27. var remain = cell.table.columns.length - count;
  28. if( remain > 0 )
  29. new Element("<td>").attr("colspan", "" + remain).appendTo(insertedTR);
  30. } else {
  31. new Element("<td>").appendTo(insertedTR);
  32. group = new Element("<td>").attr("colspan",""+cell.table.columns.length).appendTo(insertedTR);
  33. }
  34. slider = new Element("<div>").appendTo(group);
  35. slider.hide();
  36. var root = new Element("<table>");
  37. root.appendTo(slider);
  38. root.addClass("cdb-sub-sheet");
  39. insertedTR.insertAfter(cell.line.element);
  40. cell.element.text("...");
  41. cell.element.addClass("parent-sub-table");
  42. super(editor, sheet, root, mode);
  43. }
  44. override function getRealSheet() {
  45. return cell.table.sheet.getSub(cell.column);
  46. }
  47. function makeSubSheet() {
  48. var sheet = cell.table.sheet;
  49. var c = cell.column;
  50. var index = cell.line.index;
  51. var key = sheet.getPath() + "@" + c.name + ":" + index;
  52. var psheet = sheet.getSub(c);
  53. var lines = switch( cell.column.type ) {
  54. case TList:
  55. var value = cell.value;
  56. if( value == null ) {
  57. value = [];
  58. Reflect.setField(cell.line.obj, cell.column.name, value);
  59. // do not save for now
  60. }
  61. value;
  62. case TProperties:
  63. var value = cell.value;
  64. if( value == null ) {
  65. value = {};
  66. Reflect.setField(cell.line.obj, cell.column.name, value);
  67. // do not save for now
  68. }
  69. var lines = [for( f in psheet.columns ) value];
  70. if( lines.length == 0 ) lines.push(value);
  71. lines;
  72. default:
  73. throw "assert";
  74. }
  75. return new cdb.Sheet(editor.base,{
  76. columns : psheet.columns, // SHARE
  77. props : psheet.props, // SHARE
  78. name : psheet.name, // same
  79. lines : lines, // ref
  80. separators : [], // none
  81. },key, { sheet : sheet, column : cell.table.sheet.columns.indexOf(c), line : index });
  82. }
  83. public function show( ?immediate ) {
  84. if( immediate )
  85. slider.show();
  86. else
  87. slider.slideDown(100);
  88. }
  89. override public function close() {
  90. if( cell.line.subTable == this ) cell.line.subTable = null;
  91. if( slider != null ) {
  92. slider.slideUp(100, function() { slider = null; close(); });
  93. return;
  94. }
  95. cell.element.removeClass("parent-sub-table");
  96. super.close();
  97. }
  98. public function immediateClose() {
  99. if( cell.line.subTable == this ) cell.line.subTable = null;
  100. cell.element.removeClass("parent-sub-table");
  101. super.close();
  102. }
  103. override function dispose() {
  104. super.dispose();
  105. insertedTR.remove();
  106. if( cell.column.opt ) {
  107. var isEmpty = switch( cell.column.type ) {
  108. case TList: sheet.lines.length == 0;
  109. case TProperties: Reflect.fields(sheet.lines[0]).length == 0;
  110. default: false;
  111. }
  112. if( isEmpty ) {
  113. // not a change to really undo, perform direct change
  114. Reflect.deleteField(cell.line.obj, cell.column.name);
  115. editor.save();
  116. }
  117. }
  118. cell.refresh();
  119. }
  120. }