/******************************************************************************* * Copyright (c) 2008 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.eclipselink.ui.internal.persistence.options; import java.text.Collator; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; import org.eclipse.jpt.eclipselink.core.internal.context.persistence.options.Options; import org.eclipse.jpt.eclipselink.core.internal.context.persistence.options.TargetDatabase; import org.eclipse.jpt.eclipselink.ui.internal.EclipseLinkUiMessages; import org.eclipse.jpt.ui.internal.util.SWTUtil; import org.eclipse.jpt.ui.internal.widgets.Pane; import org.eclipse.jpt.utility.internal.CollectionTools; import org.eclipse.jpt.utility.internal.StringConverter; import org.eclipse.jpt.utility.internal.iterators.TransformationIterator; import org.eclipse.jpt.utility.internal.model.value.CompositeListValueModel; import org.eclipse.jpt.utility.internal.model.value.PropertyAspectAdapter; import org.eclipse.jpt.utility.internal.model.value.PropertyListValueModelAdapter; import org.eclipse.jpt.utility.internal.model.value.SimpleCollectionValueModel; import org.eclipse.jpt.utility.internal.model.value.SortedListValueModelAdapter; import org.eclipse.jpt.utility.model.value.CollectionValueModel; import org.eclipse.jpt.utility.model.value.ListValueModel; import org.eclipse.jpt.utility.model.value.PropertyValueModel; import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.widgets.Composite; /** * TargetDatabaseComposite */ public class TargetDatabaseComposite extends Pane { /** * Creates a new TargetDatabaseComposite. * * @param parentPane The parent container of this one * @param parent The parent container */ public TargetDatabaseComposite( Pane parentPane, Composite parent) { super(parentPane, parent); } private PropertyValueModel buildDefaultTargetDatabaseHolder() { return new PropertyAspectAdapter(this.getSubjectHolder(), Options.DEFAULT_TARGET_DATABASE) { @Override protected String buildValue_() { return TargetDatabaseComposite.this.getDefaultValue(subject); } }; } private ListValueModel buildDefaultTargetDatabaseListHolder() { return new PropertyListValueModelAdapter( this.buildDefaultTargetDatabaseHolder() ); } private String buildDisplayString(String targetDatabaseName) { return SWTUtil.buildDisplayString( EclipseLinkUiMessages.class, this.getClass(), TargetDatabase.valueOf(targetDatabaseName)); } private Comparator buildTargetDatabaseComparator() { return new Comparator() { public int compare(String targetDatabase1, String targetDatabase2) { targetDatabase1 = buildDisplayString(targetDatabase1); targetDatabase2 = buildDisplayString(targetDatabase2); return Collator.getInstance().compare(targetDatabase1, targetDatabase2); } }; } private StringConverter buildTargetDatabaseConverter() { return new StringConverter() { public String convertToString(String value) { try { TargetDatabase.valueOf(value); value = buildDisplayString(value); } catch (Exception e) { // Ignore since the value is not a TargetDatabase } return value; } }; } private WritablePropertyValueModel buildTargetDatabaseHolder() { return new PropertyAspectAdapter(this.getSubjectHolder(), Options.TARGET_DATABASE_PROPERTY) { @Override protected String buildValue_() { String name = subject.getTargetDatabase(); if (name == null) { name = TargetDatabaseComposite.this.getDefaultValue(subject); } return name; } @Override protected void setValue_(String value) { if (getDefaultValue(subject).equals(value)) { value = null; } subject.setTargetDatabase(value); } }; } private ListValueModel buildTargetDatabaseListHolder() { ArrayList> holders = new ArrayList>(2); holders.add(buildDefaultTargetDatabaseListHolder()); holders.add(buildTargetDatabasesListHolder()); return new CompositeListValueModel, String>(holders); } private Iterator buildTargetDatabases() { return new TransformationIterator(CollectionTools.iterator(TargetDatabase.values())) { @Override protected String transform(TargetDatabase next) { return next.name(); } }; } private CollectionValueModel buildTargetDatabasesCollectionHolder() { return new SimpleCollectionValueModel( CollectionTools.collection(buildTargetDatabases()) ); } private ListValueModel buildTargetDatabasesListHolder() { return new SortedListValueModelAdapter( buildTargetDatabasesCollectionHolder(), buildTargetDatabaseComparator() ); } private String getDefaultValue(Options subject) { String defaultValue = subject.getDefaultTargetDatabase(); if (defaultValue != null) { return NLS.bind( EclipseLinkUiMessages.PersistenceXmlOptionsTab_defaultWithOneParam, defaultValue ); } else { return EclipseLinkUiMessages.PersistenceXmlOptionsTab_defaultEmpty; } } /* * (non-Javadoc) */ @Override protected void initializeLayout(Composite container) { CCombo combo = addLabeledEditableCCombo( container, EclipseLinkUiMessages.PersistenceXmlOptionsTab_targetDatabaseLabel, this.buildTargetDatabaseListHolder(), this.buildTargetDatabaseHolder(), this.buildTargetDatabaseConverter(), null // EclipseLinkHelpContextIds.TARGET_DATABASE_NAME ); SWTUtil.attachDefaultValueHandler(combo); } }