1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.model.tree.nodes;
14
15 import java.awt.event.ActionEvent;
16 import java.util.ArrayList;
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20
21 import javax.swing.AbstractAction;
22 import javax.swing.Action;
23
24 import com.eviware.soapui.impl.wsdl.MutableTestPropertyHolder;
25 import com.eviware.soapui.model.ModelItem;
26 import com.eviware.soapui.model.TestModelItem;
27 import com.eviware.soapui.model.TestPropertyHolder;
28 import com.eviware.soapui.model.testsuite.TestPropertyListener;
29 import com.eviware.soapui.model.tree.AbstractModelItemTreeNode;
30 import com.eviware.soapui.model.tree.SoapUITreeModel;
31 import com.eviware.soapui.model.tree.SoapUITreeNode;
32 import com.eviware.soapui.model.tree.nodes.support.EmptyModelItem;
33 import com.eviware.soapui.support.StringUtils;
34 import com.eviware.soapui.support.UISupport;
35 import com.eviware.soapui.support.action.swing.ActionList;
36 import com.eviware.soapui.support.action.swing.DefaultActionList;
37
38 public class PropertiesTreeNode<T extends ModelItem> extends AbstractModelItemTreeNode<T>
39 {
40 private List<PropertyTreeNode> propertyNodes = new ArrayList<PropertyTreeNode>();
41 private Map<String, PropertyTreeNode> propertyMap = new HashMap<String, PropertyTreeNode>();
42 private InternalTestPropertyListener testPropertyListener;
43 private final TestPropertyHolder holder;
44
45 public PropertiesTreeNode( T modelItem, ModelItem parentItem, TestPropertyHolder holder, SoapUITreeModel treeModel )
46 {
47 super( modelItem, parentItem, treeModel );
48 this.holder = holder;
49
50 for( String name : holder.getPropertyNames() )
51 {
52 PropertyTreeNode propertyTreeNode = new PropertyTreeNode( holder.getProperty( name ), getModelItem(), holder,
53 treeModel );
54 propertyNodes.add( propertyTreeNode );
55 propertyMap.put( name, propertyTreeNode );
56 getTreeModel().mapModelItem( propertyTreeNode );
57 }
58
59 testPropertyListener = new InternalTestPropertyListener();
60 holder.addTestPropertyListener( testPropertyListener );
61 }
62
63 public static PropertiesTreeNode<?> createDefaultPropertiesNode( TestModelItem modelItem, SoapUITreeModel treeModel )
64 {
65 return new PropertiesTreeNode<PropertiesTreeNode.PropertiesModelItem>(
66 new PropertiesTreeNode.PropertiesModelItem( modelItem ), modelItem, modelItem, treeModel );
67 }
68
69 public int getChildCount()
70 {
71 return getTreeModel().isShowProperties() ? propertyNodes.size() : 0;
72 }
73
74 public SoapUITreeNode getChildNode( int index )
75 {
76 return propertyNodes.get( index );
77 }
78
79 public int getIndexOfChild( Object child )
80 {
81 return propertyNodes.indexOf( child );
82 }
83
84 public void release()
85 {
86 super.release();
87
88 holder.removeTestPropertyListener( testPropertyListener );
89
90 for( PropertyTreeNode node : propertyNodes )
91 getTreeModel().unmapModelItem( node.getModelItem() );
92
93 propertyNodes.clear();
94 propertyMap.clear();
95 }
96
97 private class InternalTestPropertyListener implements TestPropertyListener
98 {
99 public void propertyAdded( String name )
100 {
101 PropertyTreeNode propertyTreeNode = new PropertyTreeNode( holder.getProperty( name ), getModelItem(), holder,
102 getTreeModel() );
103 propertyNodes.add( propertyTreeNode );
104 propertyMap.put( name, propertyTreeNode );
105 getTreeModel().notifyNodeInserted( propertyTreeNode );
106
107 if( getModelItem() instanceof PropertiesModelItem )
108 {
109 ( ( PropertiesModelItem )getModelItem() ).updateName();
110 }
111 }
112
113 public void propertyRemoved( String name )
114 {
115 SoapUITreeNode treeNode = getTreeModel().getTreeNode( propertyMap.get( name ).getModelItem() );
116 if( propertyNodes.contains( treeNode ) )
117 {
118 getTreeModel().notifyNodeRemoved( treeNode );
119 propertyNodes.remove( treeNode );
120 propertyMap.remove( name );
121
122 if( getModelItem() instanceof PropertiesModelItem )
123 {
124 ( ( PropertiesModelItem )getModelItem() ).updateName();
125 }
126 }
127 else
128 throw new RuntimeException( "Removing unkown property" );
129 }
130
131 public void propertyRenamed( String oldName, String newName )
132 {
133 PropertyTreeNode propertyTreeNode = propertyMap.remove( oldName );
134 propertyMap.put( newName, propertyTreeNode );
135 propertyTreeNode.getModelItem().setName( PropertyTreeNode.buildName( holder.getProperty( newName ) ) );
136 }
137
138 public void propertyValueChanged( String name, String oldValue, String newValue )
139 {
140 PropertyTreeNode propertyTreeNode = propertyMap.get( name );
141 if( propertyTreeNode != null )
142 propertyTreeNode.getModelItem().setName( PropertyTreeNode.buildName( holder.getProperty( name ) ) );
143 }
144
145 public void propertyMoved( String name, int oldIndex, int newIndex )
146 {
147 PropertyTreeNode node = propertyNodes.get( oldIndex );
148 getTreeModel().notifyNodeRemoved( node, false );
149
150 propertyNodes.remove( oldIndex );
151 propertyNodes.add( newIndex, node );
152
153 getTreeModel().notifyNodeInserted( node );
154 }
155 }
156
157 public static class PropertiesModelItem extends EmptyModelItem
158 {
159 private final TestPropertyHolder holder;
160
161 public PropertiesModelItem( TestPropertyHolder holder )
162 {
163 super( "Properties (" + holder.getPropertyNames().length + ")", UISupport
164 .createImageIcon( "/properties_step.gif" ) );
165 this.holder = holder;
166 }
167
168 public void updateName()
169 {
170 setName( "Properties (" + holder.getPropertyNames().length + ")" );
171 }
172 }
173
174 public ActionList getActions()
175 {
176 if( getModelItem() instanceof PropertiesModelItem && holder instanceof MutableTestPropertyHolder )
177 {
178 DefaultActionList actions = new DefaultActionList();
179 actions.addAction( new AddPropertyAction() );
180 return actions;
181 }
182
183 return super.getActions();
184 }
185
186 private class AddPropertyAction extends AbstractAction
187 {
188 public AddPropertyAction()
189 {
190 super( "Add Property" );
191 putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/add_property.gif" ) );
192 putValue( Action.SHORT_DESCRIPTION, "Adds a property to the property list" );
193 }
194
195 public void actionPerformed( ActionEvent e )
196 {
197 String name = UISupport.prompt( "Specify unique property name", "Add Property", "" );
198 if( StringUtils.hasContent( name ) )
199 {
200 if( holder.hasProperty( name ) )
201 {
202 UISupport.showErrorMessage( "Property name [" + name + "] already exists.." );
203 return;
204 }
205
206 ( ( MutableTestPropertyHolder )holder ).addProperty( name );
207 }
208 }
209 }
210 }