diff options
author | Jonathan Bauer | 2015-08-08 12:05:37 +0200 |
---|---|---|
committer | Jonathan Bauer | 2015-08-08 12:05:37 +0200 |
commit | 78803491a82ac1de3f64bdc6d62d4a8041d56529 (patch) | |
tree | 921f6453df5570c4e71c05e047d1c36bae5f39ca | |
parent | [client] imagedetails stuff (diff) | |
parent | [client] Add UiFeedback interface for top level windows (diff) | |
download | tutor-module-78803491a82ac1de3f64bdc6d62d4a8041d56529.tar.gz tutor-module-78803491a82ac1de3f64bdc6d62d4a8041d56529.tar.xz tutor-module-78803491a82ac1de3f64bdc6d62d4a8041d56529.zip |
Merge branch 'v1.1' of git.openslx.org:openslx-ng/tutor-module into v1.1
4 files changed, 95 insertions, 48 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java index 295cf413..600f6a1e 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java @@ -34,6 +34,7 @@ import org.openslx.dozmod.gui.activity.UploadPanel; import org.openslx.dozmod.gui.helper.CompositePage; import org.openslx.dozmod.gui.helper.DebugWindow; import org.openslx.dozmod.gui.helper.MessageType; +import org.openslx.dozmod.gui.helper.UiFeedback; import org.openslx.dozmod.gui.window.DisclaimerWindow; import org.openslx.dozmod.gui.window.ImageListWindow; import org.openslx.dozmod.gui.window.LectureListWindow; @@ -170,12 +171,20 @@ public abstract class MainWindow { KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() { @Override public boolean dispatchKeyEvent(KeyEvent event) { - if (event.getKeyChar() == 17) { // Ctrl-Q = Quit - if (!isQuitQuestionOpen) { + int type = event.getID(); + int code = event.getKeyChar(); + if (code == 17) { // Ctrl-Q = Quit + if (type == KeyEvent.KEY_RELEASED && !isQuitQuestionOpen) { isQuitQuestionOpen = true; askApplicationQuit(); } event.consume(); + } else if (code == 27 && type == KeyEvent.KEY_PRESSED) { + Window window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); + if (window instanceof UiFeedback) { + ((UiFeedback) window).escapePressed(); + event.consume(); + } } return event.isConsumed(); } @@ -248,6 +257,12 @@ public abstract class MainWindow { break; } } + if (!open) { + Window window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); + if (window instanceof UiFeedback) { + open = ((UiFeedback) window).wantConfirmQuit(); + } + } if (!open || Gui.showMessageBox(mainWindow, "Are you sure you want to quit?", MessageType.QUESTION_YESNO, null, null)) { diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/UiFeedback.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/UiFeedback.java new file mode 100644 index 00000000..f7216692 --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/helper/UiFeedback.java @@ -0,0 +1,20 @@ +package org.openslx.dozmod.gui.helper; + +public interface UiFeedback { + + /** + * If this window wants to prevent the user from closing the application, + * it should return true. This makes the application ask the user to confirm + * quitting. + * + * @return true to ask the user for confirmation + */ + public boolean wantConfirmQuit(); + + /** + * Called if the user pressed the ESC key and the window currently has + * the focus. + */ + public void escapePressed(); + +} 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 f8baddb7..7705f792 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 @@ -30,8 +30,6 @@ import javax.swing.event.ListDataListener; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.ImageDetailsRead; -import org.openslx.bwlp.thrift.iface.ImagePermissions; -import org.openslx.bwlp.thrift.iface.ImageVersionDetails; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.bwlp.thrift.iface.ShareMode; import org.openslx.bwlp.thrift.iface.Virtualizer; @@ -39,6 +37,7 @@ import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.MainWindow; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.helper.PopupMenu; +import org.openslx.dozmod.gui.helper.UiFeedback; import org.openslx.dozmod.gui.window.layout.ImageDetailsWindowLayout; import org.openslx.dozmod.permissions.ImagePerms; import org.openslx.dozmod.thrift.MetaDataCache; @@ -50,14 +49,14 @@ import org.openslx.util.QuickTimer; import org.openslx.util.QuickTimer.Task; @SuppressWarnings("serial") -public class ImageDetailsWindow extends ImageDetailsWindowLayout { +public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFeedback { private static final Logger LOGGER = Logger.getLogger(ImageDetailsWindow.class); private final ImageDetailsWindow me = this; private ImageDetailsRead image = null; - + private final JMenuItem[] popupMenuItems = new JMenuItem[2]; public ImageDetailsWindow(Frame modalParent) { @@ -65,13 +64,11 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout { setFocusable(true); btnSaveChanges.setEnabled(false); - // ESC closes this window - addKeyListener(new KeyAdapter() { + // Close button closes window + btnClose.addActionListener(new ActionListener() { @Override - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { - dispose(); - } + public void actionPerformed(ActionEvent e) { + dispose(); } }); @@ -119,10 +116,12 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout { public void mousePressed(MouseEvent e) { processClick(e); } + @Override public void mouseReleased(MouseEvent e) { processClick(e); } + private void processClick(MouseEvent e) { int r = versionTable.rowAtPoint(e.getPoint()); if (r >= 0 && r < versionTable.getRowCount()) { @@ -142,7 +141,6 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout { } - /** * @param imageBaseId the id of the image to be displayed */ @@ -194,9 +192,8 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout { lblUpdater.setUser(UserCache.find(image.getUpdaterId())); lblCreateTime.setText(FormatHelper.longDate(image.getCreateTime())); lblUpdateTime.setText(FormatHelper.longDate(image.getUpdateTime())); - txtId.setText(image.getImageBaseId()); txtVersion.setText(image.getLatestVersionId()); - + setTitle(image.getImageName()); List<OperatingSystem> osList = MetaDataCache.getOperatingSystems(); // all fine, lets sort it @@ -276,7 +273,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout { * @param editable true to make fields editable, false otherwise. */ private void makeEditable(boolean editable) { - txtTitle.setEnabled(editable); + txtTitle.setEditable(editable); txtDescription.setEditable(editable); txtTags.setEditable(editable); txtVersion.setEditable(editable); @@ -298,4 +295,16 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout { win.setImage(imageBaseId); } + @Override + public boolean wantConfirmQuit() { + // Maybe return true if the user changed one of the fields, but not really a priority + return false; + } + + @Override + public void escapePressed() { + // Also ask if applicable + this.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 845bddcb..23a9e27c 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 @@ -32,7 +32,7 @@ import org.openslx.dozmod.gui.helper.GridPos; @SuppressWarnings("serial") public abstract class ImageDetailsWindowLayout extends JDialog { - protected final JLabel txtTitle; + protected final JTextField txtTitle; protected final JTextArea txtDescription; protected final PersonLabel lblOwner; @@ -58,7 +58,7 @@ public abstract class ImageDetailsWindowLayout extends JDialog { // TODO: Permissions, ... public ImageDetailsWindowLayout(Frame modalParent) { - super(modalParent, "Platzhalter wärend das Fenster sich noch nicht gefüllt hat", ModalityType.APPLICATION_MODAL); + super(modalParent, "<init>", ModalityType.APPLICATION_MODAL); setResizable(true); setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); setLayout(new BorderLayout()); @@ -72,33 +72,35 @@ public abstract class ImageDetailsWindowLayout extends JDialog { infoPanel.setLayout(new GridBagLayout()); infoPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // -- name -- - txtTitle = new JLabel(); + txtTitle = new JTextField(); 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); - txtDescription.setPreferredSize(new Dimension(450, 100)); + txtDescription.setWrapStyleWord(true); + txtDescription.setMinimumSize(new Dimension(0, 100)); infoPanel.add(new JLabel("Beschreibung"), GridPos.get(0, row, false, false)); - infoPanel.add(new JScrollPane(txtDescription), GridPos.get(1, row++, true, true)); + infoPanel.add(new JScrollPane(txtDescription, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), GridPos.get(1, row++, true, true)); // 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)); // os cboOperatingSystem = new JComboBox<>(); cboOperatingSystem.setEditable(false); @@ -113,32 +115,33 @@ public abstract class ImageDetailsWindowLayout extends JDialog { return this; } }); - infoPanel.add(new JLabel("Betriebssystem"), GridPos.get(0, row, false, false)); - infoPanel.add(cboOperatingSystem, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Betriebssystem"), GridPos.get(0, row, false, false)); + infoPanel.add(cboOperatingSystem, GridPos.get(1, row++, true, false)); // virtualizer lblVirtualizer = new JLabel(); - infoPanel.add(new JLabel("Virtualizer"), GridPos.get(0, row, false, false)); - infoPanel.add(lblVirtualizer, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Virtualizer"), GridPos.get(0, row, false, false)); + infoPanel.add(lblVirtualizer, GridPos.get(1, row++, true, false)); // tags txtTags = new JTextField(); - infoPanel.add(new JLabel("Tags"), GridPos.get(0, row, false, false)); - infoPanel.add(txtTags, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Tags"), GridPos.get(0, row, false, false)); + infoPanel.add(txtTags, GridPos.get(1, row++, true, false)); // share mode cboShareMode = new JComboBox<ShareMode>(); - infoPanel.add(new JLabel("Freigabemodus"), GridPos.get(0, row, false, false)); - infoPanel.add(cboShareMode, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Freigabemodus"), GridPos.get(0, row, false, false)); + infoPanel.add(cboShareMode, GridPos.get(1, row++, true, false)); // template btnIsTemplate = new JCheckBox(); - infoPanel.add(new JLabel("Vorlage"), GridPos.get(0, row, false, false)); - infoPanel.add(btnIsTemplate, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Vorlage"), GridPos.get(0, row, false, false)); + infoPanel.add(btnIsTemplate, GridPos.get(1, row++, true, false)); txtVersion = new JTextField(); - infoPanel.add(new JLabel("Version"), GridPos.get(0, row, false, false)); - infoPanel.add(txtVersion, GridPos.get(1, row++, true, false)); + infoPanel.add(new JLabel("Version"), GridPos.get(0, row, false, false)); + infoPanel.add(txtVersion, GridPos.get(1, row++, true, false)); txtId = new JTextField(); - infoPanel.add(new JLabel("ID"), GridPos.get(0, row, false, false)); - infoPanel.add(txtId, GridPos.get(1, row++, true, false)); + txtId.setEditable(false); + infoPanel.add(new JLabel("ID"), GridPos.get(0, row, false, false)); + infoPanel.add(txtId, GridPos.get(1, row++, true, false)); infoPanel.setPreferredSize(new Dimension(500, 400)); @@ -153,7 +156,7 @@ public abstract class ImageDetailsWindowLayout extends JDialog { buttonPanel.add(btnSaveChanges); buttonPanel.add(Box.createGlue()); buttonPanel.add(btnClose); - add(buttonPanel, BorderLayout.SOUTH); + add(buttonPanel, BorderLayout.PAGE_END); // --- Version table on the right (EAST) side JPanel versionTablePanel = new JPanel(); @@ -161,11 +164,11 @@ public abstract class ImageDetailsWindowLayout extends JDialog { versionTablePanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); JLabel lblVersion = new JLabel("Image Versionen"); lblVersion.setFont(lblVersion.getFont().deriveFont(Font.BOLD)); - versionTablePanel.add(lblVersion, BorderLayout.NORTH); + versionTablePanel.add(lblVersion, BorderLayout.PAGE_START); versionTable = new ImageVersionTable(); - versionTablePanel.setPreferredSize(new Dimension(400, 200)); + versionTablePanel.setPreferredSize(new Dimension(450, 200)); versionTableScrollPane = new JScrollPane(versionTable); versionTablePanel.add(versionTableScrollPane, BorderLayout.CENTER); - add(versionTablePanel, BorderLayout.EAST); + add(versionTablePanel, BorderLayout.LINE_END); } } |