diff options
author | Jonathan Bauer | 2018-06-25 13:24:40 +0200 |
---|---|---|
committer | Jonathan Bauer | 2018-06-25 13:24:40 +0200 |
commit | aeb7e3b4acdc7601e3a789c0ca8557ca9ae923e3 (patch) | |
tree | 0834ffa930feca85c038b5473b84c08e1bbfb853 /dozentenmodul/src/main/java/org/openslx/dozmod/gui/window | |
parent | [client] Fix change detection for lecture permissions (diff) | |
download | tutor-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')
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); - } -} |