blob: 253422ec98e162f96120f21273099f544ab2a49a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Lars Vogel <Lars.Vogel@vogella.com> - Bug 472654
******************************************************************************/
package org.eclipse.ui.internal;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
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.MBindingContext;
import org.eclipse.e4.ui.model.application.commands.MBindingTable;
import org.eclipse.e4.ui.model.application.commands.MCommand;
import org.eclipse.e4.ui.model.application.commands.MHandler;
import org.eclipse.e4.ui.model.application.commands.MKeyBinding;
public class ModelMigrationProcessor {
// remove e4 commands from existing IDE models
// Bug 411602 - CTRL+Q keyboard shortcut in any dialog closes the workbench
// without option to save
private static final String MIGRATION_001 = "ModelMigrationProcessor.001"; //$NON-NLS-1$
@Execute
public void process(MApplication application, IEclipseContext context) {
if (!application.getTags().contains(MIGRATION_001)) {
application.getTags().add(MIGRATION_001);
removeE4CommandsFromIDE(application);
}
}
/**
* @param application
*/
private void removeE4CommandsFromIDE(MApplication application) {
List<MCommand> commands = application.getCommands();
Set<MCommand> toBeRemoved = new HashSet<>();
for (MCommand command : commands) {
final String elementId = command.getElementId();
if ("e4.exit".equals(elementId)) { //$NON-NLS-1$
toBeRemoved.add(command);
} else if ("e4.show.view".equals(elementId)) { //$NON-NLS-1$
toBeRemoved.add(command);
} else if ("org.eclipse.e4.ui.saveCommands".equals(elementId)) { //$NON-NLS-1$
toBeRemoved.add(command);
} else if ("org.eclipse.e4.ui.saveAllCommands".equals(elementId)) { //$NON-NLS-1$
toBeRemoved.add(command);
}
if (toBeRemoved.size() > 3) {
break;
}
}
if (toBeRemoved.isEmpty()) {
return;
}
List<MHandler> handlers = application.getHandlers();
Iterator<MHandler> i = handlers.iterator();
int removed = 0;
while (i.hasNext() && removed < 4) {
MHandler handler = i.next();
if (toBeRemoved.contains(handler.getCommand())) {
i.remove();
removed++;
}
}
List<MBindingContext> bindingContexts = application.getBindingContexts();
MBindingContext dialogAndWindow = null;
for (MBindingContext c : bindingContexts) {
if ("org.eclipse.ui.contexts.dialogAndWindow".equals(c.getElementId())) { //$NON-NLS-1$
dialogAndWindow = c;
break;
}
}
if (dialogAndWindow != null) {
List<MBindingTable> bindingTables = application.getBindingTables();
MBindingTable dAWTable = null;
for (MBindingTable table : bindingTables) {
if (dialogAndWindow.equals(table.getBindingContext())) {
dAWTable = table;
break;
}
}
if (dAWTable != null) {
List<MKeyBinding> bindings = dAWTable.getBindings();
Iterator<MKeyBinding> j = bindings.iterator();
removed = 0;
while (j.hasNext() && removed < 3) {
MKeyBinding binding = j.next();
if (toBeRemoved.contains(binding.getCommand())) {
j.remove();
removed++;
}
}
}
}
commands.removeAll(toBeRemoved);
}
}