001    package nl.cwi.sen1.gui.plugin.editor;
002    
003    import javax.swing.text.Style;
004    import javax.swing.text.StyleConstants;
005    
006    import nl.cwi.sen1.configapi.types.Color;
007    import nl.cwi.sen1.configapi.types.Property;
008    import nl.cwi.sen1.configapi.types.PropertyList;
009    import nl.cwi.sen1.configapi.types.TextAttribute;
010    import nl.cwi.sen1.configapi.types.TextAttributeMap;
011    import nl.cwi.sen1.configapi.types.TextCategoryName;
012    import nl.cwi.sen1.configapi.types.TextStyle;
013    import nl.cwi.sen1.configapi.types.property.TextCategory;
014    
015    public class StyleRegistrar {
016        private static final String FOCUS_STYLE_NAME = "***focus***";
017    
018        private static final String SELECTION_STYLE_NAME = "***selection***";
019    
020        static public void registerTextCategories(EditorPane editor,
021                PropertyList categories) {
022            editor.unsetStyles();
023    
024            for (; !categories.isEmpty(); categories = categories.getTail()) {
025                Property prop = categories.getHead();
026    
027                if (prop.isTextCategory()) {
028                    registerTextCategory(editor, (TextCategory) prop);
029                }
030            }
031        }
032    
033        static private void registerTextCategory(EditorPane editor,
034                TextCategory category) {
035            TextCategoryName type = category.getCategory();
036            TextAttributeMap attrs = category.getMap();
037    
038            if (type.isExtern()) {
039                String name = category.getCategory().getName();
040                registerAttributes(editor, name, attrs);
041            } else if (type.isNormal()) {
042                setStyleAttributes(editor, attrs, editor.getDefaultStyle());
043            } else if (type.isSelection()) {
044                Style style = registerAttributes(editor, SELECTION_STYLE_NAME,
045                        attrs);
046                editor.setSelectedTextColor((java.awt.Color) style
047                        .getAttribute(StyleConstants.Foreground));
048                editor.setSelectionColor((java.awt.Color) style
049                        .getAttribute(StyleConstants.Background));
050            } else if (type.isFocus()) {
051                Style style = registerAttributes(editor, FOCUS_STYLE_NAME, attrs);
052                editor.setFocusColor((java.awt.Color) style
053                        .getAttribute(StyleConstants.Background));
054            }
055        }
056    
057        static private Style registerAttributes(EditorPane editor, String name,
058                TextAttributeMap attrs) {
059            Style style = editor.addStyle(name, editor.getDefaultStyle());
060            setStyleAttributes(editor, attrs, style);
061            return style;
062        }
063    
064    private static void setStyleAttributes(EditorPane editor, TextAttributeMap attrs, Style style) {
065            for (; !attrs.isEmpty(); attrs = attrs.getTail()) {
066                TextAttribute attr = attrs.getHead();
067    
068                if (attr.isForegroundColor()) {
069                    StyleConstants.setForeground(style, convertColor(attr
070                            .getColor()));
071                } else if (attr.isBackgroundColor()) {
072                    if (convertColor(attr.getColor()).equals(
073                            editor.getBackgroundColor())) {
074                        // the linehighlight is drawed in a lower layer than the
075                        // text,
076                        // so if the textbackground is the same as the background of
077                        // the
078                        // editor we need to remove the background attribute to
079                        // prevent
080                        // gaps in the linehighlight
081                        style.removeAttribute(StyleConstants.Background);
082                    } else {
083                        StyleConstants.setBackground(style, convertColor(attr
084                                .getColor()));
085                    }
086                } else if (attr.isStyle()) {
087                    TextStyle textStyle = attr.getStyle();
088    
089                    if (textStyle.isBold()) {
090                        StyleConstants.setBold(style, true);
091                    } else if (textStyle.isItalics()) {
092                        StyleConstants.setItalic(style, true);
093                    } else if (textStyle.isUnderlined()) {
094                        StyleConstants.setUnderline(style, true);
095                    }
096                } else if (attr.isFont()) {
097                    StyleConstants.setFontFamily(style, attr.getName());
098                } else if (attr.isSize()) {
099                    StyleConstants.setFontSize(style, attr.getPoint());
100                }
101            }
102        }    static private java.awt.Color convertColor(Color color) {
103            return new java.awt.Color(color.getRed(), color.getGreen(), color
104                    .getBlue());
105        }
106    }