/******************************************************************************* * Copyright (c) 2015 Bruno Medeiros and other Contributors. * 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: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package com.github.rustdt.ide.ui.navigator; import static melnorme.utilbox.core.CoreUtil.list; import java.nio.file.Path; import org.eclipse.core.resources.IProject; import org.eclipse.jface.action.MenuManager; import org.eclipse.ui.IViewPart; import com.github.rustdt.ide.core.operations.RustSDKPreferences; import com.github.rustdt.ide.ui.launch.RustLaunchShortcut; import melnorme.lang.ide.core.operations.RunToolOperationOnResource; import melnorme.lang.ide.core.operations.ILangOperationsListener_Default.ProcessStartKind; import melnorme.lang.ide.core.operations.ILangOperationsListener_Default.StartOperationOptions; import melnorme.lang.ide.ui.LangUIMessages_Actual; import melnorme.lang.ide.ui.launch.LangLaunchShortcut; import melnorme.lang.ide.ui.navigator.BuildTargetsActionGroup; import melnorme.lang.ide.ui.navigator.LangNavigatorActionProvider; import melnorme.lang.ide.ui.operations.RunToolUIOperation.RunSDKUIToolOperation; import melnorme.lang.ide.ui.operations.ToolSourceModifyingOperation; import melnorme.utilbox.core.CommonException; public class RustNavigatorActionProvider extends LangNavigatorActionProvider { @Override protected BuildTargetsActionGroup createBuildTargetsActionGroup(IViewPart viewPart) { return new BuildTargetsActionGroup(viewPart) { @Override protected LangLaunchShortcut createLaunchShortcut() { return new RustLaunchShortcut(); } }; } @Override protected void initActionGroups(IViewPart viewPart) { super.initActionGroups(viewPart); actionGroups.add(new RustBundleOperationsActionGroup(viewPart)); } public static class RustBundleOperationsActionGroup extends BundleOperationsActionGroup { public RustBundleOperationsActionGroup(IViewPart viewPart) { super(viewPart); } @Override protected void initActions(MenuManager bundleOpsMenu, IProject project) { addRunOperationAction(bundleOpsMenu, new RunSDKUIToolOperation(LangUIMessages_Actual.CargoUpdate_OpName, project, list("update"))); addRunOperationAction(bundleOpsMenu, new CargoFormatOperation(project)); } @Override protected String getMenuName() { return LangUIMessages_Actual.BundleOperationsMenu; } } public static class CargoFormatOperation extends ToolSourceModifyingOperation { public CargoFormatOperation(IProject project) { super( LangUIMessages_Actual.CargoFormat_OpName, new RunToolOperationOnResource( project, list("--", "--write-mode=overwrite"), new StartOperationOptions(ProcessStartKind.BUILD, true, true) ) { @Override protected ProcessBuilder createProcessBuilder() throws CommonException { Path rustfmtPath = RustSDKPreferences.RUSTFMT_PATH.getDerivedValue(); // Look for sibling command cargo-fmt Path cargoFmtPath = rustfmtPath.getParent().resolve("cargo-fmt"); return getToolManager().createToolProcessBuilder(project, cargoFmtPath, getCommands()); } } ); } } }