diff options
author | Simon Rettberg | 2015-08-14 16:43:40 +0200 |
---|---|---|
committer | Simon Rettberg | 2015-08-14 16:43:40 +0200 |
commit | 13b8f65c5e51d42591acb17bd8a25805e594ed06 (patch) | |
tree | 4d03540c2b147b146ca5818f0c57b24d48ff5756 /dozentenmodul/src/main | |
parent | [server] Return permissions for lectures, LectureRead changed (diff) | |
download | tutor-module-13b8f65c5e51d42591acb17bd8a25805e594ed06.tar.gz tutor-module-13b8f65c5e51d42591acb17bd8a25805e594ed06.tar.xz tutor-module-13b8f65c5e51d42591acb17bd8a25805e594ed06.zip |
[client] Design improvements
Diffstat (limited to 'dozentenmodul/src/main')
12 files changed, 298 insertions, 211 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ComboBox.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ComboBox.java new file mode 100644 index 00000000..abc0365c --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ComboBox.java @@ -0,0 +1,113 @@ +package org.openslx.dozmod.gui.control; + +import java.awt.Component; +import java.util.Comparator; + +import javax.swing.ComboBoxModel; +import javax.swing.DefaultListCellRenderer; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.ListCellRenderer; + +@SuppressWarnings("serial") +public class ComboBox<T> extends JComboBox<T> { + + public static abstract class ComboBoxRenderer<T> { + public abstract String renderItem(T item); + + public String getEmptyText() { + return null; + } + } + + private final Comparator<T> equalityComparator; + private final ComboBoxRenderer<T> itemRenderer; + private final ComboBox<T> me = this; + private boolean replacedRenderer = false; + + public ComboBox(ComboBoxRenderer<T> renderer) { + this(null, renderer); + } + + public ComboBox(Comparator<T> equalityComparator, ComboBoxRenderer<T> renderer) { + super(); + this.itemRenderer = renderer; + this.equalityComparator = equalityComparator; + } + + /** + * This version of {@link JComboBox#setSelectedItem(Object)} will use the + * comparator given when constructing the ComboBox to determine if an entry + * should be selected. + */ + @SuppressWarnings("unchecked") + @Override + public void setSelectedItem(Object anObject) { + if (anObject != null && equalityComparator != null) { + ComboBoxModel<T> model = getModel(); + try { + for (int i = 0; i < model.getSize(); ++i) { + T element = model.getElementAt(i); + if (equalityComparator.compare((T) anObject, element) == 0) { + anObject = element; + break; + } + } + } catch (ClassCastException e) { + // Bummer, fall through + } + } + super.setSelectedItem(anObject); + } + + @Override + public void updateUI() { + super.updateUI(); + if (!replacedRenderer) { + replacedRenderer = true; + final ListCellRenderer<? super T> oldRenderer = super.getRenderer(); + if (oldRenderer instanceof JLabel) { + // The default JComboBox renderer always seems to be a subclass of JLabel, which is nice + super.setRenderer(new ListCellRenderer<T>() { + @Override + public Component getListCellRendererComponent(JList<? extends T> list, T value, + int index, boolean isSelected, boolean cellHasFocus) { + String text; + if (me.getModel().getSize() == 0) { + text = itemRenderer.getEmptyText(); + } else { + text = itemRenderer.renderItem(value); + } + Component comp = oldRenderer.getListCellRendererComponent(list, null, index, + isSelected, cellHasFocus); + comp.setEnabled(me.isEnabled()); + ((JLabel) comp).setText(text); + return comp; + } + }); + } else { + // Fallback, in case there's any platform, L&F, runtime environment or whatnot where it's not a JLabel + super.setRenderer(new DefaultListCellRenderer() { + @SuppressWarnings("unchecked") + @Override + public Component getListCellRendererComponent(JList<?> list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + if (me.getModel().getSize() == 0) { + value = itemRenderer.getEmptyText(); + } else { + try { + value = itemRenderer.renderItem((T) value); + } catch (ClassCastException e) { + // Should never happen; do nothing, retain original value + } + } + return super.getListCellRendererComponent(list, value, index, isSelected, + cellHasFocus); + } + }); + } + } + } + +} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/GridManager.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/GridManager.java index aa5a679f..766ab94c 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/GridManager.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/GridManager.java @@ -6,6 +6,8 @@ import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.ArrayList; import javax.swing.Box; @@ -20,7 +22,7 @@ public class GridManager { * Setting this to true will insert green panels in cells where nothing was * added */ - public static boolean debugEmptyCells = false; + public static boolean debugEmptyCells = true; private final Container container; private final Insets defaultInsets; @@ -32,7 +34,6 @@ public class GridManager { private final ArrayList<Component[]> currentRows = new ArrayList<>(); - private final GridBagConstraints mainConstraints = new GridBagConstraints(); private GBC currentGbc = null; // Static general constraints @@ -234,20 +235,20 @@ public class GridManager { private void addCurrentControl() { if (currentGbc == null) return; - container.add(currentGbc.component, mainConstraints); + container.add(currentGbc.component, currentGbc); // Remember placement for future sanity checks - for (int relrow = 0; relrow < mainConstraints.gridheight; ++relrow) { + for (int relrow = 0; relrow < currentGbc.gridheight; ++relrow) { if (currentRows.size() <= relrow) { currentRows.add(new Component[columnCount]); } Component[] row = currentRows.get(relrow); - for (int relcol = 0; relcol < mainConstraints.gridwidth; ++relcol) { - if (row[relcol + mainConstraints.gridx] != null) + for (int relcol = 0; relcol < currentGbc.gridwidth; ++relcol) { + if (row[relcol + currentGbc.gridx] != null) throw new IllegalStateException("Collision detected in cell (" - + (relcol + mainConstraints.gridx) + "|" + (relrow + mainConstraints.gridy) - + "): Have " + row[relcol + mainConstraints.gridx].getClass().getSimpleName() - + ", trying to add " + currentGbc.component.getClass().getSimpleName()); - row[relcol + mainConstraints.gridx] = currentGbc.component; + + (relcol + currentGbc.gridx) + "|" + (relrow + currentGbc.gridy) + "): Have " + + row[relcol + currentGbc.gridx].getClass().getSimpleName() + ", trying to add " + + currentGbc.component.getClass().getSimpleName()); + row[relcol + currentGbc.gridx] = currentGbc.component; } } currentGbc.valid = false; @@ -277,7 +278,8 @@ public class GridManager { // - public class GBC { + @SuppressWarnings("serial") + public class GBC extends GridBagConstraints { private boolean valid = true; private final Component component; @@ -291,11 +293,13 @@ public class GridManager { public GBC fill(boolean fillX, boolean fillY) { checkValid(); if (fillX && fillY) { - mainConstraints.fill = GridBagConstraints.BOTH; + this.fill = GridBagConstraints.BOTH; } else if (fillX) { - mainConstraints.fill = GridBagConstraints.HORIZONTAL; + this.fill = GridBagConstraints.HORIZONTAL; } else if (fillY) { - mainConstraints.fill = GridBagConstraints.VERTICAL; + this.fill = GridBagConstraints.VERTICAL; + } else { + this.fill = GridBagConstraints.NONE; } return this; } @@ -310,7 +314,7 @@ public class GridManager { * @return This instance, so calls can be chained */ public GBC expand(boolean expandX, boolean expandY) { - return expand(1, 1); + return expand(expandX ? 1 : 0, expandY ? 1 : 0); } /** @@ -325,25 +329,25 @@ public class GridManager { */ public GBC expand(double expandX, double expandY) { checkValid(); - mainConstraints.weightx = expandX; - mainConstraints.weighty = expandY; + this.weightx = expandX; + this.weighty = expandY; return this; } // Extend with more helpers as needed private GBC(Component component, int spanX, int spanY) { - mainConstraints.gridx = nextColumn; - mainConstraints.gridy = currentRow; - mainConstraints.gridwidth = spanX; - mainConstraints.gridheight = spanY; - mainConstraints.weightx = 0; - mainConstraints.weighty = 0; - mainConstraints.anchor = GridBagConstraints.LINE_START; - mainConstraints.fill = GridBagConstraints.NONE; - mainConstraints.insets = defaultInsets; - mainConstraints.ipadx = 0; - mainConstraints.ipady = 0; + this.gridx = nextColumn; + this.gridy = currentRow; + this.gridwidth = spanX; + this.gridheight = spanY; + this.weightx = 0; + this.weighty = 0; + this.anchor = GridBagConstraints.LINE_START; + this.fill = GridBagConstraints.NONE; + this.insets = defaultInsets; + this.ipadx = 0; + this.ipady = 0; this.component = component; } @@ -351,6 +355,28 @@ public class GridManager { if (!valid) throw new IllegalAccessError("Cannot modify constraints after adding next control"); } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("{ "); + for (Field f : getClass().getFields()) { + if (Modifier.isFinal(f.getModifiers()) || Modifier.isStatic(f.getModifiers())) + continue; + String val; + try { + val = f.get(this).toString(); + } catch (IllegalArgumentException | IllegalAccessException e) { + val = "???"; + } + sb.append(f.getName()); + sb.append('='); + sb.append(val); + sb.append(' '); + } + sb.append('}'); + return sb.toString(); + } } } 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 21ee98da..57866b98 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 @@ -253,10 +253,8 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe for (OperatingSystem os : osList) { cboOperatingSystem.addItem(os); } - OperatingSystem os = MetaDataCache.getOsById(image.getOsId()); - if (os != null) { - cboOperatingSystem.setSelectedItem(os); - } + cboOperatingSystem.setSelectedItem(new OperatingSystem(image.getOsId(), null, null, null)); + Virtualizer virt = MetaDataCache.getVirtualizerById(image.getVirtId()); if (virt != null) lblVirtualizer.setText(virt.getVirtName()); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java index 09f787e4..d901881f 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LectureDetailsWindow.java @@ -1,11 +1,8 @@ package org.openslx.dozmod.gui.window; -import java.awt.Component; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; @@ -13,20 +10,18 @@ import java.util.Date; import java.util.List; import javax.swing.DefaultComboBoxModel; -import javax.swing.DefaultListCellRenderer; -import javax.swing.JList; import org.apache.log4j.Logger; +import org.apache.thrift.TException; import org.openslx.bwlp.thrift.iface.ImageDetailsRead; import org.openslx.bwlp.thrift.iface.ImageVersionDetails; import org.openslx.bwlp.thrift.iface.LectureRead; -import org.openslx.bwlp.thrift.iface.Organization; import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.MainWindow; -import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.window.layout.LectureDetailsWindowLayout; import org.openslx.dozmod.permissions.LecturePerms; import org.openslx.dozmod.thrift.Session; +import org.openslx.dozmod.thrift.ThriftError; import org.openslx.dozmod.thrift.UserCache; import org.openslx.dozmod.util.FormatHelper; import org.openslx.thrifthelper.ThriftManager; @@ -53,16 +48,6 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout { dispose(); } }); - // ESC closes this window - addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { - dispose(); - } - } - }); - setFocusable(true); btnAutoUpdate.addActionListener(new ActionListener() { @@ -80,36 +65,26 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout { QuickTimer.scheduleOnce(new Task() { @Override public void fire() { - Exception error = null; + TException error = null; try { synchronized (me) { if (lecture != null) return; - lecture = ThriftManager.getSatClient().getLectureDetails(Session.getSatelliteToken(), lectureId); + lecture = ThriftManager.getSatClient().getLectureDetails(Session.getSatelliteToken(), + lectureId); + image = ThriftManager.getSatClient().getImageDetails(Session.getSatelliteToken(), + lecture.getImageBaseId()); } - } catch (Exception e) { + } catch (TException e) { error = e; } - // getting imageDetailsRead for the versions - if (lecture != null) { - try { - synchronized (me) { - if (image != null) - return; - image = ThriftManager.getSatClient().getImageDetails(Session.getSatelliteToken(), lecture.getImage().getImageBaseId()); - } - } catch (Exception e) { - - error = e; - } - } - final Exception e = error; + final TException e = error; Gui.asyncExec(new Runnable() { @Override public void run() { if (e != null || lecture == null || image == null) { - Gui.showMessageBox(null, "Konnte Daten der Vorlesung nicht abrufen", - MessageType.ERROR, LOGGER, e); + ThriftError.showMessage(btnAutoUpdate, LOGGER, e, + "Konnte Daten der Vorlesung nicht abrufen"); dispose(); } else { fill(); @@ -147,42 +122,32 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout { // version combo List<ImageVersionDetails> versions = image.getVersions(); - - // sort versions with createtime + + // sort versions by createtime Collections.sort(versions, new Comparator<ImageVersionDetails>() { public int compare(ImageVersionDetails o1, ImageVersionDetails o2) { - return - Long.compare(o1.getCreateTime(), o2.getCreateTime()); + return -Long.compare(o1.getCreateTime(), o2.getCreateTime()); } }); - - cboVersions.setModel(new DefaultComboBoxModel<ImageVersionDetails>(versions.toArray(new ImageVersionDetails[versions.size()]))); - cboVersions.setRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(JList<?> list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof ImageVersionDetails) { - ImageVersionDetails version = (ImageVersionDetails) value; - setText(FormatHelper.shortDate(version.getCreateTime())); - } - return this; - } - }); - + + cboVersions.setModel(new DefaultComboBoxModel<ImageVersionDetails>( + versions.toArray(new ImageVersionDetails[versions.size()]))); + cboVersions.setSelectedItem(new ImageVersionDetails(lecture.getImageVersionId(), 0, 0, 0, null, true, + true, true, null)); + Calendar startCal = Calendar.getInstance(); startCal.setTime(new Date(lecture.getStartTime() * 1000l)); - startDate.getModel().setDate(startCal.get(Calendar.YEAR), startCal.get(Calendar.MONTH), startCal.get(Calendar.DATE)); + startDate.getModel().setDate(startCal.get(Calendar.YEAR), startCal.get(Calendar.MONTH), + startCal.get(Calendar.DATE)); startTime.getModel().setValue(startCal.getTime()); - + Calendar endCal = Calendar.getInstance(); endCal.setTime(new Date(lecture.getEndTime() * 1000l)); - endDate.getModel().setDate(endCal.get(Calendar.YEAR), endCal.get(Calendar.MONTH), endCal.get(Calendar.DATE)); + endDate.getModel().setDate(endCal.get(Calendar.YEAR), endCal.get(Calendar.MONTH), + endCal.get(Calendar.DATE)); endTime.getModel().setValue(endCal.getTime()); - - - // TODO grey out non editable components, lecture image has no permissions yet - //makeEditable(LecturePerms.canEdit(lecture)); + makeEditable(LecturePerms.canEdit(lecture)); pack(); MainWindow.centerShell(this); setVisible(true); @@ -197,7 +162,7 @@ public class LectureDetailsWindow extends LectureDetailsWindowLayout { txtTitle.setEnabled(editable); txtDescription.setEditable(editable); txtId.setEditable(editable); - + // TODO functionality for changing dates still missing // lblCreateTime.setText(FormatHelper.longDate(lecture.getCreateTime())); // lblUpdateTime.setText(FormatHelper.longDate(lecture.getUpdateTime())); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java index 4112974d..36b59eed 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java @@ -1,6 +1,5 @@ package org.openslx.dozmod.gui.window; -import java.awt.Component; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -16,9 +15,7 @@ import java.util.Iterator; import java.util.List; import javax.swing.DefaultComboBoxModel; -import javax.swing.DefaultListCellRenderer; import javax.swing.JFrame; -import javax.swing.JList; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.Organization; @@ -187,21 +184,6 @@ public class LoginWindow extends LoginWindowLayout { } else { usernameField.requestFocus(); } - - idpCombo.setRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(JList<?> list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - if (idpCombo.getModel().getSize() == 0) { - value = "Inizialisiere..."; - } else if (value instanceof Organization) { - value = ((Organization) value).getDisplayName(); - } - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - this.setEnabled(idpCombo.isEnabled()); - return this; - } - }); } /** 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 daa63d9a..76875c74 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 @@ -1,7 +1,6 @@ package org.openslx.dozmod.gui.window.layout; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; @@ -9,14 +8,12 @@ import java.awt.Frame; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; -import javax.swing.DefaultListCellRenderer; 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.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; @@ -25,9 +22,12 @@ import javax.swing.JTextField; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.bwlp.thrift.iface.ShareMode; +import org.openslx.dozmod.gui.control.ComboBox; +import org.openslx.dozmod.gui.control.ComboBox.ComboBoxRenderer; import org.openslx.dozmod.gui.control.PersonLabel; import org.openslx.dozmod.gui.control.table.ImageVersionTable; import org.openslx.dozmod.gui.helper.GridManager; +import org.openslx.thrifthelper.Comparators; @SuppressWarnings("serial") public abstract class ImageDetailsWindowLayout extends JDialog { @@ -117,18 +117,16 @@ public abstract class ImageDetailsWindowLayout extends JDialog { grid.nextRow(); // os - cboOperatingSystem = new JComboBox<>(); + cboOperatingSystem = new ComboBox<>(Comparators.operatingSystem, + new ComboBoxRenderer<OperatingSystem>() { + @Override + public String renderItem(OperatingSystem item) { + if (item == null) + return null; + return item.getOsName(); + } + }); cboOperatingSystem.setEditable(false); - cboOperatingSystem.setRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(JList<?> list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - if (value instanceof OperatingSystem) { - value = ((OperatingSystem) value).getOsName(); - } - return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - } - }); grid.add(new JLabel("Betriebssystem")); grid.add(cboOperatingSystem, 2).expand(true, false).fill(true, false); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureDetailsWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureDetailsWindowLayout.java index e186284c..ff6be78b 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureDetailsWindowLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LectureDetailsWindowLayout.java @@ -30,9 +30,13 @@ import org.jdatepicker.impl.JDatePanelImpl; import org.jdatepicker.impl.JDatePickerImpl; import org.jdatepicker.impl.UtilDateModel; import org.openslx.bwlp.thrift.iface.ImageVersionDetails; +import org.openslx.dozmod.gui.control.ComboBox; +import org.openslx.dozmod.gui.control.ComboBox.ComboBoxRenderer; import org.openslx.dozmod.gui.control.PersonLabel; import org.openslx.dozmod.gui.helper.GridPos; import org.openslx.dozmod.util.DateLabelFormatter; +import org.openslx.dozmod.util.FormatHelper; +import org.openslx.thrifthelper.Comparators; @SuppressWarnings("serial") public abstract class LectureDetailsWindowLayout extends JDialog { @@ -52,7 +56,7 @@ public abstract class LectureDetailsWindowLayout extends JDialog { protected final JCheckBox btnIsExam; protected final JCheckBox btnHasInternetAccess; protected final JCheckBox btnIsActive; - + protected final JTextField txtId; protected final JLabel lblUseCount; protected final JButton btnSaveChanges; @@ -91,7 +95,7 @@ public abstract class LectureDetailsWindowLayout extends JDialog { // -- name -- txtTitle = new JLabel(); txtTitle.setFont(txtTitle.getFont().deriveFont(Font.BOLD, txtTitle.getFont().getSize2D() * 2)); - infoPanel.add(txtTitle, GridPos.get(0, row++, 2, 1, true, false)); + infoPanel.add(txtTitle, GridPos.get(0, row++, 2, 1, true, false)); // description txtDescription = new JTextArea(); txtDescription.setLineWrap(true); @@ -108,17 +112,25 @@ public abstract class LectureDetailsWindowLayout extends JDialog { btnLinkImage = new JButton(); btnLinkImage.setText("Link Image"); linkedImagePanel.add(btnLinkImage); - infoPanel.add(linkedImagePanel, GridPos.get(1, row++, false, false)); + infoPanel.add(linkedImagePanel, GridPos.get(1, row++, false, false)); // image version handling // auto update btnAutoUpdate = new JCheckBox("Auto Update"); - infoPanel.add(new JLabel("Image Version"), GridPos.get(0, row, false, false)); + infoPanel.add(new JLabel("Image Version"), GridPos.get(0, row, false, false)); JPanel versionPanel = new JPanel(); versionPanel.add(btnAutoUpdate); // versions combo - cboVersions = new JComboBox<>(); + cboVersions = new ComboBox<>(Comparators.imageVersionDetails, + new ComboBoxRenderer<ImageVersionDetails>() { + @Override + public String renderItem(ImageVersionDetails item) { + if (item == null) + return null; + return FormatHelper.longDate(item.getCreateTime()); + } + }); versionPanel.add(cboVersions); - infoPanel.add(versionPanel, GridPos.get(1, row++, false, false)); + infoPanel.add(versionPanel, GridPos.get(1, row++, false, false)); // start time of the lecture JPanel startTimePanel = new JPanel(); startTimePanel.setLayout(new BorderLayout()); @@ -128,8 +140,8 @@ public abstract class LectureDetailsWindowLayout extends JDialog { startTimePanel.add(startDate, BorderLayout.WEST); startTimePanel.add(startTime, BorderLayout.CENTER); lblStartTime = new JLabel(); - infoPanel.add(new JLabel("Startdatum"), GridPos.get(0, row, false, false)); - infoPanel.add(startTimePanel, GridPos.get(1, row++, false, false)); + infoPanel.add(new JLabel("Startdatum"), GridPos.get(0, row, false, false)); + infoPanel.add(startTimePanel, GridPos.get(1, row++, false, false)); // end time of the lecture JPanel endTimePanel = new JPanel(); @@ -140,45 +152,45 @@ public abstract class LectureDetailsWindowLayout extends JDialog { endTimePanel.add(endDate, BorderLayout.WEST); endTimePanel.add(endTime, BorderLayout.CENTER); lblEndTime = new JLabel(); - infoPanel.add(new JLabel("Enddatum"), GridPos.get(0, row, false, false)); - infoPanel.add(endTimePanel, GridPos.get(1, row++, false, false)); + infoPanel.add(new JLabel("Enddatum"), GridPos.get(0, row, false, false)); + infoPanel.add(endTimePanel, GridPos.get(1, row++, false, false)); // owner lblOwner = new PersonLabel(); - infoPanel.add(new JLabel("Besitzer"), GridPos.get(0, row, false, false)); - infoPanel.add(lblOwner, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Besitzer"), GridPos.get(0, row, false, false)); + infoPanel.add(lblOwner, GridPos.get(1, row++, true, false)); // creation time lblCreateTime = new JLabel(); - infoPanel.add(new JLabel("Erstellt"), GridPos.get(0, row, false, false)); - infoPanel.add(lblCreateTime, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Erstellt"), GridPos.get(0, row, false, false)); + infoPanel.add(lblCreateTime, GridPos.get(1, row++, true, false)); // last updater lblUpdater = new PersonLabel(); - infoPanel.add(new JLabel("Geändert durch"), GridPos.get(0, row, false, false)); - infoPanel.add(lblUpdater, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Geändert durch"), GridPos.get(0, row, false, false)); + infoPanel.add(lblUpdater, GridPos.get(1, row++, true, false)); // last updated lblUpdateTime = new JLabel(); - infoPanel.add(new JLabel("Änderungszeitpunkt"), GridPos.get(0, row, false, false)); - infoPanel.add(lblUpdateTime, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Änderungszeitpunkt"), GridPos.get(0, row, false, false)); + infoPanel.add(lblUpdateTime, GridPos.get(1, row++, true, false)); // is exam btnIsExam = new JCheckBox(); - infoPanel.add(new JLabel("Klausur"), GridPos.get(0, row, false, false)); - infoPanel.add(btnIsExam, GridPos.get(1, row++, true, false)); - + infoPanel.add(new JLabel("Klausur"), GridPos.get(0, row, false, false)); + infoPanel.add(btnIsExam, GridPos.get(1, row++, true, false)); + btnHasInternetAccess = new JCheckBox(); - infoPanel.add(new JLabel("Internetzugriff"), GridPos.get(0, row, false, false)); - infoPanel.add(btnHasInternetAccess, GridPos.get(1, row++, true, false)); - + infoPanel.add(new JLabel("Internetzugriff"), GridPos.get(0, row, false, false)); + infoPanel.add(btnHasInternetAccess, GridPos.get(1, row++, true, false)); + btnIsActive = new JCheckBox(); - infoPanel.add(new JLabel("Aktiv"), GridPos.get(0, row, false, false)); - infoPanel.add(btnIsActive, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Aktiv"), GridPos.get(0, row, false, false)); + infoPanel.add(btnIsActive, GridPos.get(1, row++, true, false)); // id txtId = new JTextField(); txtId.setEditable(false); - infoPanel.add(new JLabel("ID"), GridPos.get(0, row, false, false)); - infoPanel.add(txtId, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("ID"), GridPos.get(0, row, false, false)); + infoPanel.add(txtId, GridPos.get(1, row++, true, false)); // use count lblUseCount = new JLabel(); - infoPanel.add(new JLabel("useCount"), GridPos.get(0, row, false, false)); - infoPanel.add(lblUseCount, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("useCount"), GridPos.get(0, row, false, false)); + infoPanel.add(lblUseCount, GridPos.get(1, row++, true, false)); // finally add the infoPanel itself to the main view add(infoPanel, BorderLayout.CENTER); // button panel on the bottom @@ -194,7 +206,7 @@ public abstract class LectureDetailsWindowLayout extends JDialog { private JSpinner makeTimeSpinner(int h, int m) { Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.HOUR_OF_DAY, h); // 24 == 12 PM == 00:00:00 + calendar.set(Calendar.HOUR_OF_DAY, h); calendar.set(Calendar.MINUTE, m); calendar.set(Calendar.SECOND, 0); SpinnerDateModel model = new SpinnerDateModel(); @@ -202,7 +214,7 @@ public abstract class LectureDetailsWindowLayout extends JDialog { JSpinner spinner = new JSpinner(model); JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "HH:mm"); DateFormatter formatter = (DateFormatter) editor.getTextField().getFormatter(); - formatter.setAllowsInvalid(false); // this makes what you want + formatter.setAllowsInvalid(false); formatter.setOverwriteMode(true); spinner.setEditor(editor); return spinner; diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LoginWindowLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LoginWindowLayout.java index ebd0da26..5472ea42 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LoginWindowLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/layout/LoginWindowLayout.java @@ -20,6 +20,8 @@ import javax.swing.border.TitledBorder; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.Organization; import org.openslx.dozmod.gui.Gui; +import org.openslx.dozmod.gui.control.ComboBox; +import org.openslx.dozmod.gui.control.ComboBox.ComboBoxRenderer; import org.openslx.dozmod.gui.helper.GridManager; import org.openslx.dozmod.util.ResourceLoader; @@ -77,7 +79,19 @@ public abstract class LoginWindowLayout extends JDialog { loginTypes[1] = new JRadioButton("Test-Zugang mit festem Benutzer"); loginTypes[2] = new JRadioButton("Direkter Zugang zum Satelliten"); - idpCombo = new JComboBox<Organization>(); + idpCombo = new ComboBox<>(new ComboBoxRenderer<Organization>() { + @Override + public String renderItem(Organization item) { + if (item == null) + return null; + return item.getDisplayName(); + } + + @Override + public String getEmptyText() { + return "Wird geladen..."; + } + }); usernameField = new JTextField(); passwordField = new JPasswordField(); loginButton = new JButton("Login"); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java index 75aefae2..a7b9141a 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java @@ -4,7 +4,6 @@ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; -import java.awt.GridBagLayout; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -25,7 +24,7 @@ import javax.swing.JSeparator; import javax.swing.SwingConstants; import org.openslx.dozmod.gui.MainWindow; -import org.openslx.dozmod.gui.helper.GridPos; +import org.openslx.dozmod.gui.helper.GridManager; @SuppressWarnings("serial") public abstract class Wizard extends JDialog { @@ -63,9 +62,10 @@ public abstract class Wizard extends JDialog { header.add(messageLabel); // Add header JPanel headerWrapper = new JPanel(); - headerWrapper.setLayout(new GridBagLayout()); - headerWrapper.add(header, GridPos.get(0, 0, true, false)); - headerWrapper.add(new JSeparator(), GridPos.get(0, 1, true, false)); + GridManager grid = new GridManager(headerWrapper, 1, false); + grid.add(header).expand(true, false).fill(true, false); + grid.add(new JSeparator()).expand(true, false).fill(true, false); + grid.finish(false); getContentPane().add(headerWrapper, BorderLayout.PAGE_START); // Buttons in footer JPanel footer = new JPanel(); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageMetaDataPageLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageMetaDataPageLayout.java index 6f10f937..2bfe0edf 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageMetaDataPageLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageMetaDataPageLayout.java @@ -1,23 +1,22 @@ package org.openslx.dozmod.gui.wizard.layout; -import java.awt.Component; import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.DefaultListCellRenderer; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; -import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.border.TitledBorder; import org.openslx.bwlp.thrift.iface.OperatingSystem; +import org.openslx.dozmod.gui.control.ComboBox; +import org.openslx.dozmod.gui.control.ComboBox.ComboBoxRenderer; import org.openslx.dozmod.gui.helper.GridManager; import org.openslx.dozmod.gui.wizard.Wizard; import org.openslx.dozmod.gui.wizard.WizardPage; +import org.openslx.thrifthelper.Comparators; @SuppressWarnings("serial") public abstract class ImageMetaDataPageLayout extends WizardPage { @@ -45,24 +44,20 @@ public abstract class ImageMetaDataPageLayout extends WizardPage { GridManager grid = new GridManager(this, 2, false); JLabel osCaption = new JLabel("Betriebssystem"); - osCombo = new JComboBox<>(); - osCombo.setEditable(false); - osCombo.setRenderer(new DefaultListCellRenderer() { + osCombo = new ComboBox<>(Comparators.operatingSystem, new ComboBoxRenderer<OperatingSystem>() { @Override - public Component getListCellRendererComponent(JList<?> list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - if (value instanceof OperatingSystem) { - OperatingSystem org = (OperatingSystem) value; - setText(org.getOsName()); - } - return this; + public String renderItem(OperatingSystem item) { + if (item == null) + return null; + return item.getOsName(); } }); + osCombo.setEditable(false); grid.add(osCaption); grid.add(osCombo); JLabel descriptionCation = new JLabel("Beschreibung"); - descriptionText = new JTextArea(5,50); + descriptionText = new JTextArea(5, 50); descriptionText.setMinimumSize(new Dimension(0, 70)); descriptionText.setLineWrap(true); descriptionText.setWrapStyleWord(true); @@ -75,13 +70,12 @@ public abstract class ImageMetaDataPageLayout extends WizardPage { setActiveCheck = new JCheckBox("Image aktivieren"); grid.add(setActiveCheck); - + licencedSoftwareCheck = new JCheckBox("Image enthält lizenzpflichtige Software"); licencedSoftwareCheck.setSelected(true); grid.add(licencedSoftwareCheck); grid.nextRow(); - // -- default permissions group -- JPanel permissionsGroup = new JPanel(); permissionsGroup.setBorder(new TitledBorder("Standardberechtigungen")); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/LectureCreationPageLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/LectureCreationPageLayout.java index c997d4a6..b488e142 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/LectureCreationPageLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/LectureCreationPageLayout.java @@ -5,7 +5,6 @@ import java.util.Calendar; import java.util.Date; import java.util.Properties; -import javax.swing.Box; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JSpinner; @@ -25,12 +24,12 @@ import org.openslx.dozmod.util.DateLabelFormatter; @SuppressWarnings("serial") public abstract class LectureCreationPageLayout extends WizardPage { - protected JTextField lectureNameTextField; - protected JTextArea descriptionText; - protected JDatePickerImpl startDate; - protected JDatePickerImpl endDate; - protected JSpinner startTime; - protected JSpinner endTime; + protected final JTextField lectureNameTextField; + protected final JTextArea descriptionText; + protected final JDatePickerImpl startDate; + protected final JDatePickerImpl endDate; + protected final JSpinner startTime; + protected final JSpinner endTime; private static final Properties pickerStrings = new Properties(); @@ -49,16 +48,14 @@ public abstract class LectureCreationPageLayout extends WizardPage { public LectureCreationPageLayout(Wizard wizard, String title) { super(wizard, title); setDescription("Geben Sie bitte einen aussagekräftigen Namen für die neue Veranstaltung ein"); - GridManager grid = new GridManager(this, 3, false); + GridManager grid = new GridManager(this, 3); // lecture name - JLabel lectureNameLabel = new JLabel("Veranstaltungsname"); - grid.add(lectureNameLabel); lectureNameTextField = new JTextField(); - grid.add(lectureNameTextField, 2, 1).fill(true, false).expand(true, false); + grid.add(new JLabel("Veranstaltungsname")); + grid.add(lectureNameTextField, 2).fill(true, false).expand(true, false); grid.nextRow(); - JLabel descriptionCaption = new JLabel("Beschreibung"); descriptionText = new JTextArea(3, 50); descriptionText.setLineWrap(true); descriptionText.setWrapStyleWord(true); @@ -66,30 +63,26 @@ public abstract class LectureCreationPageLayout extends WizardPage { JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); descriptionText.setMinimumSize(new Dimension(0, 60)); descPane.setMinimumSize(descriptionText.getMinimumSize()); - grid.add(descriptionCaption); - grid.add(descPane, 2, 1).fill(true, false); - + grid.add(new JLabel("Beschreibung")); + grid.add(descPane, 2).fill(true, false).expand(true, false); grid.nextRow(); // Start date/time - JLabel startDateLabel = new JLabel("Startdatum"); startDate = new JDatePickerImpl(new JDatePanelImpl(new UtilDateModel(new Date()), pickerStrings), new DateLabelFormatter()); startTime = makeTimeSpinner(0, 0); - grid.add(startDateLabel); + grid.add(new JLabel("Startdatum")); grid.add(startDate).fill(true, false).expand(true, false); grid.add(startTime); grid.nextRow(); - JLabel endDateLabel = new JLabel("Enddatum"); endDate = new JDatePickerImpl(new JDatePanelImpl(new UtilDateModel(new Date()), pickerStrings), new DateLabelFormatter()); endTime = makeTimeSpinner(23, 59); - grid.add(endDateLabel); + grid.add(new JLabel("Enddatum")); grid.add(endDate).fill(true, false).expand(true, false); grid.add(endTime); grid.nextRow(); - grid.add(Box.createVerticalStrut(10), 3, 1); grid.finish(true); } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/permissions/LecturePerms.java b/dozentenmodul/src/main/java/org/openslx/dozmod/permissions/LecturePerms.java index a88ab5e8..167a2b65 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/permissions/LecturePerms.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/permissions/LecturePerms.java @@ -1,20 +1,12 @@ package org.openslx.dozmod.permissions; import org.openslx.bwlp.thrift.iface.LectureRead; -import org.openslx.dozmod.thrift.Session; /** * Class for checking, whether user can edit given lecture */ public class LecturePerms { - public static boolean canEdit(LectureRead lecture){ - if(lecture.getOwnerId().equals(Session.getUserId())) - return true; - if(lecture.userPermissions !=null) { - return lecture.userPermissions.edit; - } - if (lecture.defaultPermissions != null) - return lecture.defaultPermissions.edit; - return false; + public static boolean canEdit(LectureRead lecture) { + return lecture != null && lecture.userPermissions != null && lecture.userPermissions.edit; } } |