Merge branch 'master' into uta/rainbow
[idea/community.git] / platform / lang-impl / src / com / intellij / application / options / colors / NewColorAndFontPanel.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.colors;
18
19 import com.intellij.openapi.application.ApplicationBundle;
20 import com.intellij.openapi.application.ApplicationManager;
21 import com.intellij.openapi.editor.colors.EditorColorsScheme;
22 import com.intellij.openapi.options.colors.ColorSettingsPage;
23 import com.intellij.openapi.editor.colors.EditorSchemeAttributeDescriptor;
24 import com.intellij.openapi.util.text.StringUtil;
25 import com.intellij.ui.GuiUtils;
26 import org.jetbrains.annotations.NotNull;
27
28 import javax.swing.*;
29 import java.awt.*;
30 import java.awt.event.ActionEvent;
31 import java.util.Collection;
32 import java.util.HashSet;
33 import java.util.Set;
34
35 public class NewColorAndFontPanel extends JPanel {
36   private final ColorSettingsPage mySettingsPage;
37   private final SchemesPanel mySchemesPanel;
38   private final OptionsPanel myOptionsPanel;
39   private final PreviewPanel myPreviewPanel;
40   private final AbstractAction myCopyAction;
41   private final String myCategory;
42   private final Collection<String> myOptionList;
43
44   public NewColorAndFontPanel(final SchemesPanel schemesPanel,
45                               final OptionsPanel optionsPanel,
46                               final PreviewPanel previewPanel,
47                               final String category, final Collection<String> optionList, final ColorSettingsPage page) {
48     super(new BorderLayout(0, 10));
49     mySchemesPanel = schemesPanel;
50     myOptionsPanel = optionsPanel;
51     myPreviewPanel = previewPanel;
52     myCategory = category;
53     myOptionList = optionList;
54     mySettingsPage = page;
55
56     JPanel top = new JPanel(new BorderLayout());
57
58     top.add(mySchemesPanel, BorderLayout.NORTH);
59     top.add(myOptionsPanel.getPanel(), BorderLayout.CENTER);
60     if (optionsPanel instanceof ConsoleFontOptions) {
61       JPanel wrapper = new JPanel(new FlowLayout(FlowLayout.TRAILING));
62       myCopyAction = new AbstractAction(ApplicationBundle.message("action.apply.editor.font.settings")) {
63         @Override
64         public void actionPerformed(ActionEvent e) {
65           EditorColorsScheme scheme = ((ConsoleFontOptions)myOptionsPanel).getCurrentScheme();
66           scheme.setConsoleFontName(scheme.getEditorFontName());
67           scheme.setConsoleFontPreferences(scheme.getFontPreferences());
68           scheme.setConsoleFontSize(scheme.getEditorFontSize());
69           scheme.setConsoleLineSpacing(scheme.getLineSpacing());
70           myOptionsPanel.updateOptionsList();
71           myPreviewPanel.updateView();
72         }
73       };
74       wrapper.add(new JButton(myCopyAction));
75       top.add(wrapper, BorderLayout.SOUTH);
76     }
77     else {
78       myCopyAction = null;
79     }
80
81     // We don't want to show non-used preview panel (it's considered to be not in use if it doesn't contain text).
82     if (myPreviewPanel.getPanel() != null && (page == null || !StringUtil.isEmptyOrSpaces(page.getDemoText()))) {
83       @SuppressWarnings("SuspiciousNameCombination")
84       JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, top, myPreviewPanel.getPanel());
85       splitPane.setBorder(BorderFactory.createEmptyBorder());
86       splitPane.setContinuousLayout(true);
87       add(splitPane);
88       GuiUtils.replaceJSplitPaneWithIDEASplitter(splitPane);
89     }
90     else {
91       add(top, BorderLayout.CENTER);
92     }
93
94     previewPanel.addListener(new ColorAndFontSettingsListener.Abstract() {
95       @Override
96       public void selectionInPreviewChanged(final String typeToSelect) {
97         optionsPanel.selectOption(typeToSelect);
98       }
99     });
100
101     optionsPanel.addListener(new ColorAndFontSettingsListener.Abstract() {
102       @Override
103       public void settingsChanged() {
104         optionsPanel.applyChangesToScheme();
105         previewPanel.updateView();
106       }
107
108       @Override
109       public void selectedOptionChanged(final Object selected) {
110         if (ApplicationManager.getApplication().isDispatchThread()) {
111           myPreviewPanel.blinkSelectedHighlightType(selected);
112         }
113       }
114
115     });
116     mySchemesPanel.addListener(new ColorAndFontSettingsListener.Abstract() {
117       @Override
118       public void schemeChanged(final Object source) {
119         myOptionsPanel.updateOptionsList();
120         myPreviewPanel.updateView();
121         if (optionsPanel instanceof ConsoleFontOptions) {
122           ConsoleFontOptions options = (ConsoleFontOptions)optionsPanel;
123           boolean readOnly = ColorAndFontOptions.isReadOnly(options.getCurrentScheme());
124           myCopyAction.setEnabled(!readOnly);
125         }
126       }
127     });
128
129   }
130
131   public static NewColorAndFontPanel create(final PreviewPanel previewPanel, String category, final ColorAndFontOptions options,
132                                             Collection<String> optionList, ColorSettingsPage page) {
133     final SchemesPanel schemesPanel = new SchemesPanel(options);
134
135     final OptionsPanel optionsPanel = new OptionsPanelImpl(
136       options, schemesPanel, category,
137       new CustomizedSwitcherPanel(options.getColorAndFontGlobalState(), previewPanel, page));
138
139     return new NewColorAndFontPanel(schemesPanel, optionsPanel, previewPanel, category, optionList, page);
140   }
141
142   public Runnable showOption(final String option) {
143     return myOptionsPanel.showOption(option);
144   }
145
146   @NotNull
147   public Set<String> processListOptions() {
148     if (myOptionList == null) {
149       return myOptionsPanel.processListOptions();
150     }
151     else {
152       final HashSet<String> result = new HashSet<>();
153       for (String s : myOptionList) {
154         result.add(s);
155       }
156       return result;
157     }
158   }
159
160
161   public String getDisplayName() {
162     return myCategory;
163   }
164
165   public void reset(Object source) {
166     resetSchemesCombo(source);
167   }
168
169   public void disposeUIResources() {
170     myPreviewPanel.disposeUIResources();
171   }
172
173   public void addSchemesListener(final ColorAndFontSettingsListener schemeListener) {
174     mySchemesPanel.addListener(schemeListener);
175   }
176
177   private void resetSchemesCombo(Object source) {
178     mySchemesPanel.resetSchemesCombo(source);
179   }
180
181   public boolean contains(final EditorSchemeAttributeDescriptor descriptor) {
182     return descriptor.getGroup().equals(myCategory);
183   }
184
185   public JComponent getPanel() {
186     return this;
187   }
188
189   public void updatePreview() {
190     myPreviewPanel.updateView();
191   }
192
193   public void addDescriptionListener(final ColorAndFontSettingsListener listener) {
194     myOptionsPanel.addListener(listener);
195   }
196
197   public boolean containsFontOptions() {
198     return false;
199   }
200
201   public ColorSettingsPage getSettingsPage() {
202     return mySettingsPage;
203   }
204 }