/******************************************************************************* * Copyright (c) 2012, 2017 Original authors and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Original authors and others - initial API and implementation ******************************************************************************/ package org.eclipse.nebula.widgets.nattable.search.strategy; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.regex.PatternSyntaxException; import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate; import org.eclipse.nebula.widgets.nattable.layer.ILayer; import org.eclipse.nebula.widgets.nattable.search.ISearchDirection; public class RowSearchStrategy extends AbstractSearchStrategy { private int[] rowPositions; private int startingColumnPosition; private final String searchDirection; private final IConfigRegistry configRegistry; public RowSearchStrategy(int[] rowPositions, IConfigRegistry configRegistry) { this(rowPositions, 0, configRegistry, ISearchDirection.SEARCH_FORWARD); } public RowSearchStrategy(int[] rowPositions, int startingColumnPosition, IConfigRegistry configRegistry, String searchDirection) { this.rowPositions = rowPositions; this.startingColumnPosition = startingColumnPosition; this.configRegistry = configRegistry; this.searchDirection = searchDirection; } @Override public PositionCoordinate executeSearch(Object valueToMatch) throws PatternSyntaxException { @SuppressWarnings("unchecked") Comparator<String> comparator = (Comparator<String>) getComparator(); return CellDisplayValueSearchUtil.findCell( getContextLayer(), this.configRegistry, getRowCellsToSearch(getContextLayer()), valueToMatch, comparator, isCaseSensitive(), isWholeWord(), isRegex(), isIncludeCollapsed()); } public void setStartingColumnPosition(int startingColumnPosition) { this.startingColumnPosition = startingColumnPosition; } public void setRowPositions(int[] rowPositions) { this.rowPositions = rowPositions; } protected PositionCoordinate[] getRowCellsToSearch(ILayer contextLayer) { List<PositionCoordinate> cellsToSearch = new ArrayList<PositionCoordinate>(); int columnPosition = this.startingColumnPosition; // See how many columns we can add, depends on where the search is // starting from final int columnCount = contextLayer.getColumnCount(); int width; if (this.searchDirection.equals(ISearchDirection.SEARCH_FORWARD)) { width = columnCount - this.startingColumnPosition; } else { width = this.startingColumnPosition; } for (int rowIndex = 0; rowIndex < this.rowPositions.length; rowIndex++) { final int startingRowPosition = this.rowPositions[rowIndex]; if (this.searchDirection.equals(ISearchDirection.SEARCH_BACKWARDS)) { cellsToSearch.addAll(CellDisplayValueSearchUtil.getDescendingCellCoordinatesRowFirst( getContextLayer(), columnPosition, startingRowPosition, width, 1)); columnPosition = columnCount - 1; } else { cellsToSearch.addAll(CellDisplayValueSearchUtil.getCellCoordinatesRowFirst( getContextLayer(), columnPosition, startingRowPosition, width, 1)); columnPosition = 0; } width = columnCount; // After first row is set, start the next row from the top } return cellsToSearch.toArray(new PositionCoordinate[0]); } }