package hide.comp.cdb;
class SubTable extends Table {
var insertedTR : Element;
var slider : Element;
public var cell : Cell;
public function new(editor, cell:Cell) {
this.editor = editor;
this.cell = cell;
parent = cell.table;
var sheet = makeSubSheet();
var line = cell.line;
if( line.subTable != null ) throw "assert";
line.subTable = this;
var mode : Table.DisplayMode = switch( cell.column.type ) {
case TProperties: Properties;
default: Table;
};
insertedTR = new Element("
").addClass(cell.column.type == TProperties ? "props" : "list");
var group;
if( editor.displayMode == AllProperties && cell.table.parent == null ) {
group = new Element("").attr("colspan","2").appendTo(insertedTR);
} else if( mode == Properties ) {
var count = cell.columnIndex + 1;
if (count < 3 && cell.table.columns.length >= 8)
count += 2; // fix when a lot of columns but the subproperty is on the left
group = new Element(" | ").attr("colspan",""+(count+1)).appendTo(insertedTR);
var remain = cell.table.columns.length - count;
if( remain > 0 )
new Element(" | ").attr("colspan", "" + remain).appendTo(insertedTR);
} else {
new Element(" | ").appendTo(insertedTR);
group = new Element(" | ").attr("colspan",""+cell.table.columns.length).appendTo(insertedTR);
}
slider = new Element("").appendTo(group);
slider.hide();
var root = new Element(" ");
root.appendTo(slider);
root.addClass("cdb-sub-sheet");
insertedTR.insertAfter(cell.line.element);
cell.element.text("...");
cell.element.addClass("parent-sub-table");
super(editor, sheet, root, mode);
}
override function getRealSheet() {
return cell.table.sheet.getSub(cell.column);
}
function makeSubSheet() {
var sheet = cell.table.sheet;
var c = cell.column;
var index = cell.line.index;
var key = sheet.getPath() + "@" + c.name + ":" + index;
var psheet = sheet.getSub(c);
var lines = switch( cell.column.type ) {
case TList:
var value = cell.value;
if( value == null ) {
value = [];
Reflect.setField(cell.line.obj, cell.column.name, value);
// do not save for now
}
value;
case TProperties:
var value = cell.value;
if( value == null ) {
value = {};
Reflect.setField(cell.line.obj, cell.column.name, value);
// do not save for now
}
var lines = [for( f in psheet.columns ) value];
if( lines.length == 0 ) lines.push(value);
lines;
default:
throw "assert";
}
return new cdb.Sheet(editor.base,{
columns : psheet.columns, // SHARE
props : psheet.props, // SHARE
name : psheet.name, // same
lines : lines, // ref
separators : [], // none
},key, { sheet : sheet, column : cell.table.sheet.columns.indexOf(c), line : index });
}
public function show( ?immediate ) {
if( immediate )
slider.show();
else
slider.slideDown(100);
}
override public function close() {
if( cell.line.subTable == this ) cell.line.subTable = null;
if( slider != null ) {
slider.slideUp(100, function() { slider = null; close(); });
return;
}
cell.element.removeClass("parent-sub-table");
super.close();
}
public function immediateClose() {
if( cell.line.subTable == this ) cell.line.subTable = null;
cell.element.removeClass("parent-sub-table");
super.close();
}
override function dispose() {
super.dispose();
insertedTR.remove();
if( cell.column.opt ) {
var isEmpty = switch( cell.column.type ) {
case TList: sheet.lines.length == 0;
case TProperties: Reflect.fields(sheet.lines[0]).length == 0;
default: false;
}
if( isEmpty ) {
// not a change to really undo, perform direct change
Reflect.deleteField(cell.line.obj, cell.column.name);
editor.save();
}
}
cell.refresh();
}
} |