source: subversion/applications/editors/josm/plugins/alignways/src/org/openstreetmap/josm/plugins/alignways/AlignWaysMode.java

Last change on this file was 34489, checked in by donvip, 8 months ago

rename package, fix checkstyle and javadoc warnings

File size: 10.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugins.alignways;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Cursor;
7import java.awt.Point;
8import java.awt.event.ActionEvent;
9import java.awt.event.InputEvent;
10import java.awt.event.KeyEvent;
11import java.awt.event.MouseEvent;
12
13import javax.swing.BorderFactory;
14import javax.swing.ImageIcon;
15import javax.swing.JDialog;
16import javax.swing.JOptionPane;
17
18import org.openstreetmap.josm.actions.mapmode.MapMode;
19import org.openstreetmap.josm.data.osm.DataSet;
20import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
21import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
22import org.openstreetmap.josm.data.osm.event.DataSetListener;
23import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
24import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
25import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
26import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
27import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
28import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
29import org.openstreetmap.josm.gui.IconToggleButton;
30import org.openstreetmap.josm.gui.MainApplication;
31import org.openstreetmap.josm.gui.layer.Layer;
32import org.openstreetmap.josm.gui.layer.OsmDataLayer;
33import org.openstreetmap.josm.spi.preferences.Config;
34import org.openstreetmap.josm.tools.Shortcut;
35
36/**
37 * @author tilusnet <tilusnet@gmail.com>
38 * Handles the state machine and user interaction (mouse clicks).
39 *
40 */
41public class AlignWaysMode extends MapMode implements DataSetListener {
42
43    private static final long serialVersionUID = -1090955708412011141L;
44    private final AlignWaysState noneSelected;
45    private final AlignWaysState referenceSelected;
46    private final AlignWaysState aligneeSelected;
47    private final AlignWaysState bothSelected;
48    private AlignWaysState currentState;
49    private AlignWaysSegmentMgr awSegs;
50    boolean tipShown;
51
52    public AlignWaysMode(String name, String desc) {
53        super(tr(name), "alignways.png", tr(desc),
54                Shortcut.registerShortcut("mapmode:alignways",
55                        tr("Mode: {0}", tr("Align Ways")),
56                        KeyEvent.VK_N, Shortcut.SHIFT),
57                        Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
58        noneSelected = new AlignWaysSelNoneState();
59        referenceSelected = new AlignWaysSelRefState();
60        aligneeSelected = new AlignWaysSelAlgnState();
61        bothSelected = new AlignWaysSelBothState();
62        tipShown = false;
63    }
64
65    @Override
66    public void enterMode() {
67        super.enterMode();
68
69        AlignWaysPlugin.getAwDialog().activate(true);
70        IconToggleButton optBtn = AlignWaysPlugin.getOptBtn();
71        if (!optBtn.isSelected()) {
72            // Make sure the option panel is visible when align mode starts
73            optBtn.doClick();
74        }
75
76        boolean showTips = Boolean.parseBoolean(Config.getPref().get("alignways.showtips", "true"));
77        if ((showTips) && (!tipShown)) {
78            showTips();
79        }
80        int majorVer = Integer.parseInt(Config.getPref().get("alignways.majorver", "-1"));
81        if (majorVer != AlignWaysPlugin.AlignWaysMajorVersion) {
82            showWhatsNew();
83        }
84
85        awSegs = AlignWaysSegmentMgr.getInstance(MainApplication.getMap().mapView);
86        MainApplication.getMap().mapView.addMouseListener(this);
87        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
88        if (ds != null)
89            ds.addDataSetListener(this);
90        setCurrentState(noneSelected);
91    }
92
93    @Override
94    public void exitMode() {
95        super.exitMode();
96
97        AlignWaysPlugin.getAwDialog().activate(false);
98        IconToggleButton optBtn = AlignWaysPlugin.getOptBtn();
99        if (optBtn.isSelected()) {
100            // The option panel will be switched off
101            optBtn.doClick();
102        }
103
104        setCurrentState(noneSelected);
105        MainApplication.getMap().mapView.removeMouseListener(this);
106        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
107        if (ds != null)
108            ds.removeDataSetListener(this);
109        AlignWaysPlugin.getAwAction().setEnabled(false);
110    }
111
112    @Override
113    public void mouseClicked(MouseEvent e) {
114
115        boolean ctrlPressed = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
116        boolean altPressed = (e.getModifiers() & (ActionEvent.ALT_MASK | InputEvent.ALT_GRAPH_MASK)) != 0;
117
118        if (e.getButton() == MouseEvent.BUTTON1) {
119
120            if (altPressed) {
121                currentState.altLClick(this);
122
123            } else {
124                Point clickedPoint = new Point(e.getX(), e.getY());
125
126                if (!ctrlPressed) {
127                    // Alignee could change
128
129                    if (awSegs.algnUpdate(clickedPoint)) {
130                        currentState.leftClick(this);
131                    }
132
133                } else {
134                    // Reference could change
135                    if (awSegs.refUpdate(clickedPoint)) {
136                        currentState.ctrlLClick(this);
137                    }
138                }
139            }
140        }
141
142        MainApplication.getMap().mapView.repaint();
143    }
144
145    /**
146     * Sets the current state based on the selected segments.
147     * @param mgr AlignWays segment manager singleton
148     */
149    public void setCurrentState(AlignWaysSegmentMgr mgr) {
150
151        boolean algnSelected = mgr.getAlgnSeg() != null;
152        boolean refSelected = mgr.getRefSeg() != null;
153
154        if (algnSelected && refSelected)
155            setCurrentState(getBothSelected());
156        else if (algnSelected)
157            setCurrentState(getAligneeSelected());
158        else if (refSelected)
159            setCurrentState(getReferenceSelected());
160        else
161            setCurrentState(getNoneSelected());
162    }
163
164    /**
165     * Sets the current state.
166     * @param currentState One of the AlignWays states
167     */
168    public void setCurrentState(AlignWaysState currentState) {
169        this.currentState = currentState;
170        currentState.setHelpText();
171
172        // Activate the Align Ways button if we have enough selections
173        AlignWaysPlugin.getAwAction().setEnabled(currentState == bothSelected);
174
175        if (currentState == noneSelected) {
176            awSegs.cleanupWays();
177
178            // getEditDataSet() may return null when the editable layer had
179            // already been removed by JOSM. This happens e.g. when the user closes
180            // JOSM while AlignWays mode is still active.
181            DataSet ds = getLayerManager().getEditDataSet();
182            if (ds != null) {
183                ds.clearSelection();
184            }
185        }
186    }
187
188    /**
189     * @return the noneSelected
190     */
191    public AlignWaysState getNoneSelected() {
192        return noneSelected;
193    }
194
195    /**
196     * @return the referenceSelected
197     */
198    public AlignWaysState getReferenceSelected() {
199        return referenceSelected;
200    }
201
202    /**
203     * @return the aligneeSelected
204     */
205    public AlignWaysState getAligneeSelected() {
206        return aligneeSelected;
207    }
208
209    /**
210     * @return the bothSelected
211     */
212    public AlignWaysState getBothSelected() {
213        return bothSelected;
214    }
215
216    private void showTips() {
217
218        AlignWaysTipsPanel atp = new AlignWaysTipsPanel();
219        Object[] okButton = {tr("I''m ready!")};
220        JOptionPane tipPane = new JOptionPane(atp, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION,
221                null, okButton, okButton[0]);
222        tipPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 30, 10));
223        JDialog tipDialog = tipPane.createDialog(MainApplication.getMainFrame(), tr("AlignWays Tips"));
224        tipDialog.setIconImage(new ImageIcon(getClass().getResource("/images/alignways.png")).getImage());
225
226        tipDialog.setResizable(true);
227        tipDialog.setVisible(true);
228        tipShown = true;
229
230        tipDialog.dispose();
231
232        Config.getPref().putBoolean("alignways.showtips", !atp.isChkBoxSelected());
233    }
234
235    private void showWhatsNew() {
236
237        AlignWaysWhatsNewPanel awnp = new AlignWaysWhatsNewPanel();
238        JOptionPane wnPane = new JOptionPane(awnp, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null);
239        wnPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
240        JDialog wnDialog = wnPane.createDialog(MainApplication.getMainFrame(), tr("AlignWays: What''s New..."));
241        wnDialog.setIconImage(new ImageIcon(getClass().getResource("/images/alignways.png")).getImage());
242
243        wnDialog.setResizable(true);
244        wnDialog.setVisible(true);
245
246        wnDialog.dispose();
247
248        Config.getPref().put("alignways.majorver", Integer.toString(AlignWaysPlugin.AlignWaysMajorVersion));
249    }
250
251    @Override
252    public boolean layerIsSupported(Layer l) {
253        return l instanceof OsmDataLayer;
254    }
255
256    @Override
257    protected void updateEnabledState() {
258        setEnabled(getLayerManager().getEditLayer() != null);
259    }
260
261    /* --------------- *
262     * DataSetListener *
263     * --------------- */
264
265    @Override
266    public void primitivesAdded(PrimitivesAddedEvent event) {
267    }
268
269    @Override
270    public void primitivesRemoved(PrimitivesRemovedEvent event) {
271        awSegs = AlignWaysSegmentMgr.getInstance(MainApplication.getMap().mapView);
272
273        // Check whether any of the removed primitives were part of a highlighted alignee or reference segment.
274        // If so: remove the affected segment and update the state accordingly.
275        if (awSegs.primitivesRemoved(event.getPrimitives()))
276            setCurrentState(awSegs);
277    }
278
279    @Override
280    public void tagsChanged(TagsChangedEvent event) {
281    }
282
283    @Override
284    public void nodeMoved(NodeMovedEvent event) {
285    }
286
287    @Override
288    public void wayNodesChanged(WayNodesChangedEvent event) {
289    }
290
291    @Override
292    public void relationMembersChanged(RelationMembersChangedEvent event) {
293    }
294
295    @Override
296    public void otherDatasetChange(AbstractDatasetChangedEvent event) {
297    }
298
299    @Override
300    public void dataChanged(DataChangedEvent event) {
301    }
302}
Note: See TracBrowser for help on using the repository browser.