blob: 23a8c3806fb9a2e4a3156c9c6c2a8364c47422bc [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.application.options.codeStyle.arrangement.color;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.psi.codeStyle.arrangement.std.ArrangementColorsAware;
import com.intellij.psi.codeStyle.arrangement.std.ArrangementSettingsToken;
import com.intellij.ui.GroupedElementsRenderer;
import com.intellij.util.containers.ContainerUtilRt;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
import java.util.Map;
/**
* @author Denis Zhdanov
* @since 10/24/12 4:25 PM
*/
public class ArrangementColorsProviderImpl implements ArrangementColorsProvider {
@NotNull private final Map<ArrangementSettingsToken, TextAttributes> myNormalAttributesCache = ContainerUtilRt.newHashMap();
@NotNull private final Map<ArrangementSettingsToken, TextAttributes> mySelectedAttributesCache = ContainerUtilRt.newHashMap();
@NotNull private final TextAttributes myDefaultNormalAttributes = new TextAttributes();
@NotNull private final TextAttributes myDefaultSelectedAttributes = new TextAttributes();
@NotNull private final Color myDefaultNormalBorderColor;
@NotNull private final Color myDefaultSelectedBorderColor;
@Nullable private final ArrangementColorsAware myColorsAware;
@Nullable private Color myCachedNormalBorderColor;
@Nullable private Color myCachedSelectedBorderColor;
public ArrangementColorsProviderImpl(@Nullable ArrangementColorsAware colorsAware) {
myColorsAware = colorsAware;
// Default settings.
myDefaultNormalAttributes.setForegroundColor(UIUtil.getTreeTextForeground());
myDefaultNormalAttributes.setBackgroundColor(UIUtil.getPanelBackground());
myDefaultSelectedAttributes.setForegroundColor(UIUtil.getTreeSelectionForeground());
myDefaultSelectedAttributes.setBackgroundColor(UIUtil.getTreeSelectionBackground());
myDefaultNormalBorderColor = UIUtil.getBorderColor();
Color selectionBorderColor = UIUtil.getTreeSelectionBorderColor();
if (selectionBorderColor == null) {
selectionBorderColor = GroupedElementsRenderer.SELECTED_FRAME_FOREGROUND;
}
myDefaultSelectedBorderColor = selectionBorderColor;
}
@NotNull
@Override
public Color getBorderColor(boolean selected) {
final Color cached;
if (selected) {
cached = myCachedSelectedBorderColor;
}
else {
cached = myCachedNormalBorderColor;
}
if (cached != null) {
return cached;
}
Color result = null;
if (myColorsAware != null) {
result = myColorsAware.getBorderColor(EditorColorsManager.getInstance().getGlobalScheme(), selected);
}
if (result == null) {
result = selected ? myDefaultSelectedBorderColor : myDefaultNormalBorderColor;
}
if (selected) {
myCachedSelectedBorderColor = result;
}
else {
myCachedNormalBorderColor = result;
}
return result;
}
@NotNull
@Override
public TextAttributes getTextAttributes(@NotNull ArrangementSettingsToken token, boolean selected) {
final TextAttributes cached;
if (selected) {
cached = mySelectedAttributesCache.get(token);
}
else {
cached = myNormalAttributesCache.get(token);
}
if (cached != null) {
return cached;
}
TextAttributes result = null;
if (myColorsAware != null) {
result = myColorsAware.getTextAttributes(EditorColorsManager.getInstance().getGlobalScheme(), token, selected);
}
if (result == null) {
result = selected ? myDefaultSelectedAttributes : myDefaultNormalAttributes;
}
if (selected) {
mySelectedAttributesCache.put(token, result);
}
else {
myNormalAttributesCache.put(token, result);
}
return result;
}
/**
* Asks the implementation to ensure that it uses the most up-to-date colors.
* <p/>
* I.e. this method is assumed to be called when color settings has been changed and gives a chance to reflect the changes
* accordingly.
*/
public void refresh() {
if (myColorsAware != null) {
myNormalAttributesCache.clear();
mySelectedAttributesCache.clear();
}
}
}