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
;
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(
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
);
68 public Document
writeScheme(final EditorColorsSchemeImpl scheme
) throws WriteExternalException
{
69 Element root
= new Element(SCHEME_NODE_NAME
);
71 scheme
.writeExternal(root
);
73 catch (WriteExternalException e
) {
78 return new Document(root
);
81 public void renameScheme(final String name
, final EditorColorsScheme scheme
) {
85 public boolean shouldBeSaved(final EditorColorsSchemeImpl scheme
) {
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
);
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();
136 private void addDefaultSchemes() {
137 DefaultColorsScheme
[] allDefaultSchemes
= myDefaultColorSchemesManager
.getAllSchemes();
138 for (DefaultColorsScheme defaultScheme
: allDefaultSchemes
) {
139 mySchemesManager
.addNewScheme(defaultScheme
, true);
143 // -------------------------------------------------------------------------
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());
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());
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";
224 public File
[] getExportFiles() {
225 return new File
[]{getColorsDir(true), PathManager
.getOptionsFile(this)};
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
;
246 private void initGlobalScheme() {
247 if (myGlobalSchemeName
!= null) {
248 setGlobalSchemeByName(myGlobalSchemeName
);
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
;