com.openkm.frontend.client.widget.searchin.SearchControl.java Source code

Java tutorial

Introduction

Here is the source code for com.openkm.frontend.client.widget.searchin.SearchControl.java

Source

/**
 *
 *  No bytes were intentionally harmed during the development of this application.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *  
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package com.openkm.frontend.client.widget.searchin;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.openkm.frontend.client.Main;
import com.openkm.frontend.client.bean.GWTQueryParams;
import com.openkm.frontend.client.bean.form.GWTCheckBox;
import com.openkm.frontend.client.bean.form.GWTFormElement;
import com.openkm.frontend.client.bean.form.GWTInput;
import com.openkm.frontend.client.bean.form.GWTOption;
import com.openkm.frontend.client.bean.form.GWTSelect;
import com.openkm.frontend.client.bean.form.GWTSuggestBox;
import com.openkm.frontend.client.bean.form.GWTTextArea;
import com.openkm.frontend.client.constants.ui.UISearchConstants;
import com.openkm.frontend.client.service.OKMSearchService;
import com.openkm.frontend.client.service.OKMSearchServiceAsync;

/**
 * SearchControl
 * 
 * @author jllort
 *
 */
public class SearchControl extends Composite {
    private final OKMSearchServiceAsync searchService = (OKMSearchServiceAsync) GWT.create(OKMSearchService.class);
    public static final int SEARCH_MODE_SIMPLE = 0;
    public static final int SEARCH_MODE_ADVANCED = 1;
    public static final int RESULTS_VIEW_NORMAL = 0;
    public static final int RESULTS_VIEW_COMPACT = 1;

    private ScrollPanel scrollPanel;
    private FlexTable table;
    public Button searchButton;
    private Button saveSearchButton;
    private Button cleanButton;
    private TextBox searchSavedName;
    private GWTQueryParams params;
    public KeyUpHandler keyUpHandler;
    private boolean isUserNews = false;
    public ControlSearchIn controlSearch;
    private ListBox resultPage;
    HorizontalPanel searchTypePanel;
    public final CheckBox searchTypeAnd;
    public final CheckBox searchTypeOr;
    public CheckBox advancedView;
    public CheckBox compactResultsView;
    public CheckBox showPropertyGroups;
    public CheckBox saveUserNews;
    private HTML resultsPageText;
    private HTML searchTypeText;
    private int searchMode = SEARCH_MODE_SIMPLE;
    private int resultsViewMode = RESULTS_VIEW_COMPACT;
    private int minSearchCharacters = 3;

    /**
     * SearchControl
     */
    public SearchControl() {
        table = new FlexTable();
        table.setCellPadding(2);
        table.setCellSpacing(2);
        scrollPanel = new ScrollPanel(table);
        advancedView = new CheckBox(Main.i18n("search.view.advanced"));
        advancedView.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                if (advancedView.getValue()) {
                    clean();
                    switchSearchMode(SEARCH_MODE_ADVANCED);
                } else {
                    clean();
                    switchSearchMode(SEARCH_MODE_SIMPLE);
                }
            }
        });
        compactResultsView = new CheckBox(Main.i18n("search.view.compact.results"));
        compactResultsView.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                if (compactResultsView.getValue()) {
                    switchResultsViewMode(RESULTS_VIEW_COMPACT);
                    table.getCellFormatter().setVisible(2, 0, false); // hide view property groups
                } else {
                    switchResultsViewMode(RESULTS_VIEW_NORMAL);
                    table.getCellFormatter().setVisible(2, 0, true); // show view property groups
                }
            }
        });
        showPropertyGroups = new CheckBox(Main.i18n("search.view.propety.groups"));
        showPropertyGroups.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                if (searchButton.isEnabled()) {
                    executeSearch();
                }
            }
        });
        saveUserNews = new CheckBox(Main.i18n("search.save.as.news"));
        searchSavedName = new TextBox();
        searchSavedName.setWidth("200");
        controlSearch = new ControlSearchIn();
        resultPage = new ListBox();
        resultPage.addItem("10", "10");
        resultPage.addItem("20", "20");
        resultPage.addItem("30", "30");
        resultPage.addItem("50", "50");
        resultPage.addItem("100", "100");

        keyUpHandler = new KeyUpHandler() {
            @Override
            public void onKeyUp(KeyUpEvent event) {
                evaluateSearchButtonVisible();

                if (KeyCodes.KEY_ENTER == event.getNativeKeyCode() && searchButton.isEnabled()) {
                    executeSearch();
                }
            }
        };

        searchButton = new Button(Main.i18n("button.search"), new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                executeSearch();
            }
        });

        cleanButton = new Button(Main.i18n("button.clean"), new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                clean();
            }
        });

        saveSearchButton = new Button(Main.i18n("button.save.search"), new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                long domain = 0;
                SearchNormal searchNormal = Main.get().mainPanel.search.searchBrowser.searchIn.searchNormal;
                SearchAdvanced searchAdvanced = Main.get().mainPanel.search.searchBrowser.searchIn.searchAdvanced;
                String operator = GWTQueryParams.OPERATOR_AND;
                params = new GWTQueryParams();

                if (!searchAdvanced.path.getText().equals("")) {
                    params.setPath(searchAdvanced.path.getText());
                } else {
                    params.setPath(searchNormal.context.getValue(searchNormal.context.getSelectedIndex()));
                }

                if (!searchAdvanced.categoryUuid.equals("")) {
                    params.setCategoryUuid(searchAdvanced.categoryUuid);
                    params.setCategoryPath(searchAdvanced.categoryPath.getText().substring(16)); // removes /okm:category 
                }

                params.setContent(searchNormal.content.getText());
                params.setName(searchNormal.name.getText());
                params.setKeywords(searchNormal.keywords.getText());
                params.setProperties(Main.get().mainPanel.search.searchBrowser.searchIn.getProperties());
                params.setAuthor(searchNormal.userListBox.getValue(searchNormal.userListBox.getSelectedIndex()));
                params.setLastModifiedFrom(searchNormal.modifyDateFrom);
                params.setLastModifiedTo(searchNormal.modifyDateTo);
                params.setDashboard(saveUserNews.getValue());
                params.setMailFrom(searchAdvanced.from.getText());
                params.setMailTo(searchAdvanced.to.getText());
                params.setMailSubject(searchAdvanced.subject.getText());

                if (searchAdvanced.typeDocument.getValue()) {
                    domain += GWTQueryParams.DOCUMENT;
                }

                if (searchAdvanced.typeFolder.getValue()) {
                    domain += GWTQueryParams.FOLDER;
                }

                if (searchAdvanced.typeMail.getValue()) {
                    domain += GWTQueryParams.MAIL;
                }

                params.setDomain(domain);

                if (searchTypeAnd.getValue()) {
                    operator = GWTQueryParams.OPERATOR_AND;
                } else {
                    operator = GWTQueryParams.OPERATOR_OR;
                }

                params.setOperator(operator);

                // Removes dates if dashboard is checked
                if (saveUserNews.getValue()) {
                    params.setLastModifiedFrom(null);
                    params.setLastModifiedTo(null);
                }

                params.setMimeType(searchAdvanced.mimeTypes.getValue(searchAdvanced.mimeTypes.getSelectedIndex()));

                if (!searchSavedName.getText().equals("")) {
                    saveSearchButton.setEnabled(false);
                    params.setQueryName(searchSavedName.getText());
                    isUserNews = params.isDashboard();
                    saveSearch(params, "sql");
                }
            }
        });

        searchSavedName.addKeyUpHandler(new KeyUpHandler() {
            @Override
            public void onKeyUp(KeyUpEvent event) {
                evalueSaveSearchButtonVisible();
            }
        });

        searchButton.setEnabled(false);
        saveSearchButton.setEnabled(false);

        // Type of search
        searchTypePanel = new HorizontalPanel();
        searchTypePanel.setVisible(true); // On OpenKM 4.0 has hidden AND / OR option list
        searchTypeAnd = new CheckBox("AND");
        searchTypeOr = new CheckBox("OR");
        searchTypeAnd.setValue(true);
        searchTypeOr.setValue(false);

        searchTypeAnd.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                searchTypeOr.setValue(!searchTypeAnd.getValue()); // Always set changed between and and or type
            }
        });

        searchTypeOr.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                searchTypeAnd.setValue(!searchTypeOr.getValue()); // Always set changed between and and or type
            }
        });

        HTML space1 = new HTML("");
        searchTypePanel.add(searchTypeAnd);
        searchTypePanel.add(space1);
        searchTypePanel.add(searchTypeOr);
        searchTypePanel.setCellWidth(space1, "10");

        table.setWidget(0, 0, advancedView);
        table.setWidget(1, 0, compactResultsView);
        table.setWidget(2, 0, showPropertyGroups);
        table.setWidget(3, 0, saveUserNews);
        table.setWidget(4, 0, saveSearchButton);
        table.setWidget(4, 1, searchSavedName);

        resultsPageText = new HTML(Main.i18n("search.page.results"));
        table.setWidget(5, 0, resultsPageText);
        table.setWidget(5, 1, resultPage);

        searchTypeText = new HTML(Main.i18n("search.type"));
        table.setHTML(6, 0, Main.i18n("search.type"));
        table.setWidget(6, 1, searchTypePanel);

        table.setWidget(6, 0, cleanButton);
        table.setWidget(6, 1, searchButton);

        table.setWidget(7, 0, controlSearch);

        table.getCellFormatter().setHorizontalAlignment(4, 0, HasAlignment.ALIGN_RIGHT);
        table.getCellFormatter().setHorizontalAlignment(5, 0, HasAlignment.ALIGN_RIGHT);
        table.getCellFormatter().setHorizontalAlignment(6, 0, HasAlignment.ALIGN_RIGHT);
        table.getFlexCellFormatter().setColSpan(0, 0, 2);
        table.getFlexCellFormatter().setColSpan(1, 0, 2);
        table.getFlexCellFormatter().setColSpan(2, 0, 2);
        table.getFlexCellFormatter().setColSpan(3, 0, 2);
        table.getFlexCellFormatter().setColSpan(7, 0, 2);

        // By default is enabled search mode simple
        table.getCellFormatter().setVisible(3, 0, false);
        table.getCellFormatter().setVisible(4, 0, false);
        table.getCellFormatter().setVisible(4, 1, false);

        searchButton.setStyleName("okm-SearchButton");
        saveSearchButton.setStyleName("okm-SaveButton");
        saveSearchButton.addStyleName("okm-NoWrap");
        cleanButton.setStyleName("okm-CleanButton");
        searchSavedName.setStyleName("okm-Input");
        resultPage.setStyleName("okm-Input");

        initWidget(scrollPanel);
    }

    /**
     * Executes the search
     */
    public void executeSearch() {
        switch (searchMode) {
        case SEARCH_MODE_SIMPLE:
            SearchSimple searchSimple = Main.get().mainPanel.search.searchBrowser.searchIn.searchSimple;
            Main.get().mainPanel.search.searchBrowser.searchIn.futuramaWalking
                    .evaluate(searchSimple.fullText.getText());
            controlSearch.executeSearch(searchSimple.fullText.getText(),
                    Integer.parseInt(resultPage.getItemText(resultPage.getSelectedIndex())));
            break;

        case SEARCH_MODE_ADVANCED:
            long domain = 0;
            SearchNormal searchNormal = Main.get().mainPanel.search.searchBrowser.searchIn.searchNormal;
            SearchAdvanced searchAdvanced = Main.get().mainPanel.search.searchBrowser.searchIn.searchAdvanced;
            GWTQueryParams gwtParams = new GWTQueryParams();
            gwtParams.setContent(searchNormal.content.getText());

            if (!searchAdvanced.path.getText().equals("")) {
                gwtParams.setPath(searchAdvanced.path.getText());
            } else {
                gwtParams.setPath(searchNormal.context.getValue(searchNormal.context.getSelectedIndex()));
            }

            if (!searchAdvanced.categoryUuid.equals("")) {
                gwtParams.setCategoryUuid(searchAdvanced.categoryUuid);
            }

            gwtParams.setKeywords(searchNormal.keywords.getText());
            gwtParams.setMimeType("");
            gwtParams.setName(searchNormal.name.getText());
            gwtParams.setAuthor(searchNormal.userListBox.getValue(searchNormal.userListBox.getSelectedIndex()));

            gwtParams.setMailFrom(searchAdvanced.from.getText());
            gwtParams.setMailTo(searchAdvanced.to.getText());
            gwtParams.setMailSubject(searchAdvanced.subject.getText());

            if (searchTypeAnd.getValue()) {
                gwtParams.setOperator(GWTQueryParams.OPERATOR_AND);
            } else {
                gwtParams.setOperator(GWTQueryParams.OPERATOR_OR);
            }

            if (searchNormal.modifyDateFrom != null && searchNormal.modifyDateTo != null) {
                gwtParams.setLastModifiedFrom(searchNormal.modifyDateFrom);
                gwtParams.setLastModifiedTo(searchNormal.modifyDateTo);
            } else {
                gwtParams.setLastModifiedFrom(null);
                gwtParams.setLastModifiedTo(null);
            }

            if (searchAdvanced.typeDocument.getValue()) {
                domain += GWTQueryParams.DOCUMENT;
            }

            if (searchAdvanced.typeFolder.getValue()) {
                domain += GWTQueryParams.FOLDER;
            }

            if (searchAdvanced.typeMail.getValue()) {
                domain += GWTQueryParams.MAIL;
            }

            gwtParams.setDomain(domain);
            gwtParams.setProperties(Main.get().mainPanel.search.searchBrowser.searchIn.getProperties());
            gwtParams.setMimeType(searchAdvanced.mimeTypes.getValue(searchAdvanced.mimeTypes.getSelectedIndex()));
            Main.get().mainPanel.search.searchBrowser.searchIn.futuramaWalking
                    .evaluate(searchNormal.content.getText());
            controlSearch.executeSearch(gwtParams,
                    Integer.parseInt(resultPage.getItemText(resultPage.getSelectedIndex())));
            break;
        }
    }

    /**
     * Evalues seach button visibility
     */
    public void evaluateSearchButtonVisible() {
        switch (searchMode) {
        case SEARCH_MODE_SIMPLE:
            SearchSimple searchSimple = Main.get().mainPanel.search.searchBrowser.searchIn.searchSimple;
            if (searchSimple.fullText.getText().length() >= minSearchCharacters) {
                searchButton.setEnabled(true);
            } else {
                searchButton.setEnabled(false);
            }
            break;

        case SEARCH_MODE_ADVANCED:
            SearchNormal searchNormal = Main.get().mainPanel.search.searchBrowser.searchIn.searchNormal;
            SearchAdvanced searchAdvanced = Main.get().mainPanel.search.searchBrowser.searchIn.searchAdvanced;
            SearchMetadata searchMetadata = Main.get().mainPanel.search.searchBrowser.searchIn.searchMetadata;

            if (searchNormal.content.getText().length() >= minSearchCharacters
                    || searchNormal.name.getText().length() >= minSearchCharacters
                    || searchNormal.keywords.getText().length() >= minSearchCharacters
                    || searchAdvanced.from.getText().length() >= minSearchCharacters
                    || searchAdvanced.to.getText().length() >= minSearchCharacters
                    || searchAdvanced.subject.getText().length() >= minSearchCharacters) {
                searchButton.setEnabled(true);
            } else {
                searchButton.setEnabled(false);
            }

            // Evaluates Mime Types
            if (searchAdvanced.mimeTypes.getSelectedIndex() > 0) {
                searchButton.setEnabled(true);
            }

            // Evaluates user list
            if (searchNormal.userListBox.getSelectedIndex() > 0) {
                searchButton.setEnabled(true);
            }

            // Evaluates date range
            if (searchNormal.modifyDateFrom != null && searchNormal.modifyDateTo != null) {
                searchButton.setEnabled(true);
            }

            // Evaluates properties to enable button
            for (GWTFormElement formElement : searchMetadata.updateFormElementsValuesWithNewer()) {
                if (formElement instanceof GWTInput) {
                    if (((GWTInput) formElement).getValue().length() >= minSearchCharacters) {
                        searchButton.setEnabled(true);
                        break;
                    }
                } else if (formElement instanceof GWTTextArea) {
                    if (((GWTTextArea) formElement).getValue().length() >= minSearchCharacters) {
                        searchButton.setEnabled(true);
                        break;
                    }
                } else if (formElement instanceof GWTSuggestBox) {
                    if (!((GWTSuggestBox) formElement).getValue().equals("")) {
                        searchButton.setEnabled(true);
                        break;
                    }
                } else if (formElement instanceof GWTCheckBox) {
                    // Checkbox case assume is selected to enable search
                    if (((GWTCheckBox) formElement).getValue()) {
                        searchButton.setEnabled(true);
                        break;
                    }
                } else if (formElement instanceof GWTSelect) {
                    // Checkbox case assume is selected to enable search
                    GWTSelect select = (GWTSelect) formElement;
                    for (GWTOption option : select.getOptions()) {
                        if (option.isSelected()) {
                            searchButton.setEnabled(true);
                            break;
                        }
                    }
                }
            }
            break;
        }

        // After evaluating search button, must evaluate save search too
        evalueSaveSearchButtonVisible();
    }

    /**
     * Evalues Save Search button visibility
     */
    public void evalueSaveSearchButtonVisible() {
        switch (searchMode) {
        case SEARCH_MODE_SIMPLE:
            saveSearchButton.setEnabled(false);
            break;

        case SEARCH_MODE_ADVANCED:
            if (searchSavedName.getText().length() > 0 && searchButton.isEnabled()) {
                saveSearchButton.setEnabled(true);
            } else {
                saveSearchButton.setEnabled(false);
            }
            break;
        }
    }

    /**
     * langRefresh
     */
    public void langRefresh() {
        searchButton.setHTML(Main.i18n("button.search"));
        cleanButton.setHTML(Main.i18n("button.clean"));
        saveSearchButton.setHTML(Main.i18n("button.save.search"));
        advancedView.setText(Main.i18n("search.view.advanced"));
        compactResultsView.setText(Main.i18n("search.view.compact.results"));
        showPropertyGroups.setText(Main.i18n("search.view.propety.groups"));
        saveUserNews.setText(Main.i18n("search.save.as.news"));
        resultsPageText.setHTML(Main.i18n("search.page.results"));
        searchTypeText.setHTML(Main.i18n("search.type"));
        controlSearch.langRefresh();
    }

    /**
     * Save a search
     */
    public void saveSearch(GWTQueryParams params, String type) {
        Main.get().mainPanel.search.searchBrowser.searchIn.status.setFlag_saveSearch();
        searchService.saveSearch(params, type, callbackSaveSearch);
    }

    /**
     * Call Back save search 
     */
    final AsyncCallback<Long> callbackSaveSearch = new AsyncCallback<Long>() {
        public void onSuccess(Long result) {
            params.setId(result.intValue());

            if (isUserNews) {
                Main.get().mainPanel.search.historySearch.userNews.addNewSavedSearch(params.clone());
                Main.get().mainPanel.search.historySearch.stackPanel.showStack(UISearchConstants.SEARCH_USER_NEWS);
                Main.get().mainPanel.dashboard.newsDashboard.getUserSearchs(true);
            } else {
                Main.get().mainPanel.search.historySearch.searchSaved.addNewSavedSearch(params.clone());
                Main.get().mainPanel.search.historySearch.stackPanel.showStack(UISearchConstants.SEARCH_SAVED);
            }

            searchSavedName.setText(""); // Clean name atfer saved
            Main.get().mainPanel.search.searchBrowser.searchIn.status.unsetFlag_saveSearch();
        }

        public void onFailure(Throwable caught) {
            Main.get().mainPanel.search.searchBrowser.searchIn.status.unsetFlag_saveSearch();
            Main.get().showError("SaveSearch", caught);
        }
    };

    /**
     * switchSearchMode
     * 
     * @param mode
     */
    public void switchSearchMode(int mode) {
        searchMode = mode;
        switch (searchMode) {
        case SEARCH_MODE_SIMPLE:
            table.getCellFormatter().setVisible(3, 0, false);
            table.getCellFormatter().setVisible(4, 0, false);
            table.getCellFormatter().setVisible(4, 1, false);
            break;

        case SEARCH_MODE_ADVANCED:
            advancedView.setValue(true); // switch search mode can be done by execute saved query
            table.getCellFormatter().setVisible(3, 0, true);
            table.getCellFormatter().setVisible(4, 0, true);
            table.getCellFormatter().setVisible(4, 1, true);
            break;
        }
        Main.get().mainPanel.search.searchBrowser.searchIn.switchSearchMode(searchMode);
    }

    /**
     * switchResultsViewMode
     * 
     * @param mode
     */
    private void switchResultsViewMode(int mode) {
        resultsViewMode = mode;
        Main.get().mainPanel.search.searchBrowser.searchResult.switchResultsViewMode(resultsViewMode);
    }

    /**
     * clean
     */
    private void clean() {
        SearchSimple searchSimple = Main.get().mainPanel.search.searchBrowser.searchIn.searchSimple;
        SearchNormal searchNormal = Main.get().mainPanel.search.searchBrowser.searchIn.searchNormal;
        SearchAdvanced searchAdvanced = Main.get().mainPanel.search.searchBrowser.searchIn.searchAdvanced;
        searchSimple.fullText.setText("");
        searchNormal.context.setSelectedIndex(Main.get().mainPanel.search.searchBrowser.searchIn.posTaxonomy);
        searchNormal.content.setText("");
        searchAdvanced.path.setText("");
        searchAdvanced.categoryPath.setText("");
        searchAdvanced.categoryUuid = "";
        searchNormal.name.setText("");
        searchNormal.keywords.setText("");
        searchSavedName.setText("");
        searchButton.setEnabled(false);
        saveSearchButton.setEnabled(false);
        controlSearch.setVisible(false);
        Main.get().mainPanel.search.searchBrowser.searchIn.resetMetadata();
        searchAdvanced.typeDocument.setValue(true);
        searchAdvanced.typeFolder.setValue(false);
        searchAdvanced.typeMail.setValue(false);
        searchAdvanced.mimeTypes.setSelectedIndex(0);
        searchNormal.userListBox.setSelectedIndex(0);
        searchNormal.startDate.setText("");
        searchNormal.endDate.setText("");
        searchNormal.modifyDateFrom = null;
        searchNormal.modifyDateTo = null;
        searchAdvanced.from.setText("");
        searchAdvanced.to.setText("");
        searchAdvanced.subject.setText("");
        Main.get().mainPanel.search.searchBrowser.searchResult.removeAllRows();
    }

    /**
     * getSearchMode
     * 
     * @return
     */
    public int getSearchMode() {
        return searchMode;
    }

    /**
     * setMinSearchCharacters
     * 
     * @param minSearchCharacters
     */
    public void setMinSearchCharacters(int minSearchCharacters) {
        this.minSearchCharacters = minSearchCharacters;
    }
}