/*******************************************************************************
* Copyright (c) 2006-2013 The RCP Company and others.
* 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:
* The RCP Company - initial API and implementation
*******************************************************************************/
package com.rcpcompany.uibindings.tests.application;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchAdvisor;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.IHandlerService;
import com.rcpcompany.uibindings.IManager;
import com.rcpcompany.uibindings.moao.IMOAOPackage;
import com.rcpcompany.uibindings.moao.ui.validation.MOAOMessageValidatorAdapter;
import com.rcpcompany.uibindings.navigator.INavigatorManager;
import com.rcpcompany.uibindings.scripting.IScriptEvaluationContext;
import com.rcpcompany.uibindings.scripting.IScriptManager;
import com.rcpcompany.uibindings.scripting.util.FeatureScriptValidatorAdapter;
import com.rcpcompany.uibindings.tests.shop.Shop;
import com.rcpcompany.uibindings.tests.shop.ShopFactory;
import com.rcpcompany.uibindings.utils.EditingDomainUtils;
import com.rcpcompany.uibindings.utils.IGlobalNavigationManager;
import com.rcpcompany.uibindings.validators.ConstraintValidatorAdapter;
import com.rcpcompany.uibindings.validators.EValidatorAdapter;
import com.rcpcompany.uibindings.validators.IValidatorAdapterManager;
import com.rcpcompany.utils.logging.LogUtils;
/**
* The workbench advisor.
*
* @author Tonny Madsen, The RCP Company
*/
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
private static final String PERSPECTIVE_ID = "com.rcpcompany.uibindings.example.application.perspectives.Shop";
private Shop theShop;
private IScriptEvaluationContext myGlobalScriptingContext;
@Override
public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
return new ApplicationWorkbenchWindowAdvisor(configurer);
}
@Override
public String getInitialWindowPerspectiveId() {
return PERSPECTIVE_ID;
}
@Override
public void preStartup() {
super.preStartup();
getWorkbenchConfigurer().setSaveAndRestore(true);
}
@Override
public void postStartup() {
super.postStartup();
myGlobalScriptingContext = IScriptManager.Factory.getManager().getGlobalEvaluationContext();
theShop = ShopFactory.eINSTANCE.getShop(EditingDomainUtils.getEditingDomain());
final IValidatorAdapterManager vam = IValidatorAdapterManager.Factory.getManager();
vam.addRoot(theShop, new EValidatorAdapter());
vam.addRoot(theShop, new ConstraintValidatorAdapter());
vam.addRoot(theShop, new MOAOMessageValidatorAdapter());
vam.addRoot(theShop, new FeatureScriptValidatorAdapter());
IGlobalNavigationManager.Factory.installMouseHandling();
INavigatorManager.Factory.getManager().setUseGenericEditorPartFallback(false);
// TODO create a shortcut method
theShop.eAdapters().add(new AdapterImpl() {
@Override
public void notifyChanged(Notification msg) {
if (msg.isTouch()) return;
if (msg.getFeature() == IMOAOPackage.Literals.NAMED_OBJECT__NAME) {
updateScriptingVariables();
}
}
});
updateScriptingVariables();
for (int i = SWT.None; i < SWT.ImeComposition; i++) {
Display.getCurrent().addFilter(i, SWT_EVENT_LISTENER);
}
}
public final static Listener SWT_EVENT_LISTENER = new Listener() {
@Override
public void handleEvent(Event event) {
// LogUtils.debug(this, ToStringUtils.toString(event));
}
};
protected void updateScriptingVariables() {
myGlobalScriptingContext.getVariables().put("shop", theShop);
myGlobalScriptingContext.getVariables().put("shopName", theShop.getName());
}
@Override
public boolean preShutdown() {
final IManager manager = IManager.Factory.getManager();
final EditingDomain editingDomain = manager.getEditingDomain();
int res = 1; // == NO
if (editingDomain.getCommandStack().canUndo()) {
final IWorkbenchWindow window = getWorkbenchConfigurer().getWorkbench().getActiveWorkbenchWindow();
final MessageDialog dialog = new MessageDialog(window.getShell(), "Save Shop?", null,
"Changes has been made to the shop. Save these?", MessageDialog.QUESTION, new String[] {
IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL }, 0);
res = dialog.open();
if (res == 0) {
final ICommandService cs = (ICommandService) window.getService(ICommandService.class);
final IHandlerService hs = (IHandlerService) window.getService(IHandlerService.class);
try {
final String c = manager.getCommandIDs().get(IWorkbenchCommandConstants.FILE_SAVE);
final ParameterizedCommand command = cs.deserialize(c);
hs.executeCommand(command, null);
} catch (final Exception ex) {
LogUtils.error(this, ex);
}
}
}
return res != 2;
}
}