diff options
author | Simon Rettberg | 2018-11-22 11:24:48 +0100 |
---|---|---|
committer | Simon Rettberg | 2018-11-22 11:24:48 +0100 |
commit | 27c04e7ae69c0c895ef7b7620b20170f94ddd3a6 (patch) | |
tree | a13702eb2cf0bb6bbb674504f62a640a9b39c0b4 /dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/StartupConfigurator.java | |
parent | [client] Remove dead code (diff) | |
download | tutor-module-27c04e7ae69c0c895ef7b7620b20170f94ddd3a6.tar.gz tutor-module-27c04e7ae69c0c895ef7b7620b20170f94ddd3a6.tar.xz tutor-module-27c04e7ae69c0c895ef7b7620b20170f94ddd3a6.zip |
[client] Rename files/vars
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/StartupConfigurator.java')
-rwxr-xr-x | dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/StartupConfigurator.java | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/StartupConfigurator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/StartupConfigurator.java new file mode 100755 index 00000000..f37a45ed --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/StartupConfigurator.java @@ -0,0 +1,330 @@ +package org.openslx.dozmod.gui.configurator; + +import java.awt.Color; +import java.awt.Insets; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.HashMap; + +import javax.swing.Box; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor; +import org.openslx.dozmod.gui.control.ComboBox; +import org.openslx.dozmod.gui.control.ComboBox.ComboBoxRenderer; +import org.openslx.dozmod.gui.control.QLabel; +import org.openslx.dozmod.gui.control.WordWrapLabel; +import org.openslx.dozmod.gui.helper.GridManager; +import org.openslx.util.Util; + +/** + * Widget for advanced configuration options for lectures. This handles + * Runscript and sound (un)muting + */ +public class StartupConfigurator extends StartupConfiguratorLayout { + + private static final long serialVersionUID = -3497629601818983994L; + + private StartupSettings startupSettings = new StartupSettings(null); + + public StartupConfigurator() { + super(); + } + + private void setError(final String msg) { + lblError.setText(msg); + } + /** + * Gets the runscript as String. The chosen interpreter and visibility flag + * will get encoded in the first line of the script. + * + * @return runscript as String. If no text was entered, returns a empty + * string. + */ + public String getState() { + setError(""); // fill remove any prior errors, we'll reset them if needed + // handle user input, this is tricky since + // * either an item has been selected -> editorContent will be of our enum type + // * user typed its own interpreter into the box -> editorContent will be a castable String + Object cboContent = cboRunscriptType.getEditor().getItem(); + if (cboContent instanceof RunscriptType) { + startupSettings.put(Field.EXTENSION, ((RunscriptType) cboContent).extension); + } else if (cboContent instanceof String) { + startupSettings.put(Field.EXTENSION, (String) cboContent); + } + String taInputText = taRunScript.getText(); + + RunscriptVisibility visibility = (RunscriptVisibility) cboRunscriptVisibility.getSelectedItem(); + startupSettings.put(Field.VISIBILITY, Integer.toString(visibility.value)); + SoundState sound = (SoundState)cboSoundState.getSelectedItem(); + startupSettings.put(Field.MUTED, Integer.toString(sound.value)); + + setError(""); + return startupSettings.serialize() + "\n" + taInputText; + } + + /** + * 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) { + if (config == null || config.isEmpty()) { + cboRunscriptType.setSelectedItem(null); + taRunScript.setText(""); + return; + } + String header = null; + try (BufferedReader reader = new BufferedReader(new StringReader(config))) { + header = reader.readLine(); + } catch (IOException e) { + // swallow ... + } + if (header != null) { + // we should have following format: ext=<interpreter/extension>;visibility=<flag>;... + // e.g. ext=sh;visibility=0 + startupSettings.deserialize(header); + String extension = startupSettings.get(Field.EXTENSION); + for (RunscriptType type : RunscriptType.values()) { + if (type.extension.equals(extension)) { + cboRunscriptType.setSelectedItem(type); + // mark that we found it by nulling the shebang... + extension = null; + break; + } + } + int visibility = Util.parseInt(startupSettings.get(Field.VISIBILITY), 1); + for (RunscriptVisibility windowFlag : RunscriptVisibility.values()) { + if (windowFlag.value == visibility) { + cboRunscriptVisibility.setSelectedItem(windowFlag); + break; + } + } + cboSoundState.setSelectedItem(SoundState.DEFAULT); + int mute = Util.parseInt(startupSettings.get(Field.MUTED), -1); + for (SoundState s : SoundState.values()) { + if (s.value == mute) { + cboSoundState.setSelectedItem(s); + break; + } + } + + if (extension != null) { + // user specific shebang, so just write the text to the cbo + cboRunscriptType.getEditor().setItem(extension); + } + } + // finished with the interpreter, remove that line from the given config + // before setting that text + taRunScript.setText(config.replaceFirst(".*?\n", "")); + } + + public void addToChangeMonitor(DialogChangeMonitor changeMonitor) { + changeMonitor.add(taRunScript); + changeMonitor.addEditableCombo(cboRunscriptType, null); + changeMonitor.addFixedCombo(cboRunscriptVisibility, null); + changeMonitor.addFixedCombo(cboSoundState, null); + } + + private static enum Field { + EXTENSION("ext"), + VISIBILITY("visibility"), + MUTED("soundMuted"); + public final String id; + + Field(String id) { + this.id = id; + } + } + + /** + * Map holding the inline settings from line 1 of the script + */ + private static class StartupSettings extends HashMap<String, String> { + private static final long serialVersionUID = -5893345450266600626L; + + public StartupSettings(String data) { + super(); + deserialize(data); + } + + public String put(Field key, String value) { + value = value.replace(';', '_').replace('\r', '_').replace('\n', '_'); + return super.put(key.id, value); + } + + public String get(Field key) + { + String ret = super.get(key.id); + if (ret == null) + return ""; + return ret; + } + + public String serialize() { + StringBuilder sb = new StringBuilder(); + for (Entry<String, String> e : this.entrySet()) { + if (sb.length() != 0) { + sb.append(';'); + } + sb.append(e.getKey()); + sb.append('='); + sb.append(e.getValue()); + } + return sb.toString(); + } + + public void deserialize(String data) { + if (data == null) + return; + clear(); + String[] parts = data.split(";"); + for (String s : parts) { + String[] entry = s.split("="); + if (entry.length == 2) { + put(entry[0], entry[1]); + } + } + } + } + +} + +/** + * Internal layout class for the advanced configurator (to keep it clean even + * for widgets) + */ +class StartupConfiguratorLayout extends JPanel { + + private static final long serialVersionUID = 648729071828404053L; + + private final static String RUN_SCRIPT_HELP = "Ein hier eingetragenes Skript wird nach dem Start" + + " der VM automatisch ausgeführt."; + protected final QLabel lblError; + protected final JTextArea taRunScript; + protected final ComboBox<RunscriptType> cboRunscriptType; + protected final ComboBox<RunscriptVisibility> cboRunscriptVisibility; + protected final ComboBox<SoundState> cboSoundState; + + public StartupConfiguratorLayout() { + GridManager grid = new GridManager(this, 2, true, new Insets(5, 5, 5, 5)); + grid.add(new QLabel("Audio")); + cboSoundState = new ComboBox<>(new ComboBoxRenderer<SoundState>() { + @Override + public String renderItem(SoundState item) { + return item.displayName; + } + }); + cboSoundState.setModel(new DefaultComboBoxModel<SoundState>(SoundState.values())); + grid.add(cboSoundState).fill(true, false).expand(true, false); + grid.nextRow(); + + grid.add(Box.createVerticalStrut(4), 2); + grid.nextRow(); + + grid.add(new WordWrapLabel(RUN_SCRIPT_HELP, false, true), 2) + .fill(true, false).expand(true, false); + grid.nextRow(); + + cboRunscriptType = new ComboBox<RunscriptType>( + new ComboBoxRenderer<RunscriptType>() { + @Override + public String renderItem(RunscriptType item) { + if (item == null) + return null; + return item.toString(); + } + }); + cboRunscriptType.setModel(new DefaultComboBoxModel<RunscriptType>( + RunscriptType.values())); + cboRunscriptType.setEditable(true); + grid.add(new QLabel("Dateinamenserweiterung: ")).fill(false, false) + .expand(false, false); + grid.add(cboRunscriptType).fill(true, false) + .expand(true, false); + grid.nextRow(); + + cboRunscriptVisibility = new ComboBox<RunscriptVisibility>(new ComboBoxRenderer<RunscriptVisibility>() { + @Override + public String renderItem(RunscriptVisibility item) { + if (item == null) + return null; + return item.displayName; + } + }); + cboRunscriptVisibility.setModel(new DefaultComboBoxModel<RunscriptVisibility>(RunscriptVisibility.values())); + grid.add(new QLabel("Sichtbarkeit: ")).fill(false, false) + .expand(false, false); + grid.add(cboRunscriptVisibility).fill(true, false) + .expand(true, false); + grid.nextRow(); + + taRunScript = new JTextArea("", 5, 20); + JScrollPane scpRunScript = new JScrollPane(taRunScript, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + taRunScript.setLineWrap(true); + taRunScript.setWrapStyleWord(true); + grid.add(scpRunScript, 2).fill(true, true).expand(true, true); + grid.nextRow(); + + lblError = new QLabel(""); + lblError.setForeground(Color.RED); + JPanel pnlError = new JPanel(); + pnlError.add(Box.createGlue()); + pnlError.add(lblError); + pnlError.add(Box.createGlue()); + grid.add(pnlError, 2).fill(true, false).expand(true, false); + grid.finish(false); + } + +} + + +enum RunscriptType { + SHELL("Shellskript", "sh"), BATCH("Windows-Batch", "bat"); + + public final String displayName; + public final String extension; + + private RunscriptType(String name, String extension) { + this.displayName = name; + this.extension = extension; + } + + @Override + public String toString() { + return extension + " (" + displayName + ")"; + } +} + +enum RunscriptVisibility { + NORMAL("Normal", 1), MINIMIZED("Minimiert", 2), HIDDEN("Versteckt", 0); + + public final String displayName; + public final int value; + + private RunscriptVisibility(String name, int flag) { + this.displayName = name; + this.value = flag; + } +} + +enum SoundState { + DEFAULT("Vorgabe des Pools", -1), MUTED("Stummschalten", 1), UNMUTED("Aktivieren", 0); + + public final String displayName; + public final int value; + + private SoundState(String name, int value) { + this.displayName = name; + this.value = value; + } +}
\ No newline at end of file |