/*******************************************************************************
* Copyright (c) 2005 RadRails.org and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.radrails.server.internal.ui.console;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.internal.ui.views.console.ConsoleTerminateAction;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleConstants;
import org.eclipse.ui.console.IConsolePageParticipant;
import org.eclipse.ui.console.TextConsolePage;
import org.eclipse.ui.part.IPageBookViewPage;
import org.rubypeople.rdt.launching.IRubyLaunchConfigurationConstants;
/**
* Page participant for the ServerConsole. Adds a remove all terminated action and a stop action.
*
* @author Kyle
*/
public class ServerConsolePageParticipant implements IConsolePageParticipant
{
private ServerStopAction consoleStopAction;
private LaunchBrowserAction launchBrowserAction;
private IToolBarManager toolbar;
/*
* (non-Javadoc)
* @see org.eclipse.ui.console.IConsolePageParticipant#init(org.eclipse.ui.part.IPageBookViewPage,
* org.eclipse.ui.console.IConsole)
*/
public void init(IPageBookViewPage page, IConsole console)
{
if (!(console instanceof org.eclipse.debug.ui.console.IConsole))
return;
org.eclipse.debug.ui.console.IConsole processConsole = (org.eclipse.debug.ui.console.IConsole) console;
final IProcess process = processConsole.getProcess();
if (!looksLikeServerStarting(process))
{
return;
}
this.consoleStopAction = new ServerStopAction(process);
this.launchBrowserAction = new LaunchBrowserAction(process);
// Remove the normal Terminate button
IActionBars bars = page.getSite().getActionBars();
toolbar = bars.getToolBarManager();
removeTerminateAction(toolbar);
// Add the Stop server button that replaces the terminate button
bars.getToolBarManager().prependToGroup(IConsoleConstants.LAUNCH_GROUP, consoleStopAction);
bars.getToolBarManager().prependToGroup(IConsoleConstants.LAUNCH_GROUP, launchBrowserAction);
// Listen for Ctrl+C
TextConsolePage consolePage = (TextConsolePage) page;
consolePage.getControl().addKeyListener(new KeyListener()
{
public void keyReleased(KeyEvent e)
{
// ignore
}
public void keyPressed(KeyEvent e)
{
int keyCode = e.keyCode;
if (keyCode == 'c' && e.stateMask == SWT.CONTROL) // 'Ctrl+c'
{
consoleStopAction.run();
}
}
});
}
private void removeTerminateAction(IToolBarManager toolbar)
{
if (toolbar == null)
return;
IContributionItem[] items = toolbar.getItems();
for (int i = 0; i < items.length; i++)
{
if (!(items[i] instanceof ActionContributionItem))
continue;
ActionContributionItem item = (ActionContributionItem) items[i];
IAction action = item.getAction();
if (!(action instanceof ConsoleTerminateAction))
continue;
toolbar.remove(item);
toolbar.update(false);
break;
}
}
private boolean looksLikeServerStarting(IProcess process)
{
if (process == null || process.getLaunch() == null)
return false;
String fileName = process.getLaunch().getAttribute(IRubyLaunchConfigurationConstants.ATTR_FILE_NAME);
if (fileName == null || fileName.trim().length() == 0)
return false;
return fileName.endsWith("mongrel_rails") || fileName.endsWith("server");
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.console.IConsolePageParticipant#dispose()
*/
public void dispose()
{
this.consoleStopAction = null;
this.launchBrowserAction = null;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.console.IConsolePageParticipant#activated()
*/
public void activated()
{
// Do nothing
removeTerminateAction(toolbar);
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.console.IConsolePageParticipant#deactivated()
*/
public void deactivated()
{
// Do nothing
}
/*
* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class adapter)
{
return null;
}
}