001 /*
002 * Created on Dec 26, 2009
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005 * in compliance with the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License
010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011 * or implied. See the License for the specific language governing permissions and limitations under
012 * the License.
013 *
014 * Copyright @2009-2010 the original author or authors.
015 */
016 package org.fest.swing.fixture;
017
018 import javax.swing.JTree;
019
020 import org.fest.swing.core.MouseButton;
021 import org.fest.swing.core.MouseClickInfo;
022 import org.fest.swing.exception.ActionFailedException;
023 import org.fest.swing.exception.ComponentLookupException;
024
025 /**
026 * Understands functional testing of single nodes, referenced by their row indices, in <code>{@link JTree}</code>s:
027 * <ul>
028 * <li>user input simulation</li>
029 * <li>state verification</li>
030 * <li>property value query</li>
031 * </ul>
032 *
033 * @author Alex Ruiz
034 *
035 * @since 1.2
036 */
037 public class JTreeRowFixture implements JTreeNodeFixture {
038
039 private final int index;
040 private final JTreeFixture tree;
041
042 /**
043 * Creates a new </code>{@link JTreeRowFixture}</code>.
044 * @param tree handles the <code>JTree</code> containing the node with the given row index.
045 * @param index the given row index.
046 */
047 protected JTreeRowFixture(JTreeFixture tree, int index) {
048 this.tree = tree;
049 this.index = index;
050 }
051
052 /**
053 * Simulates a user expanding this fixture's tree node.
054 * @return this fixture.
055 * @throws IllegalStateException if the <code>JTree</code> is disabled.
056 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
057 * @throws ActionFailedException if this method fails to expand the row.
058 */
059 public JTreeRowFixture expand() {
060 tree.expandRow(index);
061 return this;
062 }
063
064 /**
065 * Simulates a user collapsing this fixture's tree node.
066 * @return this fixture.
067 * @throws IllegalStateException if the <code>JTree</code> is disabled.
068 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
069 * @throws ActionFailedException if this method fails to collapse the row.
070 */
071 public JTreeRowFixture collapse() {
072 tree.collapseRow(index);
073 return this;
074 }
075
076 /**
077 * Selects the this fixture's tree node, expanding parent nodes if necessary. This method will not click the node if
078 * it is already selected.
079 * @return this fixture.
080 * @throws IllegalStateException if this fixture's <code>JTree</code> is disabled.
081 * @throws IllegalStateException if this fixture's <code>JTree</code> is not showing on the screen.
082 */
083 public JTreeRowFixture select() {
084 tree.selectRow(index);
085 return this;
086 }
087
088 /**
089 * Simulates a user clicking this fixture's tree node.
090 * @return this fixture.
091 * @throws IllegalStateException if the <code>JTree</code> is disabled.
092 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
093 */
094 public JTreeRowFixture click() {
095 tree.clickRow(index);
096 return this;
097 }
098
099 /**
100 * Simulates a user clicking this fixture's tree node.
101 * @param button the button to click.
102 * @return this fixture.
103 * @throws NullPointerException if the given button is <code>null</code>.
104 * @throws IllegalStateException if the <code>JTree</code> is disabled.
105 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
106 */
107 public JTreeRowFixture click(MouseButton button) {
108 tree.clickRow(index, button);
109 return this;
110 }
111
112 /**
113 * Simulates a user clicking this fixture's tree node.
114 * @param mouseClickInfo specifies the button to click and the times the button should be clicked.
115 * @return this fixture.
116 * @throws NullPointerException if the given <code>MouseClickInfo</code> is <code>null</code>.
117 * @throws IllegalStateException if the <code>JTree</code> is disabled.
118 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
119 */
120 public JTreeRowFixture click(MouseClickInfo mouseClickInfo) {
121 tree.clickRow(index, mouseClickInfo);
122 return this;
123 }
124
125 /**
126 * Simulates a user double-clicking this fixture's tree node.
127 * @return this fixture.
128 * @throws IllegalStateException if the <code>JTree</code> is disabled.
129 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
130 */
131 public JTreeRowFixture doubleClick() {
132 tree.doubleClickRow(index);
133 return this;
134 }
135
136 /**
137 * Simulates a user right-clicking this fixture's tree node.
138 * @return this fixture.
139 * @throws IllegalStateException if the <code>JTree</code> is disabled.
140 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
141 */
142 public JTreeRowFixture rightClick() {
143 tree.rightClickRow(index);
144 return this;
145 }
146
147 /**
148 * Simulates a user dragging this fixture's tree node.
149 * @return this fixture.
150 * @throws IllegalStateException if the <code>JTree</code> is disabled.
151 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
152 */
153 public JTreeRowFixture drag() {
154 tree.drag(index);
155 return this;
156 }
157
158 /**
159 * Simulates a user dropping relative to this fixture's tree node.
160 * @return this fixture.
161 * @throws IllegalStateException if the <code>JTree</code> is disabled.
162 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
163 * @throws ActionFailedException if there is no drag action in effect.
164 */
165 public JTreeRowFixture drop() {
166 tree.drop(index);
167 return this;
168 }
169
170 /**
171 * Shows a pop-up menu using this fixture's tree node as the invoker of the pop-up menu.
172 * @return a fixture that handles functional testing of the displayed pop-up menu.
173 * @throws IllegalStateException if the <code>JTree</code> is disabled.
174 * @throws IllegalStateException if the <code>JTree</code> is not showing on the screen.
175 * @throws ComponentLookupException if a pop-up menu cannot be found.
176 */
177 public JPopupMenuFixture showPopupMenu() {
178 return tree.showPopupMenuAt(index);
179 }
180
181 /**
182 * Returns the <code>String</code> representation of this fixture's tree node.
183 * @return the <code>String</code> representation of this fixture's tree node.
184 */
185 public String value() {
186 return tree.valueAt(index);
187 }
188
189 /**
190 * Returns the row index of the node.
191 * @return the row index of the node.
192 */
193 public int index() {
194 return index;
195 }
196 }