/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.wizards.special; import java.util.Properties; import org.jboss.tools.common.model.XModelException; import org.jboss.tools.common.model.ui.action.CommandBar; import org.jboss.tools.common.model.ui.wizards.standard.DefaultStandardWizard; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.widgets.*; import org.eclipse.ui.PlatformUI; import org.jboss.tools.common.meta.action.SpecialWizard; import org.jboss.tools.common.meta.action.impl.*; import org.jboss.tools.common.meta.help.HelpUtil; import org.jboss.tools.common.model.util.ModelFeatureFactory; import org.jboss.tools.common.model.ui.ModelUIImages; import org.jboss.tools.common.model.ui.ModelUIPlugin; public class DefaultSpecialWizard implements SpecialWizard, SpecialWizardControlListener { protected SpecialWizardSupport support = null; protected ISpecialWizardStep wizardStep = null; protected DefaultSpecialWizardDialog dialog = null; ProgressPart progressPart = null; public DefaultSpecialWizard() { } public void setObject(Object object) { setSupport((SpecialWizardSupport)((Object[])object)[0]); } public int execute() { Shell shell = (Shell)support.getProperties().get("shell"); //$NON-NLS-1$ if(shell == null) shell = ModelUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(); if(support.canBeProcessedByStandardWizard()) { DefaultStandardWizard dsw = new DefaultStandardWizard(); dsw.setWindowTitle(support.getTitle()); dsw.setSupport(support); dsw.setDefaultPageImageDescriptor(ModelUIImages.getImageDescriptor(ModelUIImages.WIZARD_DEFAULT)); WizardDialog wd = new WizardDialog(shell, dsw); wd.create(); PlatformUI.getWorkbench().getHelpSystem().setHelp(wd.getShell(), "org.eclipse.ui.new_wizard_shortcut_context"); //$NON-NLS-1$ int ii = wd.open(); return ii; } dialog = new DefaultSpecialWizardDialog(shell); dialog.setWizard(this); dialog.create(); progressPart = new ProgressPart(dialog.getShell(), this); support.getProperties().put("dialogShell", dialog.getShell()); //$NON-NLS-1$ support.getProperties().put("IRunnableContext", progressPart); //$NON-NLS-1$ open(); return 0; } public ProgressPart getProgressPart() { return progressPart; } public boolean needsProgressMonitor() { return true; } private void open() { if(validationRunnable == null) validationRunnable = new ValidationRunnable(); // String threadname = "Wizard Validation - " + support.getTitle(); /// new Thread(validationRunnable, threadname).start(); dialog.getShell().pack(true); setStep(); try { support.action("STEP"); } catch (XModelException e) { ModelUIPlugin.getPluginLog().logError(e); } dialog.open(); } public void action(String name) { if(dialog == null) return; CommandBar bar = dialog.getCommandBar(); bar.disable(); if(SpecialWizardSupport.HELP.equals(name)) { HelpUtil.helpEclipse(support.getTarget().getModel(), support.getHelpKey()); return; } try { save(); support.action(name); dialog.setMessage(""); //$NON-NLS-1$ } catch (XModelException e) { ModelUIPlugin.getPluginLog().logError(e); } setStep(); } private void setStep() { if(wizardStep != null) wizardStep.dispose(); if(support.isFinished()) { dispose(); return; } int i = support.getStepId(); if(support.isFinished()) return; String message = support.getMessage(i); if(i >= 0) { wizardStep = getStep(i); if(wizardStep == null) return; wizardStep.update(); } else { wizardStep = null; } if(wizardStep == null) return; dialog.setMaximumSize(wizardStep.getMaximumSize()); dialog.setMinimumSize(wizardStep.getMinimumSize()); dialog.updateDialogArea(); dialog.updateButtonsBar(getSupport().getActionNames(i)); dialog.getShell().setText(support.getTitle()); dialog.setTitle(support.getSubtitle()); if(message != null) dialog.setMessage(message); wizardStep.validate(); } private ISpecialWizardStep getStep(int i) { if(i < 0) return null; String cls = support.getStepImplementingClass(i); ISpecialWizardStep step = null; try { step = (ISpecialWizardStep)ModelFeatureFactory.getInstance().createFeatureInstance(cls); if(step instanceof AbstractSpecialWizardStep) { ((AbstractSpecialWizardStep)step).setWizard(this); } step.setSupport(support, i); } catch (ClassCastException e) { ModelUIPlugin.getPluginLog().logError("Cannot load class '" + cls + "'."); //$NON-NLS-1$ //$NON-NLS-2$ } return step; } public void save() { if(wizardStep != null) wizardStep.save(); } public void dispose() { stopValidator(); if(dialog == null) return; if(dialog.getShell() != null && !dialog.getShell().isDisposed()) dialog.close(); dialog = null; } public SpecialWizardSupport getSupport() { return support; } public void setSupport(SpecialWizardSupport support) { this.support = support; if(support != null) support.setControlListener(this); } public ISpecialWizardStep getWizardStep() { return wizardStep; } public void setWizardStep(ISpecialWizardStep step) { wizardStep = step; } public void dataChanged(WizardDataValidator validator, Properties data) { if(validator == null) return; if(validationRunnable == null) return; validationRunnable.setData(validator, data); validationRunnable.safeUpdateValidationData(); } private ValidationRunnable validationRunnable = new ValidationRunnable(); public void stopValidator() { if(validationRunnable == null) return; validationRunnable = null; } class ValidationRunnable implements Runnable { Properties data; WizardDataValidator validator; long timeStamp = -1, lastTimeStamp = -1; public void setData(WizardDataValidator validator, Properties data) { this.data = data; this.validator = validator; timeStamp = System.currentTimeMillis(); } public void run() { } void safeUpdateValidationData() { Display.getDefault().syncExec(new Runnable() { public void run() { updateValidationData(); } }); } void updateValidationData() { if(validationRunnable == null) return; validator.validate(data); String message = validator.getErrorMessage(); String warning = validator.getWarningMessage(); if(wizardStep != null && (!wizardStep.isDataChanged() || (message == null && warning == null))) { dialog.setErrorMessage(null); String m = support.getMessage(support.getStepId()); if (m == null || m.length() == 0) m = message == null ? warning : message; dialog.setMessage(m); } else { dialog.setErrorMessage(message); if(message != null || warning == null) { dialog.setMessage(null); } else { dialog.setMessage(warning, IMessageProvider.WARNING); } } CommandBar bar = dialog.getCommandBar(); String[] s = support.getActionNames(validator.getId()); for (int i = 0; i < s.length; i++) bar.setEnabled(s[i], validator.isCommandEnabled(s[i])); } } }