blob: d06ead06f1fe5406be0aa15d7b075a71c7e81e04 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2020 Original authors and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Original authors and others - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.search.command;
import org.eclipse.nebula.widgets.nattable.command.ILayerCommandHandler;
import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate;
import org.eclipse.nebula.widgets.nattable.layer.ILayer;
import org.eclipse.nebula.widgets.nattable.layer.ILayerListener;
import org.eclipse.nebula.widgets.nattable.search.event.SearchEvent;
import org.eclipse.nebula.widgets.nattable.search.strategy.AbstractSearchStrategy;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
import org.eclipse.nebula.widgets.nattable.selection.command.SelectCellCommand;
public class SearchGridCellsCommandHandler implements ILayerCommandHandler<SearchCommand> {
private final SelectionLayer selectionLayer;
private PositionCoordinate searchResultCellCoordinate;
public SearchGridCellsCommandHandler(SelectionLayer selectionLayer) {
this.selectionLayer = selectionLayer;
}
@Override
public Class<SearchCommand> getCommandClass() {
return SearchCommand.class;
}
@Override
public boolean doCommand(ILayer targetLayer, SearchCommand searchCommand) {
searchCommand.convertToTargetLayer(targetLayer);
final ILayerListener searchEventListener = searchCommand.getSearchEventListener();
if (searchEventListener != null) {
this.selectionLayer.addLayerListener(searchEventListener);
}
try {
PositionCoordinate anchor = this.selectionLayer.getSelectionAnchor();
if (anchor.columnPosition < 0 || anchor.rowPosition < 0) {
anchor = new PositionCoordinate(this.selectionLayer, 0, 0);
}
Object dataValueToFind = null;
if ((dataValueToFind = searchCommand.getSearchText()) == null) {
dataValueToFind = this.selectionLayer.getDataValueByPosition(anchor.columnPosition, anchor.rowPosition);
}
boolean performActionOnResult = true;
if (searchCommand.getSearchStrategy() instanceof AbstractSearchStrategy) {
AbstractSearchStrategy searchStrategy = (AbstractSearchStrategy) searchCommand.getSearchStrategy();
searchStrategy.setContextLayer(targetLayer);
searchStrategy.setCaseSensitive(searchCommand.isCaseSensitive());
searchStrategy.setWrapSearch(searchCommand.isWrapSearch());
searchStrategy.setWholeWord(searchCommand.isWholeWord());
searchStrategy.setIncremental(searchCommand.isIncremental());
searchStrategy.setRegex(searchCommand.isRegex());
searchStrategy.setIncludeCollapsed(searchCommand.isIncludeCollapsed());
searchStrategy.setSearchDirection(searchCommand.getSearchDirection());
searchStrategy.setComparator(searchCommand.getComparator());
performActionOnResult = !searchStrategy.processResultInternally();
}
this.searchResultCellCoordinate = searchCommand.getSearchStrategy().executeSearch(dataValueToFind);
this.selectionLayer.fireLayerEvent(new SearchEvent(this.searchResultCellCoordinate));
if (performActionOnResult && this.searchResultCellCoordinate != null) {
final SelectCellCommand command = new SelectCellCommand(
this.selectionLayer,
this.searchResultCellCoordinate.columnPosition,
this.searchResultCellCoordinate.rowPosition,
false,
false);
command.setForcingEntireCellIntoViewport(true);
this.selectionLayer.doCommand(command);
}
} finally {
if (searchEventListener != null) {
this.selectionLayer.removeLayerListener(searchEventListener);
}
}
return true;
}
public PositionCoordinate getSearchResultCellCoordinate() {
return this.searchResultCellCoordinate;
}
}