View Javadoc

1   /*
2    *  Copyright (C) 2003-2005 SINTEF
3    *  Author:  Fredrik Vraalsen (fredrik dot vraalsen at sintef dot no)
4    *  Webpage: http://coras.sourceforge.net/
5    *
6    *  This program is free software; you can redistribute it and/or
7    *  modify it under the terms of the GNU Lesser General Public License
8    *  as published by the Free Software Foundation; either version 2.1
9    *  of the License, or (at your option) any later version.
10   *
11   *  This program 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 GNU
14   *  Lesser General Public License for more details.
15   *
16   *  You should have received a copy of the GNU Lesser General Public
17   *  License along with this program; if not, write to the Free
18   *  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19   *  02111-1307 USA
20   */
21  package coras.client.ui;
22  
23  import java.awt.Dimension;
24  import java.awt.GridLayout;
25  import java.awt.event.ActionEvent;
26  import java.awt.event.ActionListener;
27  import java.awt.event.ComponentAdapter;
28  import java.awt.event.ComponentEvent;
29  import java.util.ArrayList;
30  import java.util.Arrays;
31  import java.util.Collection;
32  import java.util.HashMap;
33  import java.util.Iterator;
34  import java.util.Map;
35  
36  import javax.swing.AbstractButton;
37  import javax.swing.ButtonGroup;
38  import javax.swing.JCheckBox;
39  import javax.swing.JPanel;
40  
41  import coras.structure.ViewpointEnum;
42  
43  /***
44   * @author fvr
45   *
46   * TODO To change the template for this generated type comment go to
47   * Window - Preferences - Java - Code Style - Code Templates
48   */
49  public class ViewpointPanel extends JPanel {
50  
51      public static final String SELECTED_VIEWPOINTS = "selectedViewpoints";
52      
53  	private ButtonGroup buttonGroup = new ButtonGroup();
54      private Map buttonMap = new HashMap();
55      private boolean allowMultipleViewpoints = true;
56      private boolean editable = true;
57  
58      private int minWidth = 0;
59  	private int minHeight = 0;
60  	private int numButtons = ViewpointEnum.VALUES.size();
61  	private GridLayout layout = new GridLayout(numButtons, 1);
62  	/***
63  	 * This is the default constructor
64  	 */
65  	public ViewpointPanel() {
66  		super();
67  		initialize();
68  	}
69  	
70  	/* (non-Javadoc)
71  	 * @see javax.swing.JComponent#getMinimumSize()
72  	 */
73  	public Dimension getMinimumSize() {
74  		Dimension d = super.getMinimumSize();
75  		d.width = minWidth + 2 * layout.getHgap();
76  		return d;
77  	}
78  	
79  	public ViewpointEnum[] getViewpoints() {
80  	    Collection result = new ArrayList();
81  	    for (Iterator i = buttonMap.keySet().iterator(); i.hasNext(); ) {
82  	        ViewpointEnum viewpoint = (ViewpointEnum) i.next();
83  	        AbstractButton button = (AbstractButton) buttonMap.get(viewpoint);
84  	        if (button.isSelected()) {
85  	            result.add(viewpoint);
86  	        }
87  	    }
88  	    return (ViewpointEnum[]) result.toArray(new ViewpointEnum[0]);
89  	}
90  	
91  	public ViewpointEnum getViewpoint() {
92  	    ViewpointEnum[] viewpoints = getViewpoints();
93  	    if (viewpoints.length == 0) {
94  	        return null;
95  	    } else {
96  	        // FIXME handle length > 1 ???
97  	        return viewpoints[0];
98  	    }
99  	}
100 
101     /***
102      * @param viewpointArray
103      */
104     public void setViewpoints(ViewpointEnum[] viewpointArray) {
105         if (viewpointArray == null) {
106             viewpointArray = new ViewpointEnum[0];
107         }
108         Collection viewpoints = Arrays.asList(viewpointArray);
109         for (Iterator i = buttonMap.keySet().iterator(); i.hasNext();) {
110             ViewpointEnum viewpoint = (ViewpointEnum) i.next();
111             AbstractButton button = (AbstractButton) buttonMap.get(viewpoint);
112             button.setSelected(viewpoints.contains(viewpoint));
113         }
114     }
115 
116 	public boolean isEditable() {
117 	    return editable;
118 	}
119 	
120     /***
121      * @param editable
122      */
123     public synchronized void setEditable(boolean editable) {
124         if (this.editable == editable) {
125             return;
126         }
127         this.editable = editable;
128         for (Iterator i = buttonMap.values().iterator(); i.hasNext();) {
129             AbstractButton button = (AbstractButton) i.next();
130             button.setEnabled(editable);
131         }
132     }
133 
134 	public boolean isAllowMultipleViewpoints() {
135 	    return allowMultipleViewpoints = false;
136 	}
137 	
138 	public synchronized void setAllowMultipleViewpoints(boolean enable) {
139 	    if (allowMultipleViewpoints == enable) {
140 	        return;
141 	    }
142 	    allowMultipleViewpoints = enable;
143 	    for (Iterator i = buttonMap.values().iterator(); i.hasNext();) {
144 	        AbstractButton button = (AbstractButton) i.next();
145 	        if (allowMultipleViewpoints) {
146 	            buttonGroup.remove(button);
147 	        } else {
148 	            buttonGroup.add(button);
149 	        }
150 	    }
151 	}
152 	
153 	private void recalculateSize() {
154 		Dimension size = getSize();
155 		int width = Math.max(size.width, minWidth + 2 * layout.getHgap());
156 		int cols = (width - layout.getHgap()) / (minWidth + layout.getHgap());
157 		int rows = ((numButtons - 1) / cols) + 1;
158 		if (layout.getColumns() != cols || layout.getRows() != rows) {
159 			layout.setColumns(cols);
160 			layout.setRows(rows);
161 			this.revalidate();
162 		}
163 	}
164 
165 	/***
166 	 * This method initializes this
167 	 * 
168 	 * @return void
169 	 */
170 	private  void initialize() {
171 		this.setLayout(layout);
172 		this.setSize(300, 200);
173 		for (Iterator i = ViewpointEnum.VALUES.iterator(); i.hasNext();) {
174 			ViewpointEnum viewpoint = (ViewpointEnum) i.next();
175 			AbstractButton button = new JCheckBox();
176 			button.setEnabled(editable);
177 			button.setText(viewpoint.toString());
178 			buttonMap.put(viewpoint, button);
179 			add(button);
180 			
181 			Dimension size = button.getMinimumSize();
182 			if (size.width > minWidth) {
183 				minWidth = size.width;
184 			}
185 			if (size.height > minHeight) {
186 				minHeight = size.height;
187 			}
188 			
189 			button.addActionListener(new ActionListener() {
190 				public void actionPerformed(ActionEvent e) {
191 					// FIXME hack, use real property values
192 					firePropertyChange(SELECTED_VIEWPOINTS, null, getViewpoints());
193 				}
194 			});
195 		}
196 		this.addComponentListener(new ComponentAdapter() {
197 			public void componentResized(ComponentEvent e) {
198 				recalculateSize();
199 			}
200 		});
201 	}
202 
203 }