[platform] mock update server
[idea/community.git] / platform / util / src / com / intellij / util / ui / JBUI.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.util.ui;
17
18 import com.intellij.openapi.diagnostic.Logger;
19 import com.intellij.openapi.util.IconLoader;
20 import com.intellij.openapi.util.Pair;
21 import com.intellij.openapi.util.SystemInfo;
22 import com.intellij.ui.border.CustomLineBorder;
23 import com.intellij.util.SystemProperties;
24 import com.intellij.util.ui.components.BorderLayoutPanel;
25 import org.jetbrains.annotations.NotNull;
26 import org.jetbrains.annotations.Nullable;
27
28 import javax.swing.*;
29 import javax.swing.border.Border;
30 import javax.swing.border.CompoundBorder;
31 import javax.swing.plaf.UIResource;
32 import java.awt.*;
33
34 /**
35  * @author Konstantin Bulenkov
36  */
37 public class JBUI {
38   private static final Logger LOG = Logger.getInstance("#com.intellij.util.ui.JBUI");
39
40   private static float scaleFactor = 1.0f;
41
42   static {
43     calculateScaleFactor();
44   }
45
46   private static void calculateScaleFactor() {
47     if (SystemInfo.isMac) {
48       LOG.info("UI scale factor: 1.0");
49       scaleFactor = 1.0f;
50       return;
51     }
52
53     if (SystemProperties.has("hidpi") && !SystemProperties.is("hidpi")) {
54       LOG.info("UI scale factor: 1.0");
55       scaleFactor = 1.0f;
56       return;
57     }
58
59     UIUtil.initSystemFontData();
60     Pair<String, Integer> fdata = UIUtil.getSystemFontData();
61
62     int size;
63     if (fdata != null) {
64       size = fdata.getSecond();
65     } else {
66       size = Fonts.label().getSize();
67     }
68     setScaleFactor(size/UIUtil.DEF_SYSTEM_FONT_SIZE);
69   }
70
71   public static void setScaleFactor(float scale) {
72     if (SystemProperties.has("hidpi") && !SystemProperties.is("hidpi")) {
73       return;
74     }
75
76     if (scale < 1.25f) scale = 1.0f;
77     else if (scale < 1.5f) scale = 1.25f;
78     else if (scale < 1.75f) scale = 1.5f;
79     else if (scale < 2f) scale = 1.75f;
80     else scale = 2.0f;
81
82     if (SystemInfo.isLinux && scale == 1.25f) {
83       //Default UI font size for Unity and Gnome is 15. Scaling factor 1.25f works badly on Linux
84       scale = 1f;
85     }
86     if (scaleFactor == scale) {
87       return;
88     }
89     LOG.info("UI scale factor: " + scale);
90
91     scaleFactor = scale;
92     IconLoader.setScale(scale);
93   }
94
95   public static int scale(int i) {
96     return Math.round(scaleFactor * i);
97   }
98
99   public static int scaleFontSize(int fontSize) {
100     if (scaleFactor == 1.25f) return (int)(fontSize * 1.34f);
101     if (scaleFactor == 1.75f) return (int)(fontSize * 1.67f);
102     return scale(fontSize);
103   }
104
105   public static JBDimension size(int width, int height) {
106     return new JBDimension(width, height);
107   }
108
109   public static JBDimension size(int widthAndHeight) {
110     return new JBDimension(widthAndHeight, widthAndHeight);
111   }
112
113   public static JBDimension size(Dimension size) {
114     if (size instanceof JBDimension) {
115       final JBDimension jbSize = (JBDimension)size;
116       if (jbSize.originalScale == scale(1f)) {
117         return jbSize;
118       }
119       final JBDimension newSize = new JBDimension((int)(jbSize.width / jbSize.originalScale), (int)(jbSize.height / jbSize.originalScale));
120       return size instanceof UIResource ? newSize.asUIResource() : newSize;
121     }
122     return new JBDimension(size.width, size.height);
123   }
124
125   public static JBInsets insets(int top, int left, int bottom, int right) {
126     return new JBInsets(top, left, bottom, right);
127   }
128
129   public static JBInsets insets(int all) {
130     return insets(all, all, all, all);
131   }
132
133   public static JBInsets insets(int topBottom, int leftRight) {
134     return insets(topBottom, leftRight, topBottom, leftRight);
135   }
136
137   public static JBInsets emptyInsets() {
138     return new JBInsets(0, 0, 0, 0);
139   }
140
141   public static JBInsets insetsTop(int t) {
142     return insets(t, 0, 0, 0);
143   }
144
145   public static JBInsets insetsLeft(int l) {
146     return insets(0, l, 0, 0);
147   }
148
149   public static JBInsets insetsBottom(int b) {
150     return insets(0, 0, b, 0);
151   }
152
153   public static JBInsets insetsRight(int r) {
154     return insets(0, 0, 0, r);
155   }
156
157   public static EmptyIcon emptyIcon(int i) {
158     return (EmptyIcon)EmptyIcon.create(scale(i));
159   }
160
161   public static JBDimension emptySize() {
162     return new JBDimension(0, 0);
163   }
164
165   public static float scale(float f) {
166     return f * scaleFactor;
167   }
168
169   public static JBInsets insets(Insets insets) {
170     return JBInsets.create(insets);
171   }
172
173   public static boolean isHiDPI() {
174     return scaleFactor > 1.0f;
175   }
176
177   public static class Fonts {
178     public static JBFont label() {
179       return JBFont.create(UIManager.getFont("Label.font"), false);
180     }
181
182     public static JBFont label(float size) {
183       return label().deriveFont(scale(size));
184     }
185
186     public static JBFont smallFont() {
187       return label().deriveFont(UIUtil.getFontSize(UIUtil.FontSize.SMALL));
188     }
189
190     public static JBFont miniFont() {
191       return label().deriveFont(UIUtil.getFontSize(UIUtil.FontSize.MINI));
192     }
193
194     public static JBFont create(String fontFamily, int size) {
195       return JBFont.create(new Font(fontFamily, Font.PLAIN, size));
196     }
197   }
198
199   public static class Borders {
200     public static JBEmptyBorder empty(int top, int left, int bottom, int right) {
201       return new JBEmptyBorder(top, left, bottom, right);
202     }
203
204     public static JBEmptyBorder empty(int topAndBottom, int leftAndRight) {
205       return empty(topAndBottom, leftAndRight, topAndBottom, leftAndRight);
206     }
207
208     public static JBEmptyBorder emptyTop(int offset) {
209       return empty(offset, 0, 0, 0);
210     }
211
212     public static JBEmptyBorder emptyLeft(int offset) {
213       return empty(0, offset,  0, 0);
214     }
215
216     public static JBEmptyBorder emptyBottom(int offset) {
217       return empty(0, 0, offset, 0);
218     }
219
220     public static JBEmptyBorder emptyRight(int offset) {
221       return empty(0, 0, 0, offset);
222     }
223
224     public static JBEmptyBorder empty() {
225       return empty(0, 0, 0, 0);
226     }
227
228     public static Border empty(int offsets) {
229       return empty(offsets, offsets, offsets, offsets);
230     }
231
232     public static Border customLine(Color color, int top, int left, int bottom, int right) {
233       return new CustomLineBorder(color, insets(top, left, bottom, right));
234     }
235
236     public static Border customLine(Color color, int thickness) {
237       return customLine(color, thickness, thickness, thickness, thickness);
238     }
239
240     public static Border customLine(Color color) {
241       return customLine(color, 1);
242     }
243
244     public static Border merge(@Nullable Border source, @NotNull Border extra, boolean extraIsOutside) {
245       if (source == null) return extra;
246       return new CompoundBorder(extraIsOutside ? extra : source, extraIsOutside? source : extra);
247     }
248   }
249
250   public static class Panels {
251     public static BorderLayoutPanel simplePanel() {
252       return new BorderLayoutPanel();
253     }
254
255     public static BorderLayoutPanel simplePanel(Component comp) {
256       return simplePanel().addToCenter(comp);
257     }
258
259     public static BorderLayoutPanel simplePanel(int hgap, int vgap) {
260       return new BorderLayoutPanel(hgap, vgap);
261     }
262   }
263 }