blob: 4138a282dcb0513bc9f7aa13776184c9c2764365 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 IBM Corporation 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:
* IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.ui.internal;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.commands.Category;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.CommandManager;
import org.eclipse.core.commands.IParameter;
import org.eclipse.core.commands.ParameterType;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.commands.MCategory;
import org.eclipse.e4.ui.model.application.commands.MCommand;
import org.eclipse.e4.ui.model.application.commands.MCommandParameter;
import org.eclipse.e4.ui.model.application.commands.impl.CommandsFactoryImpl;
import org.eclipse.ui.internal.commands.CommandPersistence;
/**
* @since 3.5
*
*/
public class CommandToModelProcessor {
private Map<String, MCategory> categories = new HashMap<String, MCategory>();
private Map<String, MCommand> commands = new HashMap<String, MCommand>();
@Execute
void process(MApplication application, IEclipseContext context) {
for (MCategory catModel : application.getCategories()) {
categories.put(catModel.getElementId(), catModel);
}
for (MCommand cmdModel : application.getCommands()) {
commands.put(cmdModel.getElementId(), cmdModel);
}
CommandManager commandManager = context.get(CommandManager.class);
if (commandManager == null) {
commandManager = new CommandManager();
setCommandFireEvents(commandManager, false);
context.set(CommandManager.class, commandManager);
}
CommandPersistence cp = new CommandPersistence(commandManager);
cp.reRead();
generateCategories(application, commandManager);
generateCommands(application, commandManager);
cp.dispose();
}
/**
* @param application
* @param commandManager
*/
private void generateCommands(MApplication application, CommandManager commandManager) {
for (Command cmd : commandManager.getDefinedCommands()) {
if (commands.containsKey(cmd.getId())) {
continue;
}
try {
MCommand command = CommandsFactoryImpl.eINSTANCE.createCommand();
command.setElementId(cmd.getId());
command.setCategory(categories.get(cmd.getCategory().getId()));
command.setCommandName(cmd.getName());
command.setDescription(cmd.getDescription());
// deal with parameters
// command.getParameters().addAll(parameters);
IParameter[] cmdParms = cmd.getParameters();
if (cmdParms != null) {
for (IParameter cmdParm : cmdParms) {
MCommandParameter parmModel = CommandsFactoryImpl.eINSTANCE
.createCommandParameter();
parmModel.setElementId(cmdParm.getId());
parmModel.setName(cmdParm.getName());
parmModel.setOptional(cmdParm.isOptional());
ParameterType parmType = cmd.getParameterType(cmdParm.getId());
if (parmType != null) {
parmModel.setTypeId(parmType.getId());
}
command.getParameters().add(parmModel);
}
}
application.getCommands().add(command);
commands.put(command.getElementId(), command);
} catch (NotDefinedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* @param commandManager
*/
private void generateCategories(MApplication application, CommandManager commandManager) {
for (Category cat : commandManager.getDefinedCategories()) {
if (categories.containsKey(cat.getId())) {
continue;
}
try {
MCategory catModel = CommandsFactoryImpl.eINSTANCE.createCategory();
catModel.setElementId(cat.getId());
catModel.setName(cat.getName());
catModel.setDescription(cat.getDescription());
application.getCategories().add(catModel);
categories.put(catModel.getElementId(), catModel);
} catch (NotDefinedException e) {
// Since we asked for defined commands, this shouldn't be an
// issue
e.printStackTrace();
}
}
}
private void setCommandFireEvents(CommandManager manager, boolean b) {
try {
Field f = CommandManager.class.getDeclaredField("shouldCommandFireEvents"); //$NON-NLS-1$
f.setAccessible(true);
f.set(manager, Boolean.valueOf(b));
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}