spreadsheet

This commit is contained in:
Vadim Lopatin 2015-11-30 14:52:42 +03:00
parent 2dbb69b5a6
commit efeb1b94d4
2 changed files with 48 additions and 8 deletions

View File

@ -60,7 +60,7 @@ class SpreadSheetView : StringGridWidget {
}
}
class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler {
class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler, CellSelectedHandler, CellActivatedHandler, ViewScrolledHandler {
SheetEditControl _editControl;
SheetTabs _tabs;
@ -106,10 +106,10 @@ class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler {
_viewBottomLeft = new SpreadSheetView("sheetViewBottomLeft");
_viewBottomRight = new SpreadSheetView("sheetViewBottomRight");
_viewTopRight.headerCols = 0;
_viewBottomLeft.headerRows = 0;
_viewBottomRight.headerCols = 0;
_viewBottomRight.headerRows = 0;
_viewTopRight.setColWidth(0, 0);
_viewBottomLeft.setRowHeight(0, 0);
_viewBottomRight.setRowHeight(0, 0);
_viewBottomRight.setColWidth(0, 0);
_views[0] = _viewTopLeft;
_views[1] = _viewTopRight;
@ -132,6 +132,11 @@ class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler {
foreach(sb; _scrollbars)
sb.onScrollEventListener = this;
foreach(view; _views) {
view.cellSelected = this;
view.cellActivated = this;
view.viewScrolled = this;
}
}
/// Measure widget according to desired width and height constraints. (Step 1 of two phase layout).
@ -198,4 +203,21 @@ class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler {
}
return true;
}
/// Callback for handling of cell selection
void onCellSelected(GridWidgetBase source, int col, int row) {
foreach(view; _views) {
if (source != view)
view.selectCell(col + view.headerCols, row + view.headerRows, false, source, false);
}
}
/// Callback for handling of cell double click or Enter key press
void onCellActivated(GridWidgetBase source, int col, int row) {
}
/// Callback for handling of view scroll (top left visible cell change)
void onViewScrolled(GridWidgetBase source, int col, int row) {
}
}

View File

@ -225,6 +225,11 @@ interface CellActivatedHandler {
void onCellActivated(GridWidgetBase source, int col, int row);
}
/// Callback for handling of view scroll (top left visible cell change)
interface ViewScrolledHandler {
void onViewScrolled(GridWidgetBase source, int col, int row);
}
/// Abstract grid widget
class GridWidgetBase : ScrollWidgetBase {
/// Callback to handle selection change
@ -237,6 +242,9 @@ class GridWidgetBase : ScrollWidgetBase {
/// cellActivated signal alias for backward compatibility; will be deprecated in future
alias onCellActivated = cellActivated;
/// Callback for handling of view scroll (top left visible cell change)
Listener!ViewScrolledHandler viewScrolled;
protected CustomGridCellAdapter _customCellAdapter;
/// Get adapter to override drawing of some particular cells
@ -414,6 +422,10 @@ class GridWidgetBase : ScrollWidgetBase {
return _colWidths[x];
}
void setColWidth(int x, int w) {
_colWidths[x] = w;
}
/// returns row height (index includes col/row headers, if any); returns 0 for riws hidden by scroll at the top
int rowHeight(int y) {
if (y >= _headerRows + _fixedRows && y < _headerRows + _fixedRows + _scrollRow)
@ -421,6 +433,10 @@ class GridWidgetBase : ScrollWidgetBase {
return _rowHeights[y];
}
void setRowHeight(int y, int w) {
_rowHeights[y] = w;
}
/// returns cell rectangle relative to client area; row 0 is col headers row; col 0 is row headers column
Rect cellRect(int x, int y) {
Rect rc;
@ -623,7 +639,9 @@ class GridWidgetBase : ScrollWidgetBase {
}
/// move selection to specified cell
bool selectCell(int col, int row, bool makeVisible = true) {
bool selectCell(int col, int row, bool makeVisible = true, GridWidgetBase source = null, bool needNotification = true) {
if (source is null)
source = this;
if (_col == col && _row == row)
return false; // same position
if (col < _headerCols || row < _headerRows || col >= _cols || row >= _rows)
@ -634,8 +652,8 @@ class GridWidgetBase : ScrollWidgetBase {
calcScrollableAreaPos();
if (makeVisible)
makeCellVisible(_col, _row);
if (onCellSelected.assigned)
onCellSelected(this, _col - _headerCols, _row - _headerRows);
if (needNotification && onCellSelected.assigned)
onCellSelected(source, _col - _headerCols, _row - _headerRows);
return true;
}