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

Last change on this file since 1221 was 1221, checked in by stoecker, 15 years ago

cleanup color handling

  • Property svn:eol-style set to native
File size: 7.1 KB
Line 
1// License: GPL. See LICENSE file for details.
2package org.openstreetmap.josm.gui.dialogs;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5import static org.openstreetmap.josm.tools.I18n.marktr;
6
7import java.awt.BorderLayout;
8import java.awt.Color;
9import java.awt.Graphics;
10import java.awt.GridLayout;
11import java.awt.Point;
12import java.awt.event.ActionEvent;
13import java.awt.event.ActionListener;
14import java.awt.event.KeyEvent;
15import java.awt.event.MouseAdapter;
16import java.awt.event.MouseEvent;
17import java.util.Collection;
18import java.util.HashMap;
19import java.util.LinkedList;
20import java.util.Map;
21
22import javax.swing.DefaultListModel;
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.Relation;
36import org.openstreetmap.josm.data.osm.RelationMember;
37import org.openstreetmap.josm.data.osm.Node;
38import org.openstreetmap.josm.data.osm.OsmPrimitive;
39import org.openstreetmap.josm.data.osm.Way;
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.gui.SideButton;
45import org.openstreetmap.josm.tools.Shortcut;
46
47public final class ConflictDialog extends ToggleDialog {
48
49 public final Map<OsmPrimitive, OsmPrimitive> conflicts = new HashMap<OsmPrimitive, OsmPrimitive>();
50 private final DefaultListModel model = new DefaultListModel();
51 private final JList displaylist = new JList(model);
52
53 public ConflictDialog() {
54 super(tr("Conflict"), "conflict", tr("Merging conflicts."),
55 Shortcut.registerShortcut("subwindow:conflict", tr("Toggle: {0}", tr("Conflict")), KeyEvent.VK_C, Shortcut.GROUP_LAYER), 100);
56 displaylist.setCellRenderer(new OsmPrimitivRenderer());
57 displaylist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
58 displaylist.addMouseListener(new MouseAdapter(){
59 @Override public void mouseClicked(MouseEvent e) {
60 if (e.getClickCount() >= 2)
61 resolve();
62 }
63 });
64 add(new JScrollPane(displaylist), BorderLayout.CENTER);
65
66 JPanel buttonPanel = new JPanel(new GridLayout(1,2));
67 buttonPanel.add(new SideButton(marktr("Resolve"), "conflict", "Conflict",
68 tr("Open a merge dialog of all selected items in the list above."), new ActionListener(){
69 public void actionPerformed(ActionEvent e) {
70 resolve();
71 }
72 }));
73
74 buttonPanel.add(new SideButton(marktr("Select"), "select", "Conflict",
75 tr("Set the selected elements on the map to the selected items in the list above."), new ActionListener(){
76 public void actionPerformed(ActionEvent e) {
77 Collection<OsmPrimitive> sel = new LinkedList<OsmPrimitive>();
78 for (Object o : displaylist.getSelectedValues())
79 sel.add((OsmPrimitive)o);
80 Main.ds.setSelected(sel);
81 }
82 }));
83 add(buttonPanel, BorderLayout.SOUTH);
84
85 DataSet.selListeners.add(new SelectionChangedListener(){
86 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
87 displaylist.clearSelection();
88 for (OsmPrimitive osm : newSelection) {
89 if (conflicts.containsKey(osm)) {
90 int pos = model.indexOf(osm);
91 displaylist.addSelectionInterval(pos, pos);
92 }
93 }
94 }
95 });
96 displaylist.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
97 public void valueChanged(ListSelectionEvent e) {
98 Main.map.mapView.repaint();
99 }
100 });
101 }
102
103 private final void resolve() {
104 if (displaylist.getSelectedIndex() == -1) {
105 JOptionPane.showMessageDialog(Main.parent,tr("Please select something from the conflict list."));
106 return;
107 }
108 Map<OsmPrimitive, OsmPrimitive> sel = new HashMap<OsmPrimitive, OsmPrimitive>();
109 for (int i : displaylist.getSelectedIndices()) {
110 OsmPrimitive s = (OsmPrimitive)model.get(i);
111 sel.put(s, conflicts.get(s));
112 }
113 ConflictResolver resolver = new ConflictResolver(sel);
114 int answer = JOptionPane.showConfirmDialog(Main.parent, resolver, tr("Resolve Conflicts"), JOptionPane.OK_CANCEL_OPTION);
115 if (answer != JOptionPane.OK_OPTION)
116 return;
117 Main.main.undoRedo.add(new ConflictResolveCommand(resolver.conflicts, sel));
118 Main.map.mapView.repaint();
119 }
120
121 public final void rebuildList() {
122 model.removeAllElements();
123 for (OsmPrimitive osm : this.conflicts.keySet())
124 if (osm instanceof Node)
125 model.addElement(osm);
126 for (OsmPrimitive osm : this.conflicts.keySet())
127 if (osm instanceof Way)
128 model.addElement(osm);
129 for (OsmPrimitive osm : this.conflicts.keySet())
130 if (osm instanceof Relation)
131 model.addElement(osm);
132 }
133
134 public final void add(Map<OsmPrimitive, OsmPrimitive> conflicts) {
135 this.conflicts.putAll(conflicts);
136 rebuildList();
137 }
138
139 static public Color getColor()
140 {
141 return Main.pref.getColor(marktr("conflict"), Color.gray);
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 = getColor();
149 if (preferencesColor.equals(Main.pref.getColor(marktr("background"), 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(Node n1, Node n2) {
158 Point p1 = nc.getPoint(n1.eastNorth);
159 Point p2 = nc.getPoint(n2.eastNorth);
160 g.drawLine(p1.x, p1.y, p2.x, p2.y);
161 }
162 public void visit(Way w) {
163 Node lastN = null;
164 for (Node n : w.nodes) {
165 if (lastN == null) {
166 lastN = n;
167 continue;
168 }
169 visit(lastN, n);
170 lastN = n;
171 }
172 }
173 public void visit(Relation e) {
174 for (RelationMember em : e.members)
175 em.member.visit(this);
176 }
177 };
178 for (Object o : displaylist.getSelectedValues())
179 conflicts.get(o).visit(conflictPainter);
180 }
181}
Note: See TracBrowser for help on using the repository browser.