blob: c65af1ecdb4fc0970077adb8fa6856c11a21d17b [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.ui.tabs;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.components.*;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.ui.ColorUtil;
import com.intellij.ui.FileColorManager;
import com.intellij.ui.JBColor;
import com.intellij.ui.LightColors;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.UIUtil;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* @author spleaner
* @author Konstantin Bulenkov
*/
@State(
name = "FileColors",
storages = {@Storage( file = StoragePathMacros.WORKSPACE_FILE)})
public class FileColorManagerImpl extends FileColorManager implements PersistentStateComponent<Element> {
public static final String FC_ENABLED = "FileColorsEnabled";
public static final String FC_TABS_ENABLED = "FileColorsForTabsEnabled";
public static final String FC_PROJECT_VIEW_ENABLED = "FileColorsForProjectViewEnabled";
private final Project myProject;
private final FileColorsModel myModel;
private FileColorSharedConfigurationManager mySharedConfigurationManager;
private static final Map<String, Color> ourDefaultColors = ContainerUtil.<String, Color>immutableMapBuilder()
.put("Blue", new JBColor(new Color(0xdcf0ff), new Color(0x2B3557)))
.put("Green", new JBColor(new Color(231, 250, 219), new Color(0x2A3B2C)))
.put("Orange", new JBColor(new Color(246, 224, 202), new Color(0x823B1C)))
.put("Rose", new JBColor(new Color(242, 206, 202), new Color(0x542F3A)))
.put("Violet", new JBColor(new Color(222, 213, 241), new Color(0x4f4056)))
.put("Yellow", new JBColor(new Color(255, 255, 228), new Color(0x494539)))
.build();
public FileColorManagerImpl(@NotNull final Project project) {
myProject = project;
myModel = new FileColorsModel(project);
}
private void initSharedConfigurations() {
if (mySharedConfigurationManager == null) {
mySharedConfigurationManager = ServiceManager.getService(myProject, FileColorSharedConfigurationManager.class);
}
}
@Override
public boolean isEnabled() {
return _isEnabled();
}
public static boolean _isEnabled() {
return PropertiesComponent.getInstance().getBoolean(FC_ENABLED, true);
}
@Override
public void setEnabled(boolean enabled) {
PropertiesComponent.getInstance().setValue(FC_ENABLED, Boolean.toString(enabled));
}
public void setEnabledForTabs(boolean enabled) {
PropertiesComponent.getInstance().setValue(FC_TABS_ENABLED, Boolean.toString(enabled));
}
@Override
public boolean isEnabledForTabs() {
return _isEnabledForTabs();
}
public static boolean _isEnabledForTabs() {
return PropertiesComponent.getInstance().getBoolean(FC_TABS_ENABLED, true);
}
@Override
public boolean isEnabledForProjectView() {
return _isEnabledForProjectView();
}
public static boolean _isEnabledForProjectView() {
return PropertiesComponent.getInstance().getBoolean(FC_PROJECT_VIEW_ENABLED, true);
}
public static void setEnabledForProjectView(boolean enabled) {
PropertiesComponent.getInstance().setValue(FC_PROJECT_VIEW_ENABLED, Boolean.toString(enabled));
}
public Element getState(final boolean shared) {
Element element = new Element("state");
myModel.save(element, shared);
return element;
}
@Override
@SuppressWarnings({"MethodMayBeStatic"})
@Nullable
public Color getColor(@NotNull final String name) {
Color color = ourDefaultColors.get(name);
return color == null ? ColorUtil.fromHex(name, null) : color;
}
@Override
public Element getState() {
initSharedConfigurations();
return getState(false);
}
@SuppressWarnings({"AutoUnboxing"})
void loadState(Element state, final boolean shared) {
myModel.load(state, shared);
}
@Override
@SuppressWarnings({"MethodMayBeStatic"})
public Collection<String> getColorNames() {
List<String> sorted = ContainerUtil.newArrayList(ourDefaultColors.keySet());
Collections.sort(sorted);
return sorted;
}
@Override
@SuppressWarnings({"AutoUnboxing"})
public void loadState(Element state) {
initSharedConfigurations();
loadState(state, false);
}
@Override
public boolean isColored(@NotNull final String scopeName, final boolean shared) {
return myModel.isColored(scopeName, shared);
}
@Nullable
@Override
public Color getRendererBackground(VirtualFile vFile) {
if (vFile == null) return null;
if (isEnabled()) {
final Color fileColor = getFileColor(vFile);
if (fileColor != null) return fileColor;
}
//todo[kb] slightly_green for darcula
return FileEditorManager.getInstance(myProject).isFileOpen(vFile) && !UIUtil.isUnderDarcula() ? LightColors.SLIGHTLY_GREEN : null;
}
@Nullable
@Override
public Color getRendererBackground(PsiFile file) {
if (file == null) return null;
final VirtualFile vFile = file.getVirtualFile();
if (vFile == null) return null;
return getRendererBackground(vFile);
}
@Override
@Nullable
public Color getFileColor(@NotNull final PsiFile file) {
initSharedConfigurations();
final String colorName = myModel.getColor(file);
return colorName == null ? null : getColor(colorName);
}
@Override
@Nullable
public Color getFileColor(@NotNull final VirtualFile file) {
initSharedConfigurations();
final String colorName = myModel.getColor(file, getProject());
return colorName == null ? null : getColor(colorName);
}
@Override
public boolean isShared(@NotNull final String scopeName) {
return myModel.isShared(scopeName);
}
FileColorsModel getModel() {
return myModel;
}
@Override
public Project getProject() {
return myProject;
}
public List<FileColorConfiguration> getLocalConfigurations() {
return myModel.getLocalConfigurations();
}
public List<FileColorConfiguration> getSharedConfigurations() {
return myModel.getSharedConfigurations();
}
@Nullable
public static String getColorName(Color color) {
for (String name : ourDefaultColors.keySet()) {
if (color.equals(ourDefaultColors.get(name))) {
return name;
}
}
return null;
}
static String getAlias(String text) {
if (UIUtil.isUnderDarcula()) {
if (text.equals("Yellow")) return "Brown";
}
return text;
}
}