| OLD | NEW | 
|     1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file |     1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
|     2 // for details. All rights reserved. Use of this source code is governed by a |     2 // for details. All rights reserved. Use of this source code is governed by a | 
|     3 // BSD-style license that can be found in the LICENSE file. |     3 // BSD-style license that can be found in the LICENSE file. | 
|     4  |     4  | 
|     5 typedef void EditCellRangeFunction(CellRange range); |     5 typedef void EditCellRangeFunction(CellRange range); | 
|     6  |     6  | 
|     7 /** |     7 /** | 
|     8  * Spreadsheet widget. |     8  * Spreadsheet widget. | 
|     9  */ |     9  */ | 
|    10 class SpreadsheetPresenter implements SpreadsheetListener, SelectionListener { |    10 class SpreadsheetPresenter implements SpreadsheetListener, SelectionListener { | 
| (...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   657           print("Error parsing formula '${value}': ${exception}"); |   657           print("Error parsing formula '${value}': ${exception}"); | 
|   658         } |   658         } | 
|   659       } |   659       } | 
|   660     }); |   660     }); | 
|   661   } |   661   } | 
|   662  |   662  | 
|   663   void _createMoveDragger(Document doc) { |   663   void _createMoveDragger(Document doc) { | 
|   664     _moveDragger = new Element.tag("div"); |   664     _moveDragger = new Element.tag("div"); | 
|   665     _moveDragger.id = "moveDragger-${_spreadsheet.name}"; |   665     _moveDragger.id = "moveDragger-${_spreadsheet.name}"; | 
|   666     _moveDragger.attributes["class"] = "moveDragger"; |   666     _moveDragger.attributes["class"] = "moveDragger"; | 
|   667     _moveDragger.style.setProperty("left", HtmlUtils.toPx(3)); |   667     _moveDragger.style.left = HtmlUtils.toPx(3); | 
|   668     _moveDragger.style.setProperty("top", HtmlUtils.toPx(3)); |   668     _moveDragger.style.top = HtmlUtils.toPx(3); | 
|   669     _spreadsheetElement.nodes.add(_moveDragger); |   669     _spreadsheetElement.nodes.add(_moveDragger); | 
|   670  |   670  | 
|   671     _moveDragger.on.mouseDown.add((MouseEvent e) { |   671     _moveDragger.on.mouseDown.add((MouseEvent e) { | 
|   672       _moveToTop(); |   672       _moveToTop(); | 
|   673       _hideInnerMenu(true); |   673       _hideInnerMenu(true); | 
|   674  |   674  | 
|   675       int mouseStartX = e.x; |   675       int mouseStartX = e.x; | 
|   676       int mouseStartY = e.y; |   676       int mouseStartY = e.y; | 
|   677  |   677  | 
|   678       _spreadsheetElement.rect.then((ElementRect elementRect) { |   678       window.requestMeasurementFrame(() { | 
|   679         ClientRect rect = elementRect.bounding; |   679         ClientRect rect = _spreadsheetElement.rect.bounding; | 
|   680         int startX = rect.left; |   680         int startX = rect.left; | 
|   681         int startY = rect.top; |   681         int startY = rect.top; | 
|   682         _window.document.body.style.setProperty("cursor", "move"); |   682         return () { | 
 |   683           _window.document.body.style.cursor = "move"; | 
|   683  |   684  | 
|   684         _setDragFunction((MouseEvent e_) { |   685           _setDragFunction((MouseEvent e_) { | 
|   685           int x = startX + e_.x - mouseStartX; |   686             int x = startX + e_.x - mouseStartX; | 
|   686           int y = startY + e_.y - mouseStartY; |   687             int y = startY + e_.y - mouseStartY; | 
|   687  |   688  | 
|   688           x = Math.max(x, CssStyles.OBJECTBAR_WIDTH); |   689             x = Math.max(x, CssStyles.OBJECTBAR_WIDTH); | 
|   689           y = Math.max(y, CssStyles.SANDBAR_HEIGHT); |   690             y = Math.max(y, CssStyles.SANDBAR_HEIGHT); | 
|   690           // Move the spreadsheet container |   691             // Move the spreadsheet container | 
|   691           _spreadsheetElement.style.setProperty("left", HtmlUtils.toPx(x)); |   692             _spreadsheetElement.style.left = HtmlUtils.toPx(x); | 
|   692           _spreadsheetElement.style.setProperty("top", HtmlUtils.toPx(y)); |   693             _spreadsheetElement.style.top = HtmlUtils.toPx(y); | 
|   693         }); |   694           }); | 
|   694         }); |   695         }; | 
 |   696       }); | 
|   695  |   697  | 
|   696       _setUndragFunction((MouseEvent e_) { |   698       _setUndragFunction((MouseEvent e_) { | 
|   697         _window.document.body.style.setProperty("cursor", "auto"); |   699         _window.document.body.style.cursor = "auto"; | 
|   698       }); |   700       }); | 
|   699     }); |   701     }); | 
|   700   } |   702   } | 
|   701  |   703  | 
|   702   void _createResizeDragger(Document doc) { |   704   void _createResizeDragger(Document doc) { | 
|   703     _resizeDragger = new Element.tag("div"); |   705     _resizeDragger = new Element.tag("div"); | 
|   704     _resizeDragger.id = "resizeDragger-${_spreadsheet.name}"; |   706     _resizeDragger.id = "resizeDragger-${_spreadsheet.name}"; | 
|   705     _resizeDragger.attributes["class"] = "resizeDragger"; |   707     _resizeDragger.attributes["class"] = "resizeDragger"; | 
|   706     _spreadsheetElement.nodes.add(_resizeDragger); |   708     _spreadsheetElement.nodes.add(_resizeDragger); | 
|   707  |   709  | 
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   801     _tableScrollContainer.style.setProperty("left", "0px"); |   803     _tableScrollContainer.style.setProperty("left", "0px"); | 
|   802     _tableScrollContainer.style.setProperty("top", "0px"); |   804     _tableScrollContainer.style.setProperty("top", "0px"); | 
|   803     _tableScrollContainer.nodes.add(_tableScrollDiv); |   805     _tableScrollContainer.nodes.add(_tableScrollDiv); | 
|   804     _tableSizeChanged(); |   806     _tableSizeChanged(); | 
|   805  |   807  | 
|   806     _tableScrollContainer.on.scroll.add((e) { |   808     _tableScrollContainer.on.scroll.add((e) { | 
|   807       if (_scrolledByKeyboard) { |   809       if (_scrolledByKeyboard) { | 
|   808         _scrolledByKeyboard = false; |   810         _scrolledByKeyboard = false; | 
|   809         return; |   811         return; | 
|   810       } |   812       } | 
|   811       Future<ElementRect> future = _tableScrollContainer.rect; |   813       window.requestMeasurementFrame(() { | 
|   812       future.then((ElementRect rect) { |   814         final rect = _tableScrollContainer.rect; | 
|   813         int scrollTop = rect.scroll.top; |   815         int scrollTop = rect.scroll.top; | 
|   814         int row = _getAbsRowOrColumn(scrollTop, ROW) - 1; |   816         int row = _getAbsRowOrColumn(scrollTop, ROW) - 1; | 
|   815         int col = _getAbsRowOrColumn(rect.scroll.left, COL) - 1; |   817         int col = _getAbsRowOrColumn(rect.scroll.left, COL) - 1; | 
|   816         int newRowShift = Math.max(0, row); |   818         int newRowShift = Math.max(0, row); | 
|   817         int newColumnShift = Math.max(0, col); |   819         int newColumnShift = Math.max(0, col); | 
|   818         if (newRowShift != _rowShift || newColumnShift != _columnShift) { |   820         if (newRowShift != _rowShift || newColumnShift != _columnShift) { | 
|   819           _rowShift = newRowShift; |   821           _rowShift = newRowShift; | 
|   820           _columnShift = newColumnShift; |   822           _columnShift = newColumnShift; | 
|   821           _spreadsheet.refresh(); |   823           return () { _spreadsheet.refresh(); }; | 
|   822         } |   824         } | 
|   823       }); |   825       }); | 
|   824     }); |   826     }); | 
|   825   } |   827   } | 
|   826  |   828  | 
|   827   // Return the number of milliseconds since the epoch |   829   // Return the number of milliseconds since the epoch | 
|   828   int _currentTimeMllis() { |   830   int _currentTimeMllis() { | 
|   829     Date now = new Date.now(); |   831     Date now = new Date.now(); | 
|   830     Date then = new Date.fromEpoch(0, now.timeZone); |   832     Date then = new Date.fromEpoch(0, now.timeZone); | 
|   831     return now.difference(then).inMilliseconds; |   833     return now.difference(then).inMilliseconds; | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   883  |   885  | 
|   884     // apply text selection now |   886     // apply text selection now | 
|   885     _formulaCellSelectingSelectText(); |   887     _formulaCellSelectingSelectText(); | 
|   886  |   888  | 
|   887     // show cell selecting div |   889     // show cell selecting div | 
|   888     { |   890     { | 
|   889       DivElement div = _table.formulaCellSelectingDiv; |   891       DivElement div = _table.formulaCellSelectingDiv; | 
|   890       CSSStyleDeclaration divStyle = div.style; |   892       CSSStyleDeclaration divStyle = div.style; | 
|   891       int borderWidth = 2 + 2; |   893       int borderWidth = 2 + 2; | 
|   892       CellRange cellRange = new CellRange(_spreadsheet, minCorner, maxCorner); |   894       CellRange cellRange = new CellRange(_spreadsheet, minCorner, maxCorner); | 
|   893       _selectionManager.getBoundingBoxForRange(cellRange).then( |   895       window.requestMeasurementFrame(() { | 
|   894           (BoundingBox box) { |   896         final box = _selectionManager.getBoundingBoxForRange(cellRange); | 
|   895         if (box != null) { |   897         return () { | 
|   896           divStyle.setProperty("left", HtmlUtils.toPx(box.left)); |   898           if (box != null) { | 
|   897           divStyle.setProperty("top", HtmlUtils.toPx(box.top)); |   899             divStyle.left = HtmlUtils.toPx(box.left); | 
|   898           divStyle.setProperty("width", HtmlUtils.toPx(box.width - borderWidth))
      ; |   900             divStyle.top = HtmlUtils.toPx(box.top); | 
|   899           divStyle.setProperty("height", HtmlUtils.toPx(box.height - borderWidth
      )); |   901             divStyle.width = HtmlUtils.toPx(box.width - borderWidth); | 
|   900           divStyle.removeProperty("display"); |   902             divStyle.height = HtmlUtils.toPx(box.height - borderWidth); | 
|   901         } else { |   903             divStyle.removeProperty("display"); | 
|   902           divStyle.setProperty("display", "none"); |   904           } else { | 
|   903         } |   905             divStyle.setProperty("display", "none"); | 
 |   906           } | 
 |   907         }; | 
|   904       }); |   908       }); | 
|   905     } |   909     } | 
|   906   } |   910   } | 
|   907  |   911  | 
|   908   void _formulaCellSelectingRememberSelectionRange() { |   912   void _formulaCellSelectingRememberSelectionRange() { | 
|   909     _formulaCellSelectingTextStart = _formulaInput.selectionStart; |   913     _formulaCellSelectingTextStart = _formulaInput.selectionStart; | 
|   910     _formulaCellSelectingTextEnd = _formulaInput.selectionEnd; |   914     _formulaCellSelectingTextEnd = _formulaInput.selectionEnd; | 
|   911   } |   915   } | 
|   912  |   916  | 
|   913   void _formulaCellSelectingSelectText() { |   917   void _formulaCellSelectingSelectText() { | 
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1070  |  1074  | 
|  1071   // Return the number of _rows currently being displayed (not counting the colu
      mn header row) |  1075   // Return the number of _rows currently being displayed (not counting the colu
      mn header row) | 
|  1072   int _getVisibleTableHeight() => _getShiftedRowEnd(_rowShift + _rows, _rowShift
      ); |  1076   int _getVisibleTableHeight() => _getShiftedRowEnd(_rowShift + _rows, _rowShift
      ); | 
|  1073  |  1077  | 
|  1074   // Return the number of _columns currently being displayed (not counting the r
      ow header column) |  1078   // Return the number of _columns currently being displayed (not counting the r
      ow header column) | 
|  1075   int _getVisibleTableWidth() => _getShiftedColumnEnd(_columnShift + _columns, _
      columnShift); |  1079   int _getVisibleTableWidth() => _getShiftedColumnEnd(_columnShift + _columns, _
      columnShift); | 
|  1076  |  1080  | 
|  1077   // Resize the formula input field to fit the contained text |  1081   // Resize the formula input field to fit the contained text | 
|  1078   void _growFormulaInput() { |  1082   void _growFormulaInput() { | 
|  1079     _formulaInputMeasure.text = _formulaInput.value; |  1083     _formulaInputMeasure.text = _formulaInput.value; | 
|  1080     _formulaInputMeasure.rect.then((ElementRect rect) { |  1084     window.requestMeasurementFrame(() { | 
|  1081       int textWidth = rect.client.width; |  1085       int textWidth = _formulaInputMeasure.rect.client.width; | 
|  1082       int width = Math.max(textWidth + 25, _formulaCellWidth); |  1086       int width = Math.max(textWidth + 25, _formulaCellWidth); | 
|  1083       _formulaDiv.style.setProperty("width", HtmlUtils.toPx(width)); |  1087       return () { | 
|  1084       _formulaInput.style.setProperty("width", HtmlUtils.toPx(width)); |  1088         _formulaDiv.style.width = HtmlUtils.toPx(width); | 
 |  1089         _formulaInput.style.width = HtmlUtils.toPx(width); | 
 |  1090       }; | 
|  1085     }); |  1091     }); | 
|  1086   } |  1092   } | 
|  1087  |  1093  | 
|  1088   // Fade out the formula input field |  1094   // Fade out the formula input field | 
|  1089   void _hideFormula() { |  1095   void _hideFormula() { | 
|  1090     _hideFormulaCellSelecting(); |  1096     _hideFormulaCellSelecting(); | 
|  1091     _formulaEditing = false; |  1097     _formulaEditing = false; | 
|  1092     _formulaDiv.classes.remove("fadeIn"); |  1098     _formulaDiv.classes.remove("fadeIn"); | 
|  1093     _formulaDiv.classes.add("fadeOut"); |  1099     _formulaDiv.classes.add("fadeOut"); | 
|  1094   } |  1100   } | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1143   // update table row and column headers |  1149   // update table row and column headers | 
|  1144   void _redrawHeaders() { |  1150   void _redrawHeaders() { | 
|  1145     _setTableWidth(_getVisibleTableWidth()); |  1151     _setTableWidth(_getVisibleTableWidth()); | 
|  1146     _tableSizeChanged(); |  1152     _tableSizeChanged(); | 
|  1147  |  1153  | 
|  1148     _table.redrawHeaders(_selectionManager, _rows, _columns, _rowShift, _columnS
      hift, |  1154     _table.redrawHeaders(_selectionManager, _rows, _columns, _rowShift, _columnS
      hift, | 
|  1149         _cellDisplay); |  1155         _cellDisplay); | 
|  1150   } |  1156   } | 
|  1151  |  1157  | 
|  1152   void _refreshResizeDragger() { |  1158   void _refreshResizeDragger() { | 
|  1153     _table.rect.then((ElementRect elementRect) { |  1159    window.requestMeasurementFrame(() { | 
|  1154       // We may be called before the dragger is ready |  1160       // We may be called before the dragger is ready | 
|  1155       if (_resizeDragger == null) { |  1161       if (_resizeDragger == null) { | 
|  1156         return; |  1162         return; | 
|  1157       } |  1163       } | 
|  1158       ClientRect rect = elementRect.bounding; |  1164       ClientRect rect =  _table.rect.bounding; | 
|  1159  |  1165       return () { | 
|  1160       _resizeDragger.style.setProperty("left", HtmlUtils.toPx(rect.width)); |  1166         _resizeDragger.style.setProperty("left", HtmlUtils.toPx(rect.width)); | 
|  1161       _resizeDragger.style.setProperty("top", HtmlUtils.toPx(rect.height)); |  1167         _resizeDragger.style.setProperty("top", HtmlUtils.toPx(rect.height)); | 
 |  1168       }; | 
|  1162     }); |  1169     }); | 
|  1163   } |  1170   } | 
|  1164  |  1171  | 
|  1165   // Remove the HTML elements corresponding to the given column |  1172   // Remove the HTML elements corresponding to the given column | 
|  1166   void _removeTableColumnHtml(int col) { |  1173   void _removeTableColumnHtml(int col) { | 
|  1167     _table.removeColumn(col); |  1174     _table.removeColumn(col); | 
|  1168     int width = _spreadsheet.getColumnWidth(col); |  1175     int width = _spreadsheet.getColumnWidth(col); | 
|  1169     _setTableWidth(_tableWidth - width); |  1176     _setTableWidth(_tableWidth - width); | 
|  1170   } |  1177   } | 
|  1171  |  1178  | 
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1463         setDrag(COL, false); |  1470         setDrag(COL, false); | 
|  1464       } |  1471       } | 
|  1465     }); |  1472     }); | 
|  1466  |  1473  | 
|  1467     // The inline cell editing UI is displayed when a user makes the same single |  1474     // The inline cell editing UI is displayed when a user makes the same single | 
|  1468     // cell selection over again. We keep track of the current single cell that |  1475     // cell selection over again. We keep track of the current single cell that | 
|  1469     // is selected here to know when to enter edit mode. |  1476     // is selected here to know when to enter edit mode. | 
|  1470     CellLocation currentSelectedSingleCell = null; |  1477     CellLocation currentSelectedSingleCell = null; | 
|  1471  |  1478  | 
|  1472     void mouseMove(MouseEvent e) { |  1479     void mouseMove(MouseEvent e) { | 
|  1473       _table.rect.then((ElementRect rect) { |  1480       window.requestMeasurementFrame(() { | 
|  1474         // Set x and y to the mouse coordinates, relative to the top left of |  1481         // Set x and y to the mouse coordinates, relative to the top left of | 
|  1475         // the spreadsheet table. |  1482         // the spreadsheet table. | 
|  1476         ClientRect boundingRect = rect.bounding; |  1483         ClientRect boundingRect = _table.rect.bounding; | 
|  1477         int scrollOffsetX = -boundingRect.left.toInt(); |  1484         int scrollOffsetX = -boundingRect.left.toInt(); | 
|  1478         int scrollOffsetY = -boundingRect.top.toInt(); |  1485         int scrollOffsetY = -boundingRect.top.toInt(); | 
|  1479         x = e.x + scrollOffsetX; |  1486         x = e.x + scrollOffsetX; | 
|  1480         y = e.y + scrollOffsetY; |  1487         y = e.y + scrollOffsetY; | 
|  1481  |  1488  | 
|  1482         // Update the dragger position and optionally the actual row/column size |  1489         // Update the dragger position and optionally the actual row/column size | 
|  1483         if (dragRowColumn(false)) { |  1490         if (dragRowColumn(false)) { | 
|  1484           return; |  1491           return; | 
|  1485         } |  1492         } | 
|  1486  |  1493  | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1535       }); |  1542       }); | 
|  1536     } |  1543     } | 
|  1537  |  1544  | 
|  1538     _setMove(mouseMove); |  1545     _setMove(mouseMove); | 
|  1539  |  1546  | 
|  1540     _table.on.mouseDown.add((MouseEvent e) { |  1547     _table.on.mouseDown.add((MouseEvent e) { | 
|  1541       _moveToTop(); |  1548       _moveToTop(); | 
|  1542  |  1549  | 
|  1543       // Right click toggles and positions the context menu |  1550       // Right click toggles and positions the context menu | 
|  1544       if (e.button == 2 || (e.button == 0 && e.ctrlKey)) { |  1551       if (e.button == 2 || (e.button == 0 && e.ctrlKey)) { | 
|  1545         _table.rect.then((ElementRect rect) { |  1552         window.requestMeasurementFrame(() { | 
|  1546           ClientRect boundingRect = rect.bounding; |  1553           ClientRect boundingRect = _table.rect.bounding; | 
|  1547           int scrollOffsetX = -boundingRect.left; |  1554           return () { | 
|  1548           int scrollOffsetY = -boundingRect.top; |  1555             int scrollOffsetX = -boundingRect.left; | 
|  1549           _contextMenu.show(e.x + scrollOffsetX, e.y + scrollOffsetY); |  1556             int scrollOffsetY = -boundingRect.top; | 
 |  1557             _contextMenu.show(e.x + scrollOffsetX, e.y + scrollOffsetY); | 
 |  1558           }; | 
|  1550         }); |  1559         }); | 
|  1551         return; |  1560         return; | 
|  1552       } |  1561       } | 
|  1553  |  1562  | 
|  1554       _setDragFunction(mouseMove); |  1563       _setDragFunction(mouseMove); | 
|  1555  |  1564  | 
|  1556       _setUndragFunction((MouseEvent e_) { |  1565       _setUndragFunction((MouseEvent e_) { | 
|  1557         dragRowColumn(true); |  1566         dragRowColumn(true); | 
|  1558         _table.setDefaultCursor(); |  1567         _table.setDefaultCursor(); | 
|  1559         draggingSelection = false; |  1568         draggingSelection = false; | 
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1681     } |  1690     } | 
|  1682     _activeInnerMenu = new InnerMenuView(_window, row, _selectionManager, style, |  1691     _activeInnerMenu = new InnerMenuView(_window, row, _selectionManager, style, | 
|  1683         _spreadsheet.layout.getRowHeight(rowIndex), |  1692         _spreadsheet.layout.getRowHeight(rowIndex), | 
|  1684         (){ _tableSizeChanged(); }, |  1693         (){ _tableSizeChanged(); }, | 
|  1685         (){ _hideInnerMenu(true); _repositionFormulaInput(null, false); }); |  1694         (){ _hideInnerMenu(true); _repositionFormulaInput(null, false); }); | 
|  1686     _innerMenuRowIndex = rowIndex; |  1695     _innerMenuRowIndex = rowIndex; | 
|  1687   } |  1696   } | 
|  1688  |  1697  | 
|  1689   // Update the scroll mechanism due to a change in the visible table area |  1698   // Update the scroll mechanism due to a change in the visible table area | 
|  1690   void _tableSizeChanged() { |  1699   void _tableSizeChanged() { | 
|  1691     _table.rect.then((ElementRect elementRect) { |  1700     window.requestMeasurementFrame(() { | 
|  1692       ClientRect rect = elementRect.bounding; |  1701       ClientRect rect = _table.rect.bounding; | 
 |  1702       return () { | 
 |  1703         _tableScrollContainer.style.width = HtmlUtils.toPx(rect.width + 10); | 
 |  1704         _spreadsheetElement.style.width = HtmlUtils.toPx(rect.width); | 
|  1693  |  1705  | 
|  1694       _tableScrollContainer.style.width = HtmlUtils.toPx(rect.width + 10); |  1706         _tableScrollContainer.style.height = HtmlUtils.toPx(rect.height + 10); | 
|  1695       _spreadsheetElement.style.width = HtmlUtils.toPx(rect.width); |  1707         _spreadsheetElement.style.height = HtmlUtils.toPx(rect.height); | 
|  1696  |  1708  | 
|  1697       _tableScrollContainer.style.height = HtmlUtils.toPx(rect.height + 10); |  1709         _tableScrollDiv.style.width = HtmlUtils.toPx( | 
|  1698       _spreadsheetElement.style.height = HtmlUtils.toPx(rect.height); |  1710             _spreadsheet.getColumnEnd(_spreadsheet.columnCount())); | 
 |  1711         int extra = _activeInnerMenu == null ? | 
 |  1712             0 : _activeInnerMenu.currentRowHeight; | 
 |  1713         _tableScrollDiv.style.height = HtmlUtils.toPx(_spreadsheet.getRowEnd( | 
 |  1714             _spreadsheet.rowCount()) + extra); | 
|  1699  |  1715  | 
|  1700       _tableScrollDiv.style.width = HtmlUtils.toPx( |  1716         // Reposition the scroll bars | 
|  1701           _spreadsheet.getColumnEnd(_spreadsheet.columnCount())); |  1717         _scroll(_rowShift, _columnShift); | 
|  1702       int extra = _activeInnerMenu == null ? |  1718         // Move the resize dragger to the bottom-right corner | 
|  1703           0 : _activeInnerMenu.currentRowHeight; |  1719         _refreshResizeDragger(); | 
|  1704       _tableScrollDiv.style.height = HtmlUtils.toPx(_spreadsheet.getRowEnd( |  1720       }; | 
|  1705           _spreadsheet.rowCount()) + extra); |  | 
|  1706  |  | 
|  1707       // Reposition the scroll bars |  | 
|  1708       _scroll(_rowShift, _columnShift); |  | 
|  1709       // Move the resize dragger to the bottom-right corner |  | 
|  1710       _refreshResizeDragger(); |  | 
|  1711     }); |  1721     }); | 
|  1712   } |  1722   } | 
|  1713  |  1723  | 
|  1714   void _updateInnerMenu() { |  1724   void _updateInnerMenu() { | 
|  1715     if (_activeInnerMenu != null) { |  1725     if (_activeInnerMenu != null) { | 
|  1716       _activeInnerMenu.updateSize(); |  1726       _activeInnerMenu.updateSize(); | 
|  1717     } |  1727     } | 
|  1718   } |  1728   } | 
|  1719  |  1729  | 
|  1720   // Change the width/height of a column or row. |  1730   // Change the width/height of a column or row. | 
|  1721   void _updateRowColumnSize(int rowOrCol, int index, int size, int oldSize, bool
       mouseUp) { |  1731   void _updateRowColumnSize(int rowOrCol, int index, int size, int oldSize, bool
       mouseUp) { | 
|  1722     if (mouseUp) { |  1732     if (mouseUp) { | 
|  1723       Command command = new ResizeRowColumnCommand(_spreadsheet, rowOrCol, index
      , size, oldSize); |  1733       Command command = new ResizeRowColumnCommand(_spreadsheet, rowOrCol, index
      , size, oldSize); | 
|  1724       _spreadsheet.execute(command); |  1734       _spreadsheet.execute(command); | 
|  1725     } else { |  1735     } else { | 
|  1726       if (rowOrCol == COL) { |  1736       if (rowOrCol == COL) { | 
|  1727         _spreadsheet.setColumnWidth(index, size); |  1737         _spreadsheet.setColumnWidth(index, size); | 
|  1728       } else { |  1738       } else { | 
|  1729         _spreadsheet.setRowHeight(index, size); |  1739         _spreadsheet.setRowHeight(index, size); | 
|  1730       } |  1740       } | 
|  1731     } |  1741     } | 
|  1732   } |  1742   } | 
|  1733 } |  1743 } | 
| OLD | NEW |