/*
* Copyright 2013 JBoss Inc
*
* 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.artificer.ui.client.local.pages.artifacts;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
import com.google.gwt.user.client.ui.TextBox;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import org.artificer.ui.client.local.ClientMessages;
import org.artificer.ui.client.local.services.ArtifactSearchServiceCaller;
import org.artificer.ui.client.local.services.NotificationService;
import org.artificer.ui.client.local.services.callback.IServiceInvocationHandler;
import org.artificer.ui.client.shared.beans.ArtifactFilterBean;
import org.artificer.ui.client.shared.beans.ArtifactOriginEnum;
import org.artificer.ui.client.shared.beans.ArtifactTypeBean;
import org.jboss.errai.ui.shared.api.annotations.DataField;
import org.jboss.errai.ui.shared.api.annotations.EventHandler;
import org.jboss.errai.ui.shared.api.annotations.Templated;
import org.overlord.commons.gwt.client.local.widgets.DateBox;
/**
* The artifact filtersPanel sidebar. Whenever the user changes any of the settings in
* the filter sidebar, a ValueChangeEvent will be fired.
*
* @author eric.wittmann@redhat.com
*/
@Templated("/org/artificer/ui/client/local/site/artifacts.html#sramp-filter-sidebar")
@Dependent
public class ArtifactFilters extends Composite implements HasValue<ArtifactFilterBean> {
private ArtifactFilterBean currentState = new ArtifactFilterBean();
@Inject
protected ClientMessages i18n;
@Inject @DataField
protected TextBox keywords;
// Artifact Type
@Inject @DataField
protected SuggestBox artifactType;
@Inject @DataField
protected TextBox uuid;
@Inject @DataField
protected TextBox name;
// Date Created
@Inject @DataField
protected DateBox dateCreatedFrom;
@Inject @DataField
protected DateBox dateCreatedTo;
// Date Modified
@Inject @DataField
protected DateBox dateModifiedFrom;
@Inject @DataField
protected DateBox dateModifiedTo;
// Create By
@Inject @DataField
protected TextBox createdBy;
// Last Modified By
@Inject @DataField
protected TextBox lastModifiedBy;
// Origin
@Inject @DataField
protected ListBox originSelect;
@Inject @DataField
protected Button clearAllFilters;
@Inject @DataField("classifier-filter-container")
protected ClassifierFilterContainer classifierFilters;
@Inject @DataField
protected Button addCustomPropertyFilter;
@Inject @DataField("filter-custom-properties")
protected CustomPropertyFilters customPropertyFilters;
@Inject
protected Instance<AddPropertyFilterDialog> addPropertyFilterDialogFactory;
@Inject
protected ArtifactSearchServiceCaller searchService;
@Inject
protected NotificationService notificationService;
/**
* Constructor.
*/
public ArtifactFilters() {
}
public void loadSuggestionsArtifactTypes() {
final MultiWordSuggestOracle suggestions = (MultiWordSuggestOracle)artifactType.getSuggestOracle();
suggestions.clear();
searchService.types(new IServiceInvocationHandler<List<ArtifactTypeBean>>() {
@Override
public void onReturn(List<ArtifactTypeBean> data) {
if (data != null && data.size() > 0) {
for (ArtifactTypeBean type : data) {
suggestions.add(type.getType());
}
}
}
@Override
public void onError(Throwable error) {
notificationService.sendErrorNotification(i18n
.format("artifacts.filter.types.error-searching"), error);
}
});
}
/**
* Called after construction and injection.
*/
@SuppressWarnings("unchecked")
@PostConstruct
protected void postConstruct() {
ClickHandler clearFilterHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
setValue(new ArtifactFilterBean(), true);
}
};
clearAllFilters.addClickHandler(clearFilterHandler);
@SuppressWarnings("rawtypes")
ValueChangeHandler valueChangeHandler = new ValueChangeHandler() {
@Override
public void onValueChange(ValueChangeEvent event) {
onFilterValueChange();
}
};
ChangeHandler changeHandler = new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
onFilterValueChange();
}
};
loadSuggestionsArtifactTypes();
dateCreatedFrom.setReadOnly(false);
dateCreatedTo.setReadOnly(false);
dateModifiedFrom.setReadOnly(false);
dateModifiedTo.setReadOnly(false);
keywords.addValueChangeHandler(valueChangeHandler);
uuid.addValueChangeHandler(valueChangeHandler);
name.addValueChangeHandler(valueChangeHandler);
dateCreatedFrom.addValueChangeHandler(valueChangeHandler);
dateCreatedTo.addValueChangeHandler(valueChangeHandler);
dateModifiedFrom.addValueChangeHandler(valueChangeHandler);
dateModifiedTo.addValueChangeHandler(valueChangeHandler);
createdBy.addValueChangeHandler(valueChangeHandler);
lastModifiedBy.addValueChangeHandler(valueChangeHandler);
classifierFilters.addValueChangeHandler(valueChangeHandler);
customPropertyFilters.addValueChangeHandler(valueChangeHandler);
artifactType.addValueChangeHandler(valueChangeHandler);
SelectionHandler<Suggestion> selectionHandler = new SelectionHandler<SuggestOracle.Suggestion>() {
@Override
public void onSelection(SelectionEvent<Suggestion> event) {
artifactType.setValue(event.getSelectedItem().getReplacementString());
onFilterValueChange();
}
};
artifactType.addSelectionHandler(selectionHandler);
originSelect.addItem(i18n.format("artifacts.all"), ArtifactOriginEnum.ALL.name());
originSelect.addItem(i18n.format("artifacts.primary-original"), ArtifactOriginEnum.PRIMARY_ORIGINAL.name());
originSelect.addItem(i18n.format("artifacts.primary-expanded"), ArtifactOriginEnum.PRIMARY_EXPANDED.name());
originSelect.addItem(i18n.format("artifacts.derived"), ArtifactOriginEnum.DERIVED.name());
originSelect.addChangeHandler(changeHandler);
}
/**
* Called whenever any filter value changes.
*/
protected void onFilterValueChange() {
ArtifactFilterBean newState = new ArtifactFilterBean();
newState.setKeywords(keywords.getValue())
.setArtifactType(artifactType.getValue())
.setUuid(uuid.getValue())
.setName(name.getValue())
.setDateCreatedFrom(dateCreatedFrom.getDateValue())
.setDateCreatedTo(dateCreatedTo.getDateValue())
.setDateModifiedFrom(dateModifiedFrom.getDateValue())
.setDateModifiedTo(dateModifiedTo.getDateValue())
.setCreatedBy(createdBy.getValue())
.setLastModifiedBy(lastModifiedBy.getValue())
.setOrigin(ArtifactOriginEnum.valueOf(originSelect.getSelectedValue()))
.setClassifiers(classifierFilters.getValue())
.setCustomProperties(customPropertyFilters.getValue());
ArtifactFilterBean oldState = this.currentState;
this.currentState = newState;
// Only fire a change event if something actually changed.
ValueChangeEvent.fireIfNotEqual(this, oldState, currentState);
}
/**
* Called when the Add Filter button is clicked (to add a custom property filter).
* @param event
*/
@EventHandler("addCustomPropertyFilter")
protected void onAddPropertyFilter(ClickEvent event) {
AddPropertyFilterDialog dialog = addPropertyFilterDialogFactory.get();
dialog.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
customPropertyFilters.addPropertyFilter(event.getValue());
}
});
dialog.show();
}
/**
* @see com.google.gwt.event.logical.shared.HasValueChangeHandlers#addValueChangeHandler(com.google.gwt.event.logical.shared.ValueChangeHandler)
*/
@Override
public HandlerRegistration addValueChangeHandler(ValueChangeHandler<ArtifactFilterBean> handler) {
return addHandler(handler, ValueChangeEvent.getType());
}
/**
* @return the current filter settings
*/
@Override
public ArtifactFilterBean getValue() {
return this.currentState;
}
/**
* @see com.google.gwt.user.client.ui.HasValue#setValue(java.lang.Object, boolean)
*/
@Override
public void setValue(ArtifactFilterBean value, boolean fireEvents) {
keywords.setValue(value.getKeywords() == null ? "" : value.getKeywords());
artifactType.setValue(value.getArtifactType() == null ? "" : value.getArtifactType());
uuid.setValue(value.getUuid() == null ? "" : value.getUuid());
name.setValue(value.getName() == null ? "" : value.getName());
dateCreatedFrom.setDateValue(value.getDateCreatedFrom() == null ? null : value.getDateCreatedFrom());
dateCreatedTo.setDateValue(value.getDateCreatedTo() == null ? null : value.getDateCreatedTo());
dateModifiedFrom.setDateValue(value.getDateModifiedFrom() == null ? null : value.getDateModifiedFrom());
dateModifiedTo.setDateValue(value.getDateModifiedTo() == null ? null : value.getDateModifiedTo());
createdBy.setValue(value.getCreatedBy() == null ? "" : value.getCreatedBy());
switch (value.getOrigin()) {
case ALL:
originSelect.setSelectedIndex(0);
break;
case PRIMARY_ORIGINAL:
originSelect.setSelectedIndex(1);
break;
case PRIMARY_EXPANDED:
originSelect.setSelectedIndex(2);
break;
case DERIVED:
originSelect.setSelectedIndex(3);
break;
}
classifierFilters.setValue(value.getClassifiers());
customPropertyFilters.setValue(value.getCustomProperties());
ArtifactFilterBean oldState = this.currentState;
currentState = value;
if (fireEvents) {
ValueChangeEvent.fireIfNotEqual(this, oldState, currentState);
}
}
/**
* @param value the new filter settings
*/
@Override
public void setValue(ArtifactFilterBean value) {
setValue(value, false);
}
/**
* Refresh any data (e.g. ontology selectors) in the artifact filter panel.
*/
public void refresh() {
classifierFilters.refresh();
}
}