001 /* TreeSelectionEvent.java --
002 Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
003
004 This file is part of GNU Classpath.
005
006 GNU Classpath is free software; you can redistribute it and/or modify
007 it under the terms of the GNU General Public License as published by
008 the Free Software Foundation; either version 2, or (at your option)
009 any later version.
010
011 GNU Classpath is distributed in the hope that it will be useful, but
012 WITHOUT ANY WARRANTY; without even the implied warranty of
013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 General Public License for more details.
015
016 You should have received a copy of the GNU General Public License
017 along with GNU Classpath; see the file COPYING. If not, write to the
018 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
019 02110-1301 USA.
020
021 Linking this library statically or dynamically with other modules is
022 making a combined work based on this library. Thus, the terms and
023 conditions of the GNU General Public License cover the whole
024 combination.
025
026 As a special exception, the copyright holders of this library give you
027 permission to link this library with independent modules to produce an
028 executable, regardless of the license terms of these independent
029 modules, and to copy and distribute the resulting executable under
030 terms of your choice, provided that you also meet, for each linked
031 independent module, the terms and conditions of the license of that
032 module. An independent module is a module which is not derived from
033 or based on this library. If you modify this library, you may extend
034 this exception to your version of the library, but you are not
035 obligated to do so. If you do not wish to do so, delete this
036 exception statement from your version. */
037
038
039 package javax.swing.event;
040
041 import java.util.EventObject;
042
043 import javax.swing.tree.TreePath;
044 import javax.swing.tree.TreeSelectionModel;
045
046 /**
047 * An event that carries information about a change to a
048 * {@link TreeSelectionModel}.
049 *
050 * @see TreeSelectionListener
051 *
052 * @author Andrew Selkirk
053 */
054 public class TreeSelectionEvent extends EventObject
055 {
056
057 /**
058 * The paths that have been added or removed from the selection.
059 */
060 protected TreePath[] paths;
061
062 /**
063 * Flags indicating if the paths were added (<code>true</code>) or removed
064 * (<code>false</code>) from the selection.
065 */
066 protected boolean[] areNew;
067
068 /**
069 * The old lead selection path (may be <code>null</code>).
070 */
071 protected TreePath oldLeadSelectionPath;
072
073 /**
074 * The new lead selection path (may be <code>null</code>).
075 */
076 protected TreePath newLeadSelectionPath;
077
078 /**
079 * Creates a new <code>TreeSelectionEvent</code>.
080 *
081 * @param source the source (usually a {@link TreeSelectionModel},
082 * <code>null</code> not permitted).
083 * @param paths an array of the paths that have been added to or removed
084 * from the selection.
085 * @param areNew a flag for each path where <code>true</code> indicates the
086 * corresponding path has been added to the selection and
087 * <code>false</code> indicates the path has been removed.
088 * @param oldLeadSelectionPath the old lead selection path (<code>null</code>
089 * permitted).
090 * @param newLeadSelectionPath the new lead selection path (<code>null</code>
091 * permitted).
092 *
093 * @throws IllegalArgumentException if <code>source</code> is
094 * <code>null</code>.
095 */
096 public TreeSelectionEvent(Object source, TreePath[] paths,
097 boolean[] areNew, TreePath oldLeadSelectionPath,
098 TreePath newLeadSelectionPath)
099 {
100 super(source);
101 this.paths = paths;
102 this.areNew = areNew;
103 this.oldLeadSelectionPath = oldLeadSelectionPath;
104 this.newLeadSelectionPath = newLeadSelectionPath;
105 }
106
107 /**
108 * Creates a new <code>TreeSelectionEvent</code>.
109 *
110 * @param source the event source (usually a {@link TreeSelectionModel},
111 * <code>null</code> not permitted).
112 * @param path the path.
113 * @param isNew <code>true</code> indicates that <code>path</code> has been
114 * added to the selection, and <code>false</code> indicates that it has
115 * been removed.
116 * @param oldLeadSelectionPath the old lead selection path (<code>null</code>
117 * permitted).
118 * @param newLeadSelectionPath the new lead selection path (<code>null</code>
119 * permitted).
120 *
121 * @throws IllegalArgumentException if <code>source</code> is
122 * <code>null</code>.
123 */
124 public TreeSelectionEvent(Object source, TreePath path,
125 boolean isNew, TreePath oldLeadSelectionPath,
126 TreePath newLeadSelectionPath)
127 {
128 super(source);
129 this.paths = new TreePath[]{path};
130 this.areNew = new boolean[]{isNew};
131 this.oldLeadSelectionPath = oldLeadSelectionPath;
132 this.newLeadSelectionPath = newLeadSelectionPath;
133 }
134
135 /**
136 * Returns the first path element.
137 *
138 * @return The first path element.
139 *
140 * @see #getPaths()
141 */
142 public TreePath getPath()
143 {
144 return paths[0];
145 }
146
147 /**
148 * Returns an array of the paths that changed in the selection.
149 *
150 * @return The paths that changed in the selection.
151 *
152 * @see #isAddedPath(TreePath)
153 */
154 public TreePath[] getPaths()
155 {
156 return (TreePath[]) paths.clone();
157 }
158
159 /**
160 * Returns <code>true</code> if the path returned by {@link #getPath()} has
161 * been added to the selection, and <code>false</code> if it has been
162 * removed.
163 *
164 * @return A boolean.
165 *
166 * @see #isAddedPath(int)
167 */
168 public boolean isAddedPath()
169 {
170 return areNew[0];
171 }
172
173 /**
174 * Returns <code>true</code> if <code>path</code> has been added to the
175 * selection, and <code>false</code> if the path has been removed from the
176 * selection.
177 *
178 * @param path the path to check.
179 *
180 * @return A flag indicating whether the path has been added to, or removed
181 * from, the selection.
182 *
183 * @throw IllegalArgumentException if <code>path</code> is not one of the
184 * paths in {@link #getPaths()}.
185 *
186 * @see #isAddedPath(int)
187 */
188 public boolean isAddedPath(TreePath path)
189 {
190 for (int i = paths.length - 1; i >= 0; i--)
191 if (paths[i].equals(path))
192 return areNew[i];
193
194 throw new IllegalArgumentException("Unknown 'path' argument.");
195 }
196
197 /**
198 * Returns <code>true</code> if the path at the specified index has been
199 * added to the selection, and <code>false</code> if the path has been
200 * removed from the selection.
201 *
202 * @param index the path index.
203 *
204 * @return A flag indicating whether the path has been added to, or removed
205 * from, the selection.
206 *
207 * @since 1.3
208 *
209 * @see #isAddedPath(TreePath)
210 */
211 public boolean isAddedPath(int index)
212 {
213 return areNew[index];
214 }
215
216 /**
217 * Returns the old lead selection path.
218 *
219 * @return The old lead selection path (possibly <code>null</code>).
220 *
221 * @see #getNewLeadSelectionPath()
222 */
223 public TreePath getOldLeadSelectionPath()
224 {
225 return oldLeadSelectionPath;
226 }
227
228 /**
229 * Returns the new lead selection path.
230 *
231 * @return The new lead selection path (possibly <code>null</code>).
232 *
233 * @see #getOldLeadSelectionPath()
234 */
235 public TreePath getNewLeadSelectionPath()
236 {
237 return newLeadSelectionPath;
238 }
239
240 /**
241 * Creates a shallow copy of this <code>TreeSelectionEvent</code>, replacing
242 * the source with <code>source</code>.
243 *
244 * @param source the new event source (<code>null</code> not permitted).
245 *
246 * @return A cloned event with another event source.
247 *
248 * @throws IllegalArgumentException if <code>source</code> is
249 * <code>null</code>.
250 */
251 public Object cloneWithSource(Object source)
252 {
253 return new TreeSelectionEvent (source, paths, areNew, oldLeadSelectionPath,
254 newLeadSelectionPath);
255 }
256
257 }