c295a951eccdf01506513644c69d2a383d323e3c
[jalview.git] / forester / java / src / org / forester / phylogeny / data / NodeVisualData.java
1 \r
2 package org.forester.phylogeny.data;\r
3 \r
4 import java.awt.Color;\r
5 import java.awt.Font;\r
6 import java.io.IOException;\r
7 import java.io.Writer;\r
8 import java.util.ArrayList;\r
9 import java.util.List;\r
10 \r
11 import org.forester.phylogeny.data.Property.AppliesTo;\r
12 import org.forester.util.ForesterUtil;\r
13 \r
14 public final class NodeVisualData implements PhylogenyData {\r
15 \r
16     public static final String SIZE_REF             = "aptx_visualiation:node_size";\r
17     public static final String SIZE_TYPE            = "xsd:decimal";\r
18     private static final byte  DEFAULT_FONT_SIZE    = -1;\r
19     private static final int   DEFAULT_SIZE         = -1;\r
20     private static final int   DEFAULT_TRANSPARANCY = -1;\r
21     private Color              _border_color;\r
22     private Color              _fill_color;\r
23     private NodeFill           _fill_type;\r
24     private String             _font_name;\r
25     private Color              _font_color;\r
26     private byte               _font_size;\r
27     private FontType           _font_style;\r
28     private NodeShape          _shape;\r
29     private float              _size;\r
30     private float              _transparancy;\r
31     private Font               _font;\r
32 \r
33     public NodeVisualData() {\r
34         init();\r
35     }\r
36 \r
37     public NodeVisualData( final String font_name,\r
38                            final FontType font_style,\r
39                            final byte font_size,\r
40                            final Color font_color,\r
41                            final NodeShape shape,\r
42                            final NodeFill fill_type,\r
43                            final Color border_color,\r
44                            final Color fill_color,\r
45                            final float size,\r
46                            final float transparancy ) {\r
47         setFontName( font_name );\r
48         setFontStyle( font_style );\r
49         setFontSize( font_size );\r
50         setFontColor( font_color );\r
51         setShape( shape );\r
52         setFillType( fill_type );\r
53         setBorderColor( border_color );\r
54         setFillColor( fill_color );\r
55         setSize( size );\r
56         setTransparancy( transparancy );\r
57     }\r
58 \r
59     @Override\r
60     public final StringBuffer asSimpleText() {\r
61         return asText();\r
62     }\r
63 \r
64     @Override\r
65     public final StringBuffer asText() {\r
66         final StringBuffer sb = new StringBuffer();\r
67         return sb;\r
68     }\r
69 \r
70     @Override\r
71     public final PhylogenyData copy() {\r
72         return new NodeVisualData( !ForesterUtil.isEmpty( getFontName() ) ? new String( getFontName() ) : null,\r
73                                    getFontStyle(),\r
74                                    getFontSize(),\r
75                                    getFontColor() != null ? new Color( getFontColor().getRed(), getFontColor()\r
76                                            .getGreen(), getFontColor().getBlue() ) : null,\r
77                                    getShape(),\r
78                                    getFillType(),\r
79                                    getBorderColor() != null ? new Color( getBorderColor().getRed(), getBorderColor()\r
80                                            .getGreen(), getBorderColor().getBlue() ) : null,\r
81                                    getFillColor() != null ? new Color( getFillColor().getRed(), getFillColor()\r
82                                            .getGreen(), getFillColor().getBlue() ) : null,\r
83                                    getSize(),\r
84                                    getTransparancy() );\r
85     }\r
86 \r
87     public final Color getBorderColor() {\r
88         return _border_color;\r
89     }\r
90 \r
91     public final Color getFillColor() {\r
92         return _fill_color;\r
93     }\r
94 \r
95     public final NodeFill getFillType() {\r
96         return _fill_type;\r
97     }\r
98 \r
99     public final String getFontName() {\r
100         return _font_name;\r
101     }\r
102 \r
103     public final Color getFontColor() {\r
104         return _font_color;\r
105     }\r
106 \r
107     public final byte getFontSize() {\r
108         return _font_size;\r
109     }\r
110 \r
111     public final FontType getFontStyle() {\r
112         return _font_style;\r
113     }\r
114 \r
115     public final NodeShape getShape() {\r
116         return _shape;\r
117     }\r
118 \r
119     public final float getSize() {\r
120         return _size;\r
121     }\r
122 \r
123     public final float getTransparancy() {\r
124         return _transparancy;\r
125     }\r
126 \r
127     public final boolean isEmpty() {\r
128         return ( ForesterUtil.isEmpty( getFontName() ) && ( getFontStyle() == FontType.PLAIN )\r
129                 && ( getFontSize() == DEFAULT_FONT_SIZE ) && ( getFontColor() == null )\r
130                 && ( getShape() == NodeShape.DEFAULT ) && ( getFillType() == NodeFill.DEFAULT )\r
131                 && ( getBorderColor() == null ) && ( getFillColor() == null ) && ( getSize() == DEFAULT_SIZE ) && ( getTransparancy() == DEFAULT_TRANSPARANCY ) );\r
132     }\r
133 \r
134     @Override\r
135     public final boolean isEqual( final PhylogenyData data ) {\r
136         throw new UnsupportedOperationException();\r
137     }\r
138 \r
139     public final void setBorderColor( final Color border_color ) {\r
140         _border_color = border_color;\r
141     }\r
142 \r
143     public final void setFillColor( final Color fill_color ) {\r
144         _fill_color = fill_color;\r
145     }\r
146 \r
147     public final void setFillType( final NodeFill fill_type ) {\r
148         _fill_type = fill_type;\r
149     }\r
150 \r
151     public final void setFontName( final String font_name ) {\r
152         if ( !ForesterUtil.isEmpty( font_name ) ) {\r
153             _font_name = font_name;\r
154         }\r
155         else {\r
156             _font_name = null;\r
157         }\r
158         _font = null;\r
159     }\r
160 \r
161     public final void setFontColor( final Color font_color ) {\r
162         _font_color = font_color;\r
163     }\r
164 \r
165     public final void setFontSize( final int font_size ) {\r
166         if ( ( font_size != DEFAULT_FONT_SIZE ) && ( font_size < 0 ) ) {\r
167             throw new IllegalArgumentException( "negative font size: " + font_size );\r
168         }\r
169         else if ( font_size > Byte.MAX_VALUE ) {\r
170             throw new IllegalArgumentException( "font size is too large: " + font_size );\r
171         }\r
172         _font_size = ( byte ) font_size;\r
173         _font = null;\r
174     }\r
175 \r
176     public final void setFontStyle( final FontType font_style ) {\r
177         _font_style = font_style;\r
178         _font = null;\r
179     }\r
180 \r
181     public final void setFontStyle( final int font_style ) {\r
182         if ( ( font_style == ( Font.BOLD + Font.ITALIC ) ) ) {\r
183             setFontStyle( FontType.BOLD_ITALIC );\r
184         }\r
185         else if ( font_style == Font.ITALIC ) {\r
186             setFontStyle( FontType.ITALIC );\r
187         }\r
188         else if ( font_style == Font.BOLD ) {\r
189             setFontStyle( FontType.BOLD );\r
190         }\r
191         else {\r
192             setFontStyle( FontType.PLAIN );\r
193         }\r
194     }\r
195 \r
196     public final void setShape( final NodeShape shape ) {\r
197         _shape = shape;\r
198     }\r
199 \r
200     public final void setSize( final float size ) {\r
201         _size = size;\r
202     }\r
203 \r
204     public final void setTransparancy( final float transparancy ) {\r
205         _transparancy = transparancy;\r
206     }\r
207 \r
208     public final int getFontStyleInt() {\r
209         if ( getFontStyle() == FontType.BOLD ) {\r
210             return Font.BOLD;\r
211         }\r
212         else if ( getFontStyle() == FontType.ITALIC ) {\r
213             return Font.ITALIC;\r
214         }\r
215         else if ( getFontStyle() == FontType.BOLD_ITALIC ) {\r
216             return Font.BOLD + Font.ITALIC;\r
217         }\r
218         return Font.PLAIN;\r
219     }\r
220 \r
221     public final Font getFont() {\r
222         if ( _font != null ) {\r
223             return _font;\r
224         }\r
225         else if ( !ForesterUtil.isEmpty( getFontName() ) ) {\r
226             _font = new Font( getFontName(), getFontStyleInt(), getFontSize() );\r
227             return _font;\r
228         }\r
229         return null;\r
230     }\r
231 \r
232     @Override\r
233     public final StringBuffer toNHX() {\r
234         throw new UnsupportedOperationException();\r
235     }\r
236 \r
237     @Override\r
238     public final void toPhyloXML( final Writer writer, final int level, final String indentation ) throws IOException {\r
239         throw new UnsupportedOperationException();\r
240     }\r
241 \r
242     @Override\r
243     public final String toString() {\r
244         return asText().toString();\r
245     }\r
246 \r
247     private final void init() {\r
248         setFontName( null );\r
249         setFontStyle( FontType.PLAIN );\r
250         setFontSize( DEFAULT_FONT_SIZE );\r
251         setFontColor( null );\r
252         setShape( NodeShape.DEFAULT );\r
253         setFillType( NodeFill.DEFAULT );\r
254         setBorderColor( null );\r
255         setFillColor( null );\r
256         setSize( DEFAULT_SIZE );\r
257         setTransparancy( DEFAULT_TRANSPARANCY );\r
258         _font = null;\r
259     }\r
260 \r
261     private final List<Property> toProperties() {\r
262         final List<Property> properties = new ArrayList<Property>();\r
263         properties.add( new Property( SIZE_REF, String.valueOf( getSize() ), "", SIZE_TYPE, AppliesTo.NODE ) );\r
264         properties.add( new Property( SIZE_REF, String.valueOf( getShape() ), "", SIZE_TYPE, AppliesTo.NODE ) );\r
265         properties.add( new Property( SIZE_REF, String.valueOf( getFillType() ), "", SIZE_TYPE, AppliesTo.NODE ) );\r
266         properties.add( new Property( SIZE_REF, String.valueOf( getTransparancy() ), "", SIZE_TYPE, AppliesTo.NODE ) );\r
267         properties.add( new Property( SIZE_REF, String.valueOf( getFillColor() ), "", SIZE_TYPE, AppliesTo.NODE ) );\r
268         properties.add( new Property( SIZE_REF, String.valueOf( getBorderColor() ), "", SIZE_TYPE, AppliesTo.NODE ) );\r
269         return properties;\r
270     }\r
271 \r
272     public enum FontType {\r
273         BOLD, BOLD_ITALIC, ITALIC, PLAIN\r
274     }\r
275 \r
276     public enum NodeFill {\r
277         DEFAULT, GRADIENT, NONE, SOLID\r
278     }\r
279 \r
280     public enum NodeShape {\r
281         CIRCLE, DEFAULT, RECTANGLE\r
282     }\r
283 }\r