package org.openslx.dozmod.gui.control;
import java.awt.Insets;
import java.util.EventListener;
import java.util.EventObject;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.event.EventListenerList;
import org.openslx.dozmod.gui.helper.GridManager;
import org.openslx.dozmod.gui.helper.TextChangeListener;
/**
* Widget for advanced configuration options for lectures. This handles
* following options - Network rules - Runscript - USB
*/
public class RunscriptConfigurator extends RunscriptConfiguratorLayout {
private static final long serialVersionUID = -3497629601818983994L;
private String originalRunScript = null;
public RunscriptConfigurator() {
super();
final TextChangeListener docListener = new TextChangeListener() {
@Override
public void changed() {
fireRunscriptConfigurationChangeEvent(new RunscriptConfigurationChangeEvent(
new Object()));
}
};
taRunScript.getDocument().addDocumentListener(docListener);
}
public boolean hasChanged() {
return !originalRunScript.equalsIgnoreCase(taRunScript.getText());
}
/**
* Gets the runscript as String.
*
* @return runscript as String. If not text was entered, returns a empty string.
*/
public String getState() {
String input = taRunScript.getText();
return input != null ? input : "";
}
/**
* Sets the state of this widget to the given AdvancedConfiguration. Basicly
* this sets the content of the text areas to the corresponding network
* rules/runscript as given by the AdvancedConfiguration object
*
* @param config
* AdvancedConfiguration to set the state to
*/
public void setState(final String config) {
this.taRunScript.setText(config != null ? config : "" );
}
/**
* Custom event mechanism to detect changes to the user list (Mostly needed
* for the reactToChange() stuff in LectureDetailsWindow)
*/
protected EventListenerList listenerList = new EventListenerList();
public class RunscriptConfigurationChangeEvent extends EventObject {
private static final long serialVersionUID = -8779550754760035845L;
public RunscriptConfigurationChangeEvent(Object source) {
super(source);
}
}
public interface RunscriptConfigurationChangeEventListener extends
EventListener {
public void stateChanged(RunscriptConfigurationChangeEvent event);
}
public void addRunscriptConfigurationChangeEventListener(
RunscriptConfigurationChangeEventListener listener) {
listenerList.add(RunscriptConfigurationChangeEventListener.class,
listener);
}
public void removeRunscriptConfigurationChangeEventListener(
RunscriptConfigurationChangeEventListener listener) {
listenerList.remove(RunscriptConfigurationChangeEventListener.class,
listener);
}
void fireRunscriptConfigurationChangeEvent(
RunscriptConfigurationChangeEvent evt) {
Object[] listeners = listenerList.getListenerList();
for (int i = 0; i < listeners.length; i++) {
if (listeners[i] == RunscriptConfigurationChangeEventListener.class) {
((RunscriptConfigurationChangeEventListener) listeners[i + 1])
.stateChanged(evt);
}
}
}
}
/**
* Internal layout class for the advanced configurator (to keep it clean even
* for widgets)
*/
class RunscriptConfiguratorLayout extends JPanel {
private static final long serialVersionUID = 648729071828404053L;
private final static String txtRunScriptTitle = "Startskript";
private final static String txtRunScriptDesc = "Ein hier eingetragenes Skript wird nach dem Start dieser VM automatisch ausgeführt.";
private final JPanel pnlRunScript;
protected final JTextArea taRunScript;
public RunscriptConfiguratorLayout() {
GridManager grid = new GridManager(this, 1, true,
new Insets(5, 5, 5, 5));
// middle panel for the run script textpane
pnlRunScript = new JPanel();
GridManager gridRunScript = new GridManager(pnlRunScript, 1, true,
new Insets(2, 2, 2, 2));
taRunScript = new JTextArea("", 5, 20);
taRunScript.setLineWrap(true);
taRunScript.setWrapStyleWord(true);
JScrollPane scpRunScript = new JScrollPane(taRunScript,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
pnlRunScript.setBorder(BorderFactory
.createTitledBorder(txtRunScriptTitle));
gridRunScript
.add(new WordWrapLabel(txtRunScriptDesc, false, true))
.fill(true, false).expand(true, false);
gridRunScript.nextRow();
// TODO add checkbox for script's interpreter type: sh, bash, powershell...
gridRunScript.add(scpRunScript).fill(true, true).expand(true, true);
gridRunScript.finish(false);
// build the final grid
grid.add(pnlRunScript).fill(true, true).expand(true, true);
grid.finish(false);
}
}