replaced <code></code> with more concise {@code}
[idea/community.git] / platform / platform-api / src / com / intellij / openapi / ui / FixedSizeButton.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.ui;
17
18 import com.intellij.icons.AllIcons;
19 import com.intellij.util.ui.JBUI;
20 import com.intellij.util.ui.UIUtil;
21 import org.jetbrains.annotations.NotNull;
22
23 import javax.swing.*;
24 import java.awt.*;
25
26 /**
27  * This class represents non-resizable, non-focusable button with the
28  * same height and length.
29  */
30 public class FixedSizeButton extends JButton {
31   private int mySize;
32   private JComponent myComponent;
33
34   public FixedSizeButton() {
35     this(-1, null);
36   }
37
38   private FixedSizeButton(int size, JComponent component) {
39     Icon icon = AllIcons.General.Ellipsis;
40     if (icon != null) {
41       // loading may fail at design time
42       setIcon(icon);
43     }
44     else {
45       setText(".");
46     }
47     mySize = size;
48     myComponent = component;
49     setMargin(JBUI.emptyInsets());
50     setDefaultCapable(false);
51     setFocusable(false);
52     if (((UIUtil.isUnderAquaLookAndFeel()) && size == -1) || UIUtil.isUnderIntelliJLaF() || UIUtil.isUnderDarcula()) {
53       putClientProperty("JButton.buttonType", "square");
54     }
55   }
56
57   /**
58    * Creates the {@code FixedSizeButton} with specified size.
59    *
60    * @throws IllegalArgumentException
61    *          if {@code size} isn't
62    *          positive integer number.
63    */
64   public FixedSizeButton(int size) {
65     this(size, null);
66     if (size <= 0) {
67       throw new IllegalArgumentException("wrong size: " + size);
68     }
69   }
70
71   /**
72    * Creates the {@code FixedSizeButton} which size is equals to
73    * {@code component.getPreferredSize().height}. It is very convenient
74    * way to create "browse" like button near the text fields.
75    */
76   public FixedSizeButton(@NotNull JComponent component) {
77     this(-1, component);
78   }
79
80   public Dimension getMinimumSize() {
81     return getPreferredSize();
82   }
83
84   public Dimension getMaximumSize() {
85     return getPreferredSize();
86   }
87
88   public Dimension getPreferredSize() {
89     if (myComponent != null) {
90       int size = myComponent.getPreferredSize().height;
91       if (myComponent instanceof JComboBox &&
92           !(UIUtil.isUnderDefaultMacTheme() || UIUtil.isUnderWin10LookAndFeel()) || UIUtil.isUnderDarcula()) {
93         // JComboBox's preferred height is 2px greater than JTextField's one, because
94         // javax.swing.DefaultListCellRenderer#getNoFocusBorder returns (1,1,1,1) border.
95         // Decrement to have equal sizes for pretty look when stacked vertically
96         // Mac default border is computed correctly, so don't account for on Mac.
97         size -= 2;
98       }
99       return new Dimension(size, size);
100     }
101     if (mySize != -1) {
102       return new Dimension(mySize, mySize);
103     }
104     return super.getPreferredSize();
105   }
106
107   public void setAttachedComponent(JComponent component) {
108     myComponent = component;
109   }
110
111   public JComponent getAttachedComponent() {
112     return myComponent;
113   }
114
115   public void setSize(int size) {
116     mySize = size;
117   }
118
119   @Override
120   public void setBounds(int x, int y, int width, int height) {
121     int size = Math.min(width, height);
122     super.setBounds(x, y, size, size);
123   }
124
125   @Override
126   public void setBounds(Rectangle r) {
127     if (r.width != r.height) {
128       int size = Math.min(r.width, r.height);
129       r = new Rectangle(r.x, r.y, size, size);
130     }
131     super.setBounds(r);
132   }
133 }