forgot to check length()
[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.util.text.StringUtil;
24 import com.intellij.ui.GuiUtils;
25 import org.jetbrains.annotations.NotNull;
26
27 import javax.swing.*;
28 import java.awt.*;
29 import java.awt.event.ActionEvent;
30 import java.util.Collection;
31 import java.util.HashSet;
32 import java.util.Set;
33
34 public class NewColorAndFontPanel extends JPanel {
35   private final ColorSettingsPage mySettingsPage;
36   private final SchemesPanel mySchemesPanel;
37   private final OptionsPanel myOptionsPanel;
38   private final PreviewPanel myPreviewPanel;
39   private final AbstractAction myCopyAction;
40   private final String myCategory;
41   private final Collection<String> myOptionList;
42
43   public NewColorAndFontPanel(final SchemesPanel schemesPanel,
44                               final OptionsPanel optionsPanel,
45                               final PreviewPanel previewPanel,
46                               final String category, final Collection<String> optionList, final ColorSettingsPage page) {
47     super(new BorderLayout(0, 10));
48     mySchemesPanel = schemesPanel;
49     myOptionsPanel = optionsPanel;
50     myPreviewPanel = previewPanel;
51     myCategory = category;
52     myOptionList = optionList;
53     mySettingsPage = page;
54
55     JPanel top = new JPanel(new BorderLayout());
56
57     top.add(mySchemesPanel, BorderLayout.NORTH);
58     top.add(myOptionsPanel.getPanel(), BorderLayout.CENTER);
59     if (optionsPanel instanceof ConsoleFontOptions) {
60       JPanel wrapper = new JPanel(new FlowLayout(FlowLayout.TRAILING));
61       myCopyAction = new AbstractAction(ApplicationBundle.message("action.apply.editor.font.settings")) {
62         @Override
63         public void actionPerformed(ActionEvent e) {
64           EditorColorsScheme scheme = ((ConsoleFontOptions)myOptionsPanel).getCurrentScheme();
65           scheme.setConsoleFontName(scheme.getEditorFontName());
66           scheme.setConsoleFontPreferences(scheme.getFontPreferences());
67           scheme.setConsoleFontSize(scheme.getEditorFontSize());
68           scheme.setConsoleLineSpacing(scheme.getLineSpacing());
69           myOptionsPanel.updateOptionsList();
70           myPreviewPanel.updateView();
71         }
72       };
73       wrapper.add(new JButton(myCopyAction));
74       top.add(wrapper, BorderLayout.SOUTH);
75     }
76     else {
77       myCopyAction = null;
78     }
79
80     // We don't want to show non-used preview panel (it's considered to be not in use if it doesn't contain text).
81     if (myPreviewPanel.getPanel() != null && (page == null || !StringUtil.isEmptyOrSpaces(page.getDemoText()))) {
82       @SuppressWarnings("SuspiciousNameCombination")
83       JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, top, myPreviewPanel.getPanel());
84       splitPane.setBorder(BorderFactory.createEmptyBorder());
85       splitPane.setContinuousLayout(true);
86       add(splitPane);
87       GuiUtils.replaceJSplitPaneWithIDEASplitter(splitPane);
88     }
89     else {
90       add(top, BorderLayout.CENTER);
91     }
92
93     previewPanel.addListener(new ColorAndFontSettingsListener.Abstract() {
94       @Override
95       public void selectionInPreviewChanged(final String typeToSelect) {
96         optionsPanel.selectOption(typeToSelect);
97       }
98     });
99
100     optionsPanel.addListener(new ColorAndFontSettingsListener.Abstract() {
101       @Override
102       public void settingsChanged() {
103         if (schemesPanel.updateDescription(true)) {
104           optionsPanel.applyChangesToScheme();
105           previewPanel.updateView();
106         }
107       }
108
109       @Override
110       public void selectedOptionChanged(final Object selected) {
111         if (ApplicationManager.getApplication().isDispatchThread()) {
112           myPreviewPanel.blinkSelectedHighlightType(selected);
113         }
114       }
115
116     });
117     mySchemesPanel.addListener(new ColorAndFontSettingsListener.Abstract() {
118       @Override
119       public void schemeChanged(final Object source) {
120         myOptionsPanel.updateOptionsList();
121         myPreviewPanel.updateView();
122         if (optionsPanel instanceof ConsoleFontOptions) {
123           ConsoleFontOptions options = (ConsoleFontOptions)optionsPanel;
124           boolean readOnly = ColorAndFontOptions.isReadOnly(options.getCurrentScheme());
125           myCopyAction.setEnabled(!readOnly);
126         }
127       }
128     });
129
130   }
131
132   public static NewColorAndFontPanel create(final PreviewPanel previewPanel, String category, final ColorAndFontOptions options,
133                                             Collection<String> optionList, ColorSettingsPage page) {
134     final SchemesPanel schemesPanel = new SchemesPanel(options);
135
136     final OptionsPanel optionsPanel = new OptionsPanelImpl(options, schemesPanel, category);
137
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 }