From c71369bccd6bbd081e9d1e5daf54b249a1606274 Mon Sep 17 00:00:00 2001 From: Kuersat Akmaz Date: Mon, 30 Nov 2020 21:06:01 +0100 Subject: [client] added fixed htmleditor to imagedetailswindow Issue : #3732 --- .../dozmod/gui/window/ImageDetailsWindow.java | 138 +++++++++++++-------- .../window/layout/ImageDetailsWindowLayout.java | 10 +- 2 files changed, 93 insertions(+), 55 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 764cf7eb..fc68c708 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 @@ -7,10 +7,13 @@ import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.beans.Encoder; +import java.io.IOException; import java.nio.ByteBuffer; import java.util.Collections; import java.util.Comparator; @@ -28,7 +31,12 @@ import javax.swing.JOptionPane; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; +import javax.swing.text.BadLocationException; +import javax.swing.text.DefaultEditorKit; import javax.swing.text.StyledEditorKit; +import javax.swing.text.html.HTML; +import javax.swing.text.html.HTMLDocument; +import javax.swing.text.html.HTMLEditorKit; import org.apache.log4j.Logger; import org.apache.thrift.TException; @@ -266,8 +274,8 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe break; } - act.actionPerformed(new ActionEvent(act,ActionEvent.ACTION_PERFORMED, - (String)act.getValue(Action.ACTION_COMMAND_KEY))); + act.actionPerformed(new ActionEvent(act,ActionEvent.ACTION_PERFORMED, + (String)act.getValue(Action.ACTION_COMMAND_KEY))); } }); @@ -275,18 +283,43 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe @Override public void actionPerformed(ActionEvent e) { String tmp = txtDescription.getText(); - if (txtDescription.getContentType().equals("text/html")){ - txtDescription.setContentType("text/plain"); + if (txtDescription.getContentType().equals("text/html")) { + txtDescription.setContentType("text/plain"); txtDescription.setText(tmp); btnWysiwyg.setText("Wysiwyg"); + if(ImagePerms.canEdit(image) || ImagePerms.canAdmin(image)) { + btnSaveChanges.setEnabled(true); + } } else { - txtDescription.setContentType("text/html"); + txtDescription.setContentType("text/html"); txtDescription.setText(tmp); btnWysiwyg.setText("Html"); } } }); + txtDescription.addKeyListener(new KeyListener() { + @Override + public void keyPressed(KeyEvent e) { + } + + @Override + public void keyTyped(KeyEvent e) { + } + + @Override + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER && txtDescription.getContentType().equals("text/html")) { + try { + kit.insertHTML((HTMLDocument) txtDescription.getDocument(), txtDescription.getCaretPosition(), "
", 0, 0, + HTML.Tag.BR); + txtDescription.setCaretPosition(txtDescription.getCaretPosition()); // This moves caret to next line + } catch (BadLocationException | IOException ex) { + ex.printStackTrace(); + } + } + } + }); tblVersions.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); @@ -473,8 +506,8 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe @Override public void run() { if (machineDescription == null) { - Gui.showMessageBox("Konnte VM-Konfiguration nicht abrufen.", MessageType.ERROR, - LOGGER, null); + Gui.showMessageBox("Konnte VM-Konfiguration nicht abrufen.", MessageType.ERROR, LOGGER, + null); return; } @@ -498,9 +531,8 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe * ********************************************************************************/ /** - * Sets the image to the given imageBaseId. This will also trigger fill() - * which will set the image details fields to the values represented by this - * image. + * Sets the image to the given imageBaseId. This will also trigger fill() which + * will set the image details fields to the values represented by this image. * * @param imageBaseId the id of the image to be displayed */ @@ -510,8 +542,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe MetaDataCache.getVirtualizers(); final ImageMetaCallback callback = new ImageMetaCallback() { @Override - public void fetchedImageDetails(ImageDetailsRead imageDetails, - Map permissions) { + public void fetchedImageDetails(ImageDetailsRead imageDetails, Map permissions) { if (imageDetails == null) { return; } @@ -540,8 +571,8 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe if (!actionHandler.setImageOwner(image.getImageBaseId(), user)) { return; } - Gui.showMessageBox(me, "Besitzrechte übertragen an " + FormatHelper.userName(user), MessageType.INFO, - null, null); + Gui.showMessageBox(me, "Besitzrechte übertragen an " + FormatHelper.userName(user), MessageType.INFO, null, + null); makeEditable(false); refresh(true); } @@ -568,8 +599,8 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe } } // let the user confirm or abort - if (!Gui.showMessageBox("Wollen Sie diese VM wirklich landesweit veröffentlichen?", - MessageType.QUESTION_YESNO, null, null)) + if (!Gui.showMessageBox("Wollen Sie diese VM wirklich landesweit veröffentlichen?", MessageType.QUESTION_YESNO, + null, null)) return; // start upload to masterserver QuickTimer.scheduleOnce(new Task() { @@ -580,11 +611,10 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe transferId = ThriftManager.getSatClient().publishImageVersion(Session.getSatelliteToken(), image.latestVersionId); } catch (TException e1) { - ThriftError.showMessage(me, LOGGER, e1, - "Upload der VM auf den Masterserver fehlgeschlagen." - + " Prüfen Sie, ob Sie bei der Registrierung dem landesweiten VM-Austausch zugestimmt haben.\n" - + " Sie können dies hier überprüfen:\n" - + DesktopEnvironment.Link.REGISTER_BWIDM.uri.toString() + "\n\n"); + ThriftError.showMessage(me, LOGGER, e1, "Upload der VM auf den Masterserver fehlgeschlagen." + + " Prüfen Sie, ob Sie bei der Registrierung dem landesweiten VM-Austausch zugestimmt haben.\n" + + " Sie können dies hier überprüfen:\n" + + DesktopEnvironment.Link.REGISTER_BWIDM.uri.toString() + "\n\n"); return; } Gui.asyncExec(new Runnable() { @@ -593,9 +623,9 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe MainWindow.addPassiveTransfer(transferId, image.imageName, true); // Inform user Gui.showMessageBox(ImageDetailsWindow.this, - "Die Übertragung läuft direkt zwischen Satellitenserver und" - + " dem " + Branding.getServiceName() + " Zentral-Server.\n" - + "Wenn Sie die " + Branding.getApplicationName() + " schließen, wird der Transfer trotzdem" + "Die Übertragung läuft direkt zwischen Satellitenserver und" + " dem " + + Branding.getServiceName() + " Zentral-Server.\n" + "Wenn Sie die " + + Branding.getApplicationName() + " schließen, wird der Transfer trotzdem" + "weiterlaufen.", MessageType.INFO, null, null); } @@ -605,8 +635,8 @@ 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 + * 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(); @@ -622,15 +652,16 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe } /** - * Helper to only save the changes, nothing else. Updating GUI elements is - * done by saveChanges() + * 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() { // Special case: User has admin rights through default permissions - // -> user removes default admin permissions - // -> first save custom permissions, then the rest (including default permissions) + // -> user removes default admin permissions + // -> first save custom permissions, then the rest (including default + // permissions) if (adminRightsFromDefaultPermissions && changeListenerPermissions.isCurrentlyChanged()) { if (!saveCustomPermissions()) { return false; @@ -648,8 +679,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe actionHandler.updateImageBase(image.getImageBaseId(), ibw); LOGGER.info("Successfully saved new metadata"); } catch (TException e) { - ThriftError.showMessage(me, LOGGER, e, - "Konnte aktualisierte Metadaten nicht an den Server übermitteln"); + ThriftError.showMessage(me, LOGGER, e, "Konnte aktualisierte Metadaten nicht an den Server übermitteln"); return false; } @@ -674,8 +704,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe ctlImagePermissionConfigurator.getPermissions()); LOGGER.info("Successfully saved new custom permissions"); } catch (TException e) { - ThriftError.showMessage(me, LOGGER, e, - "Konnte geänderte Berechtigungen nicht an den Server übermitteln"); + ThriftError.showMessage(me, LOGGER, e, "Konnte geänderte Berechtigungen nicht an den Server übermitteln"); return false; } return true; @@ -691,10 +720,11 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe Gui.showMessageBox(this, "Ausgewählte Version ist ungültig", MessageType.ERROR, null, null); return; } - // using actionHandler here is not needed, as this ThriftAction works for downloads + // using actionHandler here is not needed, as this ThriftAction works for + // downloads // from either the master server or the satellite server - ThriftActions.initDownload(JOptionPane.getFrameForComponent(this), selected.versionId, - image.imageName, image.virtId, image.osId, selected.fileSize, null); + ThriftActions.initDownload(JOptionPane.getFrameForComponent(this), selected.versionId, image.imageName, + image.virtId, image.osId, selected.fileSize, null); } /** @@ -727,15 +757,16 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe } /** - * Extends the expiration date for given image versions to current date - * plus the user-supplied duration. + * Extends the expiration date for given image versions to current date plus the + * user-supplied duration. * * @param versions to extend the validity of */ private void extendVersionExpiry(List versions) { int daysToExtend = -1; if (versions.size() > 1) { - // more than one version given, ask the user once and use the value for all versions. + // more than one version given, ask the user once and use the value for all + // versions. daysToExtend = ExpiryDateChooser.askFutureExpiryDuration(this, null); if (daysToExtend == -1) return; @@ -749,7 +780,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe if (daysToExtend == -1) return; } - currentExpiryTimeAsDate = DateTimeHelper.addDaysTo(currentExpiryTimeAsDate, daysToExtend); + currentExpiryTimeAsDate = DateTimeHelper.addDaysTo(currentExpiryTimeAsDate, daysToExtend); try { ThriftManager.getSatClient().setImageVersionExpiry(Session.getSatelliteToken(), img.versionId, currentExpiryTimeAsDate.getTime() / 1000L); @@ -760,8 +791,7 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe } } if (count > 0) { - Gui.showMessageBox(this, "Erfolgreich verlängerte Abbilder: " + count, MessageType.INFO, null, - null); + Gui.showMessageBox(this, "Erfolgreich verlängerte Abbilder: " + count, MessageType.INFO, null, null); refresh(true); } } @@ -836,7 +866,8 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe } txtTags.setText(tagsString); - // init permissions, remember if the user had admin rights through default permissions + // 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); @@ -908,11 +939,14 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe win.setVisible(true); } - /* ******************************************************************************* + /* + * ***************************************************************************** + * ** * * Dialog class overrides * - * ******************************************************************************* + * ***************************************************************************** + * ** */ @SuppressWarnings("deprecation") @Override @@ -924,11 +958,14 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe super.show(); } - /* ******************************************************************************* + /* + * ***************************************************************************** + * ** * * UIFeedback implementation * - * ******************************************************************************* + * ***************************************************************************** + * ** */ @Override public boolean wantConfirmQuit() { @@ -945,9 +982,8 @@ public class ImageDetailsWindow extends ImageDetailsWindowLayout implements UiFe * confirmation if so */ private boolean safeClose() { - if (changeMonitor.isCurrentlyModified() - && !Gui.showMessageBox(me, "Änderungen werden verworfen, wollen Sie wirklich schließen?", - MessageType.QUESTION_YESNO, null, null)) + if (changeMonitor.isCurrentlyModified() && !Gui.showMessageBox(me, + "Änderungen werden verworfen, wollen Sie wirklich schließen?", MessageType.QUESTION_YESNO, null, null)) return false; dispose(); return true; 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 f2609e89..0d5cfd0f 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 @@ -24,7 +24,7 @@ import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.text.StyledEditorKit; -import javax.swing.JEditorPane; +import javax.swing.text.html.HTMLEditorKit; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.bwlp.thrift.iface.ShareMode; @@ -83,10 +83,10 @@ public abstract class ImageDetailsWindowLayout extends JDialog { protected final JButton btnItalic; protected final JButton btnUnderline; protected final JButton btnWysiwyg; - + protected final JComboBox cbTxtSize; protected final JComboBox cbTxtColor; - + protected final HTMLEditorKit kit; protected JTabbedPane pnlTabs; protected ImagePermissionConfigurator ctlImagePermissionConfigurator; @@ -113,7 +113,6 @@ public abstract class ImageDetailsWindowLayout extends JDialog { // name txtTitle = new JTextField(); txtTitle.setFont(txtTitle.getFont().deriveFont(Font.BOLD, txtTitle.getFont().getSize2D() * 1.4f)); - // txtTitle.setMinimumSize(Gui.getScaledDimension(0, 24)); grid.add(txtTitle, 3).expand(true, false).fill(true, false); grid.nextRow(); @@ -158,7 +157,10 @@ public abstract class ImageDetailsWindowLayout extends JDialog { // description txtDescription = new JEditorPane(); + kit = new HTMLEditorKit(); + txtDescription.setEditorKit(kit); txtDescription.setContentType("text/html"); + grid.add(new QLabel("Beschreibung")).anchor = GridBagConstraints.FIRST_LINE_START; JScrollPane jsp = new JScrollPane(txtDescription, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); -- cgit v1.2.3-55-g7522