Ignore:
Timestamp:
2018-05-24T14:13:24+02:00 (7 years ago)
Author:
biswesh
Message:

Restructered double split map mode

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/pt_assistant/src/org/openstreetmap/josm/plugins/pt_assistant/actions/DoubleSplitAction.java

    r34182 r34217  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.awt.Color;
    67import java.awt.Cursor;
     8import java.awt.Graphics2D;
    79import java.awt.GridBagLayout;
     10import java.awt.Point;
    811import java.awt.event.ActionEvent;
    912import java.awt.event.ActionListener;
     13import java.awt.event.KeyEvent;
     14import java.awt.event.KeyListener;
    1015import java.awt.event.MouseEvent;
    1116import java.util.ArrayList;
     
    1520import java.util.List;
    1621import java.util.Set;
    17 import java.util.concurrent.atomic.AtomicInteger;
    1822
    1923import javax.swing.DefaultComboBoxModel;
     
    2832import org.openstreetmap.josm.command.ChangeCommand;
    2933import org.openstreetmap.josm.command.Command;
     34import org.openstreetmap.josm.command.SequenceCommand;
    3035//import org.openstreetmap.josm.command.Command;
    3136import org.openstreetmap.josm.command.SplitWayCommand;
     37import org.openstreetmap.josm.data.Bounds;
     38import org.openstreetmap.josm.data.coor.ILatLon;
     39import org.openstreetmap.josm.data.coor.LatLon;
    3240import org.openstreetmap.josm.data.osm.Node;
    3341import org.openstreetmap.josm.data.osm.OsmPrimitive;
     42import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     43import org.openstreetmap.josm.data.osm.Relation;
     44import org.openstreetmap.josm.data.osm.RelationMember;
    3445import org.openstreetmap.josm.data.osm.TagMap;
    3546import org.openstreetmap.josm.data.osm.Way;
     
    3748import org.openstreetmap.josm.gui.ExtendedDialog;
    3849import org.openstreetmap.josm.gui.MainApplication;
     50import org.openstreetmap.josm.gui.MapView;
     51import org.openstreetmap.josm.gui.layer.AbstractMapViewPaintable;
     52import org.openstreetmap.josm.plugins.pt_assistant.utils.RouteUtils;
     53import org.openstreetmap.josm.tools.CheckParameterUtil;
    3954import org.openstreetmap.josm.tools.GBC;
    4055import org.openstreetmap.josm.tools.ImageProvider;
     
    4661 * @author Biswesh
    4762 */
    48 public class DoubleSplitAction extends MapMode {
     63public class DoubleSplitAction extends MapMode implements KeyListener {
    4964
    5065        private static final String MAP_MODE_NAME = "Double Split";
     
    5267        private transient Set<OsmPrimitive> newHighlights = new HashSet<>();
    5368        private transient Set<OsmPrimitive> oldHighlights = new HashSet<>();
    54         private int nodeCount = 0;
    5569        private List<Node> atNodes = new ArrayList<>();
    56         private Way previousAffectedWay;
     70        private final DoubleSplitLayer temporaryLayer = new DoubleSplitLayer();
     71        ILatLon Pos1 = null;
     72        ILatLon Pos2 = null;
     73        Way SegWay1 = null;
     74        Way SegWay2 = null;
     75        Way affected;
     76        Way previousAffectedWay;
    5777
    5878        private final Cursor cursorJoinNode;
     
    6484        public DoubleSplitAction() {
    6585                super(tr(MAP_MODE_NAME), "logo_double_split", tr(MAP_MODE_NAME), null, getCursor());
    66 
    6786                cursorJoinNode = ImageProvider.getCursor("crosshair", "joinnode");
    6887                cursorJoinWay = ImageProvider.getCursor("crosshair", "joinway");
     88
    6989        }
    7090
    7191        private static Cursor getCursor() {
    72                 Cursor cursor = ImageProvider.getCursor("crosshair", "bus");
    73                 if (cursor == null)
    74                         cursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
     92                Cursor cursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
    7593                return cursor;
    7694        }
     
    8199                MainApplication.getMap().mapView.addMouseListener(this);
    82100                MainApplication.getMap().mapView.addMouseMotionListener(this);
     101                MainApplication.getMap().mapView.addKeyListener(this);
     102                MainApplication.getMap().mapView.addTemporaryLayer(temporaryLayer);
    83103        }
    84104
    85105        @Override
    86106        public void exitMode() {
    87                 // if we have one node selected and we exit the mode then undo the node
    88                 if (nodeCount == 1) {
    89                         for (int i = 0; i < 2; i++) {
    90                                 MainApplication.undoRedo.undo();
    91                         }
    92                         nodeCount = 0;
    93                         atNodes.clear();
    94                         previousAffectedWay = null;
    95                         updateHighlights();
    96                 }
     107                reset();
    97108                super.exitMode();
    98109                MainApplication.getMap().mapView.removeMouseListener(this);
    99110                MainApplication.getMap().mapView.removeMouseMotionListener(this);
     111                MainApplication.getMap().mapView.removeKeyListener(this);
     112                MainApplication.getMap().mapView.removeTemporaryLayer(temporaryLayer);
     113                resetLayer();
    100114        }
    101115
    102116        private void reset() {
    103                 nodeCount = 0;
    104                 atNodes.clear();
    105                 previousAffectedWay = null;
    106                 updateHighlights();
    107         }
    108 
    109         private boolean startEndPoints(){
    110                 if (atNodes.get(0).isConnectionNode() && atNodes.get(1).isConnectionNode()) {
     117                try {
     118                        atNodes.clear();
     119                        updateHighlights();
     120                } catch (Exception e) {
     121                        e.printStackTrace();
     122                }
     123                System.out.println("reset");
     124        }
     125
     126        private void resetLayer() {
     127                Pos1 = null;
     128                Pos2 = null;
     129                SegWay1 = null;
     130                SegWay2 = null;
     131        }
     132
     133        private boolean startEndPoints(List<Command> commandList) {
     134
     135                try {
    111136                        for (Way way : atNodes.get(0).getParentWays()) {
    112137                                if (atNodes.get(1).getParentWays().contains(way)) {
    113                                         List<TagMap> affectedKeysList = new ArrayList<>();
    114                                         affectedKeysList.add(way.getKeys());
    115                                         newHighlights.add(way);
    116                                         dialogBox(Arrays.asList(way), affectedKeysList);
    117                                         return true;
     138                                        if (way.isFirstLastNode(atNodes.get(0)) && way.isFirstLastNode(atNodes.get(1))) {
     139                                                List<TagMap> affectedKeysList = new ArrayList<>();
     140                                                affectedKeysList.add(way.getKeys());
     141                                                newHighlights.add(way);
     142                                                dialogBox(3, null, way, way, commandList);
     143                                                return true;
     144                                        }
    118145                                }
    119146                        }
    120 
    121                         reset();
    122                         return true;
    123                 }
     147                } catch (Exception e) {
     148                        e.printStackTrace();
     149                }
     150
    124151                return false;
    125152        }
    126153
    127         private boolean firstNodeIsConnectionNode(Node node, Way affected) {
     154        private boolean firstNodeIsConnectionNode(Node node, Way affected, Way previousAffectedWay) {
    128155                if (node.isConnectionNode()) {
    129156                        if (node.getParentWays().contains(affected))
    130157                                previousAffectedWay = affected;
    131158                        else {
    132                                 reset();
    133159                                return true;
    134160                        }
     
    137163        }
    138164
    139         private boolean secondNodeIsConnectionNode(Node node) {
     165        private boolean secondNodeIsConnectionNode(Node node, Way previousAffectedWay) {
    140166                if (atNodes.get(1).isConnectionNode()) {
    141167                        if (atNodes.get(1).getParentWays().contains(previousAffectedWay))
    142168                                return false;
    143169                        else {
    144                                 reset();
    145170                                return true;
    146171                        }
     
    149174        }
    150175
    151         private Node checkCommonNode(Way affected) {
    152 
    153         // check if they have any common node
     176        private Node checkCommonNode(Way affected, Way previousAffectedWay) {
     177
     178                // check if they have any common node
    154179                List<Node> presentNodeList = affected.getNodes();
    155180                for (Node previousNode : previousAffectedWay.getNodes()) {
     
    158183                        }
    159184                }
    160 
    161185                return null;
    162186        }
    163187
    164         private void removeFirstNode(Way affected) {
    165 
    166                 // select the first node
    167                 Node nodeToBeDeleted = atNodes.get(0);
    168 
    169                 if (nodeToBeDeleted != null) {
    170                         // remove first node from list
    171                         atNodes.remove(0);
    172 
    173                         // remove last 2 commands from command list
    174                         Command lastCommand = MainApplication.undoRedo.commands.removeLast();
    175                         Command secondLastCommand = MainApplication.undoRedo.commands.removeLast();
    176 
    177                         // now we can undo the previous node as the command for present node has been
    178                         // removed from list
    179                         for (int i = 0; i < 2; i++) {
    180                                 MainApplication.undoRedo.undo();
    181                         }
    182 
    183                         // now again add back the last 2 commands, so overall we undo third last and
    184                     // fourth last command
    185                         MainApplication.undoRedo.commands.add(secondLastCommand);
    186                         MainApplication.undoRedo.commands.add(lastCommand);
    187 
    188                         MainApplication.undoRedo.redo();
    189                 }
    190 
    191                 previousAffectedWay = affected;
    192 
    193         }
    194 
    195         private void addKeysOnBothWays(Node commonNode, Way affected) {
     188        private void removeFirstNode() {
     189
     190                atNodes.get(0).setDeleted(true);
     191                atNodes.get(1).setDeleted(true);
     192                Pos1 = Pos2;
     193                Pos2 = null;
     194                SegWay1 = SegWay2;
     195                SegWay2 = null;
     196                reset();
     197        }
     198
     199        private void action() {
     200
     201                List<Command> commandList = new ArrayList<>();
     202
     203                // check if the user has selected an existing node, or a new one
     204                Node node1 = createNode(Pos1, commandList);
     205                if (node1 == null) {
     206                        resetLayer();
     207                        reset();
     208                        return;
     209                }
     210                Node node2 = createNode(Pos2, commandList);
     211                if (node2 == null) {
     212                        node1.setDeleted(true);
     213                        Pos2 = null;
     214                        SegWay2 = null;
     215                        reset();
     216                        return;
     217                }
     218
     219                if (node1.equals(node2)) {
     220                        resetLayer();
     221                        return;
     222                }
     223
     224                atNodes.add(node1);
     225                atNodes.add(node2);
     226
     227                previousAffectedWay = SegWay1;
     228                affected = SegWay2;
     229
     230                if (affected == null || previousAffectedWay == null) {
     231                        node1.setDeleted(true);
     232                        node2.setDeleted(true);
     233                        resetLayer();
     234                        return;
     235                }
     236
     237                // if both the nodes are starting and ending points of the same way
     238                // we don't split the way, just add new key-value to the way
     239                boolean areStartEndPoints = startEndPoints(commandList);
     240                if (areStartEndPoints) {
     241                        resetLayer();
     242                        return;
     243                }
     244
     245                // if first node is a connection node
     246                boolean isConnectionNode = firstNodeIsConnectionNode(atNodes.get(0), affected, previousAffectedWay);
     247                if (isConnectionNode) {
     248                        resetLayer();
     249                        return;
     250                }
     251
     252                // if second node is a connection node
     253                isConnectionNode = secondNodeIsConnectionNode(atNodes.get(1), previousAffectedWay);
     254                if (isConnectionNode) {
     255                        resetLayer();
     256                        return;
     257                } else {
     258                        if (atNodes.get(1).isConnectionNode()) {
     259                                affected = previousAffectedWay;
     260                        }
     261                }
     262
     263                // if both the nodes are not on same way and don't have any common node then
     264                // make second node as first node
     265                Node commonNode = null;
     266                boolean twoWaysWithCommonNode = false;
     267                if (previousAffectedWay != affected) {
     268                        commonNode = checkCommonNode(affected, previousAffectedWay);
     269                        if (commonNode == null) {
     270                                removeFirstNode();
     271                                return;
     272                        } else {
     273                                twoWaysWithCommonNode = true;
     274                        }
     275                }
     276
     277                if (twoWaysWithCommonNode) {
     278                        dialogBox(1, commonNode, affected, previousAffectedWay, commandList);
     279                } else {
     280                        dialogBox(2, commonNode, affected, previousAffectedWay, commandList);
     281                }
     282        }
     283
     284        private void dialogBox(int type, Node commonNode, Way affected, Way previousAffectedWay,
     285                        List<Command> commandList) {
     286
     287                final ExtendedDialog dialog = new SelectFromOptionDialog(type, commonNode, affected, previousAffectedWay,
     288                                commandList, atNodes);
     289                dialog.toggleEnable("way.split.segment-selection-dialog");
     290                if (!dialog.toggleCheckState()) {
     291                        dialog.setModal(false);
     292                        dialog.showDialog();
     293                        return; // splitting is performed in SegmentToKeepSelectionDialog.buttonAction()
     294                }
     295
     296        }
     297
     298        private Node createNode(ILatLon Pos, List<Command> commandList) {
     299                Boolean newNode = false;
     300                Node newStopPos;
     301
     302                Point p = new Point();
     303                p.setLocation(Pos.lat(), Pos.lon());
     304
     305                Node n = MainApplication.getMap().mapView.getNearestNode(p, OsmPrimitive::isUsable);
     306                if (n == null) {
     307                        newNode = true;
     308                        newStopPos = new Node(MainApplication.getMap().mapView.getLatLon(Pos.lat(), Pos.lon()));
     309                } else {
     310                        newStopPos = new Node(n);
     311                }
     312
     313                if (newNode) {
     314                        commandList.add(new AddCommand(getLayerManager().getEditDataSet(), newStopPos));
     315                } else {
     316                        commandList.add(new ChangeCommand(n, newStopPos));
     317                        MainApplication.getLayerManager().getEditLayer().data.setSelected(newStopPos);
     318                        newStopPos = n;
     319                }
     320
     321                return newStopPos;
     322        }
     323
     324        private void addKeys(Way affected, List<Command> commandList, JComboBox<String> keys, JComboBox<String> values) {
    196325                List<TagMap> affectedKeysList = new ArrayList<>();
     326                Way selectedWay = null;
     327
     328                MainApplication.undoRedo.add(new SequenceCommand("Add Nodes", commandList));
     329                commandList.clear();
     330
     331                addParentWay(atNodes.get(0));
     332                addParentWay(atNodes.get(1));
     333
     334                SplitWayCommand result = SplitWayCommand.split(affected, atNodes, Collections.emptyList());
     335                if (result == null)
     336                        return;
     337
     338                commandList.add(result);
     339                MainApplication.undoRedo.add(new SequenceCommand("Split Way", commandList));
     340
     341                // Find the middle way after split
     342                List<Way> affectedWayList = result.getNewWays();
     343                affectedWayList.add(result.getOriginalWay());
     344
     345                for (Way way : affectedWayList) {
     346                        if (atNodes.contains(way.firstNode()) && atNodes.contains(way.lastNode())) {
     347                                selectedWay = way;
     348                                break;
     349                        }
     350                }
     351
     352                if (selectedWay != null) {
     353                        affectedKeysList.add(affected.getKeys());
     354                        addTags(affectedKeysList, Arrays.asList(selectedWay), keys, values);
     355                }
     356        }
     357
     358        private void addKeysOnBothWays(Node commonNode, Way affected, Way previousAffectedWay, List<Command> commandList,
     359                        JComboBox<String> keys, JComboBox<String> values) {
     360                List<TagMap> affectedKeysList = new ArrayList<>();
     361
     362                MainApplication.undoRedo.add(new SequenceCommand("Add Nodes", commandList));
     363                commandList.clear();
     364
     365                // join newly created nodes to parent ways
     366                addParentWay(atNodes.get(0));
     367                addParentWay(atNodes.get(1));
    197368
    198369                List<Node> nodelist1 = Arrays.asList(atNodes.get(0), commonNode);
    199370                List<Node> nodelist2 = Arrays.asList(atNodes.get(1), commonNode);
    200371
     372                // required to be added to newly split way
    201373                affectedKeysList.add(previousAffectedWay.getKeys());
    202374                affectedKeysList.add(affected.getKeys());
    203375
    204376                // split both the ways separately
    205 
    206377                SplitWayCommand result1 = SplitWayCommand.split(previousAffectedWay, nodelist1, Collections.emptyList());
    207 
    208378                SplitWayCommand result2 = SplitWayCommand.split(affected, nodelist2, Collections.emptyList());
    209379
    210                 MainApplication.undoRedo.add(result1);
    211                 MainApplication.undoRedo.add(result2);
     380                if (result1 != null)
     381                        commandList.add(result1);
     382                if (result2 != null)
     383                        commandList.add(result2);
     384                MainApplication.undoRedo.add(new SequenceCommand("Split Way", commandList));
     385
     386                // add newly split way to relations
     387                List<Relation> referrers1 = OsmPrimitive.getFilteredList(previousAffectedWay.getReferrers(), Relation.class);
     388                referrers1.removeIf(r -> !RouteUtils.isPTRoute(r));
     389
     390                int Index1 = getIndex(previousAffectedWay, referrers1, previousAffectedWay);
     391
     392                List<Relation> referrers2 = OsmPrimitive.getFilteredList(affected.getReferrers(), Relation.class);
     393                referrers2.removeIf(r -> !RouteUtils.isPTRoute(r));
     394
     395                int Index2 = getIndex(affected, referrers2, previousAffectedWay);
    212396
    213397                Way way1 = null, way2 = null;
     
    217401                boolean isOriginalWay = true; // we check both the original way and new ways
    218402                for (Way way : result1.getNewWays()) {
     403                        checkMembership(way, referrers1, Index1);
    219404                        if (way.containsNode(commonNode) && way.containsNode(atNodes.get(0))) {
    220405                                way1 = way;
     
    223408                        }
    224409                }
     410
     411                checkMembership(result1.getOriginalWay(), referrers1, Index1);
     412
    225413                if (isOriginalWay) {
    226414                        Way way = result1.getOriginalWay();
     
    234422
    235423                for (Way way : result2.getNewWays()) {
     424                        checkMembership(way, referrers2, Index2);
    236425                        if (way.containsNode(commonNode) && way.containsNode(atNodes.get(1))) {
    237426                                way2 = way;
     
    241430                }
    242431
     432                checkMembership(result2.getOriginalWay(), referrers2, Index2);
     433
    243434                if (isOriginalWay) {
    244435                        Way way = result2.getOriginalWay();
     
    250441                if (way1 != null && way2 != null) {
    251442                        List<Way> selectedWays = Arrays.asList(way1, way2);
    252                         newHighlights.add(way1);
    253                         newHighlights.add(way2);
    254                         dialogBox(selectedWays, affectedKeysList);
    255                 }
    256         }
    257 
    258         private void addKeys(Way affected) {
     443                        addTags(affectedKeysList, selectedWays, keys, values);
     444                }
     445        }
     446
     447        private void addKeysWhenStartEndPoint(Way affected, List<Command> commandList, JComboBox<String> keys,
     448                        JComboBox<String> values) {
    259449                List<TagMap> affectedKeysList = new ArrayList<>();
    260                 Way selectedWay = null;
    261 
    262                 SplitWayCommand result = SplitWayCommand.split(affected, atNodes, Collections.emptyList());
    263                 if (result == null)
    264                         return;
    265 
    266                 MainApplication.undoRedo.add(result);
    267 
    268                 // Find the middle way after split
    269                 List<Way> affectedWayList = result.getNewWays();
    270                 for (Way way : affectedWayList) {
    271                         if (atNodes.contains(way.firstNode()) && atNodes.contains(way.lastNode())) {
    272                                 selectedWay = way;
    273                                 break;
    274                         }
    275                 }
     450                Way selectedWay = affected;
     451
     452                MainApplication.undoRedo.add(new SequenceCommand("Add Nodes", commandList));
     453                commandList.clear();
     454
     455                addParentWay(atNodes.get(0));
     456                addParentWay(atNodes.get(1));
    276457
    277458                if (selectedWay != null) {
    278459                        affectedKeysList.add(affected.getKeys());
    279                         newHighlights.add(selectedWay);
    280                         dialogBox(Arrays.asList(selectedWay), affectedKeysList);
    281                 }
     460                        addTags(affectedKeysList, Arrays.asList(selectedWay), keys, values);
     461                }
     462        }
     463
     464        private void addParentWay(Node node) {
     465                if (node.getParentWays().size() == 0) {
     466                        MainApplication.getLayerManager().getEditLayer().data.setSelected(node);
     467                        // join the node to the way only if the node is new
     468                        JoinNodeWayAction joinNodeWayAction = JoinNodeWayAction.createMoveNodeOntoWayAction();
     469                        joinNodeWayAction.actionPerformed(null);
     470                }
     471        }
     472
     473        private void checkMembership(Way way, List<Relation> referrers, int Index) {
     474                for (Relation r : referrers) {
     475                        boolean isMember = false;
     476                        for (RelationMember rm : r.getMembers()) {
     477                                if (rm.getType() == OsmPrimitiveType.WAY) {
     478                                        if (rm.getWay().equals(way)) {
     479                                                isMember = true;
     480                                        }
     481                                }
     482                        }
     483                        if (!isMember) {
     484                                r.addMember(new RelationMember("", way));
     485                        }
     486                }
     487        }
     488
     489        private int getIndex(Way way, List<Relation> referrers, Way previousAffectedWay) {
     490                int Index = -1;
     491                for (Relation r : referrers) {
     492                        for (int i = 0; i < r.getMembers().size(); i++) {
     493                                if (r.getMembers().get(i).isWay() && r.getMembers().get(i).getWay().equals(previousAffectedWay)) {
     494                                        Index = i;
     495                                }
     496                        }
     497                }
     498                return Index;
     499        }
     500
     501        private void addTags(List<TagMap> affectedKeysList, List<Way> selectedWay, JComboBox<String> keys,
     502                        JComboBox<String> values) {
     503                TagMap newKeys1 = affectedKeysList.get(0);
     504                newKeys1.put(keys.getSelectedItem().toString(), values.getSelectedItem().toString());
     505
     506                if (keys.getSelectedItem() == "bridge") {
     507                        newKeys1.put("layer", "1");
     508                        selectedWay.get(0).setKeys(newKeys1);
     509                } else if (keys.getSelectedItem() == "tunnel") {
     510                        newKeys1.put("layer", "-1");
     511                        selectedWay.get(0).setKeys(newKeys1);
     512                } else {
     513                        selectedWay.get(0).setKeys(newKeys1);
     514                }
     515
     516                if (affectedKeysList.size() == 2) {
     517                        TagMap newKeys2 = affectedKeysList.get(1);
     518                        newKeys2.put(keys.getSelectedItem().toString(), values.getSelectedItem().toString());
     519
     520                        if (keys.getSelectedItem() == "bridge") {
     521                                newKeys2.put("layer", "1");
     522                                selectedWay.get(1).setKeys(newKeys2);
     523                        } else if (keys.getSelectedItem() == "tunnel") {
     524                                newKeys2.put("layer", "-1");
     525                                selectedWay.get(1).setKeys(newKeys2);
     526                        } else {
     527                                selectedWay.get(1).setKeys(newKeys2);
     528                        }
     529                }
     530                resetLayer();
    282531        }
    283532
     
    313562        public void mouseClicked(MouseEvent e) {
    314563
    315                 Boolean newNode = false;
    316                 Node newStopPos;
    317 
    318                 // check if the user has selected an existing node, or a new one
    319                 Node n = MainApplication.getMap().mapView.getNearestNode(e.getPoint(), OsmPrimitive::isUsable);
    320                 if (n == null) {
    321                         newNode = true;
    322                         newStopPos = new Node(MainApplication.getMap().mapView.getLatLon(e.getX(), e.getY()));
    323                 } else {
    324                         newStopPos = new Node(n);
    325                 }
    326 
    327                 if (newNode) {
    328                         MainApplication.undoRedo.add(new AddCommand(getLayerManager().getEditDataSet(), newStopPos));
    329                 } else {
    330                         MainApplication.undoRedo.add(new ChangeCommand(n, newStopPos));
    331                         newStopPos = n;
    332                 }
    333 
    334                 MainApplication.getLayerManager().getEditLayer().data.setSelected(newStopPos);
    335 
    336                 // join the node to the way only if the node is new
    337                 if (newNode) {
    338                         JoinNodeWayAction joinNodeWayAction = JoinNodeWayAction.createMoveNodeOntoWayAction();
    339                         joinNodeWayAction.actionPerformed(null);
    340                 }
    341 
    342                 if (newStopPos.getParentWays().isEmpty())
    343                         return;
    344 
    345                 Way affected = newStopPos.getParentWays().get(0);
    346 
    347                 if (affected == null)
    348                         return;
    349 
    350                 atNodes.add(newStopPos);
    351 
    352                 // to check the number of nodes that have been selected
    353                 // do not split if this is the first selected node
    354                 if (nodeCount == 0) {
    355                         previousAffectedWay = affected;
    356                         nodeCount++;
    357                         return;
    358                 }
    359 
    360                 // if both the nodes are starting and ending points of the same way
    361                 // we don't split the way, just add new key-value to the way
    362                 boolean areStartEndPoints = startEndPoints();
    363                 if (areStartEndPoints)
    364                         return;
    365 
    366                 // if first node is a connection node
    367                 boolean isConnectionNode = firstNodeIsConnectionNode(atNodes.get(0), affected);
    368                 if (isConnectionNode)
    369                         return;
    370 
    371                 // if second node is a connection node
    372                 isConnectionNode = secondNodeIsConnectionNode(atNodes.get(1));
    373                 if (isConnectionNode)
    374                         return;
    375                 else {
    376                         if (atNodes.get(1).isConnectionNode()) {
    377                                 affected = previousAffectedWay;
    378                         }
    379                 }
    380 
    381 
    382                 // if both the nodes are not on same way and don't have any common node then
    383                 // make second node as first node
    384                 Node commonNode = null;
    385                 boolean twoWaysWithCommonNode = false;
    386                 if (previousAffectedWay != affected) {
    387                         commonNode = checkCommonNode(affected);
    388                         if (commonNode == null) {
    389                                 removeFirstNode(affected);
    390                                 return;
    391                         } else {
    392                                 twoWaysWithCommonNode = true;
    393                         }
    394                 }
    395 
    396 
    397                 // ****need to add undoredo for previousAffectedWay, atNode, nodeCount
    398 
    399                 if (twoWaysWithCommonNode) {
    400                         addKeysOnBothWays(commonNode, affected);
    401 
    402                 } else {
    403             addKeys(affected);
    404                 }
    405 
    406                 // reset values of all the variables after two nodes are selected and split
    407                 reset();
    408 
    409         }
    410 
    411         private void dialogBox(List<Way> selectedWay, List<TagMap> affectedKeysList) {
    412 
    413                 final ExtendedDialog dialog = new SelectFromOptionDialog(selectedWay, affectedKeysList);
    414                 dialog.toggleEnable("way.split.segment-selection-dialog");
    415                 if (!dialog.toggleCheckState()) {
    416                         dialog.setModal(false);
    417                         dialog.showDialog();
    418                         return; // splitting is performed in SegmentToKeepSelectionDialog.buttonAction()
    419                 }
    420 
     564                if (Pos1 == null) {
     565                        SegWay1 = MainApplication.getMap().mapView.getNearestWay(e.getPoint(), OsmPrimitive::isSelectable);
     566                        if (SegWay1 != null) {
     567                                Pos1 = new LatLon(e.getX(), e.getY());
     568                        }
     569                } else if (Pos2 == null) {
     570                        if (Pos1.lat() != e.getX() || Pos1.lon() != e.getY()) {
     571                                SegWay2 = MainApplication.getMap().mapView.getNearestWay(e.getPoint(), OsmPrimitive::isSelectable);
     572                                if (SegWay2 != null)
     573                                        Pos2 = new LatLon(e.getX(), e.getY());
     574                        }
     575                }
     576
     577                if (Pos2 != null) {
     578                        reset();
     579                        action();
     580                }
    421581        }
    422582
    423583        // turn off what has been highlighted on last mouse move and highlight what has
    424584        // to be highlighted now
    425 
    426     private void updateHighlights() {
     585        private void updateHighlights() {
    427586                if (oldHighlights.isEmpty() && newHighlights.isEmpty()) {
    428587                        return;
     
    444603        }
    445604
     605        @Override
     606        public void keyTyped(KeyEvent e) {
     607                System.out.println("keyTyped");
     608        }
     609
     610        @Override
     611        public void keyPressed(KeyEvent e) {
     612                System.out.println("keyPressed");
     613                boolean z = e.getKeyCode() == KeyEvent.VK_Z;
     614                updateKeyModifiers(e);
     615                System.out.println(ctrl);
     616                if (z) {
     617                        if (Pos1 != null && Pos2 == null) {
     618                                Pos1 = null;
     619                                SegWay1 = null;
     620                                temporaryLayer.invalidate();
     621                        }
     622                }
     623        }
     624
     625        @Override
     626        public void keyReleased(KeyEvent e) {
     627                System.out.println("keyReleased");
     628        }
     629
    446630        // A dialogBox to query whether to select bus_bay, tunnel or bridge.
    447631
    448         static class SelectFromOptionDialog extends ExtendedDialog {
    449                 static final AtomicInteger DISPLAY_COUNT = new AtomicInteger();
    450                 final transient List<Way> selectedWay;
     632        private class SelectFromOptionDialog extends ExtendedDialog {
     633                Way affected, previousAffectedWay;
    451634                private JComboBox<String> keys;
    452635                private JComboBox<String> values;
    453                 private List<TagMap> affectedKeysList;
    454 
    455                 SelectFromOptionDialog(List<Way> selectedWay, List<TagMap> affectedKeysList) {
     636                private int type;
     637                private List<Command> commandList;
     638                private Node commonNode;
     639
     640                SelectFromOptionDialog(int type, Node commonNode, Way affected, Way previousAffectedWay,
     641                                List<Command> commandList, List<Node> atNode) {
    456642                        super(Main.parent, tr("What do you want the segment to be?"), new String[] { tr("Ok"), tr("Cancel") },
    457643                                        true);
    458                         this.selectedWay = selectedWay;
    459                         this.affectedKeysList = affectedKeysList;
     644                        this.affected = affected;
     645                        this.previousAffectedWay = previousAffectedWay;
     646                        this.commandList = commandList;
     647                        this.type = type;
     648                        this.commonNode = commonNode;
    460649
    461650                        setButtonIcons("ok", "cancel");
     
    499688
    500689                        if (getValue() == 1) {
    501                                 TagMap newKeys1 = this.affectedKeysList.get(0);
    502                                 newKeys1.put(keys.getSelectedItem().toString(), values.getSelectedItem().toString());
    503 
    504                                 if (keys.getSelectedItem() == "bridge") {
    505                                         newKeys1.put("layer", "1");
    506                                         this.selectedWay.get(0).setKeys(newKeys1);
    507                                 } else if (keys.getSelectedItem() == "tunnel") {
    508                                         newKeys1.put("layer", "-1");
    509                                         this.selectedWay.get(0).setKeys(newKeys1);
    510                                 } else {
    511                                         this.selectedWay.get(0).setKeys(newKeys1);
     690                                if (this.type == 1) {
     691                                        addKeysOnBothWays(this.commonNode, this.affected, this.previousAffectedWay, this.commandList, keys,
     692                                                        values);
     693                                } else if (this.type == 2) {
     694                                        addKeys(this.affected, this.commandList, keys, values);
     695                                } else if (this.type == 3) {
     696                                        addKeysWhenStartEndPoint(this.affected, this.commandList, keys, values);
    512697                                }
    513698
    514                                 if (this.affectedKeysList.size() == 2) {
    515                                         TagMap newKeys2 = this.affectedKeysList.get(1);
    516                                         newKeys2.put(keys.getSelectedItem().toString(), values.getSelectedItem().toString());
    517 
    518                                         if (keys.getSelectedItem() == "bridge") {
    519                                                 newKeys2.put("layer", "1");
    520                                                 this.selectedWay.get(1).setKeys(newKeys2);
    521                                         } else if (keys.getSelectedItem() == "tunnel") {
    522                                                 newKeys2.put("layer", "-1");
    523                                                 this.selectedWay.get(1).setKeys(newKeys2);
    524                                         } else {
    525                                                 this.selectedWay.get(1).setKeys(newKeys2);
    526                                         }
    527                                 }
    528                         }
    529                 }
    530         }
     699                        } else if (getValue() == 2) {
     700                                resetLayer();
     701                        }
     702                }
     703
     704        }
     705
     706        private class DoubleSplitLayer extends AbstractMapViewPaintable {
     707                @Override
     708                public void paint(Graphics2D g, MapView mv, Bounds bbox) {
     709                        if (Pos1 != null) {
     710                                CheckParameterUtil.ensureParameterNotNull(mv, "mv");
     711                                g.setColor(Color.RED);
     712                                g.fillRect((int) Pos1.lat(), (int) Pos1.lon(), 6, 6);
     713                        }
     714                        if (Pos2 != null) {
     715                                CheckParameterUtil.ensureParameterNotNull(mv, "mv");
     716                                g.setColor(Color.RED);
     717                                g.fillRect((int) Pos2.lat(), (int) Pos2.lon(), 5, 5);
     718                        }
     719                }
     720        }
     721
    531722}
Note: See TracChangeset for help on using the changeset viewer.