Revet color chemes API chages. Will be commited via "Remote run commit"
[fedora-idea.git] / platform-impl / src / com / intellij / openapi / editor / colors / impl / EditorColorsManagerImpl.java
blob088e429fb8f9716b8a562f16721d8422e86e8d86
1 /**
2 * @author Yura Cangea
3 */
4 package com.intellij.openapi.editor.colors.impl;
6 import com.intellij.openapi.application.PathManager;
7 import com.intellij.openapi.components.ExportableApplicationComponent;
8 import com.intellij.openapi.components.RoamingType;
9 import com.intellij.openapi.diagnostic.Logger;
10 import com.intellij.openapi.editor.colors.EditorColorsListener;
11 import com.intellij.openapi.editor.colors.EditorColorsManager;
12 import com.intellij.openapi.editor.colors.EditorColorsScheme;
13 import com.intellij.openapi.editor.colors.ex.DefaultColorSchemesManager;
14 import com.intellij.openapi.options.*;
15 import com.intellij.openapi.util.DefaultJDOMExternalizer;
16 import com.intellij.openapi.util.InvalidDataException;
17 import com.intellij.openapi.util.NamedJDOMExternalizable;
18 import com.intellij.openapi.util.WriteExternalException;
19 import org.jdom.Document;
20 import org.jdom.Element;
21 import org.jdom.JDOMException;
22 import org.jetbrains.annotations.NonNls;
23 import org.jetbrains.annotations.NotNull;
25 import java.io.File;
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import java.util.Collection;
29 import java.util.Collections;
30 import java.util.Comparator;
32 public class EditorColorsManagerImpl extends EditorColorsManager
33 implements NamedJDOMExternalizable, ExportableApplicationComponent {
34 private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.editor.colors.impl.EditorColorsManagerImpl");
36 private Collection<EditorColorsListener> myListeners = new ArrayList<EditorColorsListener>();
39 @NonNls private static final String NODE_NAME = "global_color_scheme";
40 @NonNls private static final String SCHEME_NODE_NAME = "scheme";
42 private String myGlobalSchemeName;
43 public boolean USE_ONLY_MONOSPACED_FONTS = true;
44 private DefaultColorSchemesManager myDefaultColorSchemesManager;
45 private final SchemesManager<EditorColorsScheme, EditorColorsSchemeImpl> mySchemesManager;
46 @NonNls private static final String NAME_ATTR = "name";
47 private static final String FILE_SPEC = "$ROOT_CONFIG$/colors";
49 public EditorColorsManagerImpl(DefaultColorSchemesManager defaultColorSchemesManager, SchemesManagerFactory schemesManagerFactory) {
50 myDefaultColorSchemesManager = defaultColorSchemesManager;
52 mySchemesManager = schemesManagerFactory.createSchemesManager(
53 FILE_SPEC,
54 new SchemeProcessor<EditorColorsSchemeImpl>() {
55 public EditorColorsSchemeImpl readScheme(final Document document)
56 throws InvalidDataException, IOException, JDOMException {
57 Element root = document.getRootElement();
59 if (root == null || !SCHEME_NODE_NAME.equals(root.getName())) {
60 throw new InvalidDataException();
63 EditorColorsSchemeImpl scheme = new EditorColorsSchemeImpl(null, DefaultColorSchemesManager.getInstance());
64 scheme.readExternal(root);
65 return scheme;
68 public Document writeScheme(final EditorColorsSchemeImpl scheme) throws WriteExternalException {
69 Element root = new Element(SCHEME_NODE_NAME);
70 try {
71 scheme.writeExternal(root);
73 catch (WriteExternalException e) {
74 LOG.error(e);
75 return null;
78 return new Document(root);
81 public void renameScheme(final String name, final EditorColorsScheme scheme) {
82 scheme.setName(name);
85 public boolean shouldBeSaved(final EditorColorsSchemeImpl scheme) {
86 return true;
89 public void initScheme(final EditorColorsSchemeImpl scheme) {
93 public void onSchemeAdded(final EditorColorsSchemeImpl scheme) {
97 public void onSchemeDeleted(final EditorColorsSchemeImpl scheme) {
100 public void onCurrentSchemeChanged(final Scheme newCurrentScheme) {
101 fireChanges(mySchemesManager.getCurrentScheme());
103 }, RoamingType.PER_USER);
106 addDefaultSchemes();
107 loadAllSchemes();
108 setGlobalScheme(myDefaultColorSchemesManager.getAllSchemes()[0]);
111 // -------------------------------------------------------------------------
112 // ApplicationComponent interface implementation
113 // -------------------------------------------------------------------------
115 public void disposeComponent() {
118 public void initComponent() {
121 // -------------------------------------------------------------------------
122 // Schemes manipulation routines
123 // -------------------------------------------------------------------------
125 public void addColorsScheme(EditorColorsScheme scheme) {
126 if (!isDefaultScheme(scheme) && scheme.getName().trim().length() > 0) {
127 mySchemesManager.addNewScheme(scheme, true);
131 public void removeAllSchemes() {
132 mySchemesManager.clearAllSchemes();
133 addDefaultSchemes();
136 private void addDefaultSchemes() {
137 DefaultColorsScheme[] allDefaultSchemes = myDefaultColorSchemesManager.getAllSchemes();
138 for (DefaultColorsScheme defaultScheme : allDefaultSchemes) {
139 mySchemesManager.addNewScheme(defaultScheme, true);
143 // -------------------------------------------------------------------------
144 // Getters & Setters
145 // -------------------------------------------------------------------------
147 public EditorColorsScheme[] getAllSchemes() {
148 ArrayList<EditorColorsScheme> schemes = new ArrayList<EditorColorsScheme>(mySchemesManager.getAllSchemes());
149 Collections.sort(schemes, new Comparator<EditorColorsScheme>() {
150 public int compare(EditorColorsScheme s1, EditorColorsScheme s2) {
151 if (isDefaultScheme(s1) && !isDefaultScheme(s2)) return -1;
152 if (!isDefaultScheme(s1) && isDefaultScheme(s2)) return 1;
154 return s1.getName().compareToIgnoreCase(s2.getName());
158 return schemes.toArray(new EditorColorsScheme[schemes.size()]);
161 public void setGlobalScheme(EditorColorsScheme scheme) {
162 mySchemesManager.setCurrentSchemeName(scheme == null ? DefaultColorSchemesManager.getInstance().getAllSchemes()[0].getName() : scheme.getName());
163 fireChanges(scheme);
166 public EditorColorsScheme getGlobalScheme() {
167 return mySchemesManager.getCurrentScheme();
170 public EditorColorsScheme getScheme(String schemeName) {
171 return mySchemesManager.findSchemeByName(schemeName);
174 private void fireChanges(EditorColorsScheme scheme) {
175 EditorColorsListener[] colorsListeners = myListeners.toArray(new EditorColorsListener[myListeners.size()]);
176 for (EditorColorsListener colorsListener : colorsListeners) {
177 colorsListener.globalSchemeChange(scheme);
181 // -------------------------------------------------------------------------
182 // Routines responsible for loading & saving colors schemes.
183 // -------------------------------------------------------------------------
185 private void loadAllSchemes() {
186 mySchemesManager.loadSchemes();
189 private static File getColorsDir(boolean create) {
190 @NonNls String directoryPath = PathManager.getConfigPath() + File.separator + "colors";
191 File directory = new File(directoryPath);
192 if (!directory.exists()) {
193 if (!create) return null;
194 if (!directory.mkdir()) {
195 LOG.error("Cannot create directory: " + directory.getAbsolutePath());
196 return null;
199 return directory;
203 public void addEditorColorsListener(EditorColorsListener listener) {
204 myListeners.add(listener);
207 public void removeEditorColorsListener(EditorColorsListener listener) {
208 myListeners.remove(listener);
211 public void setUseOnlyMonospacedFonts(boolean b) {
212 USE_ONLY_MONOSPACED_FONTS = b;
215 public boolean isUseOnlyMonospacedFonts() {
216 return USE_ONLY_MONOSPACED_FONTS;
219 public String getExternalFileName() {
220 return "colors.scheme";
223 @NotNull
224 public File[] getExportFiles() {
225 return new File[]{getColorsDir(true), PathManager.getOptionsFile(this)};
228 @NotNull
229 public String getPresentableName() {
230 return OptionsBundle.message("options.color.schemes.presentable.name");
233 public void readExternal(Element parentNode) throws InvalidDataException {
234 DefaultJDOMExternalizer.readExternal(this, parentNode);
235 Element element = parentNode.getChild(NODE_NAME);
236 if (element != null) {
237 String name = element.getAttributeValue(NAME_ATTR);
238 if (name != null && !"".equals(name.trim())) {
239 myGlobalSchemeName = name;
243 initGlobalScheme();
246 private void initGlobalScheme() {
247 if (myGlobalSchemeName != null) {
248 setGlobalSchemeByName(myGlobalSchemeName);
250 else {
251 setGlobalScheme(myDefaultColorSchemesManager.getAllSchemes()[0]);
255 private void setGlobalSchemeByName(String schemeName) {
256 setGlobalScheme(mySchemesManager.findSchemeByName(schemeName));
259 public void writeExternal(Element parentNode) throws WriteExternalException {
260 DefaultJDOMExternalizer.writeExternal(this, parentNode);
261 if (mySchemesManager.getCurrentScheme() != null) {
262 Element element = new Element(NODE_NAME);
263 element.setAttribute(NAME_ATTR, mySchemesManager.getCurrentScheme().getName());
264 parentNode.addContent(element);
268 public boolean isDefaultScheme(EditorColorsScheme scheme) {
269 return scheme instanceof DefaultColorsScheme;
272 public String getComponentName() {
273 return "EditorColorsManagerImpl";
276 public SchemesManager<EditorColorsScheme, EditorColorsSchemeImpl> getSchemesManager() {
277 return mySchemesManager;