From db3a3d6043dae4e28835817bb9e9272f82669ce9 Mon Sep 17 00:00:00 2001 From: Denis Fokin Date: Thu, 20 Feb 2014 21:26:33 +0400 Subject: [PATCH] Fixed incorrect YesNoCancel behaviour, html in message is handled properly now, size of text in the message is taken into account, esc works properly, better message width and height calculation based on the text area and number of buttons in the message. --- .../intellij/ui/messages/JBMacMessages.java | 3 +- .../intellij/ui/messages/SheetController.java | 78 +++++++++++++------ .../intellij/ui/messages/SheetMessage.java | 18 ++--- 3 files changed, 66 insertions(+), 33 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/messages/JBMacMessages.java b/platform/platform-impl/src/com/intellij/ui/messages/JBMacMessages.java index 8fa7a04e88c7..72aab2714e85 100644 --- a/platform/platform-impl/src/com/intellij/ui/messages/JBMacMessages.java +++ b/platform/platform-impl/src/com/intellij/ui/messages/JBMacMessages.java @@ -49,7 +49,8 @@ public class JBMacMessages extends MacMessagesEmulation { } SheetMessage sheetMessage = new SheetMessage(window, title, message, null, new String [] {defaultButton, alternateButton, otherButton}, null, defaultButton, alternateButton); - int result = sheetMessage.getResult().equals(defaultButton) ? Messages.YES : Messages.NO; + String resultString = sheetMessage.getResult(); + int result = resultString.equals(defaultButton) ? Messages.YES : resultString.equals(alternateButton) ? Messages.NO : Messages.CANCEL; if (doNotAskOption != null) { doNotAskOption.setToBeShown(sheetMessage.toBeShown(), result); } diff --git a/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java b/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java index e1612932ceb9..97b376534c2d 100755 --- a/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java +++ b/platform/platform-impl/src/com/intellij/ui/messages/SheetController.java @@ -23,10 +23,7 @@ import com.intellij.util.ui.UIUtil; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; +import java.awt.event.*; import java.awt.geom.Area; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; @@ -48,13 +45,15 @@ public class SheetController { private JButton[] buttons; private JButton myDefaultButton; private JButton myFocusedButton; - public final static int SHEET_WIDTH = 400; - public final static int SHEET_HEIGHT = 150; + public int SHEET_WIDTH = 400; + public int SHEET_HEIGHT = 150; private String myResult; private JPanel mySheetPanel; private SheetMessage mySheetMessage; + private Dimension messageArea = new Dimension(250, Short.MAX_VALUE); + SheetController(final SheetMessage sheetMessage, final String title, final String message, @@ -66,15 +65,27 @@ public class SheetController { myDoNotAskOption = doNotAskOption; mySheetMessage = sheetMessage; buttons = new JButton[buttonTitles.length]; - for (int i = 0; i < buttonTitles.length; i++) { - buttons[i] = new JButton(buttonTitles[i]); - if (buttonTitles[i].equals(defaultButtonTitle)) { + + myResult = null; + + for (int i = 0; i < buttons.length; i++) { + int titleIndex = buttonTitles.length - 1 - i; + buttons[i] = new JButton(buttonTitles[titleIndex]); + if (buttonTitles[titleIndex].equals(defaultButtonTitle)) { myDefaultButton = buttons[i]; } - if (buttonTitles[i].equals(focusedButton)) { + if (buttonTitles[titleIndex].equals(focusedButton)) { myFocusedButton = buttons[i]; } + if (buttonTitles[titleIndex].equals("Cancel")) { + myResult = "Cancel"; + } } + + if (myResult == null) { + myResult = buttonTitles[0]; + } + mySheetPanel = createSheetPanel(title, message, buttons); @@ -100,6 +111,10 @@ public class SheetController { } }; + mySheetPanel.registerKeyboardAction(actionListener, + KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), + JComponent.WHEN_IN_FOCUSED_WINDOW); + for (JButton button: buttons) { button.addActionListener(actionListener); } @@ -145,20 +160,26 @@ public class SheetController { sheetPanel.add(headerLabel); - JTextArea textArea = new JTextArea(message); + JEditorPane textArea = new JEditorPane(); + textArea.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); textArea.setFont(regularFont); - textArea.setLineWrap(true); - textArea.setWrapStyleWord(true); + textArea.setEditable(false); + + textArea.setContentType("text/html"); + textArea.setSize(250, Short.MAX_VALUE); + textArea.setText(message); + messageArea.setSize(250, textArea.getPreferredSize().height); + textArea.setSize(messageArea); - textArea.setSize(250, 10); textArea.setOpaque(false); sheetPanel.add(textArea); textArea.repaint(); - textArea.setSize(textArea.getPreferredSize()); + + SHEET_HEIGHT = 20 + headerLabel.getPreferredSize().height + 10 + messageArea.height + 10 + 70; sheetPanel.setSize(SHEET_WIDTH, SHEET_HEIGHT); ico.setOpaque(false); @@ -198,14 +219,27 @@ public class SheetController { g2d.fill(shadow); } - private static void layoutButtons(final JButton[] buttons, JPanel panel) { - for (int i = 0; i < buttons.length ; i ++) { - panel.add(buttons[i]); - buttons[i].repaint(); + private void layoutButtons(final JButton[] buttons, JPanel panel) { - Dimension size = buttons[i].getPreferredSize(); - buttons[i].setBounds(SHEET_WIDTH - (size.width + 10) * (buttons.length - i) - 15, SHEET_HEIGHT - 45, - size.width, size.height); + int buttonsWidth = 120; + + for (JButton button : buttons) { + panel.add(button); + button.repaint(); + buttonsWidth = button.getWidth() + 10; + } + + SHEET_WIDTH = Math.max(buttonsWidth, SHEET_WIDTH); + + int buttonShift = 15; + + for (JButton button : buttons) { + Dimension size = button.getPreferredSize(); + buttonShift += size.width; + button.setBounds(SHEET_WIDTH - buttonShift, + SHEET_HEIGHT - 45, + size.width, size.height); + buttonShift += 10; } } diff --git a/platform/platform-impl/src/com/intellij/ui/messages/SheetMessage.java b/platform/platform-impl/src/com/intellij/ui/messages/SheetMessage.java index 4b5b41e20d84..c2220d7b578c 100755 --- a/platform/platform-impl/src/com/intellij/ui/messages/SheetMessage.java +++ b/platform/platform-impl/src/com/intellij/ui/messages/SheetMessage.java @@ -21,10 +21,7 @@ import com.intellij.util.ui.UIUtil; import javax.swing.*; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; +import java.awt.event.*; /** @@ -57,7 +54,7 @@ public class SheetMessage implements ActionListener { myParent = owner; - myWindow.setSize(SheetController.SHEET_WIDTH, SheetController.SHEET_HEIGHT); + myWindow.setUndecorated(true); myWindow.setBackground(new JBColor(new Color(0, 0, 0, 0), new Color(0, 0, 0, 0))); myController = new SheetController(this, title, message, icon, buttons, defaultButton, doNotAskOption, focusedButton); @@ -69,6 +66,7 @@ public class SheetMessage implements ActionListener { myWindow.setFocusable(true); startAnimation(); + myWindow.setSize(myController.SHEET_WIDTH, myController.SHEET_HEIGHT); myWindow.setVisible(true); setPositionRelativeToParent(); } @@ -94,14 +92,14 @@ public class SheetMessage implements ActionListener { int imageCropOffset = (UIUtil.isRetina()) ? imageHeight * 2 : imageHeight; - g.drawImage(staticImage, 0,0,SheetController.SHEET_WIDTH,imageHeight, + g.drawImage(staticImage, 0,0,myController.SHEET_WIDTH,imageHeight, 0, staticImage.getHeight(null) - imageCropOffset, staticImage.getWidth(null) ,staticImage.getHeight(null) ,null); } } }; staticPanel.setOpaque(false); - staticPanel.setSize(SheetController.SHEET_WIDTH,SheetController.SHEET_HEIGHT); + staticPanel.setSize(myController.SHEET_WIDTH,myController.SHEET_HEIGHT); myWindow.setContentPane(staticPanel); myAnimator.start(); } @@ -113,9 +111,9 @@ public class SheetMessage implements ActionListener { : imageHeight - SHEET_ANIMATION_STEP; setPositionRelativeToParent(); - if (imageHeight > SheetController.SHEET_HEIGHT) { + if (imageHeight > myController.SHEET_HEIGHT) { myAnimator.stop(); - imageHeight = SheetController.SHEET_HEIGHT; + imageHeight = myController.SHEET_HEIGHT; staticImage = null; myWindow.setContentPane(myController.getPanel(myWindow)); myController.requestFocus(); @@ -132,7 +130,7 @@ public class SheetMessage implements ActionListener { private void setPositionRelativeToParent () { int width = myParent.getWidth(); - myWindow.setLocation(width / 2 - SheetController.SHEET_WIDTH / 2 + myParent.getLocation().x, + myWindow.setLocation(width / 2 - myController.SHEET_WIDTH / 2 + myParent.getLocation().x, myParent.getInsets().top + myParent.getLocation().y); }