Changeset 1654 in josm for trunk/src/org/openstreetmap
- Timestamp:
- 2009-06-07T23:22:54+02:00 (15 years ago)
- Location:
- trunk/src/org/openstreetmap/josm
- Files:
-
- 5 added
- 12 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/command/TagConflictResolveCommand.java
r1642 r1654 16 16 import org.openstreetmap.josm.data.osm.Relation; 17 17 import org.openstreetmap.josm.data.osm.Way; 18 import org.openstreetmap.josm.gui.conflict. tags.MergeDecisionType;18 import org.openstreetmap.josm.gui.conflict.MergeDecisionType; 19 19 import org.openstreetmap.josm.gui.conflict.tags.TagMergeItem; 20 20 import org.openstreetmap.josm.tools.ImageProvider; … … 121 121 // 122 122 if (!Main.map.conflictDialog.conflicts.containsKey(my)) { 123 Main.map.conflictDialog. conflicts.put(my,their);123 Main.map.conflictDialog.addConflict(my, their); 124 124 } 125 125 } 126 127 128 126 } -
trunk/src/org/openstreetmap/josm/command/VersionConflictResolveCommand.java
r1642 r1654 86 86 } 87 87 } 88 89 90 88 } -
trunk/src/org/openstreetmap/josm/command/WayNodesConflictResolverCommand.java
r1622 r1654 25 25 26 26 /** my way */ 27 private Way my;28 /** their way */ 29 private Way their;27 private final Way my; 28 /** their way */ 29 private final Way their; 30 30 /** the list of merged nodes. This becomes the list of news of my way after the 31 31 * command is executed 32 32 */ 33 private List<Node> mergedNodeList;34 33 private final List<Node> mergedNodeList; 34 35 35 /** 36 36 * 37 37 * @param my my may 38 38 * @param their their way 39 * @param mergedNodeList the list of merged nodes 39 * @param mergedNodeList the list of merged nodes 40 40 */ 41 41 public WayNodesConflictResolverCommand(Way my, Way their, List<Node> mergedNodeList) { … … 44 44 this.mergedNodeList = mergedNodeList; 45 45 } 46 47 46 47 48 48 @Override 49 49 public MutableTreeNode description() { 50 50 return new DefaultMutableTreeNode( 51 51 new JLabel( 52 tr("Resolve conflicts in node list of of way {0}", my.id),53 ImageProvider.get("data", "object"),54 JLabel.HORIZONTAL52 tr("Resolve conflicts in node list of of way {0}", my.id), 53 ImageProvider.get("data", "object"), 54 JLabel.HORIZONTAL 55 55 ) 56 56 ); 57 57 } 58 58 … … 62 62 // 63 63 super.executeCommand(); 64 64 65 65 // replace the list of nodes of 'my' way by the list of merged 66 // nodes 66 // nodes 67 67 // 68 68 my.nodes.clear(); … … 74 74 } 75 75 } 76 return true; 76 return true; 77 77 } 78 78 … … 80 80 public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, 81 81 Collection<OsmPrimitive> added) { 82 modified.add(my); 82 modified.add(my); 83 83 } 84 84 … … 88 88 // 89 89 super.undoCommand(); 90 90 91 91 // restore a conflict if necessary 92 92 // 93 93 if (!Main.map.conflictDialog.conflicts.containsKey(my)) { 94 Main.map.conflictDialog. conflicts.put(my,their);94 Main.map.conflictDialog.addConflict(my, their); 95 95 } 96 96 } -
trunk/src/org/openstreetmap/josm/gui/conflict/ConflictResolver.java
r1650 r1654 16 16 import org.openstreetmap.josm.command.Command; 17 17 import org.openstreetmap.josm.command.SequenceCommand; 18 import org.openstreetmap.josm.command.TagConflictResolveCommand;19 18 import org.openstreetmap.josm.command.VersionConflictResolveCommand; 20 19 import org.openstreetmap.josm.data.osm.Node; … … 24 23 import org.openstreetmap.josm.gui.conflict.nodes.NodeListMergeModel; 25 24 import org.openstreetmap.josm.gui.conflict.nodes.NodeListMerger; 25 import org.openstreetmap.josm.gui.conflict.properties.PropertiesMergeModel; 26 import org.openstreetmap.josm.gui.conflict.properties.PropertiesMerger; 26 27 import org.openstreetmap.josm.gui.conflict.relation.RelationMemberListMergeModel; 27 28 import org.openstreetmap.josm.gui.conflict.relation.RelationMemberMerger; … … 42 43 private NodeListMerger nodeListMerger; 43 44 private RelationMemberMerger relationMemberMerger; 45 private PropertiesMerger propertiesMerger; 44 46 private OsmPrimitive my; 45 47 private OsmPrimitive their; … … 56 58 tabbedPane = new JTabbedPane(); 57 59 60 propertiesMerger = new PropertiesMerger(); 61 propertiesMerger.setName("panel.propertiesmerger"); 62 propertiesMerger.getModel().addPropertyChangeListener(this); 63 tabbedPane.add(tr("Properties"), propertiesMerger); 64 58 65 tagMerger = new TagMerger(); 59 66 tagMerger.setName("panel.tagmerger"); 60 67 tagMerger.getModel().addPropertyChangeListener(this); 61 tabbedPane.add( "Tags", tagMerger);68 tabbedPane.add(tr("Tags"), tagMerger); 62 69 63 70 nodeListMerger = new NodeListMerger(); 64 71 nodeListMerger.setName("panel.nodelistmerger"); 65 72 nodeListMerger.getModel().addPropertyChangeListener(this); 66 tabbedPane.add( "Nodes", nodeListMerger);73 tabbedPane.add(tr("Nodes"), nodeListMerger); 67 74 68 75 relationMemberMerger = new RelationMemberMerger(); 69 76 relationMemberMerger.setName("panel.relationmembermerger"); 70 77 relationMemberMerger.getModel().addPropertyChangeListener(this); 71 tabbedPane.add( "Members", relationMemberMerger);78 tabbedPane.add(tr("Members"), relationMemberMerger); 72 79 73 80 setLayout(new BorderLayout()); … … 81 88 82 89 public void propertyChange(PropertyChangeEvent evt) { 83 84 90 if (evt.getPropertyName().equals(TagMergeModel.PROP_NUM_UNDECIDED_TAGS)) { 85 91 int newValue = (Integer)evt.getNewValue(); 86 92 if (newValue == 0) { 87 tabbedPane.setTitleAt( 0, tr("Tags"));88 tabbedPane.setToolTipTextAt( 0, tr("No pending tag conflicts to be resolved"));89 tabbedPane.setIconAt( 0, mergeComplete);90 } else { 91 tabbedPane.setTitleAt( 0, tr("Tags({0} conflicts)", newValue));92 tabbedPane.setToolTipTextAt( 0, tr("{0} pending tag conflicts to be resolved"));93 tabbedPane.setIconAt( 0, mergeIncomplete);93 tabbedPane.setTitleAt(1, tr("Tags")); 94 tabbedPane.setToolTipTextAt(1, tr("No pending tag conflicts to be resolved")); 95 tabbedPane.setIconAt(1, mergeComplete); 96 } else { 97 tabbedPane.setTitleAt(1, tr("Tags({0} conflicts)", newValue)); 98 tabbedPane.setToolTipTextAt(1, tr("{0} pending tag conflicts to be resolved")); 99 tabbedPane.setIconAt(1, mergeIncomplete); 94 100 } 95 101 } else if (evt.getPropertyName().equals(ListMergeModel.FROZEN_PROP)) { 96 102 boolean frozen = (Boolean)evt.getNewValue(); 97 103 if (frozen && evt.getSource() == nodeListMerger.getModel()) { 98 tabbedPane.setTitleAt( 1, tr("Nodes(resolved)"));99 tabbedPane.setToolTipTextAt( 1, tr("Merged node list frozen. No pending conflicts in the node list of this way"));100 tabbedPane.setIconAt( 1, mergeComplete);101 } else { 102 tabbedPane.setTitleAt( 1, tr("Nodes(with conflicts)"));103 tabbedPane.setToolTipTextAt( 1,tr("Pending conflicts in the node list of this way"));104 tabbedPane.setIconAt( 1, mergeIncomplete);104 tabbedPane.setTitleAt(2, tr("Nodes(resolved)")); 105 tabbedPane.setToolTipTextAt(2, tr("Merged node list frozen. No pending conflicts in the node list of this way")); 106 tabbedPane.setIconAt(2, mergeComplete); 107 } else { 108 tabbedPane.setTitleAt(2, tr("Nodes(with conflicts)")); 109 tabbedPane.setToolTipTextAt(2,tr("Pending conflicts in the node list of this way")); 110 tabbedPane.setIconAt(2, mergeIncomplete); 105 111 } 106 112 if (frozen && evt.getSource() == relationMemberMerger.getModel()) { 107 tabbedPane.setTitleAt(2, tr("Members(resolved)")); 108 tabbedPane.setToolTipTextAt(2, tr("Merged member list frozen. No pending conflicts in the member list of this relation")); 109 tabbedPane.setIconAt(2, mergeComplete); 110 } else { 111 tabbedPane.setTitleAt(2, tr("Members(with conflicts)")); 112 tabbedPane.setToolTipTextAt(2, tr("Pending conflicts in the member list of this relation")); 113 tabbedPane.setIconAt(2, mergeIncomplete); 114 } 115 } 116 } 113 tabbedPane.setTitleAt(3, tr("Members(resolved)")); 114 tabbedPane.setToolTipTextAt(3, tr("Merged member list frozen. No pending conflicts in the member list of this relation")); 115 tabbedPane.setIconAt(3, mergeComplete); 116 } else { 117 tabbedPane.setTitleAt(3, tr("Members(with conflicts)")); 118 tabbedPane.setToolTipTextAt(3, tr("Pending conflicts in the member list of this relation")); 119 tabbedPane.setIconAt(3, mergeIncomplete); 120 } 121 } else if (evt.getPropertyName().equals(PropertiesMergeModel.RESOLVED_COMPLETELY_PROP)) { 122 boolean resolved = (Boolean)evt.getNewValue(); 123 if (resolved) { 124 tabbedPane.setTitleAt(0, tr("Properties")); 125 tabbedPane.setToolTipTextAt(0, tr("No pending property conflicts")); 126 tabbedPane.setIconAt(0, mergeComplete); 127 } else { 128 tabbedPane.setTitleAt(0, tr("Properties(with conflicts)")); 129 tabbedPane.setToolTipTextAt(0, tr("Pending property conflicts to be resolved")); 130 tabbedPane.setIconAt(0, mergeIncomplete); 131 } 132 } 133 } 134 117 135 118 136 /** … … 126 144 this.my = my; 127 145 this.their = their; 146 propertiesMerger.getModel().populate(my, their); 147 tabbedPane.setEnabledAt(0, true); 128 148 tagMerger.getModel().populate(my, their); 129 tabbedPane.setEnabledAt(0,true); 149 tabbedPane.setEnabledAt(1, true); 150 130 151 if (my instanceof Node) { 131 tabbedPane.setEnabledAt(1,false);132 152 tabbedPane.setEnabledAt(2,false); 153 tabbedPane.setEnabledAt(3,false); 133 154 } else if (my instanceof Way) { 134 155 nodeListMerger.populate((Way)my, (Way)their); 135 tabbedPane.setEnabledAt(1, true); 136 tabbedPane.setEnabledAt(2, false); 156 tabbedPane.setEnabledAt(2, true); 157 tabbedPane.setEnabledAt(3, false); 158 tabbedPane.setTitleAt(3,tr("Members")); 159 tabbedPane.setIconAt(3, null); 137 160 } else if (my instanceof Relation) { 138 161 relationMemberMerger.populate((Relation)my, (Relation)their); 139 tabbedPane.setEnabledAt(1, false); 140 tabbedPane.setEnabledAt(2, true); 162 tabbedPane.setEnabledAt(2, false); 163 tabbedPane.setTitleAt(2,tr("Nodes")); 164 tabbedPane.setIconAt(2, null); 165 tabbedPane.setEnabledAt(3, true); 141 166 } 142 167 } … … 150 175 public Command buildResolveCommand() { 151 176 ArrayList<Command> commands = new ArrayList<Command>(); 152 TagConflictResolveCommand cmd = tagMerger.getModel().buildResolveCommand(my, their); 153 commands.add(cmd); 177 if (tagMerger.getModel().getNumResolvedConflicts() > 0) { 178 commands.add(tagMerger.getModel().buildResolveCommand(my, their)); 179 } 180 commands.addAll(propertiesMerger.getModel().buildResolveCommand(my, their)); 154 181 if (my instanceof Way && nodeListMerger.getModel().isFrozen()) { 155 182 NodeListMergeModel model =(NodeListMergeModel)nodeListMerger.getModel(); … … 159 186 commands.add(model.buildResolveCommand((Relation)my, (Relation)their)); 160 187 } 188 if (isResolvedCompletely()) { 189 commands.add( 190 new VersionConflictResolveCommand(my, their) 191 ); 192 } 193 return new SequenceCommand(tr("Conflict Resolution"), commands); 194 } 195 196 public boolean isResolvedCompletely() { 161 197 if (my instanceof Node) { 162 198 // resolve the version conflict if this is a node and all tag 163 199 // conflicts have been resolved 164 200 // 165 if (tagMerger.getModel().isResolvedCompletely()) { 166 commands.add( 167 new VersionConflictResolveCommand(my, their) 168 ); 169 } 170 } else if (my instanceof Way) { 171 // resolve the version conflict if this is a way, all tag 172 // conflicts have been resolved, and conflicts in the node list 173 // have been resolved 174 // 175 if (tagMerger.getModel().isResolvedCompletely() && nodeListMerger.getModel().isFrozen()) { 176 commands.add( 177 new VersionConflictResolveCommand(my, their) 178 ); 179 } 180 } else if (my instanceof Relation) { 181 // resolve the version conflict if this is a relation, all tag 182 // conflicts and all conflicts in the member list 183 // have been resolved 184 // 185 if (tagMerger.getModel().isResolvedCompletely() && relationMemberMerger.getModel().isFrozen()) { 186 commands.add( 187 new VersionConflictResolveCommand(my, their) 188 ); 189 } 190 } 191 return new SequenceCommand(tr("Conflict Resolution"), commands); 192 } 193 194 public boolean isCompletelyResolved() { 195 if (my instanceof Node) { 196 // resolve the version conflict if this is a node and all tag 197 // conflicts have been resolved 198 // 199 if (tagMerger.getModel().isResolvedCompletely()) 201 if (tagMerger.getModel().isResolvedCompletely() 202 && propertiesMerger.getModel().isResolvedCompletely()) 200 203 return true; 201 204 } else if (my instanceof Way) { … … 204 207 // have been resolved 205 208 // 206 if (tagMerger.getModel().isResolvedCompletely() && nodeListMerger.getModel().isFrozen()) 209 if (tagMerger.getModel().isResolvedCompletely() 210 && propertiesMerger.getModel().isResolvedCompletely() 211 && nodeListMerger.getModel().isFrozen()) 207 212 return true; 208 213 } else if (my instanceof Relation) { … … 211 216 // have been resolved 212 217 // 213 if (tagMerger.getModel().isResolvedCompletely() && relationMemberMerger.getModel().isFrozen()) 218 if (tagMerger.getModel().isResolvedCompletely() 219 && propertiesMerger.getModel().isResolvedCompletely() 220 && relationMemberMerger.getModel().isFrozen()) 214 221 return true; 215 222 } -
trunk/src/org/openstreetmap/josm/gui/conflict/MergeDecisionType.java
r1653 r1654 1 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.gui.conflict .tags;2 package org.openstreetmap.josm.gui.conflict; 3 3 4 4 public enum MergeDecisionType { -
trunk/src/org/openstreetmap/josm/gui/conflict/nodes/NodeListTableCellRenderer.java
r1650 r1654 81 81 } 82 82 83 83 /** 84 * build the tool tip text for an {@see OsmPrimitive}. It consist of the formatted 85 * key/value pairs for this primitive. 86 * 87 * @param primitive 88 * @return the tool tip text 89 */ 84 90 public String buildToolTipText(OsmPrimitive primitive) { 85 91 StringBuilder sb = new StringBuilder(); 92 86 93 sb.append("<html>"); 94 // show the id 95 // 87 96 sb.append("<strong>id</strong>=") 88 97 .append(primitive.id) 89 98 .append("<br>"); 99 100 // show the key/value-pairs, sorted by key 101 // 90 102 ArrayList<String> keyList = new ArrayList<String>(primitive.keySet()); 91 103 Collections.sort(keyList); … … 99 111 .append("</strong>") 100 112 .append("="); 113 // make sure long values are split into several rows. Otherwise 114 // the tool tip window can become to wide 115 // 101 116 String value = primitive.get(key); 102 117 while(value.length() != 0) { … … 121 136 setForeground(Color.BLACK); 122 137 } 123 124 125 138 126 139 /** -
trunk/src/org/openstreetmap/josm/gui/conflict/tags/MergedTableCellRenderer.java
r1642 r1654 5 5 6 6 import java.awt.Color; 7 8 import org.openstreetmap.josm.gui.conflict.MergeDecisionType; 7 9 8 10 public class MergedTableCellRenderer extends TagMergeTableCellRenderer { -
trunk/src/org/openstreetmap/josm/gui/conflict/tags/MineTableCellRenderer.java
r1622 r1654 3 3 4 4 import java.awt.Color; 5 6 import org.openstreetmap.josm.gui.conflict.MergeDecisionType; 7 5 8 import static org.openstreetmap.josm.tools.I18n.tr; 6 9 -
trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagMergeItem.java
r1622 r1654 7 7 8 8 import org.openstreetmap.josm.data.osm.OsmPrimitive; 9 import org.openstreetmap.josm.gui.conflict.MergeDecisionType; 9 10 10 11 /** -
trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagMergeModel.java
r1622 r1654 13 13 import org.openstreetmap.josm.command.TagConflictResolveCommand; 14 14 import org.openstreetmap.josm.data.osm.OsmPrimitive; 15 import org.openstreetmap.josm.gui.conflict.MergeDecisionType; 15 16 16 17 /** … … 21 22 * 22 23 * {@see #decide(int, MergeDecisionType)} and {@see #decide(int[], MergeDecisionType)} can be used 23 * to remember a merge decision for a specific row in the model. 24 * 24 * to remember a merge decision for a specific row in the model. 25 * 25 26 * The model notifies {@see PropertyChangeListener}s about updates of the number of 26 27 * undecided tags (see {@see #PROP_NUM_UNDECIDED_TAGS}). … … 31 32 32 33 static public final String PROP_NUM_UNDECIDED_TAGS = TagMergeModel.class.getName() + ".numUndecidedTags"; 33 34 34 35 /** the list of tag merge items */ 35 private ArrayList<TagMergeItem> tagMergeItems;36 36 private final ArrayList<TagMergeItem> tagMergeItems; 37 37 38 /** the property change listeners */ 38 private ArrayList<PropertyChangeListener> listeners;39 39 private final ArrayList<PropertyChangeListener> listeners; 40 40 41 private int numUndecidedTags = 0; 41 42 42 43 43 44 public TagMergeModel() { 44 45 tagMergeItems = new ArrayList<TagMergeItem>(); 45 46 listeners = new ArrayList<PropertyChangeListener>(); 46 47 } 47 48 48 49 public void addPropertyChangeListener(PropertyChangeListener listener) { 49 50 synchronized(listeners) { … … 53 54 } 54 55 } 55 56 56 57 public void removePropertyChangeListener(PropertyChangeListener listener) { 57 58 synchronized(listeners) { … … 61 62 } 62 63 } 63 64 64 65 /** 65 66 * notifies {@see PropertyChangeListener}s about an update of {@see TagMergeModel#PROP_NUM_UNDECIDED_TAGS} 66 67 67 * @param oldValue the old value 68 * @param newValue the new value 68 * @param oldValue the old value 69 * @param newValue the new value 69 70 */ 70 71 protected void fireNumUndecidedTagsChanged(int oldValue, int newValue) { … … 76 77 } 77 78 } 78 79 79 80 /** 80 81 * refreshes the number of undecided tag conflicts after an update in the list of … … 89 90 } 90 91 } 91 if (newValue != numUndecidedTags) { 92 int oldValue = numUndecidedTags; 93 numUndecidedTags = newValue; 94 fireNumUndecidedTagsChanged(oldValue, numUndecidedTags); 95 } 96 } 97 98 /** 99 * Populate the model with conflicts between the tag sets of the two 92 int oldValue = numUndecidedTags; 93 numUndecidedTags = newValue; 94 fireNumUndecidedTagsChanged(oldValue, numUndecidedTags); 95 96 } 97 98 /** 99 * Populate the model with conflicts between the tag sets of the two 100 100 * {@see OsmPrimitive} <code>my</code> and <code>their</code>. 101 101 * 102 102 * @param my my primitive (i.e. the primitive from the local dataset) 103 * @param their their primitive (i.e. the primitive from the server dataset) 103 * @param their their primitive (i.e. the primitive from the server dataset) 104 104 * 105 105 */ … … 114 114 if (myValue == null || theirValue == null || ! myValue.equals(theirValue)) { 115 115 tagMergeItems.add( 116 new TagMergeItem(key, my, their)116 new TagMergeItem(key, my, their) 117 117 ); 118 118 } … … 121 121 refreshNumUndecidedTags(); 122 122 } 123 123 124 124 /** 125 125 * add a {@see TagMergeItem} to the model 126 126 * 127 * @param item the item 127 * @param item the item 128 128 */ 129 129 public void addItem(TagMergeItem item) { … … 134 134 } 135 135 } 136 136 137 137 protected void rememberDecision(int row, MergeDecisionType decision) { 138 138 TagMergeItem item = tagMergeItems.get(row); … … 144 144 * to <code>decision</code>. 145 145 * 146 * @param row the row 147 * @param decision the decision 146 * @param row the row 147 * @param decision the decision 148 148 */ 149 149 public void decide(int row, MergeDecisionType decision) { … … 157 157 * to <code>decision</code>. 158 158 * 159 * @param row the array of row indices 160 * @param decision the decision 159 * @param row the array of row indices 160 * @param decision the decision 161 161 */ 162 162 163 163 public void decide(int [] rows, MergeDecisionType decision) { 164 if (rows == null || rows.length == 0) {164 if (rows == null || rows.length == 0) 165 165 return; 166 }167 166 for (int row : rows) { 168 167 rememberDecision(row, decision); … … 182 181 // return the tagMergeItem for both columns. The cell 183 182 // renderer will dispatch on the column index and get 184 // the key or the value from the TagMergeItem 183 // the key or the value from the TagMergeItem 185 184 // 186 185 return tagMergeItems.get(row); … … 191 190 return false; 192 191 } 193 194 192 195 193 public TagConflictResolveCommand buildResolveCommand(OsmPrimitive my, OsmPrimitive their) { 196 194 return new TagConflictResolveCommand(my, their, tagMergeItems); 197 195 } 198 196 199 197 public boolean isResolvedCompletely() { 200 198 for (TagMergeItem item: tagMergeItems) { 201 if (item.getMergeDecision().equals(MergeDecisionType.UNDECIDED)) { 202 return false; 203 } 204 } 205 return true; 199 if (item.getMergeDecision().equals(MergeDecisionType.UNDECIDED)) 200 return false; 201 } 202 return true; 203 } 204 205 public int getNumResolvedConflicts() { 206 int n = 0; 207 for (TagMergeItem item: tagMergeItems) { 208 if (!item.getMergeDecision().equals(MergeDecisionType.UNDECIDED)) { 209 n++; 210 } 211 } 212 return n; 213 206 214 } 207 215 } -
trunk/src/org/openstreetmap/josm/gui/conflict/tags/TagMerger.java
r1642 r1654 26 26 import javax.swing.event.ListSelectionListener; 27 27 28 import org.openstreetmap.josm.gui.conflict.MergeDecisionType; 28 29 import org.openstreetmap.josm.tools.ImageProvider; 29 30 /** -
trunk/src/org/openstreetmap/josm/gui/conflict/tags/TheirTableCellRenderer.java
r1622 r1654 5 5 6 6 import java.awt.Color; 7 8 import org.openstreetmap.josm.gui.conflict.MergeDecisionType; 7 9 8 10 public class TheirTableCellRenderer extends TagMergeTableCellRenderer { -
trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java
r1642 r1654 169 169 170 170 public void actionPerformed(ActionEvent arg0) { 171 if (! resolver.is CompletelyResolved()) {171 if (! resolver.isResolvedCompletely()) { 172 172 Object[] options = { 173 173 tr("Apply partial resolutions"),
Note:
See TracChangeset
for help on using the changeset viewer.