// Copyright 2012 Georg-August-Universität Göttingen, Germany
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package de.ugoe.cs.autoquest.ui.swt;
import java.util.LinkedList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import de.ugoe.cs.util.FileTools;
import de.ugoe.cs.util.StringTools;
import de.ugoe.cs.util.console.CommandExecuter;
import de.ugoe.cs.util.console.Console;
import de.ugoe.cs.util.console.GlobalDataContainer;
import de.ugoe.cs.util.console.listener.ICommandListener;
/**
*
* Implements the composite for the console tab in the applications main window.
*
*
* @author Steffen Herbold
* @version 1.0
*/
public class ConsoleTabComposite extends Composite implements ICommandListener {
protected java.util.List commandHistory = new LinkedList();
protected int commandHistoryIndex = 0;
protected Text textCommand;
protected StyledText textConsoleOutput;
/**
* Create the composite.
*
* @param parent
* @param style
*/
public ConsoleTabComposite(Composite parent, int style) {
super(parent, style);
createContents();
Console.getInstance().registerCommandListener(this);
}
@Override
public void commandNotification(String command) {
commandHistory.add(command);
commandHistoryIndex = commandHistory.size();
}
private void createContents() {
setLayout(new GridLayout(3, false));
Label lblCommand = new Label(this, SWT.NONE);
lblCommand.setText("Command:");
textCommand = new Text(this, SWT.BORDER);
textCommand.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.keyCode == SWT.CR) {
executeCommand();
}
else if (e.keyCode == SWT.TAB) {
autoCompleteCommand();
}
else if (e.keyCode == SWT.ARROW_UP) {
setToPreviousCommand();
}
else if (e.keyCode == SWT.ARROW_DOWN) {
setToNextCommand();
}
}
});
textCommand.addTraverseListener(new TraverseListener() {
@Override
public void keyTraversed(TraverseEvent e) {
if ((e.detail == SWT.TRAVERSE_TAB_NEXT) || (e.detail == SWT.TRAVERSE_TAB_PREVIOUS))
{
e.doit = false;
}
}
});
GridData gd_textCommand = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
gd_textCommand.widthHint = 304;
textCommand.setLayoutData(gd_textCommand);
textCommand.setFocus();
Button btnEnter = new Button(this, SWT.NONE);
btnEnter.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
executeCommand();
}
});
btnEnter.setText("Enter");
textConsoleOutput =
new StyledText(this, SWT.BORDER | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL |
SWT.CANCEL);
GridData gd_textConsoleOutput = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
gd_textConsoleOutput.heightHint = 102;
gd_textConsoleOutput.widthHint = 456;
textConsoleOutput.setLayoutData(gd_textConsoleOutput);
textConsoleOutput.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event e) {
textConsoleOutput.setTopIndex(textConsoleOutput.getLineCount() - 1);
}
});
}
private void executeCommand() {
String command = textCommand.getText().trim();
CommandExecuter.getInstance().exec(command);
textCommand.setText("");
}
private void autoCompleteCommand() {
String prefix = textCommand.getText();
int end = textCommand.getCaretPosition() - 1;
int start = 0;
for (int i = end; i >= 0; i--) {
if (Character.isWhitespace(prefix.charAt(i))) {
start = i + 1;
break;
}
}
String textPrefix = prefix.substring(0, start);
String textSuffix = prefix.substring(end + 1);
prefix = prefix.substring(start, end + 1);
String completedPrefix = null;
if ("".equals(textCommand.getText().substring(0, start).trim())) {
// search for a command completion
completedPrefix = CommandExecuter.getInstance().autoCompleteCommand(prefix);
}
else {
// complete an object in the data store or a file name
completedPrefix = FileTools.autoCompletePath(prefix);
if (prefix.equals(completedPrefix)) {
// file completion wasn't possible, so try to complete using data objects
String[] completions =
GlobalDataContainer.getInstance().getAllKeys().toArray(new String[0]);
completedPrefix = StringTools.autocomplete(prefix, completions);
}
}
textCommand.setText(textPrefix + completedPrefix + textSuffix);
textCommand.setSelection(textPrefix.length() + completedPrefix.length());
}
private void setToPreviousCommand() {
if (commandHistoryIndex > 0) {
commandHistoryIndex--;
textCommand.setText(commandHistory.get(commandHistoryIndex));
textCommand.setSelection(commandHistory.get(commandHistoryIndex).length());
}
}
private void setToNextCommand() {
if (commandHistoryIndex < (commandHistory.size() - 1)) {
commandHistoryIndex++;
textCommand.setText(commandHistory.get(commandHistoryIndex));
textCommand.setSelection(commandHistory.get(commandHistoryIndex).length());
}
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
}