SubTable.hx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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( mode == Properties ) {
  21. var count = cell.columnIndex + 1;
  22. group = new Element("<td>").attr("colspan",""+(count+1)).appendTo(insertedTR);
  23. var remain = cell.table.sheet.columns.length - count;
  24. if( remain > 0 )
  25. new Element("<td>").attr("colspan", "" + remain).appendTo(insertedTR);
  26. } else {
  27. new Element("<td>").appendTo(insertedTR);
  28. group = new Element("<td>").attr("colspan",""+cell.table.sheet.columns.length).appendTo(insertedTR);
  29. }
  30. slider = new Element("<div>").appendTo(group);
  31. slider.hide();
  32. var root = new Element("<table>");
  33. root.appendTo(slider);
  34. insertedTR.insertAfter(cell.line.element);
  35. cell.element.text("...");
  36. super(editor, sheet, root, mode);
  37. }
  38. public function makeSubSheet() {
  39. var sheet = cell.table.sheet;
  40. var c = cell.column;
  41. var index = cell.line.index;
  42. var key = sheet.getPath() + "@" + c.name + ":" + index;
  43. var psheet = sheet.getSub(c);
  44. var lines = switch( cell.column.type ) {
  45. case TList:
  46. var value = cell.value;
  47. if( value == null ) {
  48. value = [];
  49. Reflect.setField(cell.line.obj, cell.column.name, value);
  50. // do not save for now
  51. }
  52. value;
  53. case TProperties:
  54. var value = cell.value;
  55. if( value == null ) {
  56. value = {};
  57. Reflect.setField(cell.line.obj, cell.column.name, value);
  58. // do not save for now
  59. }
  60. [for( c in sheet.columns ) value];
  61. default:
  62. throw "assert";
  63. }
  64. return new cdb.Sheet(editor.base,{
  65. columns : psheet.columns, // SHARE
  66. props : psheet.props, // SHARE
  67. name : psheet.name, // same
  68. lines : lines, // ref
  69. separators : [], // none
  70. },key, { sheet : sheet, column : cell.columnIndex, line : index });
  71. }
  72. public function show( ?immediate ) {
  73. if( immediate )
  74. slider.show();
  75. else
  76. slider.slideDown(100);
  77. }
  78. override public function close() {
  79. if( cell.line.subTable == this ) cell.line.subTable = null;
  80. if( slider != null ) {
  81. slider.slideUp(100, function() { slider = null; close(); });
  82. return;
  83. }
  84. super.close();
  85. }
  86. override function dispose() {
  87. super.dispose();
  88. insertedTR.remove();
  89. if( cell.column.opt ) {
  90. var isEmpty = switch( cell.column.type ) {
  91. case TList: sheet.lines.length == 0;
  92. case TProperties: Reflect.fields(sheet.lines[0]).length == 0;
  93. default: false;
  94. }
  95. if( isEmpty ) {
  96. // not a change to really undo, perform direct change
  97. Reflect.deleteField(cell.line.obj, cell.column.name);
  98. editor.api.save();
  99. }
  100. }
  101. cell.refresh();
  102. }
  103. }