source: josm/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java@ 298

Last change on this file since 298 was 298, checked in by imi, 17 years ago
  • added license description to head of each source file
File size: 6.2 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.gui.dialogs;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.Color;
8import java.awt.Graphics;
9import java.awt.GridLayout;
10import java.awt.Point;
11import java.awt.event.ActionEvent;
12import java.awt.event.ActionListener;
13import java.awt.event.KeyEvent;
14import java.awt.event.MouseAdapter;
15import java.awt.event.MouseEvent;
16import java.util.Collection;
17import java.util.HashMap;
18import java.util.LinkedList;
19import java.util.Map;
20
21import javax.swing.DefaultListModel;
22import javax.swing.JButton;
23import javax.swing.JList;
24import javax.swing.JOptionPane;
25import javax.swing.JPanel;
26import javax.swing.JScrollPane;
27import javax.swing.ListSelectionModel;
28import javax.swing.event.ListSelectionEvent;
29import javax.swing.event.ListSelectionListener;
30
31import org.openstreetmap.josm.Main;
32import org.openstreetmap.josm.command.ConflictResolveCommand;
33import org.openstreetmap.josm.data.SelectionChangedListener;
34import org.openstreetmap.josm.data.osm.DataSet;
35import org.openstreetmap.josm.data.osm.Node;
36import org.openstreetmap.josm.data.osm.OsmPrimitive;
37import org.openstreetmap.josm.data.osm.Segment;
38import org.openstreetmap.josm.data.osm.Way;
39import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
40import org.openstreetmap.josm.data.osm.visitor.Visitor;
41import org.openstreetmap.josm.gui.ConflictResolver;
42import org.openstreetmap.josm.gui.NavigatableComponent;
43import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
44import org.openstreetmap.josm.tools.ImageProvider;
45
46public final class ConflictDialog extends ToggleDialog {
47
48 public final Map<OsmPrimitive, OsmPrimitive> conflicts = new HashMap<OsmPrimitive, OsmPrimitive>();
49 private final DefaultListModel model = new DefaultListModel();
50 private final JList displaylist = new JList(model);
51
52 public ConflictDialog() {
53 super(tr("Conflict"), "conflict", tr("Merging conflicts."), KeyEvent.VK_C, 100);
54 displaylist.setCellRenderer(new OsmPrimitivRenderer());
55 displaylist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
56 displaylist.addMouseListener(new MouseAdapter(){
57 @Override public void mouseClicked(MouseEvent e) {
58 if (e.getClickCount() >= 2)
59 resolve();
60 }
61 });
62 add(new JScrollPane(displaylist), BorderLayout.CENTER);
63
64 JPanel buttonPanel = new JPanel(new GridLayout(1,2));
65 JButton button = new JButton(tr("Resolve"), ImageProvider.get("dialogs", "conflict"));
66 button.setToolTipText(tr("Open a merge dialog of all selected items in the list above."));
67 button.addActionListener(new ActionListener(){
68 public void actionPerformed(ActionEvent e) {
69 resolve();
70 }
71 });
72 button.putClientProperty("help", "Dialog/Conflict/Resolve");
73 buttonPanel.add(button);
74
75 button = new JButton(tr("Select"), ImageProvider.get("mapmode/selection/select"));
76 button.setToolTipText(tr("Set the selected elements on the map to the selected items in the list above."));
77 button.addActionListener(new ActionListener(){
78 public void actionPerformed(ActionEvent e) {
79 Collection<OsmPrimitive> sel = new LinkedList<OsmPrimitive>();
80 for (Object o : displaylist.getSelectedValues())
81 sel.add((OsmPrimitive)o);
82 Main.ds.setSelected(sel);
83 }
84 });
85 button.putClientProperty("help", "Dialog/Conflict/Select");
86 buttonPanel.add(button);
87
88 add(buttonPanel, BorderLayout.SOUTH);
89
90 DataSet.listeners.add(new SelectionChangedListener(){
91 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
92 displaylist.clearSelection();
93 for (OsmPrimitive osm : newSelection) {
94 if (conflicts.containsKey(osm)) {
95 int pos = model.indexOf(osm);
96 displaylist.addSelectionInterval(pos, pos);
97 }
98 }
99 }
100 });
101 displaylist.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
102 public void valueChanged(ListSelectionEvent e) {
103 Main.map.mapView.repaint();
104 }
105 });
106 }
107
108 private final void resolve() {
109 if (displaylist.getSelectedIndex() == -1) {
110 JOptionPane.showMessageDialog(Main.parent,tr("Please select something from the conflict list."));
111 return;
112 }
113 Map<OsmPrimitive, OsmPrimitive> sel = new HashMap<OsmPrimitive, OsmPrimitive>();
114 for (int i : displaylist.getSelectedIndices()) {
115 OsmPrimitive s = (OsmPrimitive)model.get(i);
116 sel.put(s, conflicts.get(s));
117 }
118 ConflictResolver resolver = new ConflictResolver(sel);
119 int answer = JOptionPane.showConfirmDialog(Main.parent, resolver, tr("Resolve Conflicts"), JOptionPane.OK_CANCEL_OPTION);
120 if (answer != JOptionPane.OK_OPTION)
121 return;
122 Main.main.editLayer().add(new ConflictResolveCommand(resolver.conflicts, sel));
123 Main.map.mapView.repaint();
124 }
125
126 public final void rebuildList() {
127 model.removeAllElements();
128 for (OsmPrimitive osm : this.conflicts.keySet())
129 if (osm instanceof Node)
130 model.addElement(osm);
131 for (OsmPrimitive osm : this.conflicts.keySet())
132 if (osm instanceof Segment)
133 model.addElement(osm);
134 for (OsmPrimitive osm : this.conflicts.keySet())
135 if (osm instanceof Way)
136 model.addElement(osm);
137 }
138
139 public final void add(Map<OsmPrimitive, OsmPrimitive> conflicts) {
140 this.conflicts.putAll(conflicts);
141 rebuildList();
142 }
143
144 /**
145 * Paint all conflicts that can be expressed on the main window.
146 */
147 public void paintConflicts(final Graphics g, final NavigatableComponent nc) {
148 Color preferencesColor = SimplePaintVisitor.getPreferencesColor("conflict", Color.gray);
149 if (preferencesColor.equals(Color.BLACK))
150 return;
151 g.setColor(preferencesColor);
152 Visitor conflictPainter = new Visitor(){
153 public void visit(Node n) {
154 Point p = nc.getPoint(n.eastNorth);
155 g.drawRect(p.x-1, p.y-1, 2, 2);
156 }
157 public void visit(Segment ls) {
158 if (ls.incomplete)
159 return;
160 Point p1 = nc.getPoint(ls.from.eastNorth);
161 Point p2 = nc.getPoint(ls.to.eastNorth);
162 g.drawLine(p1.x, p1.y, p2.x, p2.y);
163 }
164 public void visit(Way w) {
165 for (Segment ls : w.segments)
166 visit(ls);
167 }
168 };
169 for (Object o : displaylist.getSelectedValues())
170 conflicts.get(o).visit(conflictPainter);
171 }
172}
Note: See TracBrowser for help on using the repository browser.