blob: 6adf2d1cc7f5e50f70d77a1378749c313f25cab6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2013 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0, which accompanies this distribution
* and is available at http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.jaxb.ui.internal;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jpt.common.ui.internal.jface.ModelItemExtendedLabelProvider;
import org.eclipse.jpt.common.ui.internal.jface.NullItemExtendedLabelProvider;
import org.eclipse.jpt.common.ui.internal.jface.StaticItemExtendedLabelProvider;
import org.eclipse.jpt.common.ui.jface.ItemExtendedLabelProvider;
import org.eclipse.jpt.common.utility.internal.model.value.AspectPropertyValueModelAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;
import org.eclipse.jpt.common.utility.internal.model.value.StaticPropertyValueModel;
import org.eclipse.jpt.common.utility.model.event.PropertyChangeEvent;
import org.eclipse.jpt.common.utility.model.listener.PropertyChangeListener;
import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;
import org.eclipse.jpt.jaxb.core.context.JaxbContextRoot;
import org.eclipse.jpt.jaxb.core.context.JaxbEnumConstant;
import org.eclipse.jpt.jaxb.core.context.JaxbPackage;
import org.eclipse.jpt.jaxb.core.context.JaxbPersistentAttribute;
import org.eclipse.jpt.jaxb.core.context.JaxbTypeMapping;
import org.eclipse.jpt.jaxb.core.context.java.JavaClass;
import org.eclipse.jpt.jaxb.core.context.java.JavaClassMapping;
import org.eclipse.jpt.jaxb.core.context.java.JavaEnum;
import org.eclipse.jpt.jaxb.core.context.java.JavaEnumMapping;
import org.eclipse.jpt.jaxb.core.context.java.JavaPersistentAttribute;
import org.eclipse.jpt.jaxb.core.context.java.JavaType;
import org.eclipse.jpt.jaxb.ui.JptJaxbUiImages;
import org.eclipse.jpt.jaxb.ui.JptJaxbUiMessages;
public abstract class AbstractNavigatorItemLabelProviderFactory
implements ItemExtendedLabelProvider.Factory
{
protected AbstractNavigatorItemLabelProviderFactory() {
super();
}
public ItemExtendedLabelProvider buildProvider(Object item, ItemExtendedLabelProvider.Manager manager) {
if (item instanceof JaxbContextRoot) {
return this.buildJaxbContextRootProvider((JaxbContextRoot) item, manager);
}
else if (item instanceof JaxbPackage) {
return this.buildJaxbPackageProvider((JaxbPackage) item, manager);
}
else if (item instanceof JavaClass) {
return this.buildJavaClassProvider((JavaClass) item, manager);
}
else if (item instanceof JavaEnum) {
return this.buildJavaEnumProvider((JavaEnum) item, manager);
}
else if (item instanceof JavaPersistentAttribute) {
return this.buildJavaPersistentAttributeProvider((JavaPersistentAttribute) item, manager);
}
else if (item instanceof JaxbEnumConstant) {
return this.buildJaxbEnumConstantProvider((JaxbEnumConstant) item, manager);
}
return NullItemExtendedLabelProvider.instance();
}
protected ItemExtendedLabelProvider buildJaxbEnumConstantProvider(JaxbEnumConstant enumConstant, ItemExtendedLabelProvider.Manager manager) {
return new StaticItemExtendedLabelProvider(
JptJaxbUiImages.ENUM_CONSTANT,
enumConstant.getName(),
manager
);
}
protected ItemExtendedLabelProvider buildJaxbPackageProvider(JaxbPackage pkg, ItemExtendedLabelProvider.Manager manager) {
return new StaticItemExtendedLabelProvider(
JptJaxbUiImages.JAXB_PACKAGE,
pkg.getName(),
this.buildJaxbPackageDescription(pkg),
manager
);
}
protected String buildJaxbPackageDescription(JaxbPackage pkg) {
StringBuilder sb = new StringBuilder();
sb.append(pkg.getName());
sb.append(" - "); //$NON-NLS-1$
sb.append(pkg.getResource().getFullPath().makeRelative());
return sb.toString();
}
// ********** jaxb context root **********
protected ItemExtendedLabelProvider buildJaxbContextRootProvider(JaxbContextRoot root, ItemExtendedLabelProvider.Manager manager) {
return new StaticItemExtendedLabelProvider(
JptJaxbUiImages.JAXB_CONTENT,
JptJaxbUiMessages.JAXB_CONTENT_LABEL,
this.buildJaxbContextRootDescription(root),
manager
);
}
protected String buildJaxbContextRootDescription(JaxbContextRoot root) {
StringBuilder sb = new StringBuilder();
sb.append(JptJaxbUiMessages.JAXB_CONTENT_LABEL);
sb.append(" - "); //$NON-NLS-1$
sb.append(root.getResource().getFullPath().makeRelative());
return sb.toString();
}
// ********** java class **********
protected ItemExtendedLabelProvider buildJavaClassProvider(JavaClass item, ItemExtendedLabelProvider.Manager manager) {
return new ModelItemExtendedLabelProvider(
item,
manager,
this.buildJavaClassImageDescriptorModel(item),
this.buildJavaTypeTextModel(item),
this.buildJavaTypeDescriptionModel(item)
);
}
public PropertyValueModel<ImageDescriptor> buildJavaClassImageDescriptorModel(JavaClass item) {
return new JavaClassImageDescriptorModel(item);
}
protected class JavaClassImageDescriptorModel
extends AspectPropertyValueModelAdapter<JavaClass, ImageDescriptor> {
protected final PropertyValueModel<Boolean> isXmlRegistryModel;
protected final PropertyValueModel<JavaClassMapping> mappingModel;
protected final PropertyValueModel<Boolean> isXmlTransientModel;
protected final PropertyChangeListener propertyChangeListener;
public JavaClassImageDescriptorModel(JavaClass subject) {
super(new StaticPropertyValueModel<JavaClass>(subject));
this.isXmlRegistryModel = buildIsXmlRegistryModel();
this.mappingModel = buildMappingModel();
this.isXmlTransientModel = buildIsXmlTransientModel();
this.propertyChangeListener = buildPropertyChangeListener();
}
protected PropertyValueModel<Boolean> buildIsXmlRegistryModel() {
return new PropertyAspectAdapter<JavaClass, Boolean>(JavaClass.XML_REGISTRY_PROPERTY, this.subject) {
@Override
protected Boolean buildValue_() {
return Boolean.valueOf(this.subject.getXmlRegistry() != null);
}
};
}
protected PropertyValueModel<JavaClassMapping> buildMappingModel() {
return new PropertyAspectAdapter<JavaClass, JavaClassMapping> (JavaType.MAPPING_PROPERTY, this.subject) {
@Override
protected JavaClassMapping buildValue_() {
return this.subject.getMapping();
}
};
}
protected PropertyValueModel<Boolean> buildIsXmlTransientModel() {
return new PropertyAspectAdapter<JavaClassMapping, Boolean>(this.mappingModel, JaxbTypeMapping.XML_TRANSIENT_PROPERTY) {
@Override
protected Boolean buildValue_() {
return Boolean.valueOf(this.subject.isXmlTransient());
}
};
}
protected PropertyChangeListener buildPropertyChangeListener() {
// transform the subject's property change events into VALUE property change events
return new PropertyChangeListener() {
public void propertyChanged(PropertyChangeEvent event) {
JavaClassImageDescriptorModel.this.aspectChanged();
}
};
}
@Override
protected void aspectChanged() {
super.aspectChanged();
}
@Override
protected ImageDescriptor buildValue_() {
if ((this.mappingModel.getValue() != null) && (this.isXmlTransientModel.getValue() == Boolean.TRUE)) {
return JptJaxbUiImages.JAXB_TRANSIENT_CLASS;
}
if (this.isXmlRegistryModel.getValue() == Boolean.TRUE) {
return JptJaxbUiImages.JAXB_REGISTRY;
}
return JptJaxbUiImages.JAXB_CLASS;
}
@Override
protected void engageSubject_() {
this.isXmlRegistryModel.addPropertyChangeListener(VALUE, this.propertyChangeListener);
this.mappingModel.addPropertyChangeListener(VALUE, this.propertyChangeListener);
this.isXmlTransientModel.addPropertyChangeListener(VALUE, this.propertyChangeListener);
}
@Override
protected void disengageSubject_() {
this.isXmlRegistryModel.removePropertyChangeListener(VALUE, this.propertyChangeListener);
this.mappingModel.removePropertyChangeListener(VALUE, this.propertyChangeListener);
this.isXmlTransientModel.removePropertyChangeListener(VALUE, this.propertyChangeListener);
}
}
// ********** java enum **********
protected ItemExtendedLabelProvider buildJavaEnumProvider(JavaEnum item, ItemExtendedLabelProvider.Manager manager) {
return new ModelItemExtendedLabelProvider(
item,
manager,
this.buildJavaEnumImageDescriptorModel(item),
this.buildJavaTypeTextModel(item),
this.buildJavaTypeDescriptionModel(item)
);
}
public PropertyValueModel<ImageDescriptor> buildJavaEnumImageDescriptorModel(JavaEnum item) {
return new JavaEnumImageDescriptorModel(item);
}
protected class JavaEnumImageDescriptorModel
extends AspectPropertyValueModelAdapter<JavaEnum, ImageDescriptor> {
protected final PropertyValueModel<JavaEnumMapping> mappingModel;
protected final PropertyValueModel<Boolean> isXmlTransientModel;
protected final PropertyChangeListener propertyChangeListener;
public JavaEnumImageDescriptorModel(JavaEnum subject) {
super(new StaticPropertyValueModel<JavaEnum>(subject));
this.mappingModel = buildMappingModel();
this.isXmlTransientModel = buildIsXmlTransientModel();
this.propertyChangeListener = buildPropertyChangeListener();
}
protected PropertyValueModel<JavaEnumMapping> buildMappingModel() {
return new PropertyAspectAdapter<JavaEnum, JavaEnumMapping> (JavaType.MAPPING_PROPERTY, this.subject) {
@Override
protected JavaEnumMapping buildValue_() {
return this.subject.getMapping();
}
};
}
protected PropertyValueModel<Boolean> buildIsXmlTransientModel() {
return new PropertyAspectAdapter<JavaEnumMapping, Boolean>(this.mappingModel, JaxbTypeMapping.XML_TRANSIENT_PROPERTY) {
@Override
protected Boolean buildValue_() {
return Boolean.valueOf(this.subject.isXmlTransient());
}
};
}
protected PropertyChangeListener buildPropertyChangeListener() {
// transform the subject's property change events into VALUE property change events
return new PropertyChangeListener() {
public void propertyChanged(PropertyChangeEvent event) {
JavaEnumImageDescriptorModel.this.aspectChanged();
}
};
}
@Override
protected void aspectChanged() {
super.aspectChanged();
}
@Override
protected ImageDescriptor buildValue_() {
if ((this.mappingModel.getValue() != null) && (this.isXmlTransientModel.getValue() == Boolean.TRUE)) {
return JptJaxbUiImages.JAXB_TRANSIENT_ENUM;
}
return JptJaxbUiImages.JAXB_ENUM;
}
@Override
protected void engageSubject_() {
this.mappingModel.addPropertyChangeListener(VALUE, this.propertyChangeListener);
this.isXmlTransientModel.addPropertyChangeListener(VALUE, this.propertyChangeListener);
}
@Override
protected void disengageSubject_() {
this.mappingModel.removePropertyChangeListener(VALUE, this.propertyChangeListener);
this.isXmlTransientModel.removePropertyChangeListener(VALUE, this.propertyChangeListener);
}
}
// ********** java type **********
public PropertyValueModel<String> buildJavaTypeTextModel(JavaType item) {
return new StaticPropertyValueModel<String>(item.getTypeName().getTypeQualifiedName());
}
public PropertyValueModel<String> buildJavaTypeDescriptionModel(JavaType item) {
return new StaticPropertyValueModel<String>(this.buildJavaTypeDescription(item));
}
protected String buildJavaTypeDescription(JavaType item) {
StringBuilder sb = new StringBuilder();
sb.append(item.getTypeName().getFullyQualifiedName());
//TODO if type is binary, there will be no underlying file. Need to determine what correct behavior is for this case
//for now, avoid this part of the description for binary types
IResource resource = item.getResource();
if (resource != null) {
sb.append(" - "); //$NON-NLS-1$
sb.append(resource.getFullPath().makeRelative());
}
return sb.toString();
}
// ********** java persistent attribute **********
protected ItemExtendedLabelProvider buildJavaPersistentAttributeProvider(JavaPersistentAttribute item, ItemExtendedLabelProvider.Manager manager) {
return new ModelItemExtendedLabelProvider(
item,
manager,
this.buildJavaPersistentAttributeImageDescriptorModel(item),
this.buildJavaPersistentAttributeTextModel(item),
this.buildJavaPersistentAttributeDescriptionModel(item)
);
}
public PropertyValueModel<ImageDescriptor> buildJavaPersistentAttributeImageDescriptorModel(JavaPersistentAttribute item) {
return new PropertyAspectAdapter<JavaPersistentAttribute, ImageDescriptor>(IMAGE_ASPECT_NAMES, item) {
@Override
protected ImageDescriptor buildValue_() {
return AbstractNavigatorItemLabelProviderFactory.this.buildJavaPersistentAttributeImageDescriptor(this.subject.getMappingKey());
}
};
}
protected ImageDescriptor buildJavaPersistentAttributeImageDescriptor(String mappingKey) {
return JaxbMappingImageHelper.imageDescriptorForAttributeMapping(mappingKey);
}
protected static final String[] IMAGE_ASPECT_NAMES = new String[] {
JavaPersistentAttribute.DEFAULT_MAPPING_KEY_PROPERTY,
JaxbPersistentAttribute.MAPPING_PROPERTY
};
public PropertyValueModel<String> buildJavaPersistentAttributeTextModel(JavaPersistentAttribute item) {
return new StaticPropertyValueModel<String>(this.buildJavaPersistentAttributeText(item));
}
protected String buildJavaPersistentAttributeText(JavaPersistentAttribute item) {
StringBuffer sb = new StringBuffer();
if (item.isInherited()) {
sb.append(item.getDeclaringTypeName().getTypeQualifiedName());
sb.append('.');
}
sb.append(item.getName());
return sb.toString();
}
public PropertyValueModel<String> buildJavaPersistentAttributeDescriptionModel(JavaPersistentAttribute item) {
return new StaticPropertyValueModel<String>(this.buildJavaPersistentAttributeDescription(item));
}
protected String buildJavaPersistentAttributeDescription(JavaPersistentAttribute item) {
return item.getName();
}
}