Java tutorial
/* * Copyright 2017 Crown Copyright * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package stroom.explorer.client.presenter; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.resources.client.CssResource; import com.google.gwt.user.cellview.client.AbstractCellTable; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.view.client.CellPreviewEvent; import stroom.dispatch.client.ClientDispatchAsync; import stroom.explorer.client.event.ShowExplorerMenuEvent; import stroom.explorer.client.view.ExplorerTickBoxCell; import stroom.explorer.shared.ExplorerData; import stroom.explorer.shared.FetchExplorerDataResult; import stroom.util.shared.HasNodeState; import stroom.widget.spinner.client.SpinnerSmall; import stroom.widget.util.client.DoubleSelectTest; import stroom.widget.util.client.MultiSelectEvent; import java.util.List; public class ExplorerTickBoxTree extends AbstractExporerTree { private final ExplorerTreeModel treeModel; private final TickBoxSelectionModel selectionModel; private final CellTable<ExplorerData> cellTable; private final DoubleSelectTest doubleClickTest = new DoubleSelectTest(); private String expanderClassName; private String tickBoxClassName; public ExplorerTickBoxTree(final ClientDispatchAsync dispatcher) { final SpinnerSmall spinnerSmall = new SpinnerSmall(); spinnerSmall.getElement().getStyle().setPosition(Style.Position.ABSOLUTE); spinnerSmall.getElement().getStyle().setRight(5, Style.Unit.PX); spinnerSmall.getElement().getStyle().setTop(5, Style.Unit.PX); selectionModel = new TickBoxSelectionModel(); final ExplorerTickBoxCell explorerCell = new ExplorerTickBoxCell(selectionModel); expanderClassName = explorerCell.getExpanderClassName(); tickBoxClassName = explorerCell.getTickBoxClassName(); final ExplorerTreeResources resources = GWT.create(ExplorerTreeResources.class); cellTable = new CellTable<>(Integer.MAX_VALUE, resources); cellTable.setWidth("100%"); cellTable.addColumn(new Column<ExplorerData, ExplorerData>(explorerCell) { @Override public ExplorerData getValue(ExplorerData object) { return object; } }); cellTable.setLoadingIndicator(null); cellTable.setSelectionModel(null, new MySelectionEventManager(cellTable)); cellTable.setKeyboardSelectionPolicy(HasKeyboardSelectionPolicy.KeyboardSelectionPolicy.DISABLED); cellTable.getRowContainer().getStyle().setCursor(Style.Cursor.POINTER); treeModel = new ExplorerTreeModel(this, spinnerSmall, dispatcher) { @Override protected void onDataChanged(final FetchExplorerDataResult result) { super.onDataChanged(result); selectionModel.setTreeStructure(result.getTreeStructure()); } }; final ScrollPanel scrollPanel = new ScrollPanel(); scrollPanel.setWidth("100%"); scrollPanel.setHeight("100%"); scrollPanel.setWidget(cellTable); final FlowPanel flowPanel = new FlowPanel(); flowPanel.getElement().getStyle().setPosition(Style.Position.RELATIVE); flowPanel.setWidth("100%"); flowPanel.setHeight("100%"); flowPanel.add(scrollPanel); flowPanel.add(spinnerSmall); initWidget(flowPanel); } @Override void setData(final List<ExplorerData> rows) { cellTable.setRowData(0, rows); cellTable.setRowCount(rows.size(), true); } // protected void select(final ExplorerData selection) { // final boolean doubleClick = doubleClickTest.test(selection); // select(selection, doubleClick); // } // // protected void select(final ExplorerData selection, final boolean doubleClick) { // selectedItem = selection; // if (selection != null) { // ExplorerTreeSelectEvent.fire(ExplorerTickBoxTree.this, selection, doubleClick, false); // } // } // // public void setIncludedTypeSet(final Set<String> types) { // treeModel.setIncludedTypeSet(types); // refresh(); // } public void changeNameFilter(final String name) { treeModel.changeNameFilter(name); } public void refresh() { treeModel.refresh(); } private boolean hasClassName(final Element element, final String className, final int depth, final int maxDepth) { if (element == null) { return false; } if (element.hasClassName(className)) { return true; } if (depth < maxDepth) { return hasClassName(element.getParentElement(), className, depth + 1, maxDepth); } return false; } private void onKeyDown(final int keyCode) { switch (keyCode) { case KeyCodes.KEY_LEFT: setOpenState(false); break; case KeyCodes.KEY_RIGHT: setOpenState(true); break; // case KeyCodes.KEY_UP: // moveSelection(-1); // break; // case KeyCodes.KEY_DOWN: // moveSelection(+1); // break; case KeyCodes.KEY_ENTER: selectCurrent(); break; } } private void setOpenState(boolean open) { final ExplorerData selected = getKeyBoardSelected(); if (selected != null) { if (open) { if (!treeModel.getOpenItems().contains(selected)) { treeModel.toggleOpenState(selected); refresh(); } } else { if (treeModel.getOpenItems().contains(selected)) { treeModel.toggleOpenState(selected); refresh(); } } } } private void selectCurrent() { final ExplorerData selected = getKeyBoardSelected(); if (selected != null) { toggleSelection(selected); } } private ExplorerData getKeyBoardSelected() { final int row = cellTable.getKeyboardSelectedRow(); if (row >= 0) { return cellTable.getVisibleItem(row); } return null; } @Override void setInitialSelectedItem(final ExplorerData selection) { // doSelect(selection); } // private void moveSelection(int plus) { // ExplorerData currentSelection = getKeyBoardSelected(); // if (currentSelection == null) { // selectFirstItem(); // } else { // final int index = getItemIndex(currentSelection); // if (index == -1) { // selectFirstItem(); // } else { // final ExplorerData newSelection = cellTable.getVisibleItem(index + plus); // if (newSelection != null) { // setSelectedItem(newSelection); // } else { // selectFirstItem(); // } // } // } // } // // private void selectFirstItem() { // final ExplorerData firstItem = cellTable.getVisibleItem(0); // setSelectedItem(firstItem); // } // // private int getItemIndex(ExplorerData item) { // final List<ExplorerData> items = cellTable.getVisibleItems(); // if (items != null) { // for (int i = 0; i < items.size(); i++) { // if (EqualsUtil.isEquals(items.get(i), item)) { // return i; // } // } // } // // return -1; // } private void toggleSelection(final ExplorerData selection) { if (selection != null) { selectionModel.setSelected(selection, !selectionModel.isSelected(selection)); // } else { // selectionModel.clear(); } // ExplorerTreeSelectEvent.fire(ExplorerTickBoxTree.this, selectionModel, false, false); } public ExplorerTreeModel getTreeModel() { return treeModel; } public TickBoxSelectionModel getSelectionModel() { return selectionModel; } // protected void setSelectedItem(final ExplorerData selection) { // doSelect(selection, false, false); // } // // private void setSelectedItemWithDoubleClickTest(final ExplorerData selection) { // final boolean doubleClick = doubleClickTest.test(selection); // doSelect(selection, doubleClick, false); // } // // protected void doSelect(final ExplorerData selection, final boolean doubleClick, final boolean rightClick) { // if (selection != null) { // selectionModel.setSelected(selection, true); //// } else { //// selectionModel.clear(); // } // ExplorerTreeSelectEvent.fire(ExplorerTickBoxTree.this, selection, doubleClick, rightClick); // } public HandlerRegistration addSelectionHandler(final MultiSelectEvent.Handler handler) { return addHandler(handler, MultiSelectEvent.getType()); } // // public ExplorerData getSelectedItem() { // return selectedItem; // } public HandlerRegistration addContextMenuHandler(final ShowExplorerMenuEvent.Handler handler) { return addHandler(handler, ShowExplorerMenuEvent.getType()); } public void setFocus(final boolean focused) { cellTable.setFocus(focused); } @CssResource.ImportedWithPrefix("gwt-CellTable") public interface ExplorerTreeStyle extends CellTable.Style { String DEFAULT_CSS = "stroom/explorer/client/view/ExplorerTree.css"; } public interface ExplorerTreeResources extends CellTable.Resources { @Override @Source(ExplorerTreeStyle.DEFAULT_CSS) ExplorerTreeStyle cellTableStyle(); } private class MySelectionEventManager extends AbstractCellTable.CellTableKeyboardSelectionHandler<ExplorerData> { MySelectionEventManager(AbstractCellTable<ExplorerData> table) { super(table); } @Override public void onCellPreview(CellPreviewEvent<ExplorerData> event) { final NativeEvent nativeEvent = event.getNativeEvent(); final String type = nativeEvent.getType(); if ("click".equals(type)) { final int button = nativeEvent.getButton(); final ExplorerData selectedItem = event.getValue(); if (selectedItem != null) { if ((button & NativeEvent.BUTTON_LEFT) != 0) { final Element element = event.getNativeEvent().getEventTarget().cast(); if (hasClassName(element, tickBoxClassName, 0, 5)) { toggleSelection(selectedItem); super.onCellPreview(event); refresh(); } else if (HasNodeState.NodeState.LEAF.equals(selectedItem.getNodeState())) { toggleSelection(selectedItem); super.onCellPreview(event); } else if (hasClassName(element, expanderClassName, 0, 1)) { super.onCellPreview(event); treeModel.toggleOpenState(selectedItem); refresh(); } } } } else if ("keydown".equals(type)) { final int keyCode = nativeEvent.getKeyCode(); onKeyDown(keyCode); super.onCellPreview(event); } else { super.onCellPreview(event); } } } }