Code style settings UI: "Set from" button moved to tabs
[idea/community.git] / platform / lang-impl / src / com / intellij / application / options / codeStyle / CodeStyleSchemesPanel.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
17 package com.intellij.application.options.codeStyle;
18
19 import com.intellij.application.options.CodeStyleAbstractPanel;
20 import com.intellij.openapi.application.ApplicationManager;
21 import com.intellij.psi.codeStyle.*;
22 import com.intellij.ui.components.JBScrollPane;
23 import org.jetbrains.annotations.Nullable;
24
25 import javax.swing.*;
26 import java.awt.*;
27 import java.awt.event.ActionEvent;
28 import java.awt.event.ActionListener;
29 import java.util.*;
30 import java.util.List;
31
32 public class CodeStyleSchemesPanel{
33   private JComboBox myCombo;
34
35   private final CodeStyleSchemesModel myModel;
36   private JPanel myPanel;
37   private JBScrollPane myJBScrollPane;
38   private JButton myManageButton;
39
40   private boolean myIsReset = false;
41   private NewCodeStyleSettingsPanel mySettingsPanel;
42   private final Font myDefaultComboFont;
43   private final Font myBoldComboFont;
44
45   public CodeStyleSchemesPanel(CodeStyleSchemesModel model) {
46     myModel = model;
47
48     myDefaultComboFont = myCombo.getFont();
49     myBoldComboFont = myDefaultComboFont.deriveFont(Font.BOLD);
50     myCombo.addActionListener(new ActionListener() {
51       public void actionPerformed(ActionEvent e) {
52         if (!myIsReset) {
53           ApplicationManager.getApplication().invokeLater(new Runnable() {
54                 public void run() {
55                   onCombo();
56                 }
57               });
58         }
59       }
60     });
61     myCombo.setRenderer(new DefaultListCellRenderer() {
62       @Override
63       public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
64         Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
65         Font font = myDefaultComboFont;
66         if (value instanceof CodeStyleScheme) {
67           CodeStyleScheme scheme = (CodeStyleScheme)value;
68           if (scheme.isDefault() || myModel.isProjectScheme(scheme)) {
69             font = myBoldComboFont;
70           }
71         }
72         component.setFont(font);
73         return component;
74       }
75     });
76     
77     myManageButton.addActionListener(new ActionListener() {
78       @Override
79       public void actionPerformed(ActionEvent e) {
80         showManageSchemesDialog();
81       }
82     });
83     
84     myJBScrollPane.setBorder(null);
85   }
86
87   private void onCombo() {
88     CodeStyleScheme selected = getSelectedScheme();
89     if (selected != null) {
90       if (myModel.isProjectScheme(selected)) {
91         myModel.setUsePerProjectSettings(true);
92       }
93       else {
94         myModel.setUsePerProjectSettings(false);
95         myModel.selectScheme(selected, this);
96       }
97     }
98   }
99
100   @Nullable
101   private CodeStyleScheme getSelectedScheme() {
102     Object selected = myCombo.getSelectedItem();
103     if (selected instanceof CodeStyleScheme) {
104       return (CodeStyleScheme)selected;
105     }
106     return null;
107   }
108
109   public void disposeUIResources() {
110     myPanel.removeAll();
111   }
112
113   public void resetSchemesCombo() {
114     myIsReset = true;
115     try {
116       List<CodeStyleScheme> schemes = new ArrayList<CodeStyleScheme>();
117       schemes.addAll(myModel.getAllSortedSchemes());
118       DefaultComboBoxModel model = new DefaultComboBoxModel(schemes.toArray());
119       myCombo.setModel(model);
120       myCombo.setSelectedItem(myModel.getSelectedGlobalScheme());
121     }
122     finally {
123       myIsReset = false;
124     }
125
126
127   }
128
129
130   public void onSelectedSchemeChanged() {
131     myIsReset = true;
132     try {
133       if (myModel.isUsePerProjectSettings()) {
134         myCombo.setSelectedItem(myModel.getProjectScheme());
135       }
136       else {
137         myCombo.setSelectedItem(myModel.getSelectedGlobalScheme());
138       }
139     }
140     finally {
141       myIsReset = false;
142     }
143   }
144
145   public JComponent getPanel() {
146     return myPanel;
147   }
148
149   public void setCodeStyleSettingsPanel(NewCodeStyleSettingsPanel settingsPanel) {
150     mySettingsPanel = settingsPanel;
151   }
152
153   private void showManageSchemesDialog() {
154     ManageCodeStyleSchemesDialog manageSchemesDialog = new ManageCodeStyleSchemesDialog(myPanel, myModel);
155     manageSchemesDialog.show();
156   }
157
158   public void usePerProjectSettingsOptionChanged() {
159     if (myModel.isProjectScheme(myModel.getSelectedScheme())) {
160       myCombo.setSelectedItem(myModel.getProjectScheme());
161     }
162     else {
163       myCombo.setSelectedItem(myModel.getSelectedScheme());
164     }
165   }
166 }