Fix temp path calculation
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / diff / ex / DiffStatusBar.java
1 /*
2  * Copyright 2000-2009 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.diff.ex;
17
18 import com.intellij.openapi.editor.colors.EditorColorsManager;
19 import com.intellij.openapi.editor.colors.EditorColorsScheme;
20 import com.intellij.openapi.vcs.FileStatus;
21 import com.intellij.openapi.vcs.VcsBundle;
22 import com.intellij.ui.IdeBorderFactory;
23 import com.intellij.util.ui.UIUtil;
24
25 import javax.swing.*;
26 import java.awt.*;
27 import java.util.ArrayList;
28 import java.util.Arrays;
29 import java.util.Collection;
30 import java.util.List;
31
32 /**
33  * @author Yura Cangea
34  */
35 public class DiffStatusBar extends JPanel {
36   public static final List<? extends LegendTypeDescriptor> DEFAULT_TYPES =
37     Arrays.asList(
38       new LegendTypeDescriptorImpl(VcsBundle.message("diff.type.name.modified"), FileStatus.COLOR_MODIFIED),
39       new LegendTypeDescriptorImpl(VcsBundle.message("diff.type.name.added"), FileStatus.COLOR_ADDED),
40       new LegendTypeDescriptorImpl(VcsBundle.message("diff.type.name.deleted"), FileStatus.COLOR_MISSING));
41
42   private final Collection<JComponent> myLabels = new ArrayList<JComponent>();
43
44   private final JLabel myTextLabel = new JLabel("");
45   private static final int COMP_HEIGHT = 30;
46   private EditorColorsScheme myColorScheme = null;
47
48   public <T extends LegendTypeDescriptor> DiffStatusBar(List<T> types) {
49     for (T differenceType : types) {
50       addDiffType(differenceType);
51     }
52     initGui();
53   }
54
55   private void addDiffType(final LegendTypeDescriptor diffType){
56     addComponent(diffType);
57   }
58
59   private void addComponent(final LegendTypeDescriptor diffType) {
60     JComponent component = new JPanel() {
61       public void paint(Graphics g) {
62         setBackground(UIUtil.getPanelBackground());
63         super.paint(g);
64         FontMetrics metrics = getFontMetrics(getFont());
65
66         EditorColorsScheme colorScheme = myColorScheme != null
67                                          ? myColorScheme
68                                          : EditorColorsManager.getInstance().getGlobalScheme();
69         g.setColor(diffType.getLegendColor(colorScheme));
70         g.fill3DRect(10, (getHeight() - 10) / 2, 35, 10, true);
71
72         Font font = g.getFont();
73         if (font.getStyle() != Font.PLAIN) {
74           font = font.deriveFont(Font.PLAIN);
75         }
76         g.setFont(font);
77         g.setColor(UIUtil.getLabelForeground());
78         int textBaseline = (getHeight() - metrics.getHeight()) / 2 + metrics.getAscent();
79         g.drawString(diffType.getDisplayName(), 67, textBaseline);
80       }
81
82       @Override
83       public Dimension getPreferredSize() {
84         FontMetrics metrics = getFontMetrics(getFont());
85         return new Dimension((int)(70 + metrics.getStringBounds(diffType.getDisplayName(), getGraphics()).getWidth()), COMP_HEIGHT);
86       }
87
88       @Override
89       public Dimension getMinimumSize() {
90         return getPreferredSize();
91       }
92     };
93     myLabels.add(component);
94   }
95
96   public Dimension getMinimumSize() {
97     Dimension p = super.getPreferredSize();
98     Dimension m = super.getMinimumSize();
99     return new Dimension(m.width, p.height);
100   }
101
102   public Dimension getMaximumSize() {
103     Dimension p = super.getPreferredSize();
104     Dimension m = super.getMaximumSize();
105     return new Dimension(m.width, p.height);
106   }
107
108   public void setText(String text) {
109     myTextLabel.setText(text);
110   }
111
112   private void initGui() {
113     JComponent filler = new JComponent() {
114       @Override
115       public Dimension getPreferredSize() {
116         return myTextLabel.getPreferredSize();
117       }
118     };
119     setLayout(new BorderLayout());
120     setBorder(BorderFactory.createCompoundBorder(IdeBorderFactory.createBorder(),
121                                                  BorderFactory.createEmptyBorder(3, 20, 3, 20)));
122
123     add(myTextLabel, BorderLayout.WEST);
124     Box box = Box.createHorizontalBox();
125     box.add(Box.createHorizontalGlue());
126     JPanel panel = new JPanel(new GridLayout(1, myLabels.size(), 0, 0));
127     for (final JComponent myLabel : myLabels) {
128       panel.add(myLabel);
129     }
130     panel.setMaximumSize(panel.getPreferredSize());
131     box.add(panel);
132     box.add(Box.createHorizontalGlue());
133     add(box, BorderLayout.CENTER);
134
135     add(filler, BorderLayout.EAST);
136   }
137
138   public void setColorScheme(EditorColorsScheme colorScheme) {
139     EditorColorsScheme oldScheme = myColorScheme;
140     myColorScheme = colorScheme;
141     if (oldScheme != colorScheme) repaint();
142   }
143
144   public interface LegendTypeDescriptor {
145     String getDisplayName();
146     Color getLegendColor(EditorColorsScheme colorScheme);
147   }
148
149   static class LegendTypeDescriptorImpl implements LegendTypeDescriptor {
150     private final String myDisplayName;
151     private final Color myColor;
152
153     LegendTypeDescriptorImpl(final String displayName, final Color color) {
154       myDisplayName = displayName;
155       myColor = color;
156     }
157
158     public String getDisplayName() {
159       return myDisplayName;
160     }
161
162     public Color getLegendColor(final EditorColorsScheme colorScheme) {
163       return myColor;
164     }
165   }
166 }