package org.teiid.designer.ui.preferences; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.teiid.core.designer.util.I18nUtil; import org.teiid.core.designer.util.StringUtilities; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.runtime.registry.TeiidRuntimeRegistry; import org.teiid.designer.runtime.spi.ITeiidServerManager; import org.teiid.designer.runtime.version.spi.ITeiidServerVersion; import org.teiid.designer.runtime.version.spi.ITeiidServerVersion.VersionID; import org.teiid.designer.runtime.version.spi.TeiidServerVersion; import org.teiid.designer.ui.UiConstants; import org.teiid.designer.ui.UiPlugin; /** * @since 8.0 */ public class DefaultTeiidServerPreferenceContributor implements IGeneralPreferencePageContributor, UiConstants { private static final String PREF_ID = ITeiidServerManager.DEFAULT_TEIID_SERVER_VERSION_ID; private static final String PREFIX = I18nUtil.getPropertyPrefix(DefaultTeiidServerPreferenceContributor.class); private Shell shell; private Combo versionCombo; /** * {@inheritDoc} * * @see org.teiid.designer.ui.preferences.IGeneralPreferencePageContributor#createPreferenceEditor(org.eclipse.swt.widgets.Composite) */ @Override public void createPreferenceEditor( Composite parent ) { shell = parent.getShell(); Composite panel = new Composite(parent, SWT.NONE); GridLayoutFactory.swtDefaults().numColumns(2).applyTo(panel); versionCombo = new Combo(panel, SWT.DROP_DOWN); versionCombo.setFont(JFaceResources.getDialogFont()); versionCombo.setToolTipText(Util.getStringOrKey(PREFIX + "toolTip")); //$NON-NLS-1$ GridDataFactory.swtDefaults().grab(true, true).align(SWT.LEFT, SWT.CENTER).applyTo(versionCombo); Label title = new Label(panel, SWT.NONE); title.setText(Util.getStringOrKey(PREFIX + "title")); //$NON-NLS-1$ GridDataFactory.swtDefaults().grab(true, true).align(SWT.LEFT, SWT.CENTER).applyTo(title); // initialize state refresh(); } /** * {@inheritDoc} * * @see org.teiid.designer.ui.preferences.IGeneralPreferencePageContributor#getName() */ @Override public String getName() { return Util.getStringOrKey(PREFIX + "name"); //$NON-NLS-1$ } /** * Obtains the <code>IPreferenceStore</code> where this preference is being persisted. * * @return the preference store */ private IPreferenceStore getPreferenceStore() { return UiPlugin.getDefault().getPreferenceStore(); } /** * Obtains the {@link IPreferenceStore}'s default or current value for this preference * * @param defaultFlag indicates if the default or current value is being requested * @return the requested value */ private String getPreferenceStoreValue( boolean defaultFlag ) { IPreferenceStore prefStore = getPreferenceStore(); String value = null; if (defaultFlag) { value = prefStore.getDefaultString(PREF_ID); } else { value = prefStore.getString(PREF_ID); } if (StringUtilities.isEmpty(value)) { value = TeiidServerVersion.deriveUltimateDefaultServerVersion().toString(); } return value; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.preferences.IGeneralPreferencePageContributor#getToolTip() */ @Override public String getToolTip() { return Util.getStringOrKey(PREFIX + "toolTip"); //$NON-NLS-1$ } /** * {@inheritDoc} * * @see org.teiid.designer.ui.preferences.IGeneralPreferencePageContributor#performCancel() */ @Override public boolean performCancel() { return true; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.preferences.IGeneralPreferencePageContributor#performDefaults() */ @Override public boolean performDefaults() { update(getPreferenceStoreValue(true)); return true; } private boolean hasOpenEditors() { for (IWorkbenchWindow window : PlatformUI.getWorkbench().getWorkbenchWindows()) { for (IWorkbenchPage page : window.getPages()) { if (page.getEditorReferences().length > 0) return true; } } return false; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.preferences.IGeneralPreferencePageContributor#performOk() */ @Override public boolean performOk() { // persist value String versionString = versionCombo.getText(); ITeiidServerVersion version = new TeiidServerVersion(versionString); if (versionString.equals(getPreferenceStoreValue(false))) return true; // same value - no change if (ModelerCore.getTeiidServerManager().getDefaultServer() == null && hasOpenEditors()) { // No default teiid instance and open editors so modelling diagrams may close which could surprise! boolean changeVersion = MessageDialog.openQuestion(shell, Util.getStringOrKey(PREFIX + "versionChangeQuestionTitle"), //$NON-NLS-1$ Util.getStringOrKey(PREFIX + "versionChangeQuestionMessage")); //$NON-NLS-1$ if (! changeVersion) return false; } try { for (ITeiidServerVersion regVersion : TeiidRuntimeRegistry.getInstance().getSupportedVersions()) { if (regVersion.compareTo(version)) { getPreferenceStore().setValue(PREF_ID, regVersion.toString()); return true; } } } catch (Exception ex) { Util.log(ex); } boolean changeVersion = MessageDialog.openQuestion(shell, Util.getStringOrKey(PREFIX + "unsupportedVersionQuestionTitle"), //$NON-NLS-1$ Util.getStringOrKey(PREFIX + "unsupportedVersionQuestionMesssage")); //$NON-NLS-1$ if (changeVersion) { getPreferenceStore().setValue(PREF_ID, version.toString()); return true; } // No runtime client to support default version return false; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.preferences.IGeneralPreferencePageContributor#refresh() */ @Override public void refresh() { update(getPreferenceStoreValue(false)); } /** * {@inheritDoc} * * @see org.teiid.designer.ui.preferences.IGeneralPreferencePageContributor#setWorkbench(org.eclipse.ui.IWorkbench) */ @Override public void setWorkbench( IWorkbench theWorkbench ) { // nothing to do } /** * Updates the radio buttons selection states corresponding to the new value. * * @param value the new value */ private void update( String value ) { List<String> items = new ArrayList<String>(); try { Collection<ITeiidServerVersion> registeredServerVersions = TeiidRuntimeRegistry.getInstance().getSupportedVersions(); items = TeiidServerVersion.orderVersions(registeredServerVersions, true); } catch (Exception ex) { Util.log(ex); for (VersionID versionId : VersionID.values()) { items.add(versionId.toString()); } } versionCombo.setItems(items.toArray(new String[0])); versionCombo.setText(value); } }