blob: ea2a41316e883975fd7ac2f445d2d4b2c2087f74 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2011 SpringSource, a divison of VMware, Inc. 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:
* SpringSource, a division of VMware, Inc. - initial API and implementation
* SAP AG - moving to Eclipse Libra project and enhancements
*******************************************************************************/
package org.eclipse.libra.framework.editor.ui.console;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.libra.framework.editor.core.IOSGiFrameworkConsole;
import org.eclipse.libra.framework.editor.ui.internal.AbstractBundleEditorPage;
import org.eclipse.libra.framework.editor.ui.internal.EditorUIPlugin;
import org.eclipse.libra.framework.editor.ui.internal.SearchTextHistory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.ManagedForm;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.internal.browser.ImageResource;
import org.eclipse.wst.server.ui.ServerUICore;
/**
* @author Christian Dupuis
* @author Kaloyan Raev
*/
@SuppressWarnings("restriction")
public class ServerConsoleEditorPage extends AbstractBundleEditorPage {
Text commandText;
StyledText manifestText;
private IToolBarManager toolBarManager;
private Action backAction;
private Action forwardAction;
private Action refreshAction;
final SearchTextHistory history = new SearchTextHistory();
@Override
protected void createBundleContent(Composite parent) {
mform = new ManagedForm(parent);
setManagedForm(mform);
sform = mform.getForm();
FormToolkit toolkit = mform.getToolkit();
sform.setText("Server Console");
sform.setImage(ServerUICore.getLabelProvider().getImage(getServer()));
sform.setExpandHorizontal(true);
sform.setExpandVertical(true);
toolkit.decorateFormHeading(sform.getForm());
Composite body = sform.getBody();
GridLayout layout = new GridLayout(1, false);
layout.marginLeft = 6;
layout.marginTop = 6;
layout.marginRight = 6;
body.setLayout(layout);
Section manifestSection = toolkit.createSection(sform.getBody(), ExpandableComposite.TITLE_BAR
| Section.DESCRIPTION);
manifestSection.setText("Commands");
manifestSection.setDescription("Execute commands on server.");
layout = new GridLayout();
manifestSection.setLayout(layout);
manifestSection.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite manifestComposite = toolkit.createComposite(manifestSection);
layout = new GridLayout();
layout.marginLeft = 6;
layout.marginTop = 6;
layout.numColumns = 3;
manifestComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
manifestComposite.setLayout(layout);
manifestSection.setClient(manifestComposite);
Label commandLabel = toolkit.createLabel(manifestComposite, "Command:");
commandLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
GridDataFactory.fillDefaults().grab(true, false).span(3, 1).applyTo(commandLabel);
commandText = toolkit.createText(manifestComposite, "", SWT.CANCEL | SWT.SEARCH);
GridDataFactory.fillDefaults().grab(true, false).applyTo(commandText);
commandText.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.character == SWT.CR || e.character == SWT.LF) {
history.add(commandText.getText());
String cmdLine = commandText.getText();
executeCommand(cmdLine);
}
else if (e.keyCode == SWT.ARROW_UP) {
String command = history.back();
commandText.setText(command);
commandText.setSelection(command.length());
e.doit = false;
}
else if (e.keyCode == SWT.ARROW_DOWN) {
String command = history.forward();
commandText.setText(command);
commandText.setSelection(command.length());
e.doit = false;
}
}
});
Button commandButton = toolkit.createButton(manifestComposite, "Execute", SWT.PUSH);
commandButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
history.add(commandText.getText());
String cmdLine = commandText.getText();
executeCommand(cmdLine);
}
});
Button clearButton = toolkit.createButton(manifestComposite, "Clear", SWT.PUSH);
clearButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
manifestText.setText("");
}
});
manifestText = new StyledText(manifestComposite, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
manifestText.setWordWrap(false);
manifestText.setFont(JFaceResources.getTextFont());
GridData data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 3;
manifestText.setLayoutData(data);
Label helpLabel = toolkit.createLabel(manifestComposite, "Type 'help' to get a list of supported commands.");
GridDataFactory.fillDefaults().grab(true, false).span(3, 1).applyTo(helpLabel);
toolBarManager = sform.getToolBarManager();
backAction = new Action("Back") {
@Override
public void run() {
commandText.setText(history.back());
String cmdLine = commandText.getText();
executeCommand(cmdLine);
}
};
backAction.setImageDescriptor(ImageResource
.getImageDescriptor(org.eclipse.ui.internal.browser.ImageResource.IMG_ELCL_NAV_BACKWARD));
backAction.setHoverImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_CLCL_NAV_BACKWARD));
backAction.setDisabledImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_DLCL_NAV_BACKWARD));
backAction.setEnabled(false);
toolBarManager.add(backAction);
forwardAction = new Action("Forward") {
@Override
public void run() {
commandText.setText(history.forward());
String cmdLine = commandText.getText();
executeCommand(cmdLine);
}
};
forwardAction.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_ELCL_NAV_FORWARD));
forwardAction.setHoverImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_CLCL_NAV_FORWARD));
forwardAction.setDisabledImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_DLCL_NAV_FORWARD));
forwardAction.setEnabled(false);
toolBarManager.add(forwardAction);
refreshAction = new Action("Refresh from server", ImageResource.getImageDescriptor(ImageResource.IMG_ELCL_NAV_REFRESH)) {
@Override
public void run() {
String cmdLine = history.current();
if (cmdLine != null) {
executeCommand(cmdLine);
}
}
};
toolBarManager.add(refreshAction);
sform.updateToolBar();
}
void executeCommand(String cmdLine) {
clearStatus();
IOSGiFrameworkConsole console = (IOSGiFrameworkConsole) getServer().getOriginal()
.loadAdapter(IOSGiFrameworkConsole.class, null);
if (console == null) {
IStatus status = EditorUIPlugin.newErrorStatus("Console editor part is not integrated with the runtime.");
EditorUIPlugin.log(status);
setStatus(status);
return ;
}
try {
String result = console.executeCommand(cmdLine);
manifestText.append("osgi> " + cmdLine + "\n");
manifestText.append(result + "\n");
forwardAction.setEnabled(history.canForward());
backAction.setEnabled(history.canBack());
toolBarManager.update(true);
manifestText.setTopIndex(manifestText.getLineCount() - 1);
} catch (CoreException e) {
EditorUIPlugin.log(e);
setStatus(EditorUIPlugin.newErrorStatus("Failed to execute command. See Error Log for details."));
}
commandText.setText("");
}
}