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.ledder;
21  import java.awt.BorderLayout;
22  import java.awt.CardLayout;
23  import java.awt.Color;
24  import java.awt.Dimension;
25  import java.awt.Graphics;
26  import java.awt.Graphics2D;
27  import java.awt.GridBagConstraints;
28  import java.awt.GridBagLayout;
29  import java.awt.GridLayout;
30  import java.awt.event.ActionEvent;
31  import java.awt.event.ActionListener;
32  import java.awt.event.MouseAdapter;
33  import java.awt.event.MouseEvent;
34  import java.awt.geom.Rectangle2D;
35  
36  import javax.swing.JButton;
37  import javax.swing.JColorChooser;
38  import javax.swing.JComponent;
39  import javax.swing.JDialog;
40  import javax.swing.JPanel;
41  import javax.swing.JScrollPane;
42  import javax.swing.JSlider;
43  import javax.swing.JTextPane;
44  import javax.swing.border.EtchedBorder;
45  import javax.swing.border.TitledBorder;
46  
47  /**
48   * @author <a href="mailto:ales.pucelj@cosylab.com">Ales Pucelj</a>
49   * @version $id$
50   */
51  public class LedPaintDemo extends JPanel {
52  
53  	private JSlider hlFactorSlider;
54  	private JSlider hlFocusSlider;
55  
56  	private JSlider shadowSlider;
57  	private JSlider borderSlider;
58  
59  	private JSlider radiusSlider;
60  	private JSlider aliasSlider;
61  
62  	private JPanel controlPanel;
63  
64  	private JTextPane sourcePane;
65  
66  	private JButton colorButton;
67  
68  	private LightPosition lightPosition;
69  
70  	private LedPainter painter;
71  
72  	private SliderMouseListener sml = new SliderMouseListener();
73  
74  	private Color currentColor = Color.RED;
75  
76  	private class LedPainter extends JComponent {
77  
78  		private LedPaintParameters params = new LedPaintParameters();
79  
80  		public void setParameters(LedPaintParameters p) {
81  			params = p;
82  		}
83  
84  		protected void paintComponent(Graphics g) {
85  			super.paintComponent(g);
86  			Graphics2D g2 = (Graphics2D) g;
87  			Rectangle2D r =
88  				new Rectangle2D.Double(0, 0, getWidth(), getHeight());
89  
90  			long time = System.currentTimeMillis();
91  			
92  			LedPaint rgp = new LedPaint(params,getWidth() / 2,getHeight() / 2);
93  
94  			g2.setPaint(rgp);
95  			g2.fill(r);
96  
97  			time = System.currentTimeMillis() - time;
98  			System.out.println(time);
99  		}
100 	}
101 
102 	private class LightPosition extends JComponent {
103 		public double xPos = 0.0;
104 		public double yPos = 0.0;
105 		private class PointListener extends MouseAdapter {
106 			public void mouseClicked(MouseEvent e) {
107 				int w = LightPosition.this.getWidth();
108 				int h = LightPosition.this.getHeight();
109 				int r = (w < h) ? w : h;
110 
111 				xPos = (1.0 * e.getX() - (r / 2)) / (r / 2);
112 				yPos = (1.0 * e.getY() - (r / 2)) / (r / 2);
113 
114 				getPainter().setParameters(getParameters());
115 				getPainter().repaint();
116 				displayParameters();
117 			}
118 		}
119 		public LightPosition() {
120 			addMouseListener(new PointListener());
121 		}
122 		protected void paintComponent(Graphics g) {
123 			super.paintComponent(g);
124 			int w = LightPosition.this.getWidth();
125 			int h = LightPosition.this.getHeight();
126 			int r = (w < h) ? w : h;
127 
128 			g.drawOval(0, 0, r - 1, r - 1);
129 		}
130 
131 	}
132 
133 	private class SliderMouseListener extends MouseAdapter {
134 		public void mouseReleased(MouseEvent arg0) {
135 			getPainter().setParameters(getParameters());
136 			getPainter().repaint();
137 			displayParameters();
138 		}
139 	}
140 
141 	private class ColorButtonListener implements ActionListener {
142 		public void actionPerformed(ActionEvent e) {
143 			Color newColor =
144 				JColorChooser.showDialog(
145 					LedPaintDemo.this,
146 					"Select led color",
147 					currentColor);
148 
149 			if (newColor == null) {
150 				return;
151 			}
152 
153 			currentColor = newColor;
154 
155 			getPainter().setParameters(getParameters());
156 			getPainter().repaint();
157 		}
158 	}
159 
160 	public LedPaintDemo() {
161 		initialize();
162 	}
163 
164 	private void initialize() {
165 		setLayout(new BorderLayout());
166 
167 		add(getControlPanel(), BorderLayout.EAST);
168 
169 		JPanel panel = new JPanel();
170 		panel.setLayout(new GridBagLayout());
171 
172 		getPainter().setMinimumSize(new Dimension(10, 10));
173 		getPainter().setMaximumSize(new Dimension(200, 200));
174 		getPainter().setPreferredSize(new Dimension(200, 220));
175 		GridBagConstraints gbc = new GridBagConstraints();
176 
177 		gbc.gridx = 0;
178 		gbc.gridy = 0;
179 		gbc.anchor = GridBagConstraints.CENTER;
180 		gbc.fill = GridBagConstraints.NONE;
181 
182 		panel.add(getPainter(), gbc);
183 
184 		add(panel, BorderLayout.CENTER);
185 
186 		add(new JScrollPane(getSourcePane()), BorderLayout.SOUTH);
187 
188 		resetParameters();
189 		getPainter().setParameters(getParameters());
190 		getPainter().repaint();
191 		displayParameters();
192 	}
193 
194 	private LedPainter getPainter() {
195 		if (painter == null) {
196 			painter = new LedPainter();
197 			painter.setBorder(new TitledBorder("Preview"));
198 		}
199 		return painter;
200 	}
201 
202 	private JPanel getControlPanel() {
203 		if (controlPanel == null) {
204 			controlPanel = new JPanel();
205 
206 			controlPanel.setLayout(new GridLayout(4, 2));
207 
208 			controlPanel.add(getHlFactorSlider());
209 			controlPanel.add(getHlFocusSlider());
210 
211 			controlPanel.add(getShadowSlider());
212 			controlPanel.add(getBorderSlider());
213 
214 			controlPanel.add(getRadiusSlider());
215 			controlPanel.add(getAliasSlider());
216 
217 			controlPanel.add(getColorButton());
218 
219 			controlPanel.add(getLightPosition());
220 
221 		}
222 		return controlPanel;
223 	}
224 
225 	private JSlider createSlider(String title) {
226 		JSlider slider = new JSlider();
227 
228 		slider.setMinimum(0);
229 		slider.setMaximum(100);
230 		slider.setMajorTickSpacing(20);
231 		slider.setMinorTickSpacing(5);
232 		slider.setPaintLabels(true);
233 		slider.setPaintTicks(true);
234 		slider.setBorder(new TitledBorder(new EtchedBorder(), title));
235 		//		slider.addChangeListener(scl);
236 		slider.addMouseListener(sml);
237 
238 		return slider;
239 	}
240 
241 	private JSlider getHlFactorSlider() {
242 		if (hlFactorSlider == null) {
243 			hlFactorSlider = createSlider("Highlight factor");
244 		}
245 		return hlFactorSlider;
246 	}
247 
248 	private JSlider getHlFocusSlider() {
249 		if (hlFocusSlider == null) {
250 			hlFocusSlider = createSlider("Highlight focus");
251 		}
252 		return hlFocusSlider;
253 	}
254 
255 	private JSlider getShadowSlider() {
256 		if (shadowSlider == null) {
257 			shadowSlider = createSlider("Shadow intensity");
258 		}
259 		return shadowSlider;
260 	}
261 
262 	private JSlider getBorderSlider() {
263 		if (borderSlider == null) {
264 			borderSlider = createSlider("Border size");
265 		}
266 		return borderSlider;
267 	}
268 
269 	private JSlider getRadiusSlider() {
270 		if (radiusSlider == null) {
271 			radiusSlider = createSlider("Radius");
272 			radiusSlider.setMinimum(0);
273 		}
274 		return radiusSlider;
275 	}
276 
277 	private JSlider getAliasSlider() {
278 		if (aliasSlider == null) {
279 			aliasSlider = createSlider("Antialiasing level");
280 			aliasSlider.setMinimum(1);
281 			aliasSlider.setMaximum(6);
282 			aliasSlider.setMinorTickSpacing(1);
283 			aliasSlider.setMajorTickSpacing(2);
284 		}
285 		return aliasSlider;
286 	}
287 
288 	private JTextPane getSourcePane() {
289 		if (sourcePane == null) {
290 			sourcePane = new JTextPane();
291 
292 		}
293 		return sourcePane;
294 	}
295 
296 	private LedPaintParameters getParameters() {
297 		LedPaintParameters lpp = new LedPaintParameters();
298 
299 		lpp.radius = getRadiusSlider().getValue();
300 
301 		lpp.highlightFactor = getHlFactorSlider().getValue() / 100.0;
302 		lpp.highlightFocus = getHlFocusSlider().getValue() / 20.0;
303 
304 		lpp.shadowIntensity = getShadowSlider().getValue() / 100.0;
305 		lpp.borderSize = getBorderSlider().getValue() / 100.0;
306 
307 		lpp.color = currentColor;
308 
309 		lpp.antialiasing = getAliasSlider().getValue();
310 
311 		lpp.lightX = lightPosition.xPos;
312 		lpp.lightY = lightPosition.yPos;
313 
314 		return lpp;
315 	}
316 
317 	private LightPosition getLightPosition() {
318 		if (lightPosition == null) {
319 			lightPosition = new LightPosition();
320 		}
321 		return lightPosition;
322 	}
323 
324 	private void displayParameters() {
325 		LedPaintParameters lpp = getParameters();
326 		StringBuffer sb = new StringBuffer();
327 
328 		sb.append("LedPaintParameters lpp = new LedPaintParameters();\n");
329 		sb.append("lpp.radius = ");
330 		sb.append(lpp.radius);
331 		sb.append(";\n");
332 		sb.append("lpp.highlightFactor = ");
333 		sb.append(lpp.highlightFactor);
334 		sb.append(";\n");
335 		sb.append("lpp.highlightFocus = ");
336 		sb.append(lpp.highlightFocus);
337 		sb.append(";\n");
338 		sb.append("lpp.shadowIntensity = ");
339 		sb.append(lpp.shadowIntensity);
340 		sb.append(";\n");
341 		sb.append("lpp.borderSize = ");
342 		sb.append(lpp.borderSize);
343 		sb.append(";\n");
344 		sb.append("lpp.lightX = ");
345 		sb.append(lpp.lightX);
346 		sb.append(";\n");
347 		sb.append("lpp.lightY = ");
348 		sb.append(lpp.lightY);
349 		sb.append(";\n");
350 		sb.append("lpp.antialiasing = ");
351 		sb.append(lpp.antialiasing);
352 		sb.append(";\n");
353 		sb.append("lpp.color = new java.awt.Color(");
354 		sb.append(lpp.color.getRed());
355 		sb.append(", ");
356 		sb.append(lpp.color.getGreen());
357 		sb.append(", ");
358 		sb.append(lpp.color.getBlue());
359 		sb.append(");\n");
360 
361 		getSourcePane().setText(sb.toString());
362 	}
363 
364 	private void resetParameters() {
365 		getHlFactorSlider().setValue(85);
366 		getHlFocusSlider().setValue(60);
367 		getShadowSlider().setValue(100);
368 		getBorderSlider().setValue(5);
369 		getAliasSlider().setValue(1);
370 	}
371 
372 	private JButton getColorButton() {
373 		if (colorButton == null) {
374 			colorButton = new JButton("Select color");
375 			colorButton.addActionListener(new ColorButtonListener());
376 		}
377 		return colorButton;
378 	}
379 
380 	/**
381 	 * @see javax.swing.JComponent#paintComponent(Graphics)
382 	 */
383 	protected void paintComponent(Graphics g) {
384 		super.paintComponent(g);
385 	}
386 
387 	public static void main(String[] args) {
388 		JDialog dialog = new JDialog();
389 
390 		dialog.setSize(750, 550);
391 		dialog.setModal(true);
392 
393 		dialog.getContentPane().setLayout(new CardLayout());
394 		LedPaintDemo lc = new LedPaintDemo();
395 		dialog.getContentPane().add(lc, "");
396 
397 		dialog.show();
398 
399 		System.exit(0);
400 	}
401 
402 }