blob: 9417ae4c9fbaef37551ec2cdea274fb218fbe18e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 SSI Schaefer IT Solutions GmbH 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:
* SSI Schaefer IT Solutions GmbH
*******************************************************************************/
package org.eclipse.tea.core.ui.internal.menu;
import java.util.List;
import javax.inject.Inject;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.CanExecute;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.di.AboutToShow;
import org.eclipse.e4.ui.model.application.ui.menu.MDirectMenuItem;
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuFactory;
import org.eclipse.tea.core.TaskingEngine;
import org.eclipse.tea.core.TaskingInjectionHelper;
import org.eclipse.tea.core.internal.config.TaskingDevelopmentConfig;
import org.eclipse.tea.core.internal.model.TaskingModel;
import org.eclipse.tea.core.internal.model.iface.TaskingContainer;
import org.eclipse.tea.core.internal.model.iface.TaskingElement;
import org.eclipse.tea.core.internal.model.iface.TaskingItem;
import org.eclipse.tea.core.services.TaskChain;
import org.eclipse.tea.core.ui.TaskingEngineJob;
import org.eclipse.tea.core.ui.config.TaskingEclipsePreferenceStore;
import org.eclipse.tea.core.ui.internal.TaskingImageHelper;
public class DynamicTaskingMenu {
@Inject
private TaskingModel model;
@AboutToShow
public void aboutToShow(List<MMenuElement> items) {
IEclipseContext configuredContext = TaskingInjectionHelper
.createConfiguredContext(new TaskingEclipsePreferenceStore());
TaskingDevelopmentConfig cfg = configuredContext.get(TaskingDevelopmentConfig.class);
createMenu(cfg, items, model.getRootGroup());
}
private void createMenu(TaskingDevelopmentConfig cfg, List<MMenuElement> target, TaskingContainer group) {
String lastGroupingId = null;
for (TaskingElement e : group.getChildren()) {
if (e.isDevelopment() && !cfg.showHiddenTaskChains) {
continue;
}
// create separators per menu whenever the grouping switches.
if (lastGroupingId != null && !lastGroupingId.equals(e.getGroupingId())) {
// group change. add separator.
target.add(MMenuFactory.INSTANCE.createMenuSeparator());
}
lastGroupingId = e.getGroupingId();
if (e instanceof TaskingContainer) {
MMenu sub = MMenuFactory.INSTANCE.createMenu();
sub.setLabel(getLabel(cfg, e));
sub.setIconURI(TaskingImageHelper.getIconUri(e.getIconBundle(), e.getIconPath()));
target.add(sub);
createMenu(cfg, sub.getChildren(), (TaskingContainer) e);
} else if (e instanceof TaskingItem && ((TaskingItem) e).isVisibleInMenu()) {
MDirectMenuItem item = MMenuFactory.INSTANCE.createDirectMenuItem();
item.setLabel(getLabel(cfg, e));
item.setIconURI(TaskingImageHelper.getIconUri(e.getIconBundle(), e.getIconPath()));
item.setObject(new DynamicTaskChainMenuHandler(((TaskingItem) e).getChain()));
target.add(item);
}
}
}
private String getLabel(TaskingDevelopmentConfig config, TaskingElement element) {
if (!config.showGroupingIds) {
return element.getLabel();
}
return "[" + element.getGroupingId() + "] " + element.getLabel();
}
public static final class DynamicTaskChainMenuHandler {
private final TaskChain chain;
public DynamicTaskChainMenuHandler(TaskChain chain) {
this.chain = chain;
}
@Execute
public void handle() {
TaskingEngine engine = TaskingEngine.withConfiguration(new TaskingEclipsePreferenceStore());
Job j = new TaskingEngineJob(engine, chain);
j.schedule();
}
@CanExecute
public boolean checkRunning() {
return Job.getJobManager().find(TaskChain.class).length == 0;
}
}
}