From 64eb5cc2b4d62d00694957c7fcf04cb3053aff00 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 21 Nov 2018 11:44:36 +0100 Subject: [client] Add setting to mute/unmute sound at startup --- .../gui/configurator/RunscriptConfigurator.java | 262 ++++++++++++++------- .../window/layout/ImageDetailsWindowLayout.java | 2 +- 2 files changed, 173 insertions(+), 91 deletions(-) (limited to 'dozentenmodul') diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/RunscriptConfigurator.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/RunscriptConfigurator.java index 5323a215..635ec7c9 100755 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/RunscriptConfigurator.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/RunscriptConfigurator.java @@ -11,6 +11,7 @@ import java.io.IOException; import java.io.StringReader; import java.util.EventListener; import java.util.EventObject; +import java.util.HashMap; import javax.swing.Box; import javax.swing.DefaultComboBoxModel; @@ -19,56 +20,23 @@ import javax.swing.JScrollPane; import javax.swing.JTextArea; import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor; -import org.openslx.dozmod.gui.configurator.RunscriptConfigurator.RunscriptType; -import org.openslx.dozmod.gui.configurator.RunscriptConfigurator.RunscriptVisibility; 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.dozmod.gui.helper.TextChangeListener; +import org.openslx.util.Util; /** * Widget for advanced configuration options for lectures. This handles - * following options - Network rules - Runscript - USB + * Runscript */ public class RunscriptConfigurator extends RunscriptConfiguratorLayout { private static final long serialVersionUID = -3497629601818983994L; - - public static enum RunscriptType { - SHELL("Shellskript", "sh"), BATCH("Windows-Batch", "bat"); - - private final String displayName; - private final String extension; - - private RunscriptType(String name, String extension) { - this.displayName = name; - this.extension = extension; - } - - @Override - public String toString() { - return extension + " (" + displayName + ")"; - } - } - - public static enum RunscriptVisibility { - NORMAL("Normal", 1), MINIMIZED("Minimiert", 2), HIDDEN("Versteckt", 0); - - private final String displayName; - private final int flag; - - private RunscriptVisibility(String name, int flag) { - this.displayName = name; - this.flag = flag; - } - - @Override - public String toString() { - return displayName; - } - } + + private RsSettings runscriptSettings = new RsSettings(null); public RunscriptConfigurator() { super(); @@ -112,31 +80,21 @@ public class RunscriptConfigurator extends RunscriptConfiguratorLayout { // 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 - String extension = null; Object cboContent = cboRunscriptType.getEditor().getItem(); if (cboContent instanceof RunscriptType) { - extension = ((RunscriptType) cboContent).extension; + runscriptSettings.put(Field.EXTENSION, ((RunscriptType) cboContent).extension); } else if (cboContent instanceof String) { - extension = (String) cboContent; + runscriptSettings.put(Field.EXTENSION, (String) cboContent); } String taInputText = taRunScript.getText(); - if (taInputText.isEmpty()) - return ""; - if (extension == null || extension.isEmpty()) { - // this should never happen, so return null to report this invalid state - setError("Fehlende Dateinamenerweiterung!"); - return null; - } RunscriptVisibility visibility = (RunscriptVisibility) cboRunscriptVisibility.getSelectedItem(); - if (visibility == null) { - // this should never happen, so return null to report this invalid state - setError("Fehlendes Sichtbarkeits-Flag!"); - return null; - } + runscriptSettings.put(Field.VISIBILITY, Integer.toString(visibility.value)); + SoundState sound = (SoundState)cboSoundState.getSelectedItem(); + runscriptSettings.put(Field.MUTED, Integer.toString(sound.value)); setError(""); - return "ext=" + extension + ";" + "visibility=" + visibility.flag + "\n" + taInputText; + return runscriptSettings.serialize() + "\n" + taInputText; } /** @@ -154,37 +112,37 @@ public class RunscriptConfigurator extends RunscriptConfiguratorLayout { return; } String header = null; - try { - BufferedReader reader = new BufferedReader(new StringReader(config)); + try (BufferedReader reader = new BufferedReader(new StringReader(config))) { header = reader.readLine(); - reader.close(); } catch (IOException e) { // swallow ... } if (header != null) { - // we should have following format: ext=;visibility= - // e.g. ext=sh;scriptVisibility=0 - String[] options = header.split(";"); - String extension = null; - for (String option : options) { - if(option.startsWith("ext=")) { - extension = option.replace("ext=", ""); - 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; - } - } - } else if (option.startsWith("visibility=")) { - option = option.replace("visibility=", ""); - for (RunscriptVisibility windowFlag : RunscriptVisibility.values()) { - if (windowFlag.flag == Integer.parseInt(option)) { - cboRunscriptVisibility.setSelectedItem(windowFlag); - break; - } - } + // we should have following format: ext=;visibility=;... + // e.g. ext=sh;visibility=0 + runscriptSettings.deserialize(header); + String extension = runscriptSettings.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(runscriptSettings.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(runscriptSettings.get(Field.MUTED), -1); + for (SoundState s : SoundState.values()) { + if (s.value == mute) { + cboSoundState.setSelectedItem(s); + break; } } @@ -195,7 +153,7 @@ public class RunscriptConfigurator extends RunscriptConfiguratorLayout { } // finished with the interpreter, remove that line from the given config // before setting that text - taRunScript.setText(config.replaceFirst(header + "\n", "")); + taRunScript.setText(config.replaceFirst(".*?\n", "")); } /** @@ -243,6 +201,69 @@ public class RunscriptConfigurator extends RunscriptConfiguratorLayout { 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 RsSettings extends HashMap { + private static final long serialVersionUID = -5893345450266600626L; + + public RsSettings(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 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]); + } + } + } } } @@ -255,24 +276,34 @@ class RunscriptConfiguratorLayout extends JPanel { private static final long serialVersionUID = 648729071828404053L; - private final static String txtRunScriptDesc = "Ein hier eingetragenes Skript wird nach dem Start dieser VM automatisch ausgeführt."; + 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 cboRunscriptType; protected final ComboBox cboRunscriptVisibility; + protected final ComboBox cboSoundState; public RunscriptConfiguratorLayout() { - GridManager grid = new GridManager(this, 2, true, new Insets(5, 5, 5, 5)); - 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(new WordWrapLabel(txtRunScriptDesc, false, true), 2) + grid.add(new QLabel("Audio")); + cboSoundState = new ComboBox<>(new ComboBoxRenderer() { + @Override + public String renderItem(SoundState item) { + return item.displayName; + } + }); + cboSoundState.setModel(new DefaultComboBoxModel(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( new ComboBoxRenderer() { @Override @@ -290,12 +321,13 @@ class RunscriptConfiguratorLayout extends JPanel { grid.add(cboRunscriptType).fill(true, false) .expand(true, false); grid.nextRow(); + cboRunscriptVisibility = new ComboBox(new ComboBoxRenderer() { @Override public String renderItem(RunscriptVisibility item) { if (item == null) return null; - return item.toString(); + return item.displayName; } }); cboRunscriptVisibility.setModel(new DefaultComboBoxModel(RunscriptVisibility.values())); @@ -304,8 +336,16 @@ class RunscriptConfiguratorLayout extends JPanel { 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(); @@ -314,6 +354,48 @@ class RunscriptConfiguratorLayout extends JPanel { 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 diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageDetailsWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageDetailsWindowLayout.java index f8ebee60..2792e9fd 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageDetailsWindowLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageDetailsWindowLayout.java @@ -85,7 +85,7 @@ public abstract class ImageDetailsWindowLayout extends JDialog { super(modalParent, "", ModalityType.APPLICATION_MODAL); setResizable(true); setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); - setPreferredSize(Gui.getScaledDimension(630, 610)); + setPreferredSize(Gui.getScaledDimension(630, 680)); ((JPanel) getContentPane()).setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); /* ******************************************************************************* -- cgit v1.2.3-55-g7522