IDEA-77932 Create Patch dialog resizes several time on opening

This commit is contained in:
Evgeny Zakrevsky
2012-05-15 22:55:36 +04:00
parent 1c49b9ee5c
commit a922bfab53
12 changed files with 289 additions and 285 deletions
@@ -165,7 +165,7 @@ public class InitialConfigurationDialog extends DialogWrapper {
private void createUIComponents() {
myColorPreviewPanel = new AbstractTitledSeparatorWithIcon(IconLoader.getIcon("/general/comboArrowRight.png"),
IconLoader.getIcon("/general/comboArrowDown.png"),
"Click to preview", true, false) {
"Click to preview") {
private int myAddedWidth;
@@ -394,7 +394,7 @@ public class RevisionsList {
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
Graphics2D g2d = (Graphics2D)g.create();
g2d.setColor(UIUtil.getBorderSeparatorColor());
g2d.setColor(UIUtil.getBorderColor());
g2d.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float[]{1}, 1));
g2d.drawLine(x, y, x + width, y);
if (isLast) {
@@ -18,7 +18,6 @@ package com.intellij.openapi.ui;
import com.intellij.openapi.actionSystem.ActionToolbar;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.openapi.actionSystem.Separator;
import com.intellij.openapi.util.Ref;
import com.intellij.ui.switcher.QuickActionProvider;
import com.intellij.util.ui.AwtVisitor;
@@ -28,8 +27,8 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;
import java.util.List;
public class SimpleToolWindowPanel extends JPanel implements QuickActionProvider, DataProvider {
@@ -145,7 +144,7 @@ public class SimpleToolWindowPanel extends JPanel implements QuickActionProvider
super.paintComponent(g);
if (myToolbar != null && myToolbar.getParent() == this && myContent != null && myContent.getParent() == this) {
g.setColor(UIUtil.getBorderSeparatorColor());
g.setColor(UIUtil.getBorderColor());
if (myVertical) {
final int y = (int)myToolbar.getBounds().getMaxY();
g.drawLine(0, y, getWidth(), y);
@@ -54,7 +54,7 @@ public class TitledSeparator extends JPanel {
public void updateUI() {
super.updateUI();
if (myLabel != null) {
myLabel.setFont(UIUtil.getBorderFont(UIUtil.FontSize.SMALL, false));
myLabel.setFont(UIUtil.getTitledBorderFont());
}
}
@@ -81,22 +81,4 @@ public class TitledSeparator extends JPanel {
public JSeparator getSeparator() {
return mySeparator;
}
@Deprecated
public boolean isBoldFont() {
return false;
}
@Deprecated
public boolean isSmallFont() {
return true;
}
@Deprecated
public void setBoldFont(boolean boldFont) {
}
@Deprecated
public void setSmallFont(boolean smallFont) {
}
}
@@ -42,9 +42,7 @@ public abstract class AbstractTitledSeparatorWithIcon extends JPanel {
public AbstractTitledSeparatorWithIcon(@NotNull final Icon icon,
@NotNull final Icon iconOpen,
@NotNull final String text,
final boolean smallFont,
final boolean boldFont) {
@NotNull final String text) {
myIcon = icon;
myIconOpen = iconOpen;
setLayout(new GridBagLayout());
@@ -59,7 +57,7 @@ public abstract class AbstractTitledSeparatorWithIcon extends JPanel {
new Insets(3, 0, 0, 0), 0, 0);
add(mySeparator, gb);
setBorder(IdeBorderFactory.createEmptyBorder(3, 0, 5, 5));
myLabel.setFont(UIUtil.getBorderFont(smallFont ? UIUtil.FontSize.SMALL : UIUtil.FontSize.NORMAL, boldFont));
myLabel.setFont(UIUtil.getTitledBorderFont());
myLabel.setForeground(UIUtil.getTitledBorderTitleColor());
originalText = text;
myLabel.setText(UIUtil.replaceMnemonicAmpersand(originalText));
@@ -29,9 +29,8 @@ import java.awt.*;
public abstract class HideableDetailsUnderSeparator extends AbstractTitledSeparatorWithIcon {
public HideableDetailsUnderSeparator(@NotNull Icon icon,
@NotNull Icon iconOpen,
@NotNull String text,
boolean smallFont, boolean boldFont) {
super(icon, iconOpen, text, smallFont, boldFont);
@NotNull String text) {
super(icon, iconOpen, text);
}
public void on() {
@@ -0,0 +1,131 @@
package com.intellij.ui;
import com.intellij.openapi.util.IconLoader;
import com.intellij.util.ui.UIUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* @author evgeny zakrevsky
*/
public class HideableTitledPanel extends JPanel {
Icon OFF_ICON = IconLoader.getIcon("/general/comboArrow.png");
Icon ON_ICON = IconLoader.getIcon("/general/comboUpPassive.png");
private TitledSeparatorWithMnemonic myTitledSeparator;
private boolean myOn;
private final JComponent myContent;
private Dimension myPreviousContentSize;
public HideableTitledPanel(String title, JComponent content, boolean on) {
super(new BorderLayout());
myContent = content;
add(myContent, BorderLayout.CENTER);
myTitledSeparator = new TitledSeparatorWithMnemonic(title, null);
add(myTitledSeparator, BorderLayout.NORTH);
myTitledSeparator.getLabel().setIcon(OFF_ICON);
myTitledSeparator.getLabel().addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if (myOn) {
off();
}
else {
on();
}
}
@Override
public void mouseEntered(MouseEvent e) {
setCursor(new Cursor(Cursor.HAND_CURSOR));
}
@Override
public void mouseExited(MouseEvent e) {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
});
UIUtil.setActionNameAndMnemonic(title, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (myOn) {
off();
}
else {
on();
}
}
});
setOn(on);
}
public void setOn(boolean on) {
myOn = on;
if (myOn) {
on();
}
else {
off();
}
}
protected void on() {
myOn = true;
myTitledSeparator.getLabel().setIcon(ON_ICON);
myContent.setVisible(true);
adjustWindow();
invalidate();
repaint();
}
private void adjustWindow() {
final Window window = SwingUtilities.getWindowAncestor(this);
if (window == null) return;
final Dimension size = window.getSize();
final Dimension contentSize = myPreviousContentSize != null && myPreviousContentSize.width > 0 && myPreviousContentSize.height > 0
? myPreviousContentSize
: myContent.getPreferredSize();
final Dimension newSize;
if (myOn) {
newSize = new Dimension(Math.max(size.width, myContent.getSize().width), size.height + contentSize.height);
}
else {
newSize = new Dimension(size.width, size.height - contentSize.height);
}
if (!newSize.equals(size)) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (window.isShowing()) {
window.setSize(newSize);
}
}
});
}
}
protected void off() {
myOn = false;
myTitledSeparator.getLabel().setIcon(OFF_ICON);
myContent.setVisible(false);
myPreviousContentSize = myContent.getSize();
adjustWindow();
invalidate();
repaint();
}
public void setTitle(String title) {
myTitledSeparator.setText(title);
}
@Override
public void setEnabled(boolean enabled) {
myTitledSeparator.myLabel.setForeground(enabled ? UIUtil.getActiveTextColor() : UIUtil.getInactiveTextColor());
myContent.setEnabled(enabled);
}
}
@@ -47,7 +47,7 @@ public abstract class SplitterWithSecondHideable {
public SplitterWithSecondHideable(final boolean vertical,
final String separatorText,
final JComponent firstComponent,
final OnOffListener<Integer> listener, final boolean boldFont) {
final OnOffListener<Integer> listener) {
myVertical = vertical;
myListener = listener;
myFictivePanel = new JPanel(new BorderLayout());
@@ -56,12 +56,13 @@ public abstract class SplitterWithSecondHideable {
if (vertical) {
icon = IconLoader.getIcon("/general/comboArrow.png");
openIcon = IconLoader.getIcon("/general/comboUpPassive.png");
} else {
}
else {
icon = IconLoader.getIcon("/general/comboArrowRight.png");
openIcon = IconLoader.getIcon("/general/comboArrowRightPassive.png");
}
myTitledSeparator = new AbstractTitledSeparatorWithIcon(icon, openIcon, separatorText, true, true) {
myTitledSeparator = new AbstractTitledSeparatorWithIcon(icon, openIcon, separatorText) {
@Override
protected RefreshablePanel createPanel() {
return createDetails();
@@ -89,7 +90,7 @@ public abstract class SplitterWithSecondHideable {
final int firstSize = vertical ? mySplitter.getFirstComponent().getHeight() : mySplitter.getFirstComponent().getWidth();
// !! order is important! first fix
mySplitter.fixFirst();
myListener.on((int) ((1 - proportion) * firstSize / proportion));
myListener.on((int)((1 - proportion) * firstSize / proportion));
//mySplitter.setProportion(proportion);
mySplitter.setSecondComponent(myDetailsComponent.getPanel());
mySplitter.revalidate();
@@ -111,66 +112,67 @@ public abstract class SplitterWithSecondHideable {
}
};
mySplitter = new PseudoSplitter(vertical) {
{
myTitledSeparator.mySeparator.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
myTitledSeparator.mySeparator
.setCursor(myTitledSeparator.myOn ? new Cursor(Cursor.S_RESIZE_CURSOR) : new Cursor(Cursor.DEFAULT_CURSOR));
((MyDivider) mySuperDivider).processMouseEvent(e);
}
{
myTitledSeparator.mySeparator.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
myTitledSeparator.mySeparator
.setCursor(myTitledSeparator.myOn ? new Cursor(Cursor.S_RESIZE_CURSOR) : new Cursor(Cursor.DEFAULT_CURSOR));
((MyDivider)mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseExited(MouseEvent e) {
myTitledSeparator.mySeparator.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
((MyDivider) mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseExited(MouseEvent e) {
myTitledSeparator.mySeparator.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
((MyDivider)mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseClicked(MouseEvent e) {
((MyDivider) mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseClicked(MouseEvent e) {
((MyDivider)mySuperDivider).processMouseEvent(e);
}
@Override
public void mousePressed(MouseEvent e) {
((MyDivider) mySuperDivider).processMouseEvent(e);
}
@Override
public void mousePressed(MouseEvent e) {
((MyDivider)mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseReleased(MouseEvent e) {
((MyDivider) mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseReleased(MouseEvent e) {
((MyDivider)mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
((MyDivider) mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
((MyDivider)mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseDragged(MouseEvent e) {
((MyDivider) mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseDragged(MouseEvent e) {
((MyDivider)mySuperDivider).processMouseEvent(e);
}
@Override
public void mouseMoved(MouseEvent e) {
((MyDivider) mySuperDivider).processMouseEvent(e);
}
});
@Override
public void mouseMoved(MouseEvent e) {
((MyDivider)mySuperDivider).processMouseEvent(e);
}
});
myTitledSeparator.mySeparator.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
((MyDivider) mySuperDivider).processMouseMotionEvent(e);
}
myTitledSeparator.mySeparator.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
((MyDivider)mySuperDivider).processMouseMotionEvent(e);
}
@Override
public void mouseMoved(MouseEvent e) {
((MyDivider) mySuperDivider).processMouseMotionEvent(e);
}
});
}
@Override
protected Divider createDivider() {
@Override
public void mouseMoved(MouseEvent e) {
((MyDivider)mySuperDivider).processMouseMotionEvent(e);
}
});
}
@Override
protected Divider createDivider() {
mySuperDivider = new MyDivider();
mySuperDivider.add(myTitledSeparator,
new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
@@ -178,22 +180,22 @@ public abstract class SplitterWithSecondHideable {
return mySuperDivider;
}
@Override
public int getDividerWidth() {
@Override
public int getDividerWidth() {
return vertical ? myTitledSeparator.getHeight() : myTitledSeparator.getWidth();
}
class MyDivider extends Divider {
@Override
public void processMouseMotionEvent(MouseEvent e) {
super.processMouseMotionEvent(e);
}
@Override
public void processMouseEvent(MouseEvent e) {
super.processMouseEvent(e);
}
class MyDivider extends Divider {
@Override
public void processMouseMotionEvent(MouseEvent e) {
super.processMouseMotionEvent(e);
}
@Override
public void processMouseEvent(MouseEvent e) {
super.processMouseEvent(e);
}
}
};
mySplitter.setDoubleBuffered(true);
mySplitter.setFirstComponent(firstComponent);
@@ -201,7 +203,7 @@ public abstract class SplitterWithSecondHideable {
//mySplitter.setShowDividerIcon(false);
mySplitter.setProportion(1.0f);
}
public void setText(final String value) {
myTitledSeparator.setText(value);
}
@@ -215,6 +217,7 @@ public abstract class SplitterWithSecondHideable {
}
protected abstract RefreshablePanel createDetails();
protected abstract float getSplitterInitialProportion();
public float getUsedProportion() {
@@ -224,11 +227,11 @@ public abstract class SplitterWithSecondHideable {
public void initOn() {
myTitledSeparator.initOn();
}
public void on() {
myTitledSeparator.on();
}
public void off() {
myTitledSeparator.off();
}
@@ -244,8 +244,10 @@ public class Splitter extends JPanel {
if (isHonorMinimumSize()) {
final double firstMinSize = getOrientation() ? myFirstComponent.getMinimumSize().getHeight() : myFirstComponent.getMinimumSize().getWidth();
final double secondMinSize = getOrientation() ? mySecondComponent.getMinimumSize().getHeight() : mySecondComponent.getMinimumSize().getWidth();
final double firstMinSize =
getOrientation() ? myFirstComponent.getMinimumSize().getHeight() : myFirstComponent.getMinimumSize().getWidth();
final double secondMinSize =
getOrientation() ? mySecondComponent.getMinimumSize().getHeight() : mySecondComponent.getMinimumSize().getWidth();
if (firstComponentSize + secondComponentSize < firstMinSize + secondMinSize) {
double proportion = firstMinSize / (firstMinSize + secondMinSize);
@@ -269,19 +271,19 @@ public class Splitter extends JPanel {
firstComponentSize = Math.floor(firstComponentSize);
secondComponentSize = Math.floor(secondComponentSize);
if (getOrientation()) {
// fix flooring
secondComponentSize += (int) (height - firstComponentSize - secondComponentSize - dividerWidth);
secondComponentSize += (int)(height - firstComponentSize - secondComponentSize - dividerWidth);
firstRect.setBounds(0, 0, (int)width, (int)firstComponentSize);
dividerRect.setBounds(0, (int)firstComponentSize, (int)width, (int)dividerWidth);
secondRect.setBounds(0, (int)(firstComponentSize + dividerWidth), (int)width, (int)secondComponentSize);
}
else {
// fix flooring
secondComponentSize += (int) (width - firstComponentSize - secondComponentSize - dividerWidth);
secondComponentSize += (int)(width - firstComponentSize - secondComponentSize - dividerWidth);
firstRect.setBounds(0, 0, (int)firstComponentSize, (int)height);
dividerRect.setBounds((int)firstComponentSize, 0, (int)dividerWidth, (int)height);
secondRect.setBounds((int)(firstComponentSize + dividerWidth), 0, (int)secondComponentSize, (int)height);
@@ -485,16 +487,15 @@ public class Splitter extends JPanel {
}
Icon glueIcon = IconLoader.getIcon(isVerticalSplit ? "/general/splitGlueV.png" : "/general/splitGlueH.png");
int leftInsetIcon = 1;
int leftInsetArrow = 0;
int glueFill = isVerticalSplit ? GridBagConstraints.VERTICAL : GridBagConstraints.HORIZONTAL;
add(new JLabel(glueIcon), new GridBagConstraints(0, 0, 1, 1, 0, 0,
GridBagConstraints.CENTER, GridBagConstraints.EAST,
new Insets(0, leftInsetIcon, 0, 0), 0, 0));
add(new JLabel(glueIcon), new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE,
new Insets(0, 0, 0, 0), 0, 0));
if (myShowDividerControls && false) {
int glueFill = isVerticalSplit ? GridBagConstraints.VERTICAL : GridBagConstraints.HORIZONTAL;
int xMask = isVerticalSplit ? 1 : 0;
int yMask = isVerticalSplit ? 0 : 1;
int leftInsetArrow = 0;
int leftInsetIcon = 1;
JLabel splitDownlabel = new JLabel(IconLoader.getIcon(isVerticalSplit ? "/general/splitDown.png" : "/general/splitRight.png"));
splitDownlabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
@@ -509,7 +510,8 @@ public class Splitter extends JPanel {
GridBagConstraints.NONE, new Insets(0, leftInsetArrow, 0, 0), 0, 0));
//
add(new JLabel(glueIcon),
new GridBagConstraints(2 * xMask, 2 * yMask, 1, 1, 0, 0, GridBagConstraints.CENTER, glueFill, new Insets(0, leftInsetIcon, 0, 0), 0, 0));
new GridBagConstraints(2 * xMask, 2 * yMask, 1, 1, 0, 0, GridBagConstraints.CENTER, glueFill,
new Insets(0, leftInsetIcon, 0, 0), 0, 0));
JLabel splitCenterlabel =
new JLabel(IconLoader.getIcon(isVerticalSplit ? "/general/splitCenterV.png" : "/general/splitCenterH.png"));
splitCenterlabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
@@ -522,7 +524,8 @@ public class Splitter extends JPanel {
add(splitCenterlabel, new GridBagConstraints(3 * xMask, 3 * yMask, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE,
new Insets(0, leftInsetArrow, 0, 0), 0, 0));
add(new JLabel(glueIcon),
new GridBagConstraints(4 * xMask, 4 * yMask, 1, 1, 0, 0, GridBagConstraints.CENTER, glueFill, new Insets(0, leftInsetIcon, 0, 0), 0, 0));
new GridBagConstraints(4 * xMask, 4 * yMask, 1, 1, 0, 0, GridBagConstraints.CENTER, glueFill,
new Insets(0, leftInsetIcon, 0, 0), 0, 0));
//
JLabel splitUpLabel = new JLabel(IconLoader.getIcon(isVerticalSplit ? "/general/splitUp.png" : "/general/splitLeft.png"));
splitUpLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
@@ -539,7 +542,7 @@ public class Splitter extends JPanel {
isVerticalSplit ? GridBagConstraints.WEST : GridBagConstraints.SOUTH, glueFill,
new Insets(0, leftInsetIcon, 0, 0), 0, 0));
}
revalidate();
repaint();
}
@@ -552,13 +555,17 @@ public class Splitter extends JPanel {
float proportion;
if (getOrientation()) {
if (getHeight() > 0) {
proportion = Math.min(1.0f, Math.max(.0f, Math.min(Math.max(getMinProportion(myFirstComponent), (float)myPoint.y / (float)Splitter.this.getHeight()), 1 - getMinProportion(mySecondComponent))));
proportion = Math.min(1.0f, Math.max(.0f, Math
.min(Math.max(getMinProportion(myFirstComponent), (float)myPoint.y / (float)Splitter.this.getHeight()),
1 - getMinProportion(mySecondComponent))));
setProportion(proportion);
}
}
else {
if (getWidth() > 0) {
proportion = Math.min(1.0f, Math.max(.0f, Math.min(Math.max(getMinProportion(myFirstComponent), (float)myPoint.x / (float)Splitter.this.getWidth()), 1 - getMinProportion(mySecondComponent))));
proportion = Math.min(1.0f, Math.max(.0f, Math
.min(Math.max(getMinProportion(myFirstComponent), (float)myPoint.x / (float)Splitter.this.getWidth()),
1 - getMinProportion(mySecondComponent))));
setProportion(proportion);
}
}
@@ -595,9 +602,10 @@ public class Splitter extends JPanel {
public void setResizeEnabled(boolean resizeEnabled) {
myResizeEnabled = resizeEnabled;
if (! myResizeEnabled) {
if (!myResizeEnabled) {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} else {
}
else {
setCursor(getOrientation() ?
Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR) :
Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
@@ -20,7 +20,10 @@ import com.intellij.openapi.Disposable;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.*;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.*;
import com.intellij.ui.ColorUtil;
import com.intellij.ui.Gray;
import com.intellij.ui.PanelWithAnchor;
import com.intellij.ui.SideBorder;
import com.intellij.util.ArrayUtil;
import com.intellij.util.PairFunction;
import com.intellij.util.Processor;
@@ -40,15 +43,12 @@ import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.plaf.ComboBoxUI;
import javax.swing.plaf.ProgressBarUI;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicComboBoxUI;
import javax.swing.plaf.basic.BasicTreeUI;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.JTextComponent;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.*;
import java.awt.font.FontRenderContext;
@@ -1562,26 +1562,9 @@ public class UIUtil {
return BORDER_COLOR;
}
public static Color getTitledBorderLineColor() {
return BORDER_COLOR;
}
public static Font getTitledBorderFont() {
return getLabelFont();
}
public static Font getBorderFont(@NotNull FontSize size, boolean isBold) {
Font defFont = getTitledBorderFont();
if (size == FontSize.SMALL) {
defFont = defFont.deriveFont(Math.max(defFont.getSize() - 2f, 11f));
}
if (size == FontSize.MINI) {
defFont = defFont.deriveFont(Math.max(defFont.getSize() - 4f, 9f));
}
//if (isBold) {
// defFont = defFont.deriveFont(Font.BOLD);
//}
return defFont;
Font defFont = getLabelFont();
return defFont.deriveFont(Math.max(defFont.getSize() - 2f, 11f));
}
public static Color getTitledBorderTitleColor() {
@@ -34,15 +34,14 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.VcsBundle;
import com.intellij.openapi.vcs.VcsConfiguration;
import com.intellij.openapi.vcs.changes.Change;
import com.intellij.openapi.vcs.changes.RefreshablePanel;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileWrapper;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.ui.SplitterWithSecondHideable;
import com.intellij.ui.HideableTitledPanel;
import com.intellij.util.Consumer;
import com.intellij.util.OnOffListener;
import com.intellij.util.ui.FormBuilder;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -58,7 +57,7 @@ public class CreatePatchConfigurationPanel {
private static final String SYSTEM_DEFAULT = IdeBundle.message("encoding.name.system.default");
public static final String ALL = "(All)";
private JPanel myPanel;
private JPanel myMainPanel;
private TextFieldWithBrowseButton myFileNameField;
private JCheckBox myReversePatchCheckbox;
private JComboBox myEncoding;
@@ -70,17 +69,18 @@ public class CreatePatchConfigurationPanel {
private List<Change> myChanges;
private Collection<Change> myIncludedChanges;
private SelectFilesToAddTextsToPatchPanel mySelectFilesToAddTextsToPatchPanel;
private SplitterWithSecondHideable mySplitterWithSecondHideable;
private HideableTitledPanel myHideableTitledPanel;
private JPanel myPanelWithSelectedFiles;
public CreatePatchConfigurationPanel(final Project project) {
myProject = project;
initUi();
initMainPanel();
myFileNameField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final FileSaverDialog dialog =
FileChooserFactory.getInstance().createSaveFileDialog(
new FileSaverDescriptor("Save patch to", ""), myPanel);
new FileSaverDescriptor("Save patch to", ""), myMainPanel);
final String path = FileUtil.toSystemIndependentName(myFileNameField.getText().trim());
final int idx = path.lastIndexOf("/");
VirtualFile baseDir = idx == -1 ? project.getBaseDir() :
@@ -121,27 +121,6 @@ public class CreatePatchConfigurationPanel {
});
myErrorLabel.setForeground(Color.RED);
checkName();
/*new AdjustComponentWhenShown() {
@Override
protected boolean init() {
if (myPanel.isVisible()) {
IdeFocusManager.findInstanceByComponent(myPanel).requestFocus(myFileNameField.getTextField(), true);
if (myIncludeBaseRevisionTextCheckBox.isVisible()) {
// a hack =(
final JDialog dialog = getParentDialog();
final Dimension dialogSize = dialog.getSize();
dialog.setSize(dialogSize.width, dialogSize.height + 1);
if (dialogSize.width < 500) {
dialog.setSize(500, dialogSize.height - 1);
} else {
dialog.setSize(dialogSize.width, dialogSize.height - 1);
}
dialog.repaint();
}
}
return false;
}
}.install(myPanel);*/
initEncodingCombo();
}
@@ -165,110 +144,31 @@ public class CreatePatchConfigurationPanel {
if (SYSTEM_DEFAULT.equals(selectedItem)) {
return EncodingManager.getInstance().getDefaultCharset();
}
return (Charset) selectedItem;
return (Charset)selectedItem;
}
private void initUi() {
myPanel = new JPanel(new GridBagLayout());
myPanel.setMinimumSize(new Dimension(400, -1));
final GridBagConstraints gb = new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
new Insets(1, 1, 1, 1), 0, 0);
gb.anchor = GridBagConstraints.WEST;
final JLabel createPatchLabel = new JLabel(VcsBundle.message("create.patch.file.path"));
myPanel.add(createPatchLabel, gb);
gb.anchor = GridBagConstraints.NORTHWEST;
private void initMainPanel() {
myFileNameField = new TextFieldWithBrowseButton();
++ gb.gridx;
gb.fill = GridBagConstraints.HORIZONTAL;
gb.weightx = 1;
myPanel.add(myFileNameField, gb);
/*gb.fill = GridBagConstraints.NONE;
gb.weightx = 0;*/
gb.gridx = 0;
++ gb.gridy;
gb.gridwidth = 2;
myReversePatchCheckbox = new JCheckBox(VcsBundle.message("create.patch.reverse.patch.checkbox"));
++ gb.gridy;
myPanel.add(myReversePatchCheckbox, gb);
++ gb.gridy;
gb.gridwidth = 2;
gb.anchor = GridBagConstraints.WEST;
myPanel.add(new JLabel("Encoding:"), gb);
++ gb.gridx;
gb.anchor = GridBagConstraints.NORTHWEST;
myEncoding = new JComboBox();
myPanel.add(myEncoding, gb);
++ gb.gridy;
gb.gridx = 0;
myIncludeBaseRevisionTextCheckBox = new JCheckBox("Include base revision text(s) into patch file");
myPanel.add(myIncludeBaseRevisionTextCheckBox, gb);
++ gb.gridy;
myErrorLabel = new JLabel();
myPanel.add(myErrorLabel, gb);
myMainPanel = FormBuilder.createFormBuilder()
.addLabeledComponent(VcsBundle.message("create.patch.file.path"), myFileNameField)
.addComponent(myReversePatchCheckbox)
.addLabeledComponent("Encoding:", myEncoding)
.addComponent(myIncludeBaseRevisionTextCheckBox)
.addComponent(myErrorLabel)
.getPanel();
}
private void initSplitter(Runnable inclusionListener) {
private void initPanelWithSelectedFiles(Runnable inclusionListener) {
mySelectFilesToAddTextsToPatchPanel = new SelectFilesToAddTextsToPatchPanel(myProject, myChanges, myIncludedChanges, inclusionListener);
final Dimension preferredSize = myPanel.getPreferredSize();
final JPanel wrapper = new JPanel(new BorderLayout()) {
@Override
public Dimension getPreferredSize() {
return preferredSize;
}
@Override
public Dimension getMaximumSize() {
return preferredSize;
}
@Override
public Dimension getMinimumSize() {
return preferredSize;
}
};
wrapper.add(myPanel, BorderLayout.NORTH);
mySplitterWithSecondHideable = new SplitterWithSecondHideable(true, ALL, wrapper, new OnOffListener<Integer>() {
@Override
public void on(Integer integer) {
VcsConfiguration.getInstance(myProject).CREATE_PATCH_EXPAND_DETAILS_DEFAULT = true;
final JDialog dialog = getParentDialog();
final Dimension dialogSize = dialog.getSize();
int width = dialogSize.width < 550 ? 550 : dialogSize.width;
dialog.setSize(width, dialogSize.height + integer);
dialog.repaint();
}
@Override
public void off(Integer integer) {
VcsConfiguration.getInstance(myProject).CREATE_PATCH_EXPAND_DETAILS_DEFAULT = false;
final JDialog dialog = getParentDialog();
final Dimension dialogSize = dialog.getSize();
dialog.setSize(dialogSize.width, dialogSize.height - integer);
dialog.repaint();
}
}, false) {
@Override
protected RefreshablePanel createDetails() {
return mySelectFilesToAddTextsToPatchPanel;
}
@Override
protected float getSplitterInitialProportion() {
return 0.3f;
}
};
}
private JDialog getParentDialog() {
Container parent = myPanel.getParent();
while (! (parent instanceof JDialog)) {
parent = parent.getParent();
}
return (JDialog)parent;
myHideableTitledPanel = new HideableTitledPanel("", mySelectFilesToAddTextsToPatchPanel.getPanel(), false);
myPanelWithSelectedFiles = new JPanel(new BorderLayout());
myPanelWithSelectedFiles.add(myMainPanel, BorderLayout.NORTH);
myPanelWithSelectedFiles.add(myHideableTitledPanel, BorderLayout.CENTER);
}
public void showTextStoreOption(final boolean dvcsIsUsed) {
@@ -276,29 +176,29 @@ public class CreatePatchConfigurationPanel {
if (myChanges.size() > 0) {
myIncludeBaseRevisionTextCheckBox.setVisible(true);
final VcsConfiguration configuration = VcsConfiguration.getInstance(myProject);
boolean turnOn = dvcsIsUsed || configuration.INCLUDE_TEXT_INTO_PATCH;
myIncludeBaseRevisionTextCheckBox.setSelected(turnOn);
myIncludeBaseRevisionTextCheckBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mySelectFilesToAddTextsToPatchPanel.setEnabled(myIncludeBaseRevisionTextCheckBox.isSelected());
mySplitterWithSecondHideable.setEnabledColor(myIncludeBaseRevisionTextCheckBox.isSelected());
}
});
final Runnable inclusionListener = new Runnable() {
@Override
public void run() {
if (mySelectFilesToAddTextsToPatchPanel != null) {
myIncludedChanges = mySelectFilesToAddTextsToPatchPanel.getIncludedChanges();
mySplitterWithSecondHideable.setText("Selected: " + (myIncludedChanges.size() == myChanges.size() ?
"All" : ("" + myIncludedChanges.size() + " of " + myChanges.size())));
myHideableTitledPanel.setTitle("Selected: " + (myIncludedChanges.size() == myChanges.size() ?
"All" : (myIncludedChanges.size() + " of " + myChanges.size())));
}
}
};
initSplitter(inclusionListener);
initPanelWithSelectedFiles(inclusionListener);
inclusionListener.run();
final VcsConfiguration configuration = VcsConfiguration.getInstance(myProject);
boolean turnOn = dvcsIsUsed || configuration.INCLUDE_TEXT_INTO_PATCH;
myIncludeBaseRevisionTextCheckBox.setSelected(turnOn);
myIncludeBaseRevisionTextCheckBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myHideableTitledPanel.setEnabled(myIncludeBaseRevisionTextCheckBox.isSelected());
}
});
myHideableTitledPanel.setEnabled(myIncludeBaseRevisionTextCheckBox.isSelected());
}
}
@@ -306,7 +206,8 @@ public class CreatePatchConfigurationPanel {
final PatchNameChecker patchNameChecker = new PatchNameChecker(myFileNameField.getText());
if (patchNameChecker.nameOk()) {
myErrorLabel.setText("");
} else {
}
else {
myErrorLabel.setText(patchNameChecker.getError());
}
if (myOkEnabledListener != null) {
@@ -315,7 +216,7 @@ public class CreatePatchConfigurationPanel {
}
public void onOk() {
if (myIncludeBaseRevisionTextCheckBox.isVisible() && ! myDvcsIsUsed) {
if (myIncludeBaseRevisionTextCheckBox.isVisible() && !myDvcsIsUsed) {
final VcsConfiguration vcsConfiguration = VcsConfiguration.getInstance(myProject);
vcsConfiguration.INCLUDE_TEXT_INTO_PATCH = myIncludeBaseRevisionTextCheckBox.isSelected();
}
@@ -330,7 +231,7 @@ public class CreatePatchConfigurationPanel {
}
public JComponent getPanel() {
return ! myIncludeBaseRevisionTextCheckBox.isVisible() || myChanges.isEmpty() ? myPanel : mySplitterWithSecondHideable.getComponent();
return !myIncludeBaseRevisionTextCheckBox.isVisible() || myChanges.isEmpty() ? myMainPanel : myPanelWithSelectedFiles;
}
public void installOkEnabledListener(final Consumer<Boolean> runnable) {
@@ -994,7 +994,7 @@ public class CommitChangeListDialog extends DialogWrapper implements CheckinProj
setSize(dialogSize.width, dialogSize.height - integer);
repaint();
}
}, true) {
}) {
@Override
protected RefreshablePanel createDetails() {
initDetails();