/*
* Copyright (c) 2005-2016 Vincent Vandenschrick. All rights reserved.
*
* This file is part of the Jspresso framework.
*
* Jspresso 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 3 of the License, or
* (at your option) any later version.
*
* Jspresso 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Jspresso. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jspresso.framework.application.view;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.jspresso.framework.application.frontend.action.std.EditComponentAction;
import org.jspresso.framework.model.component.IComponent;
import org.jspresso.framework.model.component.IQueryComponent;
import org.jspresso.framework.model.descriptor.IComponentDescriptor;
import org.jspresso.framework.model.descriptor.IComponentDescriptorProvider;
import org.jspresso.framework.model.descriptor.IPropertyDescriptor;
import org.jspresso.framework.model.descriptor.query.ComparableQueryStructureDescriptor;
import org.jspresso.framework.model.descriptor.query.EnumQueryStructureDescriptor;
import org.jspresso.framework.util.descriptor.DefaultDescriptor;
import org.jspresso.framework.view.action.IDisplayableAction;
import org.jspresso.framework.view.descriptor.ELabelPosition;
import org.jspresso.framework.view.descriptor.ICompositeViewDescriptor;
import org.jspresso.framework.view.descriptor.IPropertyViewDescriptor;
import org.jspresso.framework.view.descriptor.IQueryViewDescriptorFactory;
import org.jspresso.framework.view.descriptor.IViewDescriptor;
import org.jspresso.framework.view.descriptor.basic.BasicBorderViewDescriptor;
import org.jspresso.framework.view.descriptor.basic.BasicComponentViewDescriptor;
import org.jspresso.framework.view.descriptor.basic.BasicNestedComponentPropertyViewDescriptor;
import org.jspresso.framework.view.descriptor.basic.BasicPropertyViewDescriptor;
import org.jspresso.framework.view.descriptor.basic.BasicReferencePropertyViewDescriptor;
import org.jspresso.framework.view.descriptor.basic.BasicTableViewDescriptor;
/**
* A default implementation for query view descriptor factory.
*
* @param <E>
* the actual gui component type used.
* @param <F>
* the actual icon type used.
* @param <G>
* the actual action type used.
* @author Vincent Vandenschrick
* @version $LastChangedRevision : 1091 $
*/
public class BasicQueryViewDescriptorFactory<E, F, G> implements IQueryViewDescriptorFactory {
private boolean useCompactComparableQueryStructures;
private IDisplayableAction okCloseDialogAction;
private IDisplayableAction modalDialogAction;
private String defaultFindIconImageUrl;
/**
* Constructs a new {@code BasicQueryViewDescriptorFactory} instance.
*/
public BasicQueryViewDescriptorFactory() {
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("ConstantConditions")
@Override
public IViewDescriptor createQueryViewDescriptor(IComponentDescriptorProvider<IComponent> componentDescriptorProvider,
IComponentDescriptor<? extends IQueryComponent>
queryComponentDescriptor,
Map<String, Object> actionContext) {
BasicComponentViewDescriptor queryComponentViewDescriptor = new BasicComponentViewDescriptor();
List<IPropertyViewDescriptor> propertyViewDescriptors = new ArrayList<>();
for (String queriableProperty : componentDescriptorProvider.getQueryableProperties()) {
IPropertyDescriptor actualPropertyDescriptor = queryComponentDescriptor.getPropertyDescriptor(queriableProperty);
// To preserve col spans for query structures.
if (actualPropertyDescriptor instanceof ComparableQueryStructureDescriptor) {
if (isUseCompactComparableQueryStructures()) {
IPropertyViewDescriptor propertyView = createCompactComparablePropertyViewDescriptor(
queriableProperty, (ComparableQueryStructureDescriptor) actualPropertyDescriptor);
propertyViewDescriptors.add(propertyView);
} else {
IPropertyViewDescriptor propertyView = createNestedComparablePropertyViewDescriptor(
queriableProperty, actualPropertyDescriptor);
propertyViewDescriptors.add(propertyView);
}
} else if (actualPropertyDescriptor instanceof EnumQueryStructureDescriptor) {
BasicPropertyViewDescriptor propertyView = createEnumReferencePropertyViewDescriptor(queriableProperty,
(EnumQueryStructureDescriptor) actualPropertyDescriptor);
propertyViewDescriptors.add(propertyView);
} else {
BasicPropertyViewDescriptor propertyView = createDefaultPropertyViewDescriptor(queriableProperty);
propertyViewDescriptors.add(propertyView);
}
}
// We have to delay width computation in order to solve bug #663.
for (IPropertyViewDescriptor propertyView : propertyViewDescriptors) {
int width;
// if (propertyView.getName().endsWith(
// ComparableQueryStructureDescriptor.COMPARATOR)
// || propertyView.getName().endsWith(
// ComparableQueryStructureDescriptor.INF_VALUE)) {
// width = 1;
// } else if (propertyView.getName().endsWith(
// ComparableQueryStructureDescriptor.SUP_VALUE)) {
// width = 2;
// } else {
width = 4;
// }
((BasicPropertyViewDescriptor) propertyView).setWidth(width);
}
queryComponentViewDescriptor.setPropertyViewDescriptors(propertyViewDescriptors);
queryComponentViewDescriptor.setColumnCount(8);
queryComponentViewDescriptor.setModelDescriptor(queryComponentDescriptor);
queryComponentViewDescriptor.setWidthResizeable(false);
return queryComponentViewDescriptor;
}
/**
* Create default property view descriptor basic property view descriptor.
*
* @param queriableProperty
* the queriable property
* @return the basic property view descriptor
*/
protected BasicPropertyViewDescriptor createDefaultPropertyViewDescriptor(String queriableProperty) {
BasicPropertyViewDescriptor propertyView = new BasicPropertyViewDescriptor();
propertyView.setName(queriableProperty);
return propertyView;
}
/**
* Create enum reference property view descriptor basic reference property view descriptor.
*
* @param queriableProperty
* the queriable property
* @param actualPropertyDescriptor
* the actual property descriptor
* @return the basic reference property view descriptor
*/
protected BasicPropertyViewDescriptor createEnumReferencePropertyViewDescriptor(String queriableProperty,
EnumQueryStructureDescriptor actualPropertyDescriptor) {
BasicReferencePropertyViewDescriptor propertyView = new BasicReferencePropertyViewDescriptor();
propertyView.setName(queriableProperty);
propertyView.setLovAction(createEnumSelectAction(actualPropertyDescriptor));
propertyView.setAutoCompleteEnabled(false);
return propertyView;
}
/**
* Create compact comparable property view descriptor basic reference property view descriptor.
*
* @param queriableProperty
* the queriable property
* @param actualPropertyDescriptor
* the actual property descriptor
* @return the basic reference property view descriptor
*/
protected BasicPropertyViewDescriptor createCompactComparablePropertyViewDescriptor(String queriableProperty,
ComparableQueryStructureDescriptor actualPropertyDescriptor) {
BasicReferencePropertyViewDescriptor propertyView = new BasicReferencePropertyViewDescriptor();
propertyView.setName(queriableProperty);
propertyView.setLovAction(
createComparableEditAction(actualPropertyDescriptor));
propertyView.setAutoCompleteEnabled(false);
return propertyView;
}
/**
* Create nested comparable property view descriptor basic nested component property view descriptor.
*
* @param queriableProperty
* the queriable property
* @param actualPropertyDescriptor
* the actual property descriptor
* @return the basic nested component property view descriptor
*/
protected BasicPropertyViewDescriptor createNestedComparablePropertyViewDescriptor(
String queriableProperty, IPropertyDescriptor actualPropertyDescriptor) {
BasicComponentViewDescriptor comparableComponentViewDescriptor = new BasicComponentViewDescriptor();
comparableComponentViewDescriptor.setLabelsPosition(ELabelPosition.NONE);
comparableComponentViewDescriptor.setWidthResizeable(false);
comparableComponentViewDescriptor.setColumnCount(3);
comparableComponentViewDescriptor.setModelDescriptor(
((ComparableQueryStructureDescriptor) actualPropertyDescriptor).getReferencedDescriptor());
comparableComponentViewDescriptor.setRenderedProperties(Arrays
.asList(ComparableQueryStructureDescriptor.COMPARATOR,
ComparableQueryStructureDescriptor.INF_VALUE,
ComparableQueryStructureDescriptor.SUP_VALUE));
BasicNestedComponentPropertyViewDescriptor propertyView = new BasicNestedComponentPropertyViewDescriptor();
propertyView.setName(queriableProperty);
propertyView.setNestedComponentViewDescriptor(comparableComponentViewDescriptor);
propertyView.setModelDescriptor(actualPropertyDescriptor);
return propertyView;
}
/**
* Create comparable edit action.
*
* @param comparablePropertyDescriptor
* the comparable property descriptor
* @return the edit action
*/
protected IDisplayableAction createComparableEditAction(
ComparableQueryStructureDescriptor comparablePropertyDescriptor) {
EditComponentAction<E, F, G> comparableEditAction = new EditComponentAction<>();
if (comparablePropertyDescriptor.getIcon() != null) {
comparableEditAction.setIcon(comparablePropertyDescriptor.getIcon());
} else {
comparableEditAction.setIconImageURL(getDefaultFindIconImageUrl());
}
BasicComponentViewDescriptor viewDescriptor = new BasicComponentViewDescriptor();
BasicPropertyViewDescriptor propertyView;
List<IPropertyViewDescriptor> propertyViewDescriptors = new ArrayList<>();
propertyView = new BasicPropertyViewDescriptor();
propertyView.setName(ComparableQueryStructureDescriptor.COMPARATOR);
propertyViewDescriptors.add(propertyView);
propertyView = new BasicPropertyViewDescriptor();
propertyView.setName(ComparableQueryStructureDescriptor.INF_VALUE);
propertyViewDescriptors.add(propertyView);
propertyView = new BasicPropertyViewDescriptor();
propertyView.setName(ComparableQueryStructureDescriptor.SUP_VALUE);
propertyViewDescriptors.add(propertyView);
viewDescriptor.setColumnCount(3);
viewDescriptor.setPropertyViewDescriptors(propertyViewDescriptors);
viewDescriptor.setName(comparablePropertyDescriptor.getName());
viewDescriptor.setModelDescriptor(comparablePropertyDescriptor.getReferencedDescriptor());
comparableEditAction.setViewDescriptor(viewDescriptor);
comparableEditAction.setCancelAction(null);
comparableEditAction.setOkAction(getOkCloseDialogAction());
comparableEditAction.setNextAction(getModalDialogAction());
return comparableEditAction;
}
/**
* Creates the enumSelectAction.
*
* @param enumPropertyDescriptor
* the enumeration property descriptor to create the LOV action for.
* @return the enumSelectAction.
*/
protected IDisplayableAction createEnumSelectAction(final EnumQueryStructureDescriptor enumPropertyDescriptor) {
EditComponentAction<E, F, G> enumSelectAction = new EditComponentAction<>();
if (enumPropertyDescriptor.getIcon() != null) {
enumSelectAction.setIcon(enumPropertyDescriptor.getIcon());
} else {
enumSelectAction.setIconImageURL(getDefaultFindIconImageUrl());
}
BasicBorderViewDescriptor viewDescriptor = new BasicBorderViewDescriptor();
viewDescriptor.setName(EnumQueryStructureDescriptor.ENUMERATION_VALUES);
viewDescriptor.setModelDescriptor(enumPropertyDescriptor.getReferencedDescriptor());
BasicTableViewDescriptor table = new BasicTableViewDescriptor();
table.setName(EnumQueryStructureDescriptor.ENUMERATION_VALUES);
viewDescriptor.setCenterViewDescriptor(table);
enumSelectAction.setViewDescriptor(viewDescriptor);
enumSelectAction.setCancelAction(null);
enumSelectAction.setOkAction(getOkCloseDialogAction());
enumSelectAction.setNextAction(getModalDialogAction());
return enumSelectAction;
}
/**
* Gets the okCloseDialogAction.
*
* @return the okCloseDialogAction.
*/
protected IDisplayableAction getOkCloseDialogAction() {
return okCloseDialogAction;
}
/**
* Sets the okCloseDialogAction.
*
* @param okCloseDialogAction
* the okCloseDialogAction to set.
*/
public void setOkCloseDialogAction(IDisplayableAction okCloseDialogAction) {
this.okCloseDialogAction = okCloseDialogAction;
}
/**
* Gets the modalDialogAction.
*
* @return the modalDialogAction.
*/
protected IDisplayableAction getModalDialogAction() {
return modalDialogAction;
}
/**
* Sets the modalDialogAction.
*
* @param modalDialogAction
* the modalDialogAction to set.
*/
public void setModalDialogAction(IDisplayableAction modalDialogAction) {
this.modalDialogAction = modalDialogAction;
}
/**
* Gets the defaultFindIconImageUrl.
*
* @return the defaultFindIconImageUrl.
*/
protected String getDefaultFindIconImageUrl() {
return defaultFindIconImageUrl;
}
/**
* Sets the defaultFindIconImageUrl.
*
* @param defaultFindIconImageUrl
* the defaultFindIconImageUrl to set.
*/
public void setDefaultFindIconImageUrl(String defaultFindIconImageUrl) {
this.defaultFindIconImageUrl = defaultFindIconImageUrl;
}
/**
* Is use compact comparable query structures.
*
* @return the boolean
*/
protected boolean isUseCompactComparableQueryStructures() {
return useCompactComparableQueryStructures;
}
/**
* Sets use compact comparable query structures.
*
* @param useCompactComparableQueryStructures
* the use compact comparable query structures
*/
public void setUseCompactComparableQueryStructures(boolean useCompactComparableQueryStructures) {
this.useCompactComparableQueryStructures = useCompactComparableQueryStructures;
}
/**
* {@inheritDoc}
*/
@Override
public <V extends IViewDescriptor> V adaptExistingViewDescriptor(V viewDescriptor) {
if (viewDescriptor instanceof BasicComponentViewDescriptor) {
List<IPropertyViewDescriptor> propertyViews = ((BasicComponentViewDescriptor) viewDescriptor)
.getPropertyViewDescriptors(false);
for (int i = 0; i < propertyViews.size(); i++) {
IPropertyViewDescriptor propertyView = propertyViews.get(i);
if ((propertyView.getModelDescriptor() instanceof ComparableQueryStructureDescriptor
&& isUseCompactComparableQueryStructures()) || propertyView
.getModelDescriptor() instanceof EnumQueryStructureDescriptor) {
if (!(propertyView instanceof BasicReferencePropertyViewDescriptor)) {
propertyView = adaptReferencePropertyViewDescriptor(propertyView);
propertyViews.set(i, propertyView);
}
if (((BasicReferencePropertyViewDescriptor) propertyView).getLovAction() == null) {
if (propertyView.getModelDescriptor() instanceof ComparableQueryStructureDescriptor) {
((BasicReferencePropertyViewDescriptor) propertyView).setLovAction(
createComparableEditAction((ComparableQueryStructureDescriptor) propertyView.getModelDescriptor()));
} else if (propertyView.getModelDescriptor() instanceof EnumQueryStructureDescriptor) {
((BasicReferencePropertyViewDescriptor) propertyView).setLovAction(
createEnumSelectAction((EnumQueryStructureDescriptor) propertyView.getModelDescriptor()));
}
}
} else if (propertyView.getModelDescriptor() instanceof ComparableQueryStructureDescriptor) {
BasicPropertyViewDescriptor nestedComparablePropertyViewDescriptor = createNestedComparablePropertyViewDescriptor(
propertyView.getName(), (IPropertyDescriptor) propertyView.getModelDescriptor());
copyStyle(propertyView, nestedComparablePropertyViewDescriptor);
propertyView = nestedComparablePropertyViewDescriptor;
propertyViews.set(i, propertyView);
}
}
((BasicComponentViewDescriptor) viewDescriptor).setPropertyViewDescriptors(propertyViews);
}
if (viewDescriptor instanceof ICompositeViewDescriptor) {
List<IViewDescriptor> children = ((ICompositeViewDescriptor) viewDescriptor).getChildViewDescriptors();
if (children != null) {
for (IViewDescriptor childViewDesc : children) {
adaptExistingViewDescriptor(childViewDesc);
}
}
}
return viewDescriptor;
}
/**
* Adapt reference property view descriptor basic reference property view descriptor.
*
* @param propertyView
* the property view
* @return the basic reference property view descriptor
*/
protected BasicReferencePropertyViewDescriptor adaptReferencePropertyViewDescriptor(
IPropertyViewDescriptor propertyView) {
BasicReferencePropertyViewDescriptor refPropertyView = new BasicReferencePropertyViewDescriptor();
copyStyle(propertyView, refPropertyView);
refPropertyView.setAutoCompleteEnabled(false);
return refPropertyView;
}
private void copyStyle(IPropertyViewDescriptor source, BasicPropertyViewDescriptor dest) {
dest.setAction(source.getAction());
dest.setBackground(source.getBackground());
dest.setBorderType(source.getBorderType());
dest.setDescription(source.getDescription());
dest.setFont(source.getFont());
dest.setForeground(source.getForeground());
dest.setGrantedRoles(source.getGrantedRoles());
dest.setHorizontalAlignment(source.getHorizontalAlignment());
if (source instanceof DefaultDescriptor) {
dest.setI18nNameKey(((DefaultDescriptor) source).getI18nNameKey());
}
dest.setIcon(source.getIcon());
dest.setLabelBackground(source.getLabelBackground());
dest.setLabelFont(source.getLabelFont());
dest.setLabelForeground(source.getLabelForeground());
dest.setModelDescriptor(source.getModelDescriptor());
dest.setName(source.getName());
dest.setPermId(source.getPermId());
dest.setPreferredSize(source.getPreferredSize());
dest.setReadabilityGates(source.getReadabilityGates());
dest.setReadOnly(source.isReadOnly());
dest.setWritabilityGates(source.getWritabilityGates());
dest.setWidth(source.getWidth());
}
}