/******************************************************************************* * 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.action; import java.util.*; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.jboss.tools.common.meta.action.SignificanceMessageFactory; import org.jboss.tools.common.meta.action.XAction; import org.jboss.tools.common.meta.action.XActionItem; import org.jboss.tools.common.meta.action.XRedirect; import org.jboss.tools.common.model.XModelException; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.event.ActionDeclinedException; import org.jboss.tools.common.model.ui.wizards.OneStepWizard; import org.jboss.tools.common.model.ui.ModelUIPlugin; public class XModelObjectAction extends XModelObjectActionItem { protected XAction action; ActionX eclipseAction; public XModelObjectAction(XAction action, XModelObject object, XModelObject[] targets, Object environment) { super((XActionItem)action, object, targets, environment); this.action = action; eclipseAction = new ActionX(this); } public Action getEclipseAction() { return eclipseAction; } public Shell getShell() { if(shell != null) return shell; try { return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); } catch (NullPointerException t) { return null; } } public void actionPerformed() { XAction runAction = action; XModelObject runObject = object; XRedirect redirect = action.getRedirect(); XAction redirectAction = null; XModelObject redirectObject = null; while (redirect != null) { redirectAction = redirect.getRedirectAction(runObject); redirectObject = redirect.getRedirectSource(runObject); redirect = redirectAction == null ? null : redirectAction.getRedirect(); if (redirect != null) { runObject = redirectObject; } } if (redirectAction != null && redirectObject != null) { runAction = redirectAction; runObject = redirectObject; } if (action.getSignificantFlag(object)) { // i18n: can't construct sentences by concatenation String message = SignificanceMessageFactory.getInstance() .getMessage(action, object, targets) + "?"; MessageDialog d = new MessageDialog(getShell(), "Confirmation", null, message, MessageDialog.QUESTION, new String[] { "OK", "Cancel" }, 0); int m = d.open(); if (m != 0) return; } String wizardName = runAction.getWizardClassName(); if (wizardName == null || wizardName.equals("")) { //$NON-NLS-1$ action.getEntityData(object); try { Properties p = prepareProperties(); if (p == null) p = new Properties(); if (getShell() != null) p.put("shell", getShell()); //$NON-NLS-1$ if (targets == null) action.executeHandler(object, p); else action.executeHandler(object, targets, p); } catch (ActionDeclinedException e) { return; } catch (XModelException e2) { ModelUIPlugin.getPluginLog().logError(e2); } } else { runAction.getEntityData(runObject); OneStepWizard w = new OneStepWizard(); Properties p = prepareProperties(); if (p == null) p = new Properties(); p.put("action", runAction); //$NON-NLS-1$ p.put("object", runObject); //$NON-NLS-1$ if (getShell() != null) p.put("shell", getShell()); //$NON-NLS-1$ w.setObject(p); w.execute(); } } protected Properties prepareProperties() { if(environment == null) return null; if(environment instanceof Properties) return (Properties)environment; if(!(environment instanceof Object[])) return null; Object[] os = (Object[])environment; for (int i = 0; i < os.length; i++) { if(os[i] instanceof Properties ) return (Properties)os[i]; } return null; } class AL implements SelectionListener { public void widgetSelected(SelectionEvent e) { actionPerformed(); } public void widgetDefaultSelected(SelectionEvent e) {} } public void createMenuItem(Menu menu) { boolean enabled = (targets == null) ? action.isEnabled(object) : action.isEnabled(object, targets); boolean hidden = action.hide(enabled) || (!enabled && targets != null); if(hidden) return; MenuItem item = new MenuItem(menu, SWT.CASCADE); item.setAccelerator(eclipseAction.getAccelerator()); item.addSelectionListener(new AL()); item.setText(eclipseAction.getText()); item.setEnabled(eclipseAction.isEnabled()); item.setImage(eclipseAction.getImage()); } }