Bug 6840 fixed: Add new line_style
[scilab.git] / scilab / modules / graphic_objects / src / java / org / scilab / modules / graphic_objects / contouredObject / Line.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Manuel JULIACHS
4  * Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.graphic_objects.contouredObject;
15
16 import org.scilab.modules.graphic_objects.graphicObject.GraphicObject.UpdateStatus;
17
18 /**
19  * Line class
20  * @author Manuel JULIACHS
21  */
22 public class Line {
23     /** Line properties */
24     public enum LinePropertyType { MODE, LINESTYLE, THICKNESS, COLOR };
25
26     /** Line style */
27     public enum LineType { SOLID, DASH, DASH_DOT, LONG_DASH_DOT, BIG_DASH_DOT, BIG_DASH_LONG_DASH, DOT, DOUBLE_DOT, LONG_BLANK_DOT, BIG_BLANK_DOT;
28
29         /**
30          * Converts a scilab line style index to the corresponding line type.
31          * @param sciIndex the scilab index.
32          * @return the line type as enum.
33          */
34         public static LineType fromScilabIndex(Integer sciIndex) {
35             switch (sciIndex) {
36             case 1:
37                 return SOLID;
38             case 2:
39                 return DASH;
40             case 3:
41                 return DASH_DOT;
42             case 4:
43                 return LONG_DASH_DOT;
44             case 5:
45                 return BIG_DASH_DOT;
46             case 6:
47                 return BIG_DASH_LONG_DASH;
48             case 7:
49                 return DOT;
50             case 8:
51                 return DOUBLE_DOT;
52             case 9:
53                 return LONG_BLANK_DOT;
54             case 10:
55                 return BIG_BLANK_DOT;
56             default:
57                 return SOLID;
58             }
59         }
60
61         /**
62          * Converts the line type to the corresponding scilab line style index.
63          * @return  the scilab line style index corresponding to this line type.
64          */
65         public int asScilabIndex() {
66             return ordinal() + 1;
67         }
68
69         /**
70          * Converts the line type to a 16-bit pattern.
71          * @return the 16-bit pattern corresponding to the line type.
72          */
73         public short asPattern() {
74             switch (this) {
75             case DASH:
76                 return (short) 0x07FF; // 5 blanks, 11 solids
77             case DASH_DOT:
78                 return (short) 0x0F0F; // 4 blanks, 4 solids, 4 blanks, 4 solids
79             case LONG_DASH_DOT:
80                 return (short) 0x1FC2; // 3 blanks, 3 solids, 3 blanks, 7 solids
81             case BIG_DASH_DOT:
82                 return (short) 0x3FC9; // 2 blanks, 8 solids, 2 blanks, 1 solid, 2 blanks, 1 solid
83             case BIG_DASH_LONG_DASH:
84                 return (short) 0x3FC6; // 3 blanks, 8 solids, 3 blanks, 2 solids
85             case DOT:
86                 return (short) 0x5555; // (1 blank, 1 solid) x 8
87             case DOUBLE_DOT:
88                 return (short) 0x3333; // (2 blanks, 2 solids) x 4
89             case LONG_BLANK_DOT:
90                 return (short) 0x1111; // (3 blanks, 1 solids) x 4
91             case BIG_BLANK_DOT:
92                 return (short) 0x0101; // (7 blanks, 1 solids) x 2
93             default:
94             case SOLID:
95                 return (short) 0xFFFF; // 16 solids, unused equivalent to no stipple
96             }
97         }
98     }
99
100     /** Specifies whether the line is drawn or not */
101     private boolean mode;
102
103     /** Line style */
104     private LineType lineStyle;
105
106     /** Line thickness */
107     private double thickness;
108
109     /** Line color */
110     private int color;
111
112     /** Constructor */
113     public Line() {
114         mode = false;
115         lineStyle = LineType.SOLID;
116         thickness = 1.0;
117         color = -1;
118     }
119
120     /**
121      * Copy constructor
122      * @param line the Line to copy
123      */
124     public Line(Line line) {
125         mode = line.mode;
126         lineStyle = line.lineStyle;
127         thickness = line.thickness;
128         color = line.color;
129     }
130
131     /**
132      * @return the color
133      */
134     public Integer getColor() {
135         return color;
136     }
137
138     /**
139      * @param color the color to set
140      */
141     public UpdateStatus setColor(Integer color) {
142         if (this.color == color) {
143             return UpdateStatus.NoChange;
144         }
145         this.color = color;
146         return UpdateStatus.Success;
147     }
148
149     /**
150      * @return the lineStyle
151      */
152     public LineType getLineStyle() {
153         return lineStyle;
154     }
155
156     /**
157      * @param lineStyle the lineStyle to set
158      */
159     public UpdateStatus setLineStyle(LineType lineStyle) {
160         if (this.lineStyle != lineStyle) {
161             this.lineStyle = lineStyle;
162             return UpdateStatus.Success;
163         }
164
165         return UpdateStatus.NoChange;
166     }
167
168     /**
169      * @return the mode
170      */
171     public Boolean getMode() {
172         return mode;
173     }
174
175     /**
176      * @param mode the mode to set
177      */
178     public UpdateStatus setMode(Boolean mode) {
179         if (this.mode == mode) {
180             return UpdateStatus.NoChange;
181         }
182         this.mode = mode;
183         return UpdateStatus.Success;
184     }
185
186     /**
187      * @return the thickness
188      */
189     public Double getThickness() {
190         return thickness;
191     }
192
193     /**
194      * @param thickness the thickness to set
195      */
196     public UpdateStatus setThickness(Double thickness) {
197         if (this.thickness != thickness) {
198             this.thickness = thickness;
199             return UpdateStatus.Success;
200         }
201
202         return UpdateStatus.NoChange;
203     }
204 }