summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window
diff options
context:
space:
mode:
authorJonathan Bauer2018-06-25 13:24:40 +0200
committerJonathan Bauer2018-06-25 13:24:40 +0200
commitaeb7e3b4acdc7601e3a789c0ca8557ca9ae923e3 (patch)
tree0834ffa930feca85c038b5473b84c08e1bbfb853 /dozentenmodul/src/main/java/org/openslx/dozmod/gui/window
parent[client] Fix change detection for lecture permissions (diff)
downloadtutor-module-aeb7e3b4acdc7601e3a789c0ca8557ca9ae923e3.tar.gz
tutor-module-aeb7e3b4acdc7601e3a789c0ca8557ca9ae923e3.tar.xz
tutor-module-aeb7e3b4acdc7601e3a789c0ca8557ca9ae923e3.zip
[client] reworked ImageDetailsWindow
* switch to tab layout * support for new dialog monitor * simplified (hah!) permissions handling
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/gui/window')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java304
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImagePermissionWindow.java104
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImageDetailsWindowLayout.java187
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImagePermissionWindowLayout.java103
4 files changed, 255 insertions, 443 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java
index 15964e65..0887e461 100644
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImageDetailsWindow.java
@@ -17,7 +17,6 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
@@ -42,9 +41,11 @@ import org.openslx.bwlp.thrift.iface.UserInfo;
import org.openslx.bwlp.thrift.iface.Virtualizer;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.MainWindow;
+import org.openslx.dozmod.gui.changemonitor.AbstractControlWrapper;
+import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor;
+import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor.TextNotEmptyConstraint;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.gui.helper.PopupMenu;
-import org.openslx.dozmod.gui.helper.TextChangeListener;
import org.openslx.dozmod.gui.helper.UiFeedback;
import org.openslx.dozmod.gui.window.UserListWindow.UserAddedCallback;
import org.openslx.dozmod.gui.window.layout.ImageDetailsWindowLayout;
@@ -60,10 +61,10 @@ import org.openslx.dozmod.thrift.ThriftError;
import org.openslx.dozmod.thrift.cache.LectureCache;
import org.openslx.dozmod.thrift.cache.MetaDataCache;
import org.openslx.dozmod.thrift.cache.UserCache;
-import org.openslx.dozmod.util.FormatHelper;
-import org.openslx.dozmod.util.MapHelper;
import org.openslx.dozmod.util.DesktopEnvironment;
+import org.openslx.dozmod.util.FormatHelper;
import org.openslx.sat.thrift.version.Feature;
+import org.openslx.thrifthelper.Comparators;
import org.openslx.thrifthelper.TConst;
import org.openslx.thrifthelper.ThriftManager;
import org.openslx.util.QuickTimer;
@@ -113,14 +114,9 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
private Map<String, ImagePermissions> customPermissions;
/**
- * The original custom permissions as fetched from the server
+ * Did the user have admin rights due to default permissions?
*/
- private Map<String, ImagePermissions> originalCustomPermissions;
-
- /**
- * The original default permissions as fetched from the server
- */
- private ImagePermissions originalDefaultPermissions;
+ private boolean adminRightsFromDefaultPermissions;
/**
* Popup menu items
@@ -131,8 +127,9 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
private final JMenuItem mnuDelete = new JMenuItem("Löschen");
private final JMenuItem mnuExtendExpiryDate = new JMenuItem("Ablaufzeitpunkt verlängern");
- private boolean metadataChanged = false;
- private boolean permissionsChanged = false;
+ private DialogChangeMonitor changeMonitor;
+
+ private AbstractControlWrapper<?> changeListenerPermissions;
/**
* Constructor
@@ -146,6 +143,21 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
this.callback = callback;
this.actionHandler = actionHandler;
+ // Set up change monitor
+ changeMonitor = new DialogChangeMonitor(new DialogChangeMonitor.Callback() {
+ @Override
+ public void validityChanged(String errorMessage) {
+ lblError.setText(errorMessage);
+ btnSaveChanges.setEnabled(changeMonitor.isValid() && changeMonitor.wasEverModified());
+ LOGGER.info("Valid: " + changeMonitor.isValid());
+ }
+
+ @Override
+ public void modificationChanged() {
+ btnSaveChanges.setEnabled(changeMonitor.isValid() && changeMonitor.wasEverModified());
+ LOGGER.info("Changed: " + changeMonitor.isCurrentlyModified());
+ }
+ });
// Hook when user presses X (top right)
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@@ -213,21 +225,6 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
}
});
- btnPermissions.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent arg0) {
- // open the custom permission window and save returned default/custom permissions
- ImagePermissionWindow.open(me, customPermissions, image.defaultPermissions, image.ownerId);
- // since the window above gets references of the default/custom permission object
- // there is no need to further save the return value ...
- // THAT or we do work with copies in ImagePermissionWindow ...
-
- // for now let's stay with refs and just reactToChange() where we check if
- // the permissions stuff changed since the last call of fill()
- reactToChange();
- }
- });
-
tblVersions.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
/**
@@ -335,33 +332,52 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
scpVersions.addMouseListener(ma);
tblVersions.addMouseListener(ma);
- // listen to changes
- final TextChangeListener docListener = new TextChangeListener() {
- @Override
- public void changed() {
- reactToChange();
- }
- };
- final ItemListener comboItemListener = new ItemListener() {
+ // add controls to change monitor to handle user actions
+ changeMonitor.add(txtTitle).addConstraint(new TextNotEmptyConstraint("Name darf nicht leer sein"));
+ changeMonitor.add(txtDescription)
+ .addConstraint(new TextNotEmptyConstraint("Beschreibung darf nicht leer sein"));
+ changeMonitor.add(txtTags);
+ changeMonitor.addFixedCombo(cboOperatingSystem, Comparators.operatingSystem)
+ .addConstraint(new DialogChangeMonitor.ValidationConstraint<OperatingSystem>() {
+ public String checkStateValid(OperatingSystem userInput) {
+ if (userInput != null && MetaDataCache.getOsById(userInput.osId) != null) // validating OS coming from the cache makes no sense?
+ return null;
+ return "Ungültiges Betriebssystem ausgewählt!";
+ }
+ });
+ changeMonitor.addFixedCombo(cboShareMode, Comparators.shareModeById)
+ .addConstraint(new DialogChangeMonitor.ValidationConstraint<ShareMode>() {
+ public String checkStateValid(ShareMode userInput) {
+ if (userInput != null)
+ return null;
+ return "Ungültiges Betriebssystem ausgewählt!";
+ }
+ });
+ changeMonitor.add(chkIsTemplate);
+ changeMonitor.add(chkDefaultPermLink);
+ changeMonitor.add(chkDefaultPermDownload);
+ changeMonitor.add(chkDefaultPermEdit);
+ changeMonitor.add(chkDefaultPermAdmin);
+ changeListenerPermissions = changeMonitor.add(ctlImagePermissionConfigurator);
+
+ // update default permissions hook for the permission configurator to apply to newly added users
+ final ItemListener updateDefaultPermissionsListener = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
- if (e.getStateChange() == ItemEvent.SELECTED) {
- reactToChange();
- }
+ if (e.getSource() == chkDefaultPermLink)
+ image.defaultPermissions.link = chkDefaultPermLink.isSelected();
+ if (e.getSource() == chkDefaultPermDownload)
+ image.defaultPermissions.download = chkDefaultPermDownload.isSelected();
+ if (e.getSource() == chkDefaultPermEdit)
+ image.defaultPermissions.edit = chkDefaultPermEdit.isSelected();
+ if (e.getSource() == chkDefaultPermAdmin)
+ image.defaultPermissions.admin = chkDefaultPermAdmin.isSelected();
}
};
- final ActionListener checkBoxListener = new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- reactToChange();
- }
- };
- txtTitle.getDocument().addDocumentListener(docListener);
- txtDescription.getDocument().addDocumentListener(docListener);
- txtTags.getDocument().addDocumentListener(docListener);
- cboOperatingSystem.addItemListener(comboItemListener);
- cboShareMode.addItemListener(comboItemListener);
- chkIsTemplate.addActionListener(checkBoxListener);
+ chkDefaultPermLink.addItemListener(updateDefaultPermissionsListener);
+ chkDefaultPermDownload.addItemListener(updateDefaultPermissionsListener);
+ chkDefaultPermEdit.addItemListener(updateDefaultPermissionsListener);
+ chkDefaultPermAdmin.addItemListener(updateDefaultPermissionsListener);
/**
* Initial state of GUI elements
@@ -469,23 +485,6 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
}
/**
- * Called by the "Save" button, tries to save the changes internally and
- * then react based depending on the outcome of the save
- */
- private void saveChanges() {
- boolean saved = saveChangesInternal();
- // if there was nothing to save, saved would be true from the above call
- // however we wouldn't even get to saving if nothing was changed, so its fine
- if (saved) {
- if (callback != null)
- callback.updated();
- dispose();
- } else {
- btnSaveChanges.setEnabled(true);
- }
- }
-
- /**
* Called by the "Publish" button. Tries to upload that image to the
* masterserver.
*/
@@ -498,14 +497,13 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
MessageType.ERROR, null, null);
return;
}
- if (metadataChanged || permissionsChanged) {
+ if (changeMonitor.isCurrentlyModified()) {
if (Gui.showMessageBox("Sie haben unspeicherte Änderungen, wollen Sie diese erst speichern?",
MessageType.QUESTION_YESNO, null, null)) {
if (!saveChangesInternal()) {
return;
}
}
-
}
// let the user confirm or abort
if (!Gui.showMessageBox("Wollen Sie diese VM wirklich landesweit veröffentlichen?",
@@ -545,24 +543,42 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
}
/**
+ * Called by the "Save" button, tries to save the changes internally and
+ * then react based depending on the outcome of the save
+ */
+ private void saveChanges() {
+ boolean saved = saveChangesInternal();
+ // if there was nothing to save, saved would be true from the above call
+ // however we wouldn't even get to saving if nothing was changed, so its fine
+ if (saved) {
+ if (callback != null)
+ callback.updated();
+ dispose();
+ } else {
+ btnSaveChanges.setEnabled(true);
+ }
+ }
+
+ /**
* Helper to only save the changes, nothing else. Updating GUI elements is
* done by saveChanges()
- *
+ *
* @return false if any try to save changes failed, true otherwise
*/
private boolean saveChangesInternal() {
-
- // We might only have admin perms because of the default permissions,
- // so we first write the permission map because we might remove our own default admin permissions.
- if (originalDefaultPermissions.admin && permissionsChanged) {
- if (!writeImagePermMap())
+ // Special case: User has admin rights through default permissions
+ // -> user removes default admin permissions
+ // -> first save custom permissions, then the rest (including default permissions)
+ if (adminRightsFromDefaultPermissions && image.defaultPermissions.admin == false
+ && changeListenerPermissions.isCurrentlyChanged()) {
+ if (!saveCustomPermissions()) {
return false;
- LOGGER.info("Successfully saved new default permissions");
- permissionsChanged = false;
+ }
+ changeListenerPermissions.reset();
+ LOGGER.info("Successfully saved new custom permissions");
}
-
// now trigger the actual action
- if (metadataChanged) {
+ if (changeMonitor.isCurrentlyModified()) {
// first build the ImageBaseWrite from the GUI fields
final ImageBaseWrite ibw = new ImageBaseWrite(txtTitle.getText(), txtDescription.getText(),
cboOperatingSystem.getItemAt(cboOperatingSystem.getSelectedIndex()).osId, image.virtId,
@@ -578,22 +594,27 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
return false;
}
LOGGER.info("Successfully saved new metadata");
- metadataChanged = false;
}
-
- // if we haven't written the permission map yet and the permissions have changed
- if (permissionsChanged) {
- if (!writeImagePermMap())
+ if (changeListenerPermissions.isCurrentlyChanged()) {
+ if (!saveCustomPermissions()) {
return false;
+ }
LOGGER.info("Successfully saved new custom permissions");
- permissionsChanged = false;
}
+ changeMonitor.reset();
return true;
}
- private boolean writeImagePermMap() {
+ /**
+ * Helper to save the custom user permissions (those not included in
+ * ImageBaseWrite).
+ *
+ * @return true if successfully saved, false otherwise.
+ */
+ private boolean saveCustomPermissions() {
try {
- actionHandler.writeImagePermissions(image.getImageBaseId(), customPermissions);
+ actionHandler.writeImagePermissions(image.getImageBaseId(),
+ ctlImagePermissionConfigurator.getPermissions());
} catch (TException e) {
ThriftError.showMessage(me, LOGGER, e,
"Konnte geänderte Berechtigungen nicht an den Server übermitteln");
@@ -603,9 +624,9 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
}
/**
- * Triggers the download of the given image version
- *
- * @param selected image to download
+ * Triggers the download of the given image version.
+ *
+ * @param selected image to download.
*/
private void performImageDownload(ImageVersionDetails selected) {
if (selected.getVersionId() == null) {
@@ -619,9 +640,9 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
}
/**
- * Triggers the deletion of the given image version
- *
- * @param version image version to delete
+ * Triggers the deletion of the given image version.
+ *
+ * @param version image version to delete.
*/
private void deleteVersion(final ImageVersionDetails version) {
if (version == null)
@@ -635,9 +656,9 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
}
/**
- * Triggers the deletion of a list of versions
+ * Triggers the deletion of a list of versions.
*
- * @param versions list of versions to delete
+ * @param versions to delete
*/
private void deleteVersions(List<ImageVersionDetails> versions) {
if (versions == null || versions.isEmpty())
@@ -647,6 +668,12 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
}
}
+ /**
+ * Extends the expiration date for given image versions to current date
+ * plus the configured maximum image validity days.
+ *
+ * @param versions to extend the validity of
+ */
private void extendVersionExpiry(List<ImageVersionDetails> versions) {
int count = 0;
for (ImageVersionDetails img : versions) {
@@ -692,24 +719,9 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
private void fillDetails() {
if (image == null)
return;
- // remember default permissions
- if (image.defaultPermissions != null) {
- originalDefaultPermissions = new ImagePermissions(image.defaultPermissions);
- }
- // remember custom permissions
- if (customPermissions != null) {
- // need a deep copy of the permission map to be able to check for
- // changes after ImageCustomPermissionWindow
- if (originalCustomPermissions == null)
- originalCustomPermissions = new HashMap<String, ImagePermissions>();
- else
- originalCustomPermissions.clear();
- // fill it
- for (Entry<String, ImagePermissions> entry : customPermissions.entrySet()) {
- originalCustomPermissions.put(entry.getKey(), new ImagePermissions(entry.getValue()));
- }
- }
+
txtTitle.setText(image.getImageName());
+ txtTitle.setCaretPosition(0);
txtDescription.setText(image.getDescription());
lblOwner.setUser(UserCache.find(image.getOwnerId()));
lblUpdater.setUser(UserCache.find(image.getUpdaterId()));
@@ -744,8 +756,8 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
for (ShareMode mode : ShareMode.values()) {
cboShareMode.addItem(mode);
}
- cboShareMode.setSelectedItem(image.getShareMode());
}
+ cboShareMode.setSelectedItem(image.getShareMode());
String tagsString = "";
if (image.getTags() != null) {
@@ -755,6 +767,13 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
}
txtTags.setText(tagsString);
+ // init permissions, remember if the user had admin rights through default permissions
+ adminRightsFromDefaultPermissions = image.defaultPermissions.admin;
+ ctlImagePermissionConfigurator.initPanel(customPermissions, image.defaultPermissions, image.ownerId);
+ chkDefaultPermAdmin.setSelected(image.defaultPermissions.admin);
+ chkDefaultPermEdit.setSelected(image.defaultPermissions.edit);
+ chkDefaultPermDownload.setSelected(image.defaultPermissions.download);
+ chkDefaultPermLink.setSelected(image.defaultPermissions.link);
// Count the number of linked lectures to the image
int lectureCount = 0;
for (LectureSummary lecture : LectureCache.get(false)) {
@@ -772,60 +791,10 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
// make fields editable is allowed
makeEditable(true);
+ changeMonitor.reset();
// finally do show it all
setVisible(true);
- }
-
- /**
- * Checks whether the user changed any fields of the image details and
- * enables the save button if so TODO TAGS
- */
- private void reactToChange() {
- metadataChanged = reactToChangeInternal();
- permissionsChanged = MapHelper.hasChanged(originalCustomPermissions, customPermissions);
- btnSaveChanges.setEnabled(metadataChanged || permissionsChanged);
- }
- private boolean reactToChangeInternal() {
- if (image == null)
- return false;
- boolean changed = false;
- // Image name
- if (txtTitle.getText().isEmpty()) {
- lblError.setText("Kein VM-Name gesetzt!");
- return false;
- }
- // Image description
- if (txtDescription.getText().isEmpty()) {
- lblError.setText("Keine Beschreibung angegeben!");
- return false;
- }
-
- // Operating system
- OperatingSystem newOs = cboOperatingSystem.getItemAt(cboOperatingSystem.getSelectedIndex());
- if (newOs == null) {
- lblError.setText("Kein Betriebssystem ausgewählt!");
- return false;
- }
-
- // Share mode
- ShareMode newShareMode = cboShareMode.getItemAt(cboShareMode.getSelectedIndex());
- if (newShareMode == null) {
- lblError.setText("Kein Share-Modus ausgewählt!");
- return false;
- }
- // mandatory checks done, remove error message
- lblError.setText(null);
-
- // Template, default permissions and custom permissions:
- // no sanity checks here only check if they changed
- changed = !txtTitle.getText().equals(image.getImageName())
- || !txtDescription.getText().equals(image.getDescription())
- || newOs.getOsId() != image.getOsId() || !newShareMode.equals(image.shareMode)
- || chkIsTemplate.isSelected() != image.isTemplate
- || !image.defaultPermissions.equals(originalDefaultPermissions);
-
- return changed;
}
/**
@@ -845,7 +814,6 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
txtTags.setEditable(editable);
cboOperatingSystem.setEnabled(editable);
// cboShareMode.setEnabled(editable);
- btnPermissions.setEnabled(editable && ImagePerms.canAdmin(image));
btnChangeOwner.setEnabled(editable && ImagePerms.canAdmin(image));
btnUpdateImage.setEnabled(editable);
if (actionHandler.isImagePublishSupported())
@@ -890,7 +858,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
*/
@Override
public boolean wantConfirmQuit() {
- return metadataChanged || permissionsChanged;
+ return changeMonitor.isCurrentlyModified();
}
@Override
@@ -903,7 +871,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe
* confirmation if so
*/
private boolean safeClose() {
- if ((metadataChanged || permissionsChanged)
+ if (changeMonitor.isCurrentlyModified()
&& !Gui.showMessageBox(me, "Änderungen werden verworfen, wollen Sie wirklich schließen?",
MessageType.QUESTION_YESNO, null, null))
return false;
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImagePermissionWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImagePermissionWindow.java
deleted file mode 100644
index e8c8ba06..00000000
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/ImagePermissionWindow.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.openslx.dozmod.gui.window;
-
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Map;
-
-import org.apache.log4j.Logger;
-import org.openslx.bwlp.thrift.iface.ImagePermissions;
-import org.openslx.dozmod.gui.helper.UiFeedback;
-import org.openslx.dozmod.gui.window.layout.ImagePermissionWindowLayout;
-
-/**
- * Window for modifying the custom permissions of an image.
- */
-@SuppressWarnings("serial")
-public class ImagePermissionWindow extends ImagePermissionWindowLayout implements UiFeedback {
-
- private static final Logger LOGGER = Logger.getLogger(ImagePermissionWindow.class);
-
- private boolean okUsed = false;
-
- protected ImagePermissionWindow(final Window modalParent,
- final Map<String, ImagePermissions> permissionMap, final ImagePermissions defaultPermissions,
- String ownerId) {
- super(modalParent);
- imagePermissionManager.initPanel(permissionMap, defaultPermissions, ownerId);
-
- btnOk.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- okUsed = true;
- dispose();
- }
- });
-
- btnClose.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent arg0) {
- dispose();
- }
- });
-
- chkCustomPermAdmin.setSelected(defaultPermissions.admin);
- chkCustomPermEdit.setSelected(defaultPermissions.edit);
- chkCustomPermDownload.setSelected(defaultPermissions.download);
- chkCustomPermLink.setSelected(defaultPermissions.link);
-
- ActionListener updateDefaultPermissionListener = new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- imagePermissionManager.updateDefaultPermissions(chkCustomPermLink.isSelected(),
- chkCustomPermDownload.isSelected(), chkCustomPermEdit.isSelected(),
- chkCustomPermAdmin.isSelected());
- }
- };
-
- chkCustomPermAdmin.addActionListener(updateDefaultPermissionListener);
- chkCustomPermEdit.addActionListener(updateDefaultPermissionListener);
- chkCustomPermDownload.addActionListener(updateDefaultPermissionListener);
- chkCustomPermLink.addActionListener(updateDefaultPermissionListener);
- }
-
- /**
- * Set a created ImageCustomPermissionWindow visible and return resulting
- * permissions
- *
- * @return PermissionDefaultToCustomLink with default- and customPermissions
- * when using OK button, null otherwise
- */
- private void run() {
- setVisible(true);
- if (okUsed)
- imagePermissionManager.updatePermissionReferences();
- }
-
- /**
- * Creates a new ImageCustomPermissionWindow dialog
- *
- * @param modalParent
- * parent window of this dialog
- * @param permissionMap
- * The current user permissions with which the permission manager
- * to initialise, null creates empty list.
- * @param defaultPermissions
- * The current default permissions, should not be null!
- * @param ownerId
- * The id of the user to exclude when adding users. Can be null.
- */
- public static void open(Window modalParent, Map<String, ImagePermissions> permissionMap,
- ImagePermissions defaultPermissions, String ownerId) {
- new ImagePermissionWindow(modalParent, permissionMap, defaultPermissions, ownerId).run();
- }
-
- @Override
- public boolean wantConfirmQuit() {
- return false;
- }
-
- @Override
- public void escapePressed() {
- dispose();
- }
-}
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 43904c42..b556f4e8 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
@@ -12,18 +12,19 @@ import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
+import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
+import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import org.openslx.bwlp.thrift.iface.OperatingSystem;
import org.openslx.bwlp.thrift.iface.ShareMode;
import org.openslx.dozmod.gui.Gui;
+import org.openslx.dozmod.gui.configurator.ImagePermissionConfigurator;
import org.openslx.dozmod.gui.control.ComboBox;
import org.openslx.dozmod.gui.control.ComboBox.ComboBoxRenderer;
import org.openslx.dozmod.gui.control.PersonLabel;
@@ -35,7 +36,7 @@ import org.openslx.thrifthelper.Comparators;
@SuppressWarnings("serial")
public abstract class ImageDetailsWindowLayout extends JDialog {
-
+
private static final int ICON_SIZE_Y = 24;
protected final JTextField txtTitle;
@@ -52,38 +53,49 @@ public abstract class ImageDetailsWindowLayout extends JDialog {
protected final QLabel lblVirtualizer;
protected final JTextField txtTags;
protected final JCheckBox chkIsTemplate;
- protected final JComboBox<ShareMode> cboShareMode;
+ protected final ComboBox<ShareMode> cboShareMode;
protected final JTextField txtId;
protected final JTextField txtVersion;
- protected final JButton btnPermissions;
-
protected final JButton btnSaveChanges;
protected final JButton btnUpdateImage;
protected final JButton btnUploadToMaster;
protected final JButton btnClose;
+ protected final JCheckBox chkDefaultPermAdmin;
+ protected final JCheckBox chkDefaultPermEdit;
+ protected final JCheckBox chkDefaultPermDownload;
+ protected final JCheckBox chkDefaultPermLink;
+
protected final JButton btnShowLinkingLectures;
protected final QLabel lblLinkedLectureCount;
protected final ImageVersionTable tblVersions;
protected final QScrollPane scpVersions;
+ protected JTabbedPane pnlTabs;
+
+ protected ImagePermissionConfigurator ctlImagePermissionConfigurator;
+
+ private static String infoTextDefPerms = "<html><body style='width:100%'>"
+ + "Hier können Sie Rechte für nicht in der Liste angegebene Nutzer festlegen:" + "</body></html>";
+
public ImageDetailsWindowLayout(Frame modalParent) {
super(modalParent, "<init>", ModalityType.APPLICATION_MODAL);
setResizable(true);
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
-
- // create left panel for info and buttons and right panel for the table and add
- // them to split pane
-
- // use panel to put every info related widget in it
- // then we we'll set the panel with BorderLayout.CENTER
- JPanel infoPanel = new JPanel();
- GridManager grid = new GridManager(infoPanel, 3, true, new Insets(2, 2, 2, 2));
- infoPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
- // -- name --
+ setPreferredSize(Gui.getScaledDimension(650, 600));
+ ((JPanel) getContentPane()).setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+
+ /* *******************************************************************************
+ *
+ * Tab: Overview
+ *
+ ********************************************************************************/
+ JPanel pnlTabOverview = new JPanel();
+ GridManager grid = new GridManager(pnlTabOverview, 3, true, new Insets(2, 2, 2, 2));
+ // name
txtTitle = new JTextField();
txtTitle.setFont(txtTitle.getFont().deriveFont(Font.BOLD, txtTitle.getFont().getSize2D() * 2));
grid.add(txtTitle, 3).expand(true, false).fill(true, false);
@@ -127,7 +139,6 @@ public abstract class ImageDetailsWindowLayout extends JDialog {
grid.add(lblUpdateTime, 2);
grid.nextRow();
- // os
cboOperatingSystem = new ComboBox<OperatingSystem>(Comparators.operatingSystem,
new ComboBoxRenderer<OperatingSystem>() {
@Override
@@ -145,14 +156,16 @@ public abstract class ImageDetailsWindowLayout extends JDialog {
// tags
txtTags = new JTextField();
- /* TODO
- grid.add(new QLabel("Tags"), GridPos.get(0, row, false, false));
- grid.add(txtTags, GridPos.get(1, row++, true, false));
- grid.nextRow();
- */
// share mode
- cboShareMode = new JComboBox<ShareMode>();
+ cboShareMode = new ComboBox<ShareMode>(Comparators.shareModeById, new ComboBoxRenderer<ShareMode>() {
+ @Override
+ public String renderItem(ShareMode item) {
+ if (item == null)
+ return null;
+ return item.name();
+ }
+ });
grid.add(new QLabel("Freigabemodus"));
grid.add(cboShareMode, 2).expand(true, false).fill(true, false);
grid.nextRow();
@@ -182,11 +195,6 @@ public abstract class ImageDetailsWindowLayout extends JDialog {
grid.add(lblVirtualizer, 2).expand(true, false).fill(true, false);
grid.nextRow();
- btnPermissions = new JButton("Berechtigungen");
- grid.skip();
- grid.add(btnPermissions, 2);
- grid.nextRow();
-
grid.add(new QLabel("Veranstaltungen"));
lblLinkedLectureCount = new QLabel();
grid.add(lblLinkedLectureCount).expand(true, false);
@@ -197,51 +205,94 @@ public abstract class ImageDetailsWindowLayout extends JDialog {
grid.nextRow();
grid.finish(true);
- infoPanel.setPreferredSize(Gui.getScaledDimension(500, 400));
- infoPanel.setMinimumSize(Gui.getScaledDimension(350, 300));
+ pnlTabOverview.setPreferredSize(Gui.getScaledDimension(500, 400));
+ pnlTabOverview.setMinimumSize(Gui.getScaledDimension(350, 300));
- // finally add the infoPanel itself to the left panel
- // button panel at the bottom
- JPanel buttonPanel = new JPanel();
- buttonPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
- buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
+ /* *******************************************************************************
+ *
+ * Tab: VM versions
+ *
+ ********************************************************************************/
+ JPanel pnlTabVersions = new JPanel();
+ tblVersions = new ImageVersionTable();
+ scpVersions = new QScrollPane(tblVersions);
+ GridManager grdVersions = new GridManager(pnlTabVersions, 1, false, new Insets(8, 2, 8, 2));
+ grdVersions.add(scpVersions).fill(true, true).expand(true, true);
+ grdVersions.finish(false);
+
+ /* *******************************************************************************
+ *
+ * Tab: Permissions
+ *
+ ********************************************************************************/
+ JPanel pnlTabPermissions = new JPanel();
+ ctlImagePermissionConfigurator = new ImagePermissionConfigurator();
+ GridManager grdImagePermissionConfigurator = new GridManager(pnlTabPermissions, 1, false, new Insets(8, 2, 8, 2));
+ grdImagePermissionConfigurator.add(ctlImagePermissionConfigurator).fill(true, true).expand(true, true);
+ // Panel with the permissions for other users
+ JPanel defaultPermissionPane = new JPanel();
+ defaultPermissionPane.setBorder(BorderFactory.createTitledBorder("Andere Nutzer"));
+ defaultPermissionPane.setLayout(new BoxLayout(defaultPermissionPane, BoxLayout.PAGE_AXIS));
+ JLabel txtDefaultPerms = new JLabel(infoTextDefPerms);
+
+ JPanel txtDefaultPermsPanel = new JPanel();
+ // Panel + BoxLayout + Label = wordwrap
+ txtDefaultPermsPanel.setLayout(new BoxLayout(txtDefaultPermsPanel, BoxLayout.LINE_AXIS));
+ txtDefaultPermsPanel.add(txtDefaultPerms);
+ JPanel defaultPermsSubPanel = new JPanel();
+ defaultPermsSubPanel.setLayout(new BoxLayout(defaultPermsSubPanel, BoxLayout.LINE_AXIS));
+ chkDefaultPermAdmin = new JCheckBox("Admin");
+ chkDefaultPermDownload = new JCheckBox("Download");
+ chkDefaultPermEdit = new JCheckBox("Bearbeiten");
+ chkDefaultPermLink = new JCheckBox("Verlinken");
+
+ defaultPermsSubPanel.add(chkDefaultPermLink);
+ defaultPermsSubPanel.add(chkDefaultPermDownload);
+ defaultPermsSubPanel.add(chkDefaultPermEdit);
+ defaultPermsSubPanel.add(chkDefaultPermAdmin);
+
+ defaultPermissionPane.add(txtDefaultPermsPanel);
+ defaultPermissionPane.add(Box.createVerticalStrut(10));
+ defaultPermissionPane.add(defaultPermsSubPanel);
+ grdImagePermissionConfigurator.add(defaultPermissionPane).fill(true, false).expand(false, false);
+ grdImagePermissionConfigurator.finish(false);
+
+ /* *******************************************************************************
+ *
+ * Bottom panel for buttons
+ *
+ ********************************************************************************/
+ JPanel pnlButtons = new JPanel();
+ pnlButtons.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+ pnlButtons.setLayout(new BoxLayout(pnlButtons, BoxLayout.LINE_AXIS));
btnSaveChanges = new JButton("Speichern");
btnClose = new JButton("Schließen");
- btnUpdateImage = new JButton("Neue VM-Version hochladen", Gui.getScaledIconResource("/img/upload-icon.png", "New VM", ICON_SIZE_Y, buttonPanel));
- buttonPanel.add(btnUpdateImage);
- btnUploadToMaster = new JButton("Landesweit veröffentlichen", Gui.getScaledIconResource("/img/publish-icon.png", "Publish VM", ICON_SIZE_Y, buttonPanel));
- buttonPanel.add(btnUploadToMaster);
- buttonPanel.add(Box.createGlue());
+ btnUpdateImage = new JButton("Neue VM-Version hochladen",
+ Gui.getScaledIconResource("/img/upload-icon.png", "New VM", ICON_SIZE_Y, pnlButtons));
+ pnlButtons.add(btnUpdateImage);
+ btnUploadToMaster = new JButton("Landesweit veröffentlichen",
+ Gui.getScaledIconResource("/img/publish-icon.png", "Publish VM", ICON_SIZE_Y, pnlButtons));
+ pnlButtons.add(btnUploadToMaster);
+ pnlButtons.add(Box.createGlue());
// user feedback slot
lblError = new QLabel("");
lblError.setForeground(Color.RED);
- buttonPanel.add(lblError);
- buttonPanel.add(Box.createGlue());
- buttonPanel.add(btnClose);
- buttonPanel.add(btnSaveChanges);
-
- // --- Version table on the right (EAST) side
- JPanel versionTablePanel = new JPanel();
- versionTablePanel.setLayout(new BorderLayout());
- versionTablePanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
- QLabel lblVersion = new QLabel("VM-Versionen");
- lblVersion.setFont(lblVersion.getFont().deriveFont(Font.BOLD));
- versionTablePanel.add(lblVersion, BorderLayout.PAGE_START);
- tblVersions = new ImageVersionTable();
- scpVersions = new QScrollPane(tblVersions);
- scpVersions.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
- versionTablePanel.add(scpVersions, BorderLayout.CENTER);
-
- // add the tabel panel to the right panel
- JPanel rightPanel = new JPanel();
- rightPanel.setLayout(new BorderLayout());
- rightPanel.add(versionTablePanel, BorderLayout.CENTER);
-
- // add left and right panel to the split pane
- JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, infoPanel, rightPanel);
- splitPane.setResizeWeight(0.5);
- // add the split pane
- add(splitPane, BorderLayout.CENTER);
- add(buttonPanel, BorderLayout.PAGE_END);
+ pnlButtons.add(lblError);
+ pnlButtons.add(Box.createGlue());
+ pnlButtons.add(btnClose);
+ pnlButtons.add(btnSaveChanges);
+
+ /* *******************************************************************************
+ *
+ * Main panel containing the tabs
+ *
+ ********************************************************************************/
+ pnlTabs = new JTabbedPane();
+ pnlTabs.addTab("Übersicht", pnlTabOverview);
+ pnlTabs.addTab("VM-Versions", pnlTabVersions);
+ pnlTabs.addTab("Berechtigungen", pnlTabPermissions);
+
+ add(pnlTabs, BorderLayout.CENTER);
+ add(pnlButtons, BorderLayout.PAGE_END);
}
}
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImagePermissionWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImagePermissionWindowLayout.java
deleted file mode 100644
index 6b9ea566..00000000
--- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/ImagePermissionWindowLayout.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.openslx.dozmod.gui.window.layout;
-
-import java.awt.Window;
-
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import org.apache.log4j.Logger;
-import org.openslx.dozmod.gui.Gui;
-import org.openslx.dozmod.gui.configurator.ImagePermissionConfigurator;
-import org.openslx.dozmod.gui.helper.GridManager;
-
-/**
- * Window for editing permissions of an Image
- */
-@SuppressWarnings("serial")
-public class ImagePermissionWindowLayout extends JDialog {
-
- private static final Logger LOGGER = Logger.getLogger(ImagePermissionWindowLayout.class);
-
- protected final JCheckBox chkCustomPermAdmin;
- protected final JCheckBox chkCustomPermEdit;
- protected final JCheckBox chkCustomPermDownload;
- protected final JCheckBox chkCustomPermLink;
-
- protected final JButton btnOk;
- protected final JButton btnClose;
-
- protected final ImagePermissionConfigurator imagePermissionManager;
-
- private static String title = "Berechtigungen";
- private static String infoTextDefPerms = "<html><body style='width:100%'>"
- + "Hier können Sie Rechte für nicht in der Liste angegebene Nutzer festlegen:" + "</body></html>";
-
- protected ImagePermissionWindowLayout(Window modalParent) {
- super(modalParent, title, modalParent != null ? ModalityType.APPLICATION_MODAL
- : ModalityType.MODELESS);
- this.setTitle(title);
-
- // Panel to add everything into, needed for the border.
- JPanel contentPanel = new JPanel();
- contentPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
- add(contentPanel);
-
- imagePermissionManager = new ImagePermissionConfigurator();
-
- // Panel for the buttons at the bottom
- JPanel buttonPane = new JPanel();
- buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
- buttonPane.add(Box.createGlue());
- btnClose = new JButton("Schließen");
- buttonPane.add(btnClose);
- btnOk = new JButton("Übernehmen");
- buttonPane.add(btnOk);
-
- // Panel with the permissions for other users
- JPanel defaultPermissionPane = new JPanel();
- defaultPermissionPane.setBorder(BorderFactory.createTitledBorder("Andere Nutzer"));
- defaultPermissionPane.setLayout(new BoxLayout(defaultPermissionPane, BoxLayout.PAGE_AXIS));
- JLabel txtDefaultPerms = new JLabel(infoTextDefPerms);
-
- JPanel txtDefaultPermsPanel = new JPanel();
- // Panel + BoxLayout + Label = wordwrap
- txtDefaultPermsPanel.setLayout(new BoxLayout(txtDefaultPermsPanel, BoxLayout.LINE_AXIS));
- txtDefaultPermsPanel.add(txtDefaultPerms);
- JPanel defaultPermsSubPanel = new JPanel();
- defaultPermsSubPanel.setLayout(new BoxLayout(defaultPermsSubPanel, BoxLayout.LINE_AXIS));
- chkCustomPermAdmin = new JCheckBox("Admin");
- chkCustomPermDownload = new JCheckBox("Download");
- chkCustomPermEdit = new JCheckBox("Bearbeiten");
- chkCustomPermLink = new JCheckBox("Verlinken");
-
- defaultPermsSubPanel.add(chkCustomPermLink);
- defaultPermsSubPanel.add(chkCustomPermDownload);
- defaultPermsSubPanel.add(chkCustomPermEdit);
- defaultPermsSubPanel.add(chkCustomPermAdmin);
-
- defaultPermissionPane.add(txtDefaultPermsPanel);
- defaultPermissionPane.add(Box.createVerticalStrut(10));
- defaultPermissionPane.add(defaultPermsSubPanel);
-
- // Put everything into the grid
- GridManager grid = new GridManager(contentPanel, 1);
- grid.add(imagePermissionManager).fill(true, true).expand(true, true);
- grid.nextRow();
- grid.add(defaultPermissionPane).fill(true, false).expand(true, false);
- grid.nextRow();
- grid.add(buttonPane).fill(true, false).expand(false, false);
- grid.nextRow();
- grid.finish(false);
-
- contentPanel.setPreferredSize(Gui.getScaledDimension(480, 350));
-
- pack();
- setLocationRelativeTo(modalParent);
- }
-}