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); }