📄 colordecoder.java
字号:
/*******************************************************************************
* Copyright (c) 2004 Stefan Zeiger and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.novocode.com/legal/epl-v10.html
*
* Contributors:
* Stefan Zeiger (szeiger@novocode.com) - initial API and implementation
*******************************************************************************/
package com.novocode.naf.color;
import java.util.*;
import org.eclipse.swt.SWT;
import org.w3c.dom.*;
import com.novocode.naf.app.NAFException;
import com.novocode.naf.data.DataDecoder;
/**
* Contains utility methods to decode colors specifications
* from Strings and DOM Nodes.
*
* @author Stefan Zeiger (szeiger@novocode.com)
* @since Apr 26, 2004
*/
public class ColorDecoder
{
private static final Map<String, Integer> fwdSysColors = new HashMap<String, Integer>();
private static final Map<Integer, String> revSysColors = new HashMap<Integer, String>();
static
{
putSysColor("WHITE", SWT.COLOR_WHITE);
putSysColor("BLACK", SWT.COLOR_BLACK);
putSysColor("RED", SWT.COLOR_RED);
putSysColor("DARK_RED", SWT.COLOR_DARK_RED);
putSysColor("GREEN", SWT.COLOR_GREEN);
putSysColor("DARK_GREEN", SWT.COLOR_DARK_GREEN);
putSysColor("YELLOW", SWT.COLOR_YELLOW);
putSysColor("DARK_YELLOW", SWT.COLOR_DARK_YELLOW);
putSysColor("BLUE", SWT.COLOR_BLUE);
putSysColor("DARK_BLUE", SWT.COLOR_DARK_BLUE);
putSysColor("MAGENTA", SWT.COLOR_MAGENTA);
putSysColor("DARK_MAGENTA", SWT.COLOR_DARK_MAGENTA);
putSysColor("CYAN", SWT.COLOR_CYAN);
putSysColor("DARK_CYAN", SWT.COLOR_DARK_CYAN);
putSysColor("GRAY", SWT.COLOR_GRAY);
putSysColor("DARK_GRAY", SWT.COLOR_DARK_GRAY);
putSysColor("WIDGET_DARK_SHADOW", SWT.COLOR_WIDGET_DARK_SHADOW);
putSysColor("WIDGET_NORMAL_SHADOW", SWT.COLOR_WIDGET_NORMAL_SHADOW);
putSysColor("WIDGET_LIGHT_SHADOW", SWT.COLOR_WIDGET_LIGHT_SHADOW);
putSysColor("WIDGET_HIGHLIGHT_SHADOW", SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW);
putSysColor("WIDGET_BACKGROUND", SWT.COLOR_WIDGET_BACKGROUND);
putSysColor("WIDGET_BORDER", SWT.COLOR_WIDGET_BORDER);
putSysColor("WIDGET_FOREGROUND", SWT.COLOR_WIDGET_FOREGROUND);
putSysColor("LIST_FOREGROUND", SWT.COLOR_LIST_FOREGROUND);
putSysColor("LIST_BACKGROUND", SWT.COLOR_LIST_BACKGROUND);
putSysColor("LIST_SELECTION", SWT.COLOR_LIST_SELECTION);
putSysColor("LIST_SELECTION_TEXT", SWT.COLOR_LIST_SELECTION_TEXT);
putSysColor("INFO_FOREGROUND", SWT.COLOR_INFO_FOREGROUND);
putSysColor("INFO_BACKGROUND", SWT.COLOR_INFO_BACKGROUND);
putSysColor("TITLE_FOREGROUND", SWT.COLOR_TITLE_FOREGROUND);
putSysColor("TITLE_BACKGROUND", SWT.COLOR_TITLE_BACKGROUND);
putSysColor("TITLE_BACKGROUND_GRADIENT", SWT.COLOR_TITLE_BACKGROUND_GRADIENT);
putSysColor("TITLE_INACTIVE_FOREGROUND", SWT.COLOR_TITLE_INACTIVE_FOREGROUND);
putSysColor("TITLE_INACTIVE_BACKGROUND", SWT.COLOR_TITLE_INACTIVE_BACKGROUND);
putSysColor("TITLE_INACTIVE_BACKGROUND_GRADIENT", SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT);
}
private ColorDecoder() {}
private static void putSysColor(String s, int i)
{
Integer ii = new Integer(i);
s = s.toLowerCase().replace('_', '-');
fwdSysColors.put(s, ii);
revSysColors.put(ii, s);
}
public static Integer sysColorFor(String s)
{
return fwdSysColors.get(s.toLowerCase().replace(' ', '-').replace('_', '-'));
}
public static String sysColorStringFor(int i)
{
return revSysColors.get(new Integer(i));
}
public static ColorData[] decodeColorArray(Attr attr) throws NAFException
{
if(attr == null) return null;
return decodeColorArray(attr.getValue());
}
public static ColorData[] decodeColorArray(String s) throws NAFException
{
String[] names = DataDecoder.decodeStringArray(s, ",", true, false);
if(names.length == 1 && names[0].length() == 0) return null;
ColorData[] cd = new ColorData[names.length];
for(int i=0; i<names.length; i++) cd[i] = decodeColor(names[i]);
return cd;
}
public static ColorData decodeColor(Node n) throws NAFException
{
if(n == null) return ColorData.INHERIT;
String s = n.getNodeValue();
return decodeColor(s);
}
public static ColorData decodeColor(String s) throws NAFException
{
if(s == null || s.length() == 0 || s.equals("default")) return ColorData.DEFAULT;
s = s.trim();
String[] values = DataDecoder.decodeStringArray(s, ":", true, true);
s = values[0];
ColorData cd;
if(s.equals("inherit")) cd = ColorData.INHERIT;
else if(s.startsWith("#"))
{
if(s.length() != 7) throw new NAFException("Illegal color code "+s+": '#' must be followed by 6 hex digits");
String rs = s.substring(1,3);
String gs = s.substring(3,5);
String bs = s.substring(5);
try
{
int ri = Integer.parseInt(rs, 16);
int gi = Integer.parseInt(gs, 16);
int bi = Integer.parseInt(bs, 16);
cd = new ColorData(ri, gi, bi);
}
catch(NumberFormatException ex)
{
throw new NAFException("Illegal color code "+s+": '#' must be followed by 6 hex digits");
}
}
else
{
Integer id = sysColorFor(s);
if(id == null) throw new NAFException("Unknown system color name "+s);
else cd = new ColorData(id.intValue());
}
if(values.length > 1)
{
IColorDecorator[] decorators = new IColorDecorator[values.length-1];
for(int i=0; i<decorators.length; i++)
{
String dn = values[i+1];
IColorDecorator deco;
if(dn.equals("lighter")) deco = LightenColorDecorator.DECO_LIGHTEN_10_PERCENT;
else if(dn.equals("darker")) deco = DarkenColorDecorator.DECO_DARKEN_10_PERCENT;
else if(dn.equals("invert")) deco = InvertColorDecorator.DECO_INVERT;
else if(dn.equals("warmer")) deco = RGBMatrixColorDecorator.DECO_WARMER;
else if(dn.equals("cooler")) deco = RGBMatrixColorDecorator.DECO_COOLER;
else throw new NAFException("Illegal color decorator \""+dn+"\"");
decorators[i] = deco;
}
cd.setDecorators(decorators);
}
return cd;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -