diff options
-rw-r--r-- | examples/examples.css | 2 | ||||
-rw-r--r-- | plugins/slick.rowselectionmodel.js | 46 | ||||
-rw-r--r-- | slick-default-theme.css (renamed from examples/slick-default-theme.css) | 10 | ||||
-rw-r--r-- | slick.dataview.js | 2 | ||||
-rw-r--r-- | slick.grid.js | 67 | ||||
-rw-r--r-- | tests/init benchmark.html | 57 |
6 files changed, 126 insertions, 58 deletions
diff --git a/examples/examples.css b/examples/examples.css index a0caa7d..24bc4a2 100644 --- a/examples/examples.css +++ b/examples/examples.css @@ -1,4 +1,4 @@ -@import url('slick-default-theme.css'); +@import url('../slick-default-theme.css'); * { font-family: arial; diff --git a/plugins/slick.rowselectionmodel.js b/plugins/slick.rowselectionmodel.js index 28e7e43..0de8dd3 100644 --- a/plugins/slick.rowselectionmodel.js +++ b/plugins/slick.rowselectionmodel.js @@ -134,34 +134,34 @@ return false; } + if (!_grid.getOptions().multiSelect || ( + !e.ctrlKey && !e.shiftKey && !e.metaKey)) { + return false; + } + var selection = rangesToRows(_ranges); var idx = $.inArray(cell.row, selection); - if (!e.ctrlKey && !e.shiftKey && !e.metaKey) { - return false; - } - else if (_grid.getOptions().multiSelect) { - if (idx === -1 && (e.ctrlKey || e.metaKey)) { - selection.push(cell.row); - _grid.setActiveCell(cell.row, cell.cell); - } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) { - selection = $.grep(selection, function (o, i) { - return (o !== cell.row); - }); - _grid.setActiveCell(cell.row, cell.cell); - } else if (selection.length && e.shiftKey) { - var last = selection.pop(); - var from = Math.min(cell.row, last); - var to = Math.max(cell.row, last); - selection = []; - for (var i = from; i <= to; i++) { - if (i !== last) { - selection.push(i); - } + if (idx === -1 && (e.ctrlKey || e.metaKey)) { + selection.push(cell.row); + _grid.setActiveCell(cell.row, cell.cell); + } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) { + selection = $.grep(selection, function (o, i) { + return (o !== cell.row); + }); + _grid.setActiveCell(cell.row, cell.cell); + } else if (selection.length && e.shiftKey) { + var last = selection.pop(); + var from = Math.min(cell.row, last); + var to = Math.max(cell.row, last); + selection = []; + for (var i = from; i <= to; i++) { + if (i !== last) { + selection.push(i); } - selection.push(last); - _grid.setActiveCell(cell.row, cell.cell); } + selection.push(last); + _grid.setActiveCell(cell.row, cell.cell); } _ranges = rowsToRanges(selection); diff --git a/examples/slick-default-theme.css b/slick-default-theme.css index 6efd255..efc7415 100644 --- a/examples/slick-default-theme.css +++ b/slick-default-theme.css @@ -6,17 +6,17 @@ classes should alter those! */ .slick-header-columns { - background: url('../images/header-columns-bg.gif') repeat-x center bottom; + background: url('images/header-columns-bg.gif') repeat-x center bottom; border-bottom: 1px solid silver; } .slick-header-column { - background: url('../images/header-columns-bg.gif') repeat-x center bottom; + background: url('images/header-columns-bg.gif') repeat-x center bottom; border-right: 1px solid silver; } .slick-header-column:hover, .slick-header-column-active { - background: white url('../images/header-columns-over-bg.gif') repeat-x center bottom; + background: white url('images/header-columns-over-bg.gif') repeat-x center bottom; } .slick-headerrow { @@ -61,11 +61,11 @@ classes should alter those! } .slick-group-toggle.expanded { - background: url(../images/collapse.gif) no-repeat center center; + background: url(images/collapse.gif) no-repeat center center; } .slick-group-toggle.collapsed { - background: url(../images/expand.gif) no-repeat center center; + background: url(images/expand.gif) no-repeat center center; } .slick-group-totals { diff --git a/slick.dataview.js b/slick.dataview.js index 5bee4ff..2dabd87 100644 --- a/slick.dataview.js +++ b/slick.dataview.js @@ -457,7 +457,7 @@ var group; var val; var groups = []; - var groupsByVal = []; + var groupsByVal = {}; var r; var level = parentGroup ? parentGroup.level + 1 : 0; var gi = groupingInfos[level]; diff --git a/slick.grid.js b/slick.grid.js index a9a9efc..e5c7a89 100644 --- a/slick.grid.js +++ b/slick.grid.js @@ -133,7 +133,6 @@ if (typeof Slick === "undefined") { var headerColumnWidthDiff = 0, headerColumnHeightDiff = 0, // border+padding
cellWidthDiff = 0, cellHeightDiff = 0;
var absoluteColumnMinWidth;
- var numberOfRows = 0;
var tabbingDirection = 1;
var activePosX;
@@ -668,8 +667,8 @@ if (typeof Slick === "undefined") { tolerance: "intersection",
helper: "clone",
placeholder: "slick-sortable-placeholder ui-state-default slick-header-column",
- forcePlaceholderSize: true,
start: function (e, ui) {
+ ui.placeholder.width(ui.helper.outerWidth() - headerColumnWidthDiff);
$(ui.helper).addClass("slick-header-column-active");
},
beforeStop: function (e, ui) {
@@ -880,23 +879,27 @@ if (typeof Slick === "undefined") { el = $("<div class='ui-state-default slick-header-column' style='visibility:hidden'>-</div>").appendTo($headers);
headerColumnWidthDiff = headerColumnHeightDiff = 0;
- $.each(h, function (n, val) {
- headerColumnWidthDiff += parseFloat(el.css(val)) || 0;
- });
- $.each(v, function (n, val) {
- headerColumnHeightDiff += parseFloat(el.css(val)) || 0;
- });
+ if (el.css("box-sizing") != "border-box" && el.css("-moz-box-sizing") != "border-box" && el.css("-webkit-box-sizing") != "border-box") {
+ $.each(h, function (n, val) {
+ headerColumnWidthDiff += parseFloat(el.css(val)) || 0;
+ });
+ $.each(v, function (n, val) {
+ headerColumnHeightDiff += parseFloat(el.css(val)) || 0;
+ });
+ }
el.remove();
var r = $("<div class='slick-row' />").appendTo($canvas);
el = $("<div class='slick-cell' id='' style='visibility:hidden'>-</div>").appendTo(r);
cellWidthDiff = cellHeightDiff = 0;
- $.each(h, function (n, val) {
- cellWidthDiff += parseFloat(el.css(val)) || 0;
- });
- $.each(v, function (n, val) {
- cellHeightDiff += parseFloat(el.css(val)) || 0;
- });
+ if (el.css("box-sizing") != "border-box" && el.css("-moz-box-sizing") != "border-box" && el.css("-webkit-box-sizing") != "border-box") {
+ $.each(h, function (n, val) {
+ cellWidthDiff += parseFloat(el.css(val)) || 0;
+ });
+ $.each(v, function (n, val) {
+ cellHeightDiff += parseFloat(el.css(val)) || 0;
+ });
+ }
r.remove();
absoluteColumnMinWidth = Math.max(headerColumnWidthDiff, cellWidthDiff);
@@ -1593,9 +1596,10 @@ if (typeof Slick === "undefined") { }
function updateRowCount() {
- var dataLength = getDataLength();
if (!initialized) { return; }
- numberOfRows = getDataLengthIncludingAddNew() +
+
+ var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
+ var numberOfRows = dataLengthIncludingAddNew +
(options.leaveSpaceForNewRows ? numVisibleRows - 1 : 0);
var oldViewportHasVScroll = viewportHasVScroll;
@@ -1604,7 +1608,7 @@ if (typeof Slick === "undefined") { // remove the rows that are now outside of the data range
// this helps avoid redundant calls to .removeRow() when the size of the data decreased by thousands of rows
- var l = getDataLengthIncludingAddNew() - 1;
+ var l = dataLengthIncludingAddNew - 1;
for (var i in rowsCache) {
if (i >= l) {
removeRowFromCache(i);
@@ -1997,10 +2001,11 @@ if (typeof Slick === "undefined") { }
function asyncPostProcessRows() {
+ var dataLength = getDataLength();
while (postProcessFromRow <= postProcessToRow) {
var row = (vScrollDir >= 0) ? postProcessFromRow++ : postProcessToRow--;
var cacheEntry = rowsCache[row];
- if (!cacheEntry || row >= getDataLength()) {
+ if (!cacheEntry || row >= dataLength) {
continue;
}
@@ -2171,10 +2176,10 @@ if (typeof Slick === "undefined") { }
cancelEditAndSetFocus();
} else if (e.which == 34) {
- scrollPageDown();
+ navigatePageDown();
handled = true;
} else if (e.which == 33) {
- scrollPageUp();
+ navigatePageUp();
handled = true;
} else if (e.which == 37) {
handled = navigateLeft();
@@ -2486,13 +2491,14 @@ if (typeof Slick === "undefined") { }
function isCellPotentiallyEditable(row, cell) {
+ var dataLength = getDataLength();
// is the data for this row loaded?
- if (row < getDataLength() && !getDataItem(row)) {
+ if (row < dataLength && !getDataItem(row)) {
return false;
}
// are we in the Add New row? can we create new from this cell?
- if (columns[cell].cannotTriggerInsert && row >= getDataLength()) {
+ if (columns[cell].cannotTriggerInsert && row >= dataLength) {
return false;
}
@@ -2716,8 +2722,9 @@ if (typeof Slick === "undefined") { if (options.enableCellNavigation && activeRow != null) {
var row = activeRow + deltaRows;
- if (row >= getDataLengthIncludingAddNew()) {
- row = getDataLengthIncludingAddNew() - 1;
+ var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
+ if (row >= dataLengthIncludingAddNew) {
+ row = dataLengthIncludingAddNew - 1;
}
if (row < 0) {
row = 0;
@@ -2741,11 +2748,11 @@ if (typeof Slick === "undefined") { }
}
- function scrollPageDown() {
+ function navigatePageDown() {
scrollPage(1);
}
- function scrollPageUp() {
+ function navigatePageUp() {
scrollPage(-1);
}
@@ -2839,8 +2846,9 @@ if (typeof Slick === "undefined") { function gotoDown(row, cell, posX) {
var prevCell;
+ var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
while (true) {
- if (++row >= getDataLengthIncludingAddNew()) {
+ if (++row >= dataLengthIncludingAddNew) {
return null;
}
@@ -2901,7 +2909,8 @@ if (typeof Slick === "undefined") { }
var firstFocusableCell = null;
- while (++row < getDataLengthIncludingAddNew()) {
+ var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
+ while (++row < dataLengthIncludingAddNew) {
firstFocusableCell = findFirstFocusableCell(row);
if (firstFocusableCell !== null) {
return {
@@ -3340,6 +3349,8 @@ if (typeof Slick === "undefined") { "navigateDown": navigateDown,
"navigateLeft": navigateLeft,
"navigateRight": navigateRight,
+ "navigatePageUp": navigatePageUp,
+ "navigatePageDown": navigatePageDown,
"gotoCell": gotoCell,
"getTopPanel": getTopPanel,
"setTopPanelVisibility": setTopPanelVisibility,
diff --git a/tests/init benchmark.html b/tests/init benchmark.html new file mode 100644 index 0000000..8b41c84 --- /dev/null +++ b/tests/init benchmark.html @@ -0,0 +1,57 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <title>SlickGrid Initialization Benchmark</title> + <link rel="stylesheet" href="../slick.grid.css" type="text/css" media="screen" charset="utf-8" /> + <link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css" media="screen" charset="utf-8" /> + <link rel="stylesheet" href="../examples/examples.css" type="text/css" media="screen" charset="utf-8" /> + </head> + <body> + <script src="http://code.jquery.com/jquery-1.7.2.js"></script> + <script src="../lib/jquery-ui-1.8.16.custom.min.js"></script> + <script src="../lib/jquery.event.drag-2.2.js"></script> + + <script src="../slick.core.js"></script> + <script src="../slick.grid.js"></script> + <script src="../slick.formatters.js"></script> + + <button onclick="bench(false)">Run w/o disposing</button> + <button onclick="bench(true)">Run w/ disposing</button> + + <hr/> + + <div id="container" style="width:600px;height:100000px;"></div> + + <script> + function bench(dispose) { + var startTime = new Date(); + var container = $("#container"); + for (var i = 0; i < 20; i++) { + var parentEl = $("<div style='width:600px;height:400px;'></div>").appendTo(container); + var grid = createGrid(parentEl); + if (dispose) { + grid.destroy(); + parentEl.remove(); + } + } + alert((new Date() - startTime)); + } + + function createGrid(parentEl) { + var data = [{}, {}, {}]; + var columns = []; + for (var i = 0; i < 20; i++) { + columns.push({id: "field" + i, name: "field" + i, field: "field" + i}); + } + + var options = { + enableCellNavigation: true, + enableColumnReorder: false + }; + + return new Slick.Grid(parentEl, data, columns, options); + } + </script> + </body> +</html> |