/*
* Copyright 2008 Ayman Al-Sairafi ayman.alsairafi@gmail.com
*
* 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 jsyntaxpane;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Logger;
import javax.swing.text.Segment;
import javax.swing.text.TabExpander;
import jsyntaxpane.util.JarServiceProvider;
/**
* The STyles to use for each TokenType. The defaults are created here, and
* then the resource META-INF/services/syntaxstyles.properties is read and
* merged. You can also pass a properties instance and merge your prefered
* styles into the default styles
*
* @author Ayman
*/
public class SyntaxStyles {
/**
* You can call the mergeStyles method with a Properties file to customize
* the existing styles. Any existing styles will be overwritten by the
* styles you provide.
* @param styles
*/
public void mergeStyles(Properties styles) {
for (String token : styles.stringPropertyNames()) {
String stv = styles.getProperty(token);
try {
TokenType tt = TokenType.valueOf(token);
SyntaxStyle tokenStyle = new SyntaxStyle(stv);
put(tt, tokenStyle);
} catch (IllegalArgumentException ex) {
LOG.warning("illegal token type or style for: " + token);
}
}
}
Map<TokenType, SyntaxStyle> styles;
private static SyntaxStyles instance = createInstance();
private static final Logger LOG = Logger.getLogger(SyntaxStyles.class.getName());
private static SyntaxStyle DEFAULT_STYLE = new SyntaxStyle(Color.BLACK, Font.PLAIN);
private SyntaxStyles() {
}
/**
* Create default styles
* @return
*/
private static SyntaxStyles createInstance() {
SyntaxStyles syntaxstyles = new SyntaxStyles();
Properties styles = JarServiceProvider.readProperties(SyntaxStyles.class);
syntaxstyles.mergeStyles(styles);
return syntaxstyles;
}
public static SyntaxStyles getInstance() {
return instance;
}
public void put(TokenType type, SyntaxStyle style) {
if (styles == null) {
styles = new HashMap<TokenType, SyntaxStyle>();
}
styles.put(type, style);
}
/**
* Set the graphics font and others to the style for the given token
* @param g
* @param type
* @deprecated
*/
@Deprecated
public void setGraphicsStyle(Graphics g, TokenType type) {
Font c = g.getFont();
SyntaxStyle ss = styles.get(type);
if (ss != null) {
g.setFont(g.getFont().deriveFont(ss.getFontStyle()));
g.setColor(ss.getColor());
} else {
g.setFont(g.getFont().deriveFont(Font.PLAIN));
g.setColor(Color.BLACK);
}
}
/**
* Return the style for the given TokenType
* @param type
* @return
*/
public SyntaxStyle getStyle(TokenType type) {
if (styles.containsKey(type)) {
return styles.get(type);
} else {
return DEFAULT_STYLE;
}
}
/**
* Draw the given Token. This will simply find the proper SyntaxStyle for
* the TokenType and then asks the proper Style to draw the text of the
* Token.
* @param segment
* @param x
* @param y
* @param graphics
* @param e
* @param token
* @return
*/
public int drawText(Segment segment, int x, int y,
Graphics graphics, TabExpander e, Token token) {
SyntaxStyle s = getStyle(token.type);
return s.drawText(segment, x, y, graphics, e, token.start);
}
}