View Javadoc

1   /*
2    * Copyright (c) 2003-2008 by Cosylab d. d.
3    *
4    * This file is part of CosyBeans-Common.
5    *
6    * CosyBeans-Common is free software: you can redistribute it and/or modify
7    * it under the terms of the GNU General Public License as published by
8    * the Free Software Foundation, either version 3 of the License, or
9    * (at your option) any later version.
10   *
11   * CosyBeans-Common is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU General Public License for more details.
15   *
16   * You should have received a copy of the GNU General Public License
17   * along with CosyBeans-Common.  If not, see <http://www.gnu.org/licenses/>.
18   */
19  
20  package com.cosylab.gui.components.numberfield;
21  
22  import com.cosylab.logging.DebugLogger;
23  
24  import com.cosylab.util.PrintfFormat;
25  import com.cosylab.util.StringUtilities;
26  
27  import java.util.logging.Level;
28  import java.util.logging.Logger;
29  
30  
31  /**
32   * <code>DefaultNumberDescriptor</code> is a default implementaion of the 
33   * NumberDescriptor interface.
34   *
35   * @author $Author: jbobnar $
36   * @version $Revision: 1.8 $
37   */
38  public class DefaultNumberDescriptor implements NumberDescriptor
39  {
40  	/**
41  	 * @see NumberDescriptor
42  	 */
43  	public final static String NAME = "Default Visualization";
44  
45  	/**
46  	 * @see NumberDescriptor
47  	 */
48  	public final static String DESCRIPTION = "Prints value to string according to ANSI format string.";
49  	private final Logger logger = DebugLogger.getLogger("DND", Level.OFF);
50  	private String format;
51  	private Class type = Double.class;
52  	private PrintfFormat formatter;
53  
54  	/* (non-Javadoc)
55  	 * @see com.cosylab.gui.components.numberfield.NumberDescriptor#parseNumber(java.lang.String)
56  	 */
57  	public Number parseNumber(String number)
58  	{
59  		try {
60  			if (type == Long.class) {
61  				if ("-".equals(number.trim())) {
62  					return new Long(0);
63  				}
64  
65  				logger.fine("Long '" + number + "'");
66  
67  				double d = StringUtilities.parseDouble(number);
68  
69  				if (Double.isNaN(d)) {
70  					return null;
71  				}
72  
73  				return new Long((long)d);
74  			}
75  
76  			double newValue = StringUtilities.parseDouble(number);
77  
78  			if (Double.isInfinite(Math.abs(newValue))) {
79  				logger.fine("Infinite '" + number + "'");
80  
81  				return null;
82  			}
83  
84  			if (Double.isNaN(newValue)) {
85  				logger.fine("NaN '" + number + "'");
86  
87  				return null;
88  			}
89  
90  			logger.fine("Dobule '" + number + "' -> " + newValue);
91  
92  			return new Double(newValue);
93  		} catch (Exception e) {
94  			// ignored
95  			logger.fine("Exception " + e);
96  		}
97  
98  		logger.fine("Plain failed '" + number + "'");
99  
100 		return null;
101 	}
102 
103 	/* (non-Javadoc)
104 	 * @see com.cosylab.gui.components.numberfield.NumberDescriptor#toString(java.lang.Number)
105 	 */
106 	public String printString(Number number)
107 	{
108 		String s = formatter.sprintf(number).replace(',', '.');
109 		logger.fine("'" + number + "' -> '" + s + "'");
110 
111 		return s;
112 	}
113 
114 	/* (non-Javadoc)
115 	 * @see com.cosylab.gui.components.numberfield.NumberDescriptor#toEditString(java.lang.Number)
116 	 */
117 	public String printEditString(Number number)
118 	{
119 		String s = printString(number).trim();
120 
121 		if (s.charAt(0) == '+') {
122 			s = s.substring(1);
123 		}
124 
125 		logger.fine("'" + number + "' -> '" + s + "'");
126 		return s;
127 	}
128 
129 	/* (non-Javadoc)
130 	 * @see com.cosylab.gui.components.numberfield.NumberDescriptor#getFormat()
131 	 */
132 	public String getFormat()
133 	{
134 		return format;
135 	}
136 
137 	/* (non-Javadoc)
138 	 * @see com.cosylab.gui.components.numberfield.NumberDescriptor#setFormat(java.lang.String)
139 	 */
140 	public void setFormat(String format)
141 	{
142 		logger.info("newFormat '" + format + "'");
143 		this.format = format;
144 		formatter = new PrintfFormat(format);
145 	}
146 
147 	/**
148 	 * Supported types are <code>Double.class</code> and
149 	 * <code>Long.class</code>.
150 	 *
151 	 * @see com.cosylab.gui.components.numberfield.NumberDescriptor#setNumberType(java.lang.Class)
152 	 */
153 	public void setNumberType(Class newClass)
154 	{
155 		logger.info("newClass '" + newClass + "'");
156 
157 		if (newClass != Double.class && newClass != Long.class) {
158 			throw new IllegalArgumentException("Type '" + newClass
159 			    + "' not supported.");
160 		}
161 
162 		type = newClass;
163 	}
164 
165 	/* (non-Javadoc)
166 	 * @see com.cosylab.gui.components.numberfield.NumberDescriptor#getNumberType()
167 	 */
168 	public Class getNumberType()
169 	{
170 		return type;
171 	}
172 }
173 
174 /* __oOo__ */