/**
* Copyright (c) Red Hat, Inc., contributors and others 2013 - 2014. All rights reserved
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.tools.forge.ui.internal.ext.handlers;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.handlers.HandlerUtil;
import org.jboss.tools.forge.core.furnace.FurnaceRuntime;
import org.jboss.tools.forge.core.preferences.ForgeCorePreferences;
import org.jboss.tools.forge.core.runtime.ForgeRuntime;
import org.jboss.tools.forge.core.runtime.ForgeRuntimeState;
import org.jboss.tools.forge.ui.internal.ForgeUIPlugin;
import org.jboss.tools.forge.ui.internal.ext.dialog.UICommandListDialog;
import org.jboss.tools.forge.ui.internal.part.ForgeConsoleView;
import org.jboss.tools.forge.ui.util.ForgeHelper;
public class ForgeCommandHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
openWizardDialog(window);
return null;
}
public void openWizardDialog(IWorkbenchWindow window) {
ForgeRuntime runtime = ForgeCorePreferences.INSTANCE.getDefaultRuntime();
if (runtime != FurnaceRuntime.INSTANCE) {
startForgeRuntime(runtime);
} else {
try {
ForgeConsoleView forgeConsoleView = ForgeHelper.findForgeConsoleView();
if (forgeConsoleView != null && forgeConsoleView.isShowing()) {
ForgeHelper.showRuntime(FurnaceRuntime.INSTANCE);
}
if (saveCurrentEditor(window)) {
if (!ForgeRuntimeState.RUNNING.equals(FurnaceRuntime.INSTANCE.getState())) {
Job job = ForgeHelper.createStartRuntimeJob(FurnaceRuntime.INSTANCE);
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
Display.getDefault().asyncExec(() -> new UICommandListDialog(window).open());
}
});
job.schedule();
} else {
new UICommandListDialog(window).open();
}
}
} catch (Exception e) {
ForgeUIPlugin.log(e);
}
}
}
private boolean saveCurrentEditor(IWorkbenchWindow window) throws ExecutionException {
boolean saveOnCommandMenu = ForgeCorePreferences.INSTANCE.isSaveOnCommandMenu();
boolean result = true;
IWorkbenchPage page = window.getActivePage();
if (page != null) {
IEditorPart editor = page.getActiveEditor();
if (editor != null && editor.isDirty()) {
if (!saveOnCommandMenu) {
MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoQuestion(window.getShell(),
"Save Resource",
"'" + editor.getTitle()
+ "' has been modified. Save changes?\n (For Forge to access latest changes you need to save)",
"Always save before opening the command dialog", false, null, null);
// No == 3, Cancel == 1, Yes == 2
switch (dialog.getReturnCode()) {
case 1:
result = false;
break;
case 2:
saveOnCommandMenu = true;
// fall-back
default:
if (dialog.getToggleState()) {
ForgeCorePreferences.INSTANCE.setSaveOnCommandMenu(true);
}
break;
}
}
if (saveOnCommandMenu) {
result = page.saveEditor(editor, false);
}
}
}
return result;
}
private void startForgeRuntime(ForgeRuntime runtime) {
ForgeHelper.showForgeConsole(runtime);
if (!ForgeRuntimeState.RUNNING.equals(runtime.getState())) {
ForgeHelper.start(runtime);
}
}
}