/*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* For further information about Alkacon Software, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.ade.galleries.client.ui;
import org.opencms.ade.galleries.client.CmsSearchTabHandler;
import org.opencms.ade.galleries.client.Messages;
import org.opencms.ade.galleries.shared.CmsGallerySearchBean;
import org.opencms.ade.galleries.shared.CmsGallerySearchScope;
import org.opencms.ade.galleries.shared.I_CmsGalleryProviderConstants.GalleryTabId;
import org.opencms.gwt.client.ui.CmsPushButton;
import org.opencms.gwt.client.ui.I_CmsAutoHider;
import org.opencms.gwt.client.ui.css.I_CmsInputLayoutBundle;
import org.opencms.gwt.client.ui.input.CmsCheckBox;
import org.opencms.gwt.client.ui.input.CmsLabelSelectCell;
import org.opencms.gwt.client.ui.input.CmsSelectBox;
import org.opencms.gwt.client.ui.input.CmsTextBox;
import org.opencms.gwt.client.ui.input.datebox.CmsDateBox;
import org.opencms.util.CmsStringUtil;
import java.util.Date;
import java.util.Map;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Style.Display;
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.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.UIObject;
/**
* Provides the widget for the full text search tab.<p>
*
* @since 8.0.
*/
public class CmsSearchTab extends A_CmsTab {
/**
* Implements the ClickHandler for the clear button.<p>
*/
protected class ClearButtonClickHandler implements ClickHandler {
/**
* @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent)
*/
public void onClick(ClickEvent event) {
clearInput();
}
}
/**
* The date box change handler.<p>
*
* Used for all date boxes inside the search tab.<p>
*
* Delegates the methods to the search tab handler.<p>
*/
protected class DateBoxChangeHandler implements ValueChangeHandler<Date>, KeyPressHandler {
/**
* @see com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress(com.google.gwt.event.dom.client.KeyPressEvent)
*/
public void onKeyPress(KeyPressEvent event) {
UIObject source = (UIObject)event.getSource();
Element el = source.getElement();
if (m_dateCreatedStartDateBox.getElement().isOrHasChild(el)) {
Scheduler.get().scheduleDeferred(new DateChangeCommand(m_dateCreatedStartDateBox));
} else if (m_dateCreatedEndDateBox.getElement().isOrHasChild(el)) {
Scheduler.get().scheduleDeferred(new DateChangeCommand(m_dateCreatedEndDateBox));
} else if (m_dateModifiedStartDateBox.getElement().isOrHasChild(el)) {
Scheduler.get().scheduleDeferred(new DateChangeCommand(m_dateModifiedStartDateBox));
} else if (m_dateModifiedEndDateBox.getElement().isOrHasChild(el)) {
Scheduler.get().scheduleDeferred(new DateChangeCommand(m_dateModifiedEndDateBox));
}
}
/**
* @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)
*/
public void onValueChange(ValueChangeEvent<Date> event) {
// if the since created date was changed, set it in the tab handler
if (event.getSource() == m_dateCreatedStartDateBox) {
if (event.getValue() != null) {
m_tabHandler.setDateCreatedStart(event.getValue().getTime());
} else {
// if the field is empty take the min value
m_tabHandler.setDateCreatedStart(-1L);
}
}
// if the until created date was changed, set it in the tab handler
if (event.getSource() == m_dateCreatedEndDateBox) {
if (event.getValue() != null) {
m_tabHandler.setDateCreatedEnd(event.getValue().getTime());
} else {
// if the field is empty take the max value
m_tabHandler.setDateCreatedEnd(-1L);
}
}
// if the since modified date was changed, set it in the tab handler
if (event.getSource() == m_dateModifiedStartDateBox) {
if (event.getValue() != null) {
m_tabHandler.setDateModifiedStart(event.getValue().getTime());
} else {
// if the field is empty take the min value
m_tabHandler.setDateModifiedStart(-1L);
}
}
// if the until modified date was changed, set it in the tab handler
if (event.getSource() == m_dateModifiedEndDateBox) {
if (event.getValue() != null) {
m_tabHandler.setDateModifiedEnd(event.getValue().getTime());
} else {
// if the field is empty take the max value
m_tabHandler.setDateModifiedEnd(-1L);
}
}
}
}
/**
* Scheduled command implementation for the date boxes that fires a value change event for the given date box.<p>
*/
protected class DateChangeCommand implements ScheduledCommand {
/** The date box to use as source. */
private CmsDateBox m_dateBox;
/**
* The constructor.<p>
*
* @param dateBox the date box to use as source for the value change event
*/
public DateChangeCommand(CmsDateBox dateBox) {
m_dateBox = dateBox;
}
/**
* @see com.google.gwt.core.client.Scheduler.ScheduledCommand#execute()
*/
public void execute() {
if (m_dateBox.isValideDateBox()) {
ValueChangeEvent.fire(m_dateBox, m_dateBox.getValue());
} else {
ValueChangeEvent.fire(m_dateBox, null);
}
}
}
/**
* Internal handler for the include expired check-box.<p>
*/
protected class IncludeExpiredChangeHandler implements ValueChangeHandler<Boolean> {
/**
* @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)
*/
public void onValueChange(ValueChangeEvent<Boolean> event) {
Boolean value = event.getValue();
m_tabHandler.setIncludeExpired(value.booleanValue());
}
}
/**
* The language selection handler.<p>
*
* Delegates the methods to the search tab handler.<p>
*/
protected class LanguageChangeHandler implements ValueChangeHandler<String> {
/**
* @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)
*/
public void onValueChange(ValueChangeEvent<String> event) {
String value = event.getValue();
if (CmsStringUtil.isEmptyOrWhitespaceOnly(value) || value.equals(NOT_SET_OPTION_VALUE)) {
value = m_currentLocale;
}
m_tabHandler.setLocale(value);
}
}
/**
* Implements the ValueChangeHandler for the query input field.<p>
*/
protected class QueryChangedHandler implements ValueChangeHandler<String>, KeyPressHandler {
/**
* @see com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress(com.google.gwt.event.dom.client.KeyPressEvent)
*/
public void onKeyPress(KeyPressEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute() {
m_tabHandler.selectResultTab();
}
});
} else {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
/**
* @see com.google.gwt.user.client.Command#execute()
*/
public void execute() {
ValueChangeEvent.fire(m_searchInput, m_searchInput.getText());
}
});
}
}
/**
* @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)
*/
public void onValueChange(ValueChangeEvent<String> event) {
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(event.getValue()) && (event.getValue().length() >= 3)) {
m_tabHandler.setSearchQuery(event.getValue());
} else {
m_tabHandler.setSearchQuery(null);
}
}
}
/**
* Internal handler for search scope changes.<p>
*/
protected class ScopeChangeHandler implements ValueChangeHandler<String> {
/**
* @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)
*/
public void onValueChange(ValueChangeEvent<String> event) {
String value = event.getValue();
m_tabHandler.setScope(CmsGallerySearchScope.valueOf(value));
}
}
/** The ui-binder interface. */
interface I_CmsSearchTabUiBinder extends UiBinder<HTMLPanel, CmsSearchTab> {
// GWT interface, nothing to do here
}
/** A constant for the "not set" valueof the language selection. */
private static final String NOT_SET_OPTION_VALUE = "notSet";
/** The ui-binder instance. */
private static I_CmsSearchTabUiBinder uiBinder = GWT.create(I_CmsSearchTabUiBinder.class);
/** The button to clear the tab input. */
@UiField
protected CmsPushButton m_clearButton;
/** The current locale. */
protected String m_currentLocale;
/** The date box for the created until date. */
@UiField
protected CmsDateBox m_dateCreatedEndDateBox;
/** The label for the created until date. */
@UiField
protected Label m_dateCreatedEndLabel;
/** The date box for the created since date. */
@UiField
protected CmsDateBox m_dateCreatedStartDateBox;
/** The label for the created since date. */
@UiField
protected Label m_dateCreatedStartLabel;
/** The date box for the modified until date. */
@UiField
protected CmsDateBox m_dateModifiedEndDateBox;
/** The label for the modified until date. */
@UiField
protected Label m_dateModifiedEndLabel;
/** The date box for the modified since date. */
@UiField
protected CmsDateBox m_dateModifiedStartDateBox;
/** The label for the modified since date. */
@UiField
protected Label m_dateModifiedStartLabel;
/** The include expired resources check-box. */
@UiField
protected CmsCheckBox m_includeExpiredCheckBox;
/** The include expired resources form row. */
@UiField
protected DivElement m_includeExpiredRow;
/** The label for the language selection. */
@UiField
protected Label m_localeLabel;
/** The row for the language selection. */
@UiField
protected HTMLPanel m_localeRow;
/** The select box for the language selection. */
@UiField
protected CmsSelectBox m_localeSelection;
/** The label for the search scope selection. */
@UiField
protected Label m_scopeLabel;
/** The row for the search scope selection. */
@UiField
protected HTMLPanel m_scopeRow;
/** The select box for the search scope selection. */
@UiField
protected CmsSelectBox m_scopeSelection;
/** The input field for the search query. */
@UiField
protected CmsTextBox m_searchInput;
/** The label for the search query. */
@UiField
protected Label m_searchLabel;
/** The tab handler. */
CmsSearchTabHandler m_tabHandler;
/** The parent popup to this dialog if present. */
private I_CmsAutoHider m_autoHideParent;
/** The map of available locales. */
private Map<String, String> m_availableLocales;
/** The search parameter panel for this tab. */
private CmsSearchParamPanel m_paramPanel;
/** The search scope. */
private CmsGallerySearchScope m_scope;
/** The tab panel. */
private HTMLPanel m_tab;
/**
* Constructor for the search tab.<p>
*
* @param tabHandler the tab handler
* @param autoHideParent the auto-hide parent to this dialog if present
* @param currentLocale the current content locale
* @param availableLocales the available locales
* @param scope the search scope
*/
@SuppressWarnings("deprecation")
public CmsSearchTab(
CmsSearchTabHandler tabHandler,
I_CmsAutoHider autoHideParent,
String currentLocale,
Map<String, String> availableLocales,
CmsGallerySearchScope scope) {
// initialize the tab
super(GalleryTabId.cms_tab_search.name());
m_tab = uiBinder.createAndBindUi(this);
initWidget(m_tab);
addStyleName(I_CmsInputLayoutBundle.INSTANCE.inputCss().highTextBoxes());
m_tabHandler = tabHandler;
m_autoHideParent = autoHideParent;
m_currentLocale = currentLocale;
m_availableLocales = availableLocales;
m_scope = scope;
//add search roots selection
String scopeLabelText = Messages.get().key(Messages.GUI_SEARCH_SCOPE_0);
m_scopeLabel.setText(scopeLabelText);
for (CmsGallerySearchScope choice : CmsGallerySearchScope.values()) {
String name = Messages.get().key(choice.getKey());
m_scopeSelection.addOption(choice.name(), name);
}
m_scopeSelection.setFormValueAsString(m_scope.name());
m_scopeSelection.addValueChangeHandler(new ScopeChangeHandler());
// add the language selection
m_localeLabel.setText(Messages.get().key(Messages.GUI_TAB_SEARCH_LANGUAGE_LABEL_TEXT_0));
CmsLabelSelectCell notSelectedCell = new CmsLabelSelectCell(NOT_SET_OPTION_VALUE, Messages.get().key(
Messages.GUI_TAB_SEARCH_LANGUAGE_NOT_SEL_0));
notSelectedCell.setVisible(false);
m_localeSelection.addOption(notSelectedCell);
for (Map.Entry<String, String> entry : availableLocales.entrySet()) {
m_localeSelection.addOption(entry.getKey(), entry.getValue());
}
m_localeSelection.addValueChangeHandler(new LanguageChangeHandler());
// hide language selection if only one locale is available
if (availableLocales.size() <= 1) {
m_localeRow.getElement().getStyle().setDisplay(Display.NONE);
}
// add the query
m_searchLabel.setText(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_TEXT_0));
QueryChangedHandler queryHandler = new QueryChangedHandler();
m_searchInput.addValueChangeHandler(queryHandler);
m_searchInput.addKeyPressHandler(queryHandler);
m_includeExpiredCheckBox.setChecked(false);
m_includeExpiredCheckBox.setText(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_INCLUDE_EXPIRED_0));
m_includeExpiredCheckBox.addValueChangeHandler(new IncludeExpiredChangeHandler());
// set the labels for the date box widgets
m_dateCreatedStartLabel.setText(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_CREATED_SINCE_0));
m_dateCreatedEndLabel.setText(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_CREATED_UNTIL_0));
m_dateModifiedStartLabel.setText(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_MODIFIED_SINCE_0));
m_dateModifiedEndLabel.setText(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_MODIFIED_UNTIL_0));
if (m_autoHideParent != null) {
m_dateCreatedEndDateBox.setAutoHideParent(m_autoHideParent);
m_dateCreatedStartDateBox.setAutoHideParent(m_autoHideParent);
m_dateModifiedEndDateBox.setAutoHideParent(m_autoHideParent);
m_dateModifiedStartDateBox.setAutoHideParent(m_autoHideParent);
}
// add the handler to the according date box widgets
DateBoxChangeHandler handler = new DateBoxChangeHandler();
m_dateCreatedStartDateBox.addValueChangeHandler(handler);
m_dateCreatedStartDateBox.addKeyPressHandler(handler);
m_dateCreatedEndDateBox.addValueChangeHandler(handler);
m_dateCreatedEndDateBox.addKeyPressHandler(handler);
m_dateModifiedStartDateBox.addValueChangeHandler(handler);
m_dateModifiedStartDateBox.addKeyPressHandler(handler);
Date initialStartDate = new Date();
initialStartDate.setHours(0);
initialStartDate.setMinutes(0);
m_dateModifiedStartDateBox.setInitialDate(initialStartDate);
m_dateModifiedEndDateBox.addValueChangeHandler(handler);
m_dateModifiedEndDateBox.addKeyPressHandler(handler);
Date initialEndDate = new Date();
initialEndDate.setHours(23);
initialEndDate.setMinutes(59);
m_dateModifiedEndDateBox.setInitialDate(initialEndDate);
// add the clear button
m_clearButton.setText(Messages.get().key(Messages.GUI_TAB_SEARCH_BUTTON_CLEAR_0));
m_clearButton.setUseMinWidth(true);
ClearButtonClickHandler clearHandler = new ClearButtonClickHandler();
m_clearButton.addClickHandler(clearHandler);
}
/**
* Clears the search tab input.<p>
*/
public void clearInput() {
m_searchInput.setFormValueAsString("");
ValueChangeEvent.fire(m_searchInput, "");
m_dateCreatedStartDateBox.setValue(null, true);
m_dateCreatedEndDateBox.setValue(null, true);
m_dateModifiedStartDateBox.setValue(null, true);
m_dateModifiedEndDateBox.setValue(null, true);
m_includeExpiredCheckBox.setChecked(false);
m_localeSelection.reset();
}
/**
* Enables the include expired resources form input.<p>
*
* @param enable <code>true</code> to enable the include expired resources form input
*/
public void enableExpiredResourcesSearch(boolean enable) {
m_includeExpiredRow.getStyle().setDisplay(enable ? Display.BLOCK : Display.NONE);
}
/**
* @see org.opencms.ade.galleries.client.ui.A_CmsTab#getParamPanel(org.opencms.ade.galleries.shared.CmsGallerySearchBean)
*/
@Override
public CmsSearchParamPanel getParamPanel(CmsGallerySearchBean searchObj) {
if (m_paramPanel == null) {
m_paramPanel = new CmsSearchParamPanel(Messages.get().key(Messages.GUI_PARAMS_LABEL_SEARCH_0), this);
}
String content = getSearchParams();
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(content)) {
m_paramPanel.setContent(content);
return m_paramPanel;
}
return null;
}
/**
* Returns the content of the full text search parameter.<p>
*
* @return the inputs from the search tab
*/
public String getSearchParams() {
StringBuffer result = new StringBuffer();
// get the required data
String query = m_searchInput.getText();
String cStart = m_dateCreatedStartDateBox.getValueAsFormatedString();
String cEnd = m_dateCreatedEndDateBox.getValueAsFormatedString();
String mStart = m_dateModifiedStartDateBox.getValueAsFormatedString();
String mEnd = m_dateModifiedEndDateBox.getValueAsFormatedString();
// append the language to the resulting string
String locale = m_localeSelection.getFormValueAsString();
String language = m_availableLocales.get(locale);
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(locale)
&& CmsStringUtil.isNotEmptyOrWhitespaceOnly(language)
&& !locale.equals(NOT_SET_OPTION_VALUE)) {
result.append(Messages.get().key(Messages.GUI_TAB_SEARCH_LANGUAGE_LABEL_TEXT_0)).append(" ").append(
language);
}
// append the search query to the resulting string
StringBuffer queryResult = new StringBuffer();
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(query)) {
queryResult.append(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_TEXT_0)).append(" ").append(query);
}
if ((result.length() > 0) && (queryResult.length() > 0)) {
result.append(", ");
}
result.append(queryResult);
// append the date created range to the resulting string
StringBuffer createdResult = new StringBuffer();
if ((CmsStringUtil.isNotEmptyOrWhitespaceOnly(cStart) && CmsStringUtil.isNotEmptyOrWhitespaceOnly(cEnd))) {
createdResult.append(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_CREATED_RANGE_0)).append(" ").append(
cStart).append(" - ").append(cEnd);
} else if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(cStart)) {
createdResult.append(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_CREATED_SINCE_0)).append(" ").append(
cStart);
} else if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(cEnd)) {
createdResult.append(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_CREATED_UNTIL_0)).append(" ").append(
cEnd);
}
if ((result.length() > 0) && (createdResult.length() > 0)) {
result.append(", ");
}
result.append(createdResult);
// append the date modified range to the resulting string
StringBuffer modifiedResult = new StringBuffer();
if ((CmsStringUtil.isNotEmptyOrWhitespaceOnly(mStart) && CmsStringUtil.isNotEmptyOrWhitespaceOnly(mEnd))) {
modifiedResult.append(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_MODIFIED_RANGE_0)).append(" ").append(
mStart).append(" - ").append(mEnd);
} else if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(mStart)) {
modifiedResult.append(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_MODIFIED_SINCE_0)).append(" ").append(
mStart);
} else if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(mEnd)) {
modifiedResult.append(Messages.get().key(Messages.GUI_TAB_SEARCH_LABEL_MODIFIED_UNTIL_0)).append(" ").append(
mEnd);
}
if ((result.length() > 0) && (modifiedResult.length() > 0)) {
result.append(", ");
}
result.append(modifiedResult);
if (m_includeExpiredCheckBox.getFormValue().booleanValue()) {
if (result.length() > 0) {
result.append(", ");
}
result.append(Messages.get().key(Messages.GUI_PARAMS_LABEL_INCLUDING_EXPIRED_0));
}
return result.toString();
}
/**
* @see org.opencms.ade.galleries.client.ui.A_CmsTab#getTabHandler()
*/
@Override
public CmsSearchTabHandler getTabHandler() {
return m_tabHandler;
}
}