Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: client/samples/total/src/SpreadsheetPresenter.dart

Issue 9148015: Example showing alternate async measurement solution (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Ready for review Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011, 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 {
11 11
(...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
880 882
881 // apply text selection now 883 // apply text selection now
882 _formulaCellSelectingSelectText(); 884 _formulaCellSelectingSelectText();
883 885
884 // show cell selecting div 886 // show cell selecting div
885 { 887 {
886 DivElement div = _table.formulaCellSelectingDiv; 888 DivElement div = _table.formulaCellSelectingDiv;
887 CSSStyleDeclaration divStyle = div.style; 889 CSSStyleDeclaration divStyle = div.style;
888 int borderWidth = 2 + 2; 890 int borderWidth = 2 + 2;
889 CellRange cellRange = new CellRange(_spreadsheet, minCorner, maxCorner); 891 CellRange cellRange = new CellRange(_spreadsheet, minCorner, maxCorner);
890 _selectionManager.getBoundingBoxForRange(cellRange).then( 892 window.requestMeasurementFrame(() {
891 (BoundingBox box) { 893 final box = _selectionManager.getBoundingBoxForRange(cellRange);
892 if (box != null) { 894 return () {
893 divStyle.setProperty("left", HtmlUtils.toPx(box.left)); 895 if (box != null) {
894 divStyle.setProperty("top", HtmlUtils.toPx(box.top)); 896 divStyle.left = HtmlUtils.toPx(box.left);
895 divStyle.setProperty("width", HtmlUtils.toPx(box.width - borderWidth)) ; 897 divStyle.top = HtmlUtils.toPx(box.top);
896 divStyle.setProperty("height", HtmlUtils.toPx(box.height - borderWidth )); 898 divStyle.width = HtmlUtils.toPx(box.width - borderWidth);
897 divStyle.removeProperty("display"); 899 divStyle.height = HtmlUtils.toPx(box.height - borderWidth);
898 } else { 900 divStyle.removeProperty("display");
899 divStyle.setProperty("display", "none"); 901 } else {
900 } 902 divStyle.setProperty("display", "none");
903 }
904 };
901 }); 905 });
902 } 906 }
903 } 907 }
904 908
905 void _formulaCellSelectingRememberSelectionRange() { 909 void _formulaCellSelectingRememberSelectionRange() {
906 _formulaCellSelectingTextStart = _formulaInput.selectionStart; 910 _formulaCellSelectingTextStart = _formulaInput.selectionStart;
907 _formulaCellSelectingTextEnd = _formulaInput.selectionEnd; 911 _formulaCellSelectingTextEnd = _formulaInput.selectionEnd;
908 } 912 }
909 913
910 void _formulaCellSelectingSelectText() { 914 void _formulaCellSelectingSelectText() {
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1067 1071
1068 // Return the number of _rows currently being displayed (not counting the colu mn header row) 1072 // Return the number of _rows currently being displayed (not counting the colu mn header row)
1069 int _getVisibleTableHeight() => _getShiftedRowEnd(_rowShift + _rows, _rowShift ); 1073 int _getVisibleTableHeight() => _getShiftedRowEnd(_rowShift + _rows, _rowShift );
1070 1074
1071 // Return the number of _columns currently being displayed (not counting the r ow header column) 1075 // Return the number of _columns currently being displayed (not counting the r ow header column)
1072 int _getVisibleTableWidth() => _getShiftedColumnEnd(_columnShift + _columns, _ columnShift); 1076 int _getVisibleTableWidth() => _getShiftedColumnEnd(_columnShift + _columns, _ columnShift);
1073 1077
1074 // Resize the formula input field to fit the contained text 1078 // Resize the formula input field to fit the contained text
1075 void _growFormulaInput() { 1079 void _growFormulaInput() {
1076 _formulaInputMeasure.text = _formulaInput.value; 1080 _formulaInputMeasure.text = _formulaInput.value;
1077 _formulaInputMeasure.rect.then((ElementRect rect) { 1081 window.requestMeasurementFrame(() {
1078 int textWidth = rect.client.width; 1082 int textWidth = _formulaInputMeasure.rect.client.width;
1079 int width = Math.max(textWidth + 25, _formulaCellWidth); 1083 int width = Math.max(textWidth + 25, _formulaCellWidth);
1080 _formulaDiv.style.setProperty("width", HtmlUtils.toPx(width)); 1084 return () {
1081 _formulaInput.style.setProperty("width", HtmlUtils.toPx(width)); 1085 _formulaDiv.style.width = HtmlUtils.toPx(width);
1086 _formulaInput.style.width = HtmlUtils.toPx(width);
1087 };
1082 }); 1088 });
1083 } 1089 }
1084 1090
1085 // Fade out the formula input field 1091 // Fade out the formula input field
1086 void _hideFormula() { 1092 void _hideFormula() {
1087 _hideFormulaCellSelecting(); 1093 _hideFormulaCellSelecting();
1088 _formulaEditing = false; 1094 _formulaEditing = false;
1089 _formulaDiv.classes.remove("fadeIn"); 1095 _formulaDiv.classes.remove("fadeIn");
1090 _formulaDiv.classes.add("fadeOut"); 1096 _formulaDiv.classes.add("fadeOut");
1091 } 1097 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1140 // update table row and column headers 1146 // update table row and column headers
1141 void _redrawHeaders() { 1147 void _redrawHeaders() {
1142 _setTableWidth(_getVisibleTableWidth()); 1148 _setTableWidth(_getVisibleTableWidth());
1143 _tableSizeChanged(); 1149 _tableSizeChanged();
1144 1150
1145 _table.redrawHeaders(_selectionManager, _rows, _columns, _rowShift, _columnS hift, 1151 _table.redrawHeaders(_selectionManager, _rows, _columns, _rowShift, _columnS hift,
1146 _cellDisplay); 1152 _cellDisplay);
1147 } 1153 }
1148 1154
1149 void _refreshResizeDragger() { 1155 void _refreshResizeDragger() {
1150 _table.rect.then((ElementRect elementRect) { 1156 window.requestMeasurementFrame(() {
1151 // We may be called before the dragger is ready 1157 // We may be called before the dragger is ready
1152 if (_resizeDragger == null) { 1158 if (_resizeDragger == null) {
1153 return; 1159 return;
1154 } 1160 }
1155 ClientRect rect = elementRect.bounding; 1161 ClientRect rect = _table.rect.bounding;
1156 1162 return () {
1157 _resizeDragger.style.setProperty("left", HtmlUtils.toPx(rect.width)); 1163 _resizeDragger.style.setProperty("left", HtmlUtils.toPx(rect.width));
1158 _resizeDragger.style.setProperty("top", HtmlUtils.toPx(rect.height)); 1164 _resizeDragger.style.setProperty("top", HtmlUtils.toPx(rect.height));
1165 };
1159 }); 1166 });
1160 } 1167 }
1161 1168
1162 // Remove the HTML elements corresponding to the given column 1169 // Remove the HTML elements corresponding to the given column
1163 void _removeTableColumnHtml(int col) { 1170 void _removeTableColumnHtml(int col) {
1164 _table.removeColumn(col); 1171 _table.removeColumn(col);
1165 int width = _spreadsheet.getColumnWidth(col); 1172 int width = _spreadsheet.getColumnWidth(col);
1166 _setTableWidth(_tableWidth - width); 1173 _setTableWidth(_tableWidth - width);
1167 } 1174 }
1168 1175
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
1460 setDrag(COL, false); 1467 setDrag(COL, false);
1461 } 1468 }
1462 }); 1469 });
1463 1470
1464 // The inline cell editing UI is displayed when a user makes the same single 1471 // The inline cell editing UI is displayed when a user makes the same single
1465 // cell selection over again. We keep track of the current single cell that 1472 // cell selection over again. We keep track of the current single cell that
1466 // is selected here to know when to enter edit mode. 1473 // is selected here to know when to enter edit mode.
1467 CellLocation currentSelectedSingleCell = null; 1474 CellLocation currentSelectedSingleCell = null;
1468 1475
1469 void mouseMove(MouseEvent e) { 1476 void mouseMove(MouseEvent e) {
1470 _table.rect.then((ElementRect rect) { 1477 window.requestMeasurementFrame(() {
1471 // Set x and y to the mouse coordinates, relative to the top left of 1478 // Set x and y to the mouse coordinates, relative to the top left of
1472 // the spreadsheet table. 1479 // the spreadsheet table.
1473 ClientRect boundingRect = rect.bounding; 1480 ClientRect boundingRect = _table.rect.bounding;
1474 int scrollOffsetX = -boundingRect.left.toInt(); 1481 int scrollOffsetX = -boundingRect.left.toInt();
1475 int scrollOffsetY = -boundingRect.top.toInt(); 1482 int scrollOffsetY = -boundingRect.top.toInt();
1476 x = e.x + scrollOffsetX; 1483 x = e.x + scrollOffsetX;
1477 y = e.y + scrollOffsetY; 1484 y = e.y + scrollOffsetY;
1478 1485
1479 // Update the dragger position and optionally the actual row/column size 1486 // Update the dragger position and optionally the actual row/column size
1480 if (dragRowColumn(false)) { 1487 if (dragRowColumn(false)) {
1481 return; 1488 return;
1482 } 1489 }
1483 1490
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1532 }); 1539 });
1533 } 1540 }
1534 1541
1535 _setMove(mouseMove); 1542 _setMove(mouseMove);
1536 1543
1537 _table.on.mouseDown.add((MouseEvent e) { 1544 _table.on.mouseDown.add((MouseEvent e) {
1538 _moveToTop(); 1545 _moveToTop();
1539 1546
1540 // Right click toggles and positions the context menu 1547 // Right click toggles and positions the context menu
1541 if (e.button == 2 || (e.button == 0 && e.ctrlKey)) { 1548 if (e.button == 2 || (e.button == 0 && e.ctrlKey)) {
1542 _table.rect.then((ElementRect rect) { 1549 window.requestMeasurementFrame(() {
1543 ClientRect boundingRect = rect.bounding; 1550 ClientRect boundingRect = _table.rect.bounding;
1544 int scrollOffsetX = -boundingRect.left; 1551 return () {
1545 int scrollOffsetY = -boundingRect.top; 1552 int scrollOffsetX = -boundingRect.left;
1546 _contextMenu.show(e.x + scrollOffsetX, e.y + scrollOffsetY); 1553 int scrollOffsetY = -boundingRect.top;
1554 _contextMenu.show(e.x + scrollOffsetX, e.y + scrollOffsetY);
1555 };
1547 }); 1556 });
1548 return; 1557 return;
1549 } 1558 }
1550 1559
1551 _setDragFunction(mouseMove); 1560 _setDragFunction(mouseMove);
1552 1561
1553 _setUndragFunction((MouseEvent e_) { 1562 _setUndragFunction((MouseEvent e_) {
1554 dragRowColumn(true); 1563 dragRowColumn(true);
1555 _table.setDefaultCursor(); 1564 _table.setDefaultCursor();
1556 draggingSelection = false; 1565 draggingSelection = false;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1678 } 1687 }
1679 _activeInnerMenu = new InnerMenuView(_window, row, _selectionManager, style, 1688 _activeInnerMenu = new InnerMenuView(_window, row, _selectionManager, style,
1680 _spreadsheet.layout.getRowHeight(rowIndex), 1689 _spreadsheet.layout.getRowHeight(rowIndex),
1681 (){ _tableSizeChanged(); }, 1690 (){ _tableSizeChanged(); },
1682 (){ _hideInnerMenu(true); _repositionFormulaInput(null, false); }); 1691 (){ _hideInnerMenu(true); _repositionFormulaInput(null, false); });
1683 _innerMenuRowIndex = rowIndex; 1692 _innerMenuRowIndex = rowIndex;
1684 } 1693 }
1685 1694
1686 // Update the scroll mechanism due to a change in the visible table area 1695 // Update the scroll mechanism due to a change in the visible table area
1687 void _tableSizeChanged() { 1696 void _tableSizeChanged() {
1688 _table.rect.then((ElementRect elementRect) { 1697 window.requestMeasurementFrame(() {
1689 ClientRect rect = elementRect.bounding; 1698 ClientRect rect = _table.rect.bounding;
1699 return () {
1700 _tableScrollContainer.style.width = HtmlUtils.toPx(rect.width + 10);
1701 _spreadsheetElement.style.width = HtmlUtils.toPx(rect.width);
1690 1702
1691 _tableScrollContainer.style.width = HtmlUtils.toPx(rect.width + 10); 1703 _tableScrollContainer.style.height = HtmlUtils.toPx(rect.height + 10);
1692 _spreadsheetElement.style.width = HtmlUtils.toPx(rect.width); 1704 _spreadsheetElement.style.height = HtmlUtils.toPx(rect.height);
1693 1705
1694 _tableScrollContainer.style.height = HtmlUtils.toPx(rect.height + 10); 1706 _tableScrollDiv.style.width = HtmlUtils.toPx(
1695 _spreadsheetElement.style.height = HtmlUtils.toPx(rect.height); 1707 _spreadsheet.getColumnEnd(_spreadsheet.columnCount()));
1708 int extra = _activeInnerMenu == null ?
1709 0 : _activeInnerMenu.currentRowHeight;
1710 _tableScrollDiv.style.height = HtmlUtils.toPx(_spreadsheet.getRowEnd(
1711 _spreadsheet.rowCount()) + extra);
1696 1712
1697 _tableScrollDiv.style.width = HtmlUtils.toPx( 1713 // Reposition the scroll bars
1698 _spreadsheet.getColumnEnd(_spreadsheet.columnCount())); 1714 _scroll(_rowShift, _columnShift);
1699 int extra = _activeInnerMenu == null ? 1715 // Move the resize dragger to the bottom-right corner
1700 0 : _activeInnerMenu.currentRowHeight; 1716 _refreshResizeDragger();
1701 _tableScrollDiv.style.height = HtmlUtils.toPx(_spreadsheet.getRowEnd( 1717 };
1702 _spreadsheet.rowCount()) + extra);
1703
1704 // Reposition the scroll bars
1705 _scroll(_rowShift, _columnShift);
1706 // Move the resize dragger to the bottom-right corner
1707 _refreshResizeDragger();
1708 }); 1718 });
1709 } 1719 }
1710 1720
1711 void _updateInnerMenu() { 1721 void _updateInnerMenu() {
1712 if (_activeInnerMenu != null) { 1722 if (_activeInnerMenu != null) {
1713 _activeInnerMenu.updateSize(); 1723 _activeInnerMenu.updateSize();
1714 } 1724 }
1715 } 1725 }
1716 1726
1717 // Change the width/height of a column or row. 1727 // Change the width/height of a column or row.
1718 void _updateRowColumnSize(int rowOrCol, int index, int size, int oldSize, bool mouseUp) { 1728 void _updateRowColumnSize(int rowOrCol, int index, int size, int oldSize, bool mouseUp) {
1719 if (mouseUp) { 1729 if (mouseUp) {
1720 Command command = new ResizeRowColumnCommand(_spreadsheet, rowOrCol, index , size, oldSize); 1730 Command command = new ResizeRowColumnCommand(_spreadsheet, rowOrCol, index , size, oldSize);
1721 _spreadsheet.execute(command); 1731 _spreadsheet.execute(command);
1722 } else { 1732 } else {
1723 if (rowOrCol == COL) { 1733 if (rowOrCol == COL) {
1724 _spreadsheet.setColumnWidth(index, size); 1734 _spreadsheet.setColumnWidth(index, size);
1725 } else { 1735 } else {
1726 _spreadsheet.setRowHeight(index, size); 1736 _spreadsheet.setRowHeight(index, size);
1727 } 1737 }
1728 } 1738 }
1729 } 1739 }
1730 } 1740 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698