/* Initialization for Tabulizer by Dimitrios Mourloukos */ var grid; var grid_data = []; var grid_row_limit = 500; var grid_column_limit = 100; var grid_selected_range = new Object; var options = { editable: true, enableAddRow: true, enableCellNavigation: true, asyncEditorLoading: false, autoEdit: false }; var columns = [ { id: "selector", name: "", field: "num", width: 30 } ]; function FormulaEditor(args) { var _self = this; var _editor = new Slick.Editors.Text(args); var _selector; jQuery.extend(this, _editor); function init() { // register a plugin to select a range and append it to the textbox // since events are fired in reverse order (most recently added are executed first), // this will override other plugins like moverows or selection model and will // not require the grid to not be in the edit mode _selector = new Slick.CellRangeSelector(); _selector.onCellRangeSelected.subscribe(_self.handleCellRangeSelected); args.grid.registerPlugin(_selector); } this.destroy = function () { _selector.onCellRangeSelected.unsubscribe(_self.handleCellRangeSelected); grid.unregisterPlugin(_selector); _editor.destroy(); }; this.handleCellRangeSelected = function (e, args) { _editor.setValue( _editor.getValue() + grid.getColumns()[args.range.fromCell].name + args.range.fromRow + ":" + grid.getColumns()[args.range.toCell].name + args.range.toRow ); }; init(); } function initGrid(data, grid_rows, grid_columns) { for (var i = 0; i < grid_column_limit; i++) { columns.push({ id: i, name: "Col"+(i+1), field: i, width: 60, editor: FormulaEditor }); } for (var i = 0; i < grid_row_limit; i++) { var d = (grid_data[i] = {}); d["num"] = i+1; } grid = new Slick.Grid("#grid", grid_data, columns, options); var selectionModel = new Slick.CellSelectionModel(); grid.setSelectionModel(selectionModel); grid.registerPlugin(new Slick.AutoTooltips()); // set keyboard focus on the grid grid.getCanvasNode().focus(); var copyManager = new Slick.CellCopyManager(); grid.registerPlugin(copyManager); copyManager.onPasteCells.subscribe(function (e, args) { if (args.from.length !== 1 || args.to.length !== 1) { throw "This implementation only supports single range copy and paste operations"; } var from = args.from[0]; var to = args.to[0]; var val; // treat differently the cases where the destination area is a single cell or not var to_range_length = (to.toRow - to.fromRow) + (to.toCell - to.fromCell); var i, j, copy_data = []; for (i = 0; i <= from.toRow - from.fromRow; i++) { copy_data[i] = []; for (j = 0; j <= from.toCell - from.fromCell; j++) { copy_data[i][j] = grid_data[from.fromRow + i][columns[from.fromCell + j].field]; } } if (to_range_length == 0) { for (i = 0; i <= from.toRow - from.fromRow; i++) { for (j = 0; j <= from.toCell - from.fromCell; j++) { grid_data[to.fromRow + i][columns[to.fromCell + j].field] = copy_data[i][j]; grid.invalidateRow(to.fromRow + i); } } } else { for (i = 0; i <= from.toRow - from.fromRow; i++) { for (j = 0; j <= from.toCell - from.fromCell; j++) { if (i <= to.toRow - to.fromRow && j <= to.toCell - to.fromCell) { val = copy_data[i][j]; grid_data[to.fromRow + i][columns[to.fromCell + j].field] = val; grid.invalidateRow(to.fromRow + i); } /* if (i <= to.toRow - to.fromRow && j <= to.toCell - to.fromCell) { val = grid_data[from.fromRow + i][columns[from.fromCell + j].field]; grid_data[to.fromRow + i][columns[to.fromCell + j].field] = val; grid.invalidateRow(to.fromRow + i); } */ } } } grid.render(); }); grid.onAddNewRow.subscribe(function (e, args) { var item = args.item; var column = args.column; grid.invalidateRow(grid_data.length); grid_data.push(item); grid.updateRowCount(); grid.render(); }); grid.onContextMenu.subscribe(function (e) { e.preventDefault(); var cell = grid.getCellFromEvent(e); jQuery("#gridContextMenu") .data("row", cell.row) .data("column", cell.cell) .css("top", e.pageY) .css("left", e.pageX) .show(); jQuery("body").one("click", function (e) { // finally, hide context menu jQuery("#gridContextMenu").hide(); }); }); selectionModel.onSelectedRangesChanged.subscribe(function (e, args) { if (args.length == 1) { grid_selected_range.fromRow = args[0].fromRow; grid_selected_range.toRow = args[0].toRow grid_selected_range.fromColumn = args[0].fromCell-1; grid_selected_range.toColumn = args[0].toCell-1; grid_selected_range.active = 1; } else { grid_selected_range.active = 0; } }); grid.onKeyDown.subscribe( function (e, args) { if ((e.which != 46) || e.ctrlKey) { return false; } if (grid_selected_range) { if (grid_selected_range.active) { for (var i = grid_selected_range.fromRow; i <= grid_selected_range.toRow; i++) { for (var j = grid_selected_range.fromColumn; j <= grid_selected_range.toColumn; j++) { grid_data[i][j] = null; } grid.invalidateRow(i); } grid.render(); e.preventDefault(); } } }); } function gridAddRow(row_id, direction) { var i, j, d; var row_add = grid_row_limit; if (direction == 'above') { if (row_id>=0) row_add = row_id; else row_add = 0; } else { if (row_id < grid_row_limit) row_add = row_id + 1; else row_add = grid_row_limit; } grid_row_limit++; for (i = grid_row_limit; i> row_add; i--) { d = (grid_data[i] = {}); d["num"] = i+1; if (grid_data[i-1] != null) { for (j=0;j<=grid_column_limit;j++) { if (grid_data[i-1][j] !== 'undefined') { d[j] = grid_data[i-1][j]; } else { d[j] = null; } } grid.invalidateRow(i); } } d = (grid_data[row_add] = {}); d["num"] = row_add+1; /* for (j=1;j<=grid_column_limit;j++) { d[j] = null; } */ grid.invalidateRow(row_add); grid.updateRowCount(); grid.render(); } function gridAddColumn(column_id, direction) { var i, j, d; var column_add = grid_column_limit; if (direction == 'before') { if (column_id>0) column_add = column_id - 1; else column_add = 1; } else { if (column_id < grid_column_limit) column_add = column_id; else column_add = grid_column_limit; } grid_column_limit++; for (i = 0; i< grid_row_limit; i++) { if (grid_data[i] != null) { d = grid_data[i]; for (j=grid_column_limit;j>column_add;j--) { if (typeof grid_data[i][j-1] !== 'undefined') { d[j] = grid_data[i][j-1]; } else { d[j] = null; } } d[column_add] = null; for (j=0;j grid_row_limit) return; else remove_row = row_id; for (i = remove_row; i < grid_row_limit; i++) { d = (grid_data[i] = {}); d["num"] = i+1; if (grid_data[i+1] != null) { for (j=0;j grid_column_limit) return; else remove_column = column_id-1; for (i = 0; i< grid_row_limit; i++) { if (grid_data[i] != null) { d = grid_data[i]; for (j=0;j