/**
* @fileoverview
* Table을 삽입하는 기능을 가진 Tool 'table' Source,
* Class Trex.Tool.Table,Trex.Menu.Table,Trex.Menu.Table.TableEdit와 configuration 을 포함 하고있다.
*/
TrexConfig.addTool(
"table",
{
borderStyle: "1px solid #ccc",
sync: _FALSE,
status: _TRUE
},
function(root){
var bgc = TrexConfig.get("canvas",root).styles.backgroundColor;
if (bgc != "transparent") {
TrexConfig.getTool("table",root).bgcolor = bgc;
}
}
);
TrexMessage.addMsg({
'@table.alert': "1 이상 99 이하의 숫자만 입력 가능합니다."
});
Trex.Tool.Table = Trex.Class.create({
$const: {
__Identity: 'table',
__DEFAULT_TABLE_PROPERTY:{
"cellSpacing": 0,
"cellPadding": 1,
"border": 0,
"style": {
border: "none",
borderCollapse:"collapse"
}
},
__DEFAULT_TABLE_PROPERTY_STR: "cellspacing=\"0\" cellpadding=\"0\" border=\"0\"",
__DEFAULT_TABLE_STYLE: "border:none;border-collapse:collapse;",
__DEFAULT_TABLE_CLASS: "txc-table",
__DEFAULT_TABLE_CELL_HEIGHT: 24
},
$extend: Trex.Tool,
oninitialized: function(config) {
var _self = this;
this.tableSize = { row: 0, col:0 };
var _canvas = this.canvas;
var _toolHandler = this.handler = function(data) {
_canvas.execute(function(processor) {
// get table width
var tableWidth = '100%';
processor.executeUsingCaret(function(range, savedCaret){
var endCaret = savedCaret.getCaret(_FALSE);
if (!$tom.ancestor(endCaret, 'table')) {
tableWidth = _self.getDefaultTableWidth();
}
});
// insert empty table
var table = _self.makeEmptyTable(data.row, data.col, tableWidth);
var _tNode = processor.pasteContent(table, _TRUE);
processor.bookmarkInto(_tNode);
// open advanced toolbar
if (_self.toolbar.tools.advanced) {
_self.toolbar.tools.advanced.forceOpen();
}
});
};
/* button & menu weave */
this.weave.bind(this)(
/* button */
new Trex.Button(this.buttonCfg),
/* menu */
new Trex.Menu.Table(this.menuCfg),
/* handler */
_toolHandler
);
},
makeEmptyTable: function(row, col, tableWidth){
var tableStringArr = [];
tableStringArr.push("
");
return tableStringArr.join("");
},
getDefaultCellWidth: function(columnCount, tableWidth) {
var width;
tableWidth = tableWidth || '100%';
if (tableWidth.toString().indexOf('%') !== -1) {
width = (100 / columnCount) + '%';
} else {
width = parseInt(parseInt(tableWidth,10)/columnCount, 10);
if (isNaN(width)) {
width = 0;
}
width = width.toPx();
}
return width;
},
getDefaultCellHeight: function(rowCount) {
return Trex.Tool.Table.__DEFAULT_TABLE_CELL_HEIGHT.toPx();
},
getDefaultTableWidth: function(){ //NOTE: #FTDUEDTR-905
var tableWidth = this.config.tableWidth;
if (!tableWidth) {
tableWidth = this.getCanvasInnerWidth();
}
return tableWidth;
},
getCanvasInnerWidth: function() {
var padding = this.canvas.getSizeConfig().contentPadding || 8;
return (this.canvas.getSizeConfig().contentWidth || 600) - padding * 2 - 20;
}
});
Trex.Tool.Table.TemplateWizard = Trex.Class.create({
initialize: function(){
this.templateList = (typeof getTableTemplateList == "function")? getTableTemplateList() : [{
klass: "ex1",
common: {
backgroundColor:"transparent",
borderTop:"none",
borderLeft:"none",
borderRight: "1px solid #d9d9d9",
borderBottom: "1px solid #d9d9d9"
},
firstRow: {
borderTop: "1px solid #000"
},
firstCol: {
borderLeft: "1px solid #000"
},
lastCol: {
borderRight: "1px solid #000"
},
lastRow: {
borderBottom: "1px solid #000"
},
evenRow: {},
oddRow: {}
}];
this.currentTemplate = _NULL;
},
applyStyle: function(table, templateIndex){
if ( isNaN( templateIndex ) ){
return ;
}
var tableMatrixer = new Trex.Tool.Table.TableCellMatrixer(table);
var tdMatrix = tableMatrixer.getTdMatrix();
this.currentTemplate = this.templateList[templateIndex];
for( var i = 0; i < tdMatrix.length; i++){
for( var j = 0; j < tdMatrix[i].length; j++){
this.setCellStyle(tdMatrix[i][j], {
isEvenRow: (i % 2) == 1,
isFirstRow: i == 0,
isLastRow: i == tdMatrix.length - 1,
isFirstCol: j == 0,
isLastCol: (j == tdMatrix[i].length - 1)
});
}
}
},
setCellStyle: function(elTd, truthMap){
var t = this.currentTemplate;
var style = Object.extend({}, t['common']);
Object.extend(style, (truthMap.isEvenRow)?t['evenRow'] : t['oddRow']);
Object.extend(style, (truthMap.isFirstRow)?t['firstRow'] : (truthMap.isLastRow)?t['lastRow'] : {});
Object.extend(style, (truthMap.isLastCol)?t['lastCol'] : {});
Object.extend(style, (truthMap.isFirstCol)?t['firstCol'] : {});
txlib.setStyle(elTd, style);
},
getTemplateList: function(){
return this.templateList;
}
});
Trex.Tool.Table.TableCellMatrixer = Trex.Class.create({
initialize: function(table){
this.rowSize = this.initRowSize(table);
this.colSize = this.initColSize(table);
var context = $tom.first(table,"tbody") || table;
this.tdMatrix = this.createTdMatrix(context);
//this.table = table;
for (var i = 0; i < this.tdMatrix.length; i++) {
for (var j = 0; j < this.tdMatrix[i].length; j++) {
var td = this.tdMatrix[i][j];
if (td.cols > 1) {
td.cols--;
this.tdMatrix[i].splice(j+1, 0, td);
}
}
}
for( var i = 0; i< this.tdMatrix.length; i++ ){
for( var j = 0; j < this.tdMatrix[i].length; j++ ){
var td = this.tdMatrix[i][j];
if ( td.rows > 1 ){
td.rows--;
this.tdMatrix[i + 1].splice(j, 0, td);
}
}
}
},
createTdMatrix: function(tbody){
var tdMatrix = [];
var trArr = $tom.children(tbody, "tr");
for( var i = 0, len = trArr.length; i < len; i++ ){
tdMatrix.push(this.createTdArray(trArr[i]));
}
return tdMatrix;
},
createTdArray: function(tr){
var tdArr = [];
var tds = $tom.children(tr, "td");
for( var i = 0, len = tds.length; i < len; i++ ){
tdArr.push( this.decorateSingleTd( tds[i] ) );
}
return tdArr;
},
decorateSingleTd: function(td){
var cols = parseInt( td.getAttribute("colSpan") || 1);
var rows = parseInt( td.getAttribute("rowSpan") || 1);
td.cols = cols;
td.rows = (rows-1) * cols + 1;
return td;
},
initRowSize: function(table){
return table.rows.length;
},
initColSize: function(table){
var colSize = 0;
var tdArr = $tom.children( $tom.collect(table, "tr"), "td");
tdArr.each(function(td){
colSize += parseInt(td.getAttribute("colSpan") || 1);
});
return colSize;
},
getRowSize: function(){
return this.rowSize;
},
getColSize: function(){
return this.colSize;
},
getTdMatrix: function(){
return this.tdMatrix;
}
});
TrexMessage.addMsg({
'@table.title.insert': '표삽입 ',
'@table.title.setDirectly': '표 직접설정',
'@table.title.row': '열 개수',
'@table.title.col': '행 개수'
});
Trex.MarkupTemplate.add(
'menu.table.direct', [
'@table.title.setDirectly
',
''
].join("")
);
/* Trex.Menu.Table ************************************************************************************/
Trex.Menu.Table = Trex.Class.create({
$const:{
MAX_ROW:99,
MAX_COL:99
},
$extend: Trex.Menu,
ongenerated: function() {
this.rowSize = 1;
this.colSize = 1;
this.elInnerPreview = $tom.collect(this.elMenu, 'div.tx-menu-inner .tx-menu-preview');
this.dynamicSizer = this.generateDynamicSizer(this.elInnerPreview);
this.elInnerRowCol = $tom.collect(this.elMenu, 'div.tx-menu-inner .tx-menu-rowcol');
this.generateTextSizer(this.elInnerRowCol);
this.elButtonArea = $tom.collect(this.elMenu, 'div.tx-menu-inner .tx-menu-enter');
this.generateButtonArea(this.elButtonArea);
},
onregenerated: function() {
this.showDynamicSizer();
},
showDynamicSizer: function(){
this.dynamicSizer.clear();
$tx.show( this.elInnerPreview );
$tx.hide( this.elInnerRowCol );
$tx.hide( this.elButtonArea );
},
showTextSizer: function(){
$tx.hide(this.elInnerPreview);
$tx.show(this.elInnerRowCol);
$tx.show(this.elButtonArea);
},
generateDynamicSizer: function(elPreivewContext){
var _self = this;
var elRowCol= tx.span();
var elDisplay = tx.div({className:"tx-dynamic-sizer-display"}, TXMSG('@table.title.insert'), elRowCol);
elPreivewContext.appendChild( elDisplay );
var dynamicSizer = new Trex.DynamicSizer({
el: elPreivewContext,
clickHandler: this.onSelect.bind(this),
moveHandler: function(row, col){
elRowCol.innerHTML = row + 'x' +col;
}
});
var _elA = tx.a({href:"javascript:;"}, TXMSG('@table.title.setDirectly'));
$tx.observe( _elA, "click", function(ev){
_self.showTextSizer();
$tx.stop(ev);
_self.fireJobs(Trex.Ev.__MENU_LAYER_CHANGE_SIZE, {
detail: {
menu: _self
}
});
});
var _elButton = tx.div({className:"tx-more-button"});
_elButton.appendChild(_elA);
elPreivewContext.appendChild( _elButton );
return dynamicSizer;
},
generateTextSizer: function(elContext) {
var _self = this;
Trex.MarkupTemplate.get('menu.table.direct').evaluateToDom({}, elContext);
var calculator = {
calculate: function(value, max, operand){
value = parseInt(value);
if ( value + operand > max || value + operand< 1){
alert( TXMSG("@table.alert") );
return value;
}else{
return value + operand;
}
},
getValidValue:function(value, previousValue, max){
if ( value <= 0 || value > max ){
alert( TXMSG("@table.alert") );
return previousValue;
}else{
return value;
}
}
};
var colInput = $tom.collect(elContext, "div.tx-col-field input");
$tx.observe(colInput, "blur", function(){
colInput.value = _self.colSize = calculator.getValidValue(colInput.value, _self.colSize, Trex.Menu.Table.MAX_COL);
});
$tx.observe( $tom.collect(elContext, "div.tx-col-field a.tx-btn-add"), "click", function(e){
colInput.value = _self.colSize = calculator.calculate(_self.colSize, Trex.Menu.Table.MAX_COL, 1);
$tx.stop(e);
return _FALSE;
});
$tx.observe($tom.collect(elContext, "div.tx-col-field a.tx-btn-sub"), "click", function(e){
colInput.value = _self.colSize = calculator.calculate(_self.colSize, Trex.Menu.Table.MAX_COL, -1);
$tx.stop(e);
return _FALSE;
});
var rowInput = $tom.collect(elContext, "div.tx-row-field input");
$tx.observe(rowInput, "blur", function(){
rowInput.value = _self.rowSize = calculator.getValidValue(rowInput.value, _self.rowSize, Trex.Menu.Table.MAX_ROW);
});
$tx.observe($tom.collect(elContext, "div.tx-row-field a.tx-btn-add"), "click", function(e){
rowInput.value = _self.rowSize = calculator.calculate(_self.rowSize, Trex.Menu.Table.MAX_ROW, 1);
$tx.stop(e);
return _FALSE;
});
$tx.observe($tom.collect(elContext, "div.tx-row-field a.tx-btn-sub"), "click", function(e){
rowInput.value = _self.rowSize = calculator.calculate(_self.rowSize, Trex.Menu.Table.MAX_ROW, -1);
$tx.stop(e);
return _FALSE;
});
},
generateButtonArea: function(elContext){
var _self = this;
var elDiv = tx.div();
var elAConfirm = tx.a({href:"javascript:;", className:"tx-btn-confirm"}, "확인");
var elACancel = tx.a({href:"javascript:;", className:"tx-btn-cancel"}, "취소");
$tx.observe( elAConfirm, "click", function(ev){
_self.onSelect(ev, {
row: _self.rowSize,
col: _self.colSize
});
});
$tx.observe(elACancel, "click", function(e) {
$tx.stop(e);
this.onCancel();
return _FALSE;
}.bindAsEventListener(this));
elDiv.appendChild(elAConfirm);
elDiv.appendChild(elACancel);
elContext.appendChild(elDiv);
}
});