/* * Copyright 2006-2017 ICEsoft Technologies Canada Corp. * * 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 org.icepdf.core.search; import org.icepdf.core.pobjects.graphics.text.LineText; import org.icepdf.core.pobjects.graphics.text.PageText; import org.icepdf.core.pobjects.graphics.text.WordText; import java.util.ArrayList; import java.util.List; /** * Document search controller interface for content text searches * * @since 4.0 */ public interface DocumentSearchController { /** * Searches the given page using the specified term and properties. The * search model is updated to store the pages Page text as a weak reference * which can be queried using isSearchHighlightNeeded to efficiently make * sure that a pages text is highlighted even after a despose/init cycle. * If the text state is no longer present then the search should be executed * again. * <br> * This method clears the search results for the page before it searches. If * you wish to have cumulative search results then searches terms should * be added with {@link #addSearchTerm(String, boolean, boolean)} and the * method {@link #searchPage(int)} should be called after each term is * added or after all have been added. * * @param pageIndex page to search * @param caseSensitive if true use case sensitive searches * @param wholeWord if true use whole word searches * @param term term to search for * @return number for hits for this page. */ int searchHighlightPage(int pageIndex, String term, boolean caseSensitive, boolean wholeWord); /** * Searches the page index given the search terms that have been added * with {@link #addSearchTerm(String, boolean, boolean)}. If search * hits where detected then the Page's PageText is added to the cache. * <br> * This method represent the core search algorithm for this * DocumentSearchController implementation. This method can be overridden * if a different search algorithm or functionality is needed. * * @param pageIndex page index to search * @return number of hits found for this page. */ int searchHighlightPage(int pageIndex); /** * Searches the page index given the search terms that have been added * with {@link #addSearchTerm(String, boolean, boolean)}. If search * hits where detected then the Page's PageText is added to the cache. * <br> * This class differences from {@link #searchHighlightPage(int)} in that * is returns a list of lineText fragments for each hit but the LinText * is padded by pre and post words that surround the hit in the page * context. * <br> * This method represent the core search algorithm for this * DocumentSearchController implementation. This method can be overridden * if a different search algorithm or functionality is needed. * * @param pageIndex page index to search * @param wordPadding word padding on either side of hit to give context * to found words in the returned LineText. Values should be greater than * zero * @return number of hits found for this page. */ List<LineText> searchHighlightPage(int pageIndex, int wordPadding); /** * Search page but only return words that are hits. Highlighting is till * applied but this method can be used if other data needs to be extracted * from the found words. * * @param pageIndex page to search * @return list of words that match the term and search properties. */ ArrayList<WordText> searchPage(int pageIndex); /** * Add the search term to the list of search terms. The term is split * into words based on white space and punctuation. No checks are done * for duplication. * <br> * A new search needs to be executed for this change to take place. * * @param term single word or phrase to search for. * @param caseSensitive is search case sensitive. * @param wholeWord is search whole word sensitive. * @return searchTerm newly create search term. */ SearchTerm addSearchTerm(String term, boolean caseSensitive, boolean wholeWord); /** * Removes the specified search term from the search. A new search needs * to be executed for this change to take place. * * @param searchTerm search term to remove. */ void removeSearchTerm(SearchTerm searchTerm); /** * Clear all searched items for specified page. * * @param pageIndex page index to clear */ void clearSearchHighlight(int pageIndex); /** * Clears all highlighted text states for this this document. This optimized * to use the the SearchHighlightModel to only clear pages that still have * selected states. */ void clearAllSearchHighlight(); /** * Test to see if a search highlight is needed. This is done by first * check if there is a hit for this page and if the PageText object is the * same as the one specified as a param. If they are not the same PageText * object then we need to do refresh as the page was disposed and * reinitialized with new content. * * @param pageIndex page index to text for restuls. * @param pageText current pageText object associated with the pageIndex. * @return true if refresh is needed, false otherwise. */ boolean isSearchHighlightRefreshNeeded(int pageIndex, PageText pageText); /** * Disposes controller clearing resources. */ void dispose(); }