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.

This commit is contained in:
Denis Fokin
2014-02-20 21:30:53 +04:00
parent c582c37d3b
commit db3a3d6043
3 changed files with 66 additions and 33 deletions
@@ -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);
}
@@ -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;
}
}
@@ -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);
}