package com.vaadin.addon.spreadsheet;
import java.io.Serializable;
import java.util.WeakHashMap;
import org.apache.poi.ss.usermodel.Sheet;
/**
* This Class keeps the last state of selected cell or selected range.
* <p>
* NOTICE 1: It ignores individualSelectedCells, moreover, just last range
* or last selected cell is considered depends on which one happens later.
*/
class SheetState implements Serializable {
private static Spreadsheet spreadSheet;
private static WeakHashMap<Sheet, String> selectedCells = new WeakHashMap<Sheet, String>();
SheetState(final Spreadsheet spreadSheet) {
this.spreadSheet = spreadSheet;
spreadSheet.addSelectionChangeListener(new Spreadsheet.SelectionChangeListener() {
@Override
public void onSelectionChange(Spreadsheet.SelectionChangeEvent event) {
String lastSelectionState = extractStrCellRef(event);
selectedCells.put(spreadSheet.getActiveSheet(), lastSelectionState);
}
});
}
/**
* @param event selection event
* @return last selected cell or range.
*/
private String extractStrCellRef(Spreadsheet.SelectionChangeEvent event) {
String selectedCellRef = event.getSelectedCellReference().getCellRefParts()[2] + event
.getSelectedCellReference().getCellRefParts()[1];
// Hackish way to check whether the last selection is cellSelection or rangeSelection.
// Last selected range is considered.
if (!event.getCellRangeAddresses().isEmpty()) {
String lastSelectedRange = event.getCellRangeAddresses().get(event.getCellRangeAddresses().size() - 1).formatAsString();
if (selectedCellRef.equals(lastSelectedRange.substring(0, lastSelectedRange.indexOf(':'))) || selectedCellRef.equals(lastSelectedRange.substring(lastSelectedRange.indexOf(':') + 1))) {
selectedCellRef = lastSelectedRange;
}
}
return selectedCellRef;
}
public String getSelectedCellsOnSheet(Sheet sheetIdx) {
return selectedCells.get(sheetIdx);
}
public void clear() {
selectedCells.clear();
}
}