001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.dialogs.relation;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.awt.BorderLayout;
007 import java.awt.FlowLayout;
008 import java.awt.event.ActionEvent;
009 import java.awt.event.MouseAdapter;
010 import java.awt.event.MouseEvent;
011
012 import javax.swing.AbstractAction;
013 import javax.swing.JCheckBox;
014 import javax.swing.JList;
015 import javax.swing.JPanel;
016 import javax.swing.JScrollPane;
017 import javax.swing.ListSelectionModel;
018 import javax.swing.event.ListDataEvent;
019 import javax.swing.event.ListDataListener;
020 import javax.swing.event.ListSelectionEvent;
021 import javax.swing.event.ListSelectionListener;
022
023 import org.openstreetmap.josm.Main;
024 import org.openstreetmap.josm.data.osm.Relation;
025 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
026 import org.openstreetmap.josm.gui.SideButton;
027 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
028 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
029 import org.openstreetmap.josm.tools.ImageProvider;
030
031 /**
032 * This is browser for a list of relations which refer to another relations
033 *
034 *
035 */
036 public class ReferringRelationsBrowser extends JPanel {
037
038 /** the list of relations */
039 private JList referrers;
040 private ReferringRelationsBrowserModel model;
041 private OsmDataLayer layer;
042 private JCheckBox cbReadFull;
043 private EditAction editAction;
044
045 /**
046 * build the GUI
047 */
048 protected void build() {
049 setLayout(new BorderLayout());
050 referrers = new JList(model);
051 referrers.setCellRenderer(new OsmPrimitivRenderer());
052 add(new JScrollPane(referrers), BorderLayout.CENTER);
053 referrers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
054 referrers.addMouseListener(new DblClickMouseAdapter());
055
056 JPanel pnl = new JPanel();
057 pnl.setLayout(new FlowLayout(FlowLayout.LEFT));
058
059 ReloadAction reloadAction = new ReloadAction();
060 referrers.getModel().addListDataListener(reloadAction);
061 pnl.add(new SideButton(reloadAction));
062 pnl.add(cbReadFull = new JCheckBox(tr("including immediate children of parent relations")));
063
064 editAction = new EditAction();
065 referrers.getSelectionModel().addListSelectionListener(editAction);
066 pnl.add(new SideButton(editAction));
067 add(pnl, BorderLayout.SOUTH);
068 }
069
070 public ReferringRelationsBrowser(OsmDataLayer layer, ReferringRelationsBrowserModel model, GenericRelationEditor relationEditor) {
071 this.model = model;
072 this.layer = layer;
073 build();
074 }
075
076 public void init() {
077 model.populate(getLayer().data);
078 }
079
080 protected OsmDataLayer getLayer() {
081 return layer;
082 }
083
084 /**
085 * Action for loading the parent relations of a relation
086 *
087 */
088 class ReloadAction extends AbstractAction implements ListDataListener {
089 public ReloadAction() {
090 putValue(SHORT_DESCRIPTION, tr("Load parent relations"));
091 putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
092 putValue(NAME, tr("Reload"));
093 refreshEnabled();
094 }
095
096 protected void refreshEnabled() {
097 setEnabled(model.canReload());
098 }
099
100 public void actionPerformed(ActionEvent e) {
101 boolean full = cbReadFull.isSelected();
102 final ParentRelationLoadingTask task = new ParentRelationLoadingTask(
103 model.getRelation(),
104 getLayer(),
105 full,
106 new PleaseWaitProgressMonitor(tr("Loading parent relations"))
107 );
108 task.setContinuation(
109 new Runnable() {
110 public void run() {
111 if (task.isCanceled() || task.hasError())
112 return;
113 model.populate(task.getParents());
114 }
115 }
116 );
117 Main.worker.submit(task);
118 }
119
120 public void contentsChanged(ListDataEvent e) {
121 refreshEnabled();
122 }
123
124 public void intervalAdded(ListDataEvent e) {
125 refreshEnabled();
126 }
127
128 public void intervalRemoved(ListDataEvent e) {
129 refreshEnabled();
130 }
131 }
132
133 /**
134 * Action for editing the currently selected relation
135 *
136 */
137 class EditAction extends AbstractAction implements ListSelectionListener {
138 public EditAction() {
139 putValue(SHORT_DESCRIPTION, tr("Edit the currently selected relation"));
140 putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
141 putValue(NAME, tr("Edit"));
142 refreshEnabled();
143 }
144
145 protected void refreshEnabled() {
146 setEnabled(referrers.getSelectionModel().getMinSelectionIndex() >=0);
147 }
148
149 public void actionPerformed(ActionEvent e) {
150 run();
151 }
152
153 public void run() {
154 int idx = referrers.getSelectedIndex();
155 if (idx < 0) return;
156 Relation r = model.get(idx);
157 if (r == null) return;
158 RelationEditor editor = RelationEditor.getEditor(getLayer(), r, null);
159 editor.setVisible(true);
160 }
161
162 public void valueChanged(ListSelectionEvent e) {
163 refreshEnabled();
164 }
165 }
166
167 class DblClickMouseAdapter extends MouseAdapter {
168 @Override
169 public void mouseClicked(MouseEvent e) {
170 if (e.getClickCount() == 2) {
171 editAction.run();
172 }
173 }
174 }
175 }