Changeset 26481 in osm for applications/editors/josm


Ignore:
Timestamp:
2011-08-07T19:46:22+02:00 (13 years ago)
Author:
tordanik
Message:

add more options for GraphView arrow rendering

Location:
applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/GraphViewPlugin.java

    r26345 r26481  
    119119                    graphViewLayer.setWayGraph(graph);
    120120                    graphViewLayer.setColorScheme(preferences.getCurrentColorScheme());
     121                    graphViewLayer.setArrowheadPlacement(preferences.getArrowheadPlacement());
    121122                    graphViewLayer.setNodePositioner(new DefaultNodePositioner());
    122123
     
    269270            if (graphViewLayer != null) {
    270271                graphViewLayer.setColorScheme(preferences.getCurrentColorScheme());
     272                graphViewLayer.setArrowheadPlacement(preferences.getArrowheadPlacement());
    271273            }
    272274        }
  • applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/dialogs/GraphViewPreferenceEditor.java

    r26466 r26481  
    33import static org.openstreetmap.josm.tools.I18n.tr;
    44
     5import java.awt.BasicStroke;
    56import java.awt.Color;
     7import java.awt.Dimension;
     8import java.awt.Graphics;
     9import java.awt.Graphics2D;
    610import java.awt.GridBagConstraints;
    711import java.awt.GridBagLayout;
    812import java.awt.GridLayout;
     13import java.awt.Point;
    914import java.awt.event.ActionEvent;
    1015import java.awt.event.ActionListener;
     16import java.awt.geom.Line2D;
    1117import java.io.File;
    1218import java.util.Collection;
     
    2531import javax.swing.JOptionPane;
    2632import javax.swing.JPanel;
     33import javax.swing.JSlider;
    2734import javax.swing.JTextField;
     35import javax.swing.event.ChangeEvent;
     36import javax.swing.event.ChangeListener;
    2837
    2938import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
    3039import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
    3140import org.openstreetmap.josm.plugins.graphview.plugin.dialogs.AccessParameterDialog.BookmarkAction;
     41import org.openstreetmap.josm.plugins.graphview.plugin.layer.GraphViewLayer;
    3242import org.openstreetmap.josm.plugins.graphview.plugin.preferences.GraphViewPreferenceDefaults;
    3343import org.openstreetmap.josm.plugins.graphview.plugin.preferences.GraphViewPreferences;
     
    5666    private JButton nodeColorButton;
    5767    private JPanel nodeColorField;
    58    
     68    private JButton arrowheadFillColorButton;
     69    private JPanel arrowheadFillColorField;
     70    private JSlider arrowheadPlacementSlider;
     71    private JPanel arrowPreviewPanel;
     72
    5973    public void addGui(PreferenceTabbedPane gui) {
    6074
     
    182196        return vehiclePanel;
    183197    }
    184    
     198
    185199    private JPanel createVisualizationPanel() {
    186        
     200
    187201        JPanel visualizationPanel = new JPanel();
    188202        visualizationPanel.setBorder(BorderFactory.createTitledBorder(tr("Visualization")));
    189203        visualizationPanel.setLayout(new BoxLayout(visualizationPanel, BoxLayout.Y_AXIS));
    190        
     204
    191205        separateDirectionsCheckBox = new JCheckBox(tr("Draw directions separately"));
    192206        separateDirectionsCheckBox.setSelected(GraphViewPreferences.getInstance().getSeparateDirections());
    193207        visualizationPanel.add(separateDirectionsCheckBox);
    194        
     208
    195209        { // create color chooser panel
    196                
     210
    197211                JPanel colorPanel = new JPanel();
    198                 colorPanel.setLayout(new GridLayout(2, 2));
    199                
     212                colorPanel.setLayout(new GridLayout(3, 2));
     213
    200214                Color nodeColor = GraphViewPreferences.getInstance().getNodeColor();
    201                
     215
    202216                nodeColorButton = new JButton(tr("Node color"));
    203217                nodeColorButton.addActionListener(chooseNodeColorActionListener);
     
    206220                nodeColorField.setBackground(nodeColor);
    207221                colorPanel.add(nodeColorField);
    208                
     222
    209223                Color segmentColor = GraphViewPreferences.getInstance().getSegmentColor();
    210                
     224
    211225                segmentColorButton = new JButton(tr("Arrow color"));
    212226                segmentColorButton.addActionListener(chooseSegmentColorActionListener);
     
    215229                segmentColorField.setBackground(segmentColor);
    216230                colorPanel.add(segmentColorField);
    217                
     231
     232                Color arrowheadFillColor = GraphViewPreferences.getInstance().getArrowheadFillColor();
     233
     234                arrowheadFillColorButton = new JButton(tr("Arrowhead fill color"));
     235                arrowheadFillColorButton.addActionListener(chooseArrowheadFillColorActionListener);
     236                colorPanel.add(arrowheadFillColorButton);
     237                arrowheadFillColorField = new JPanel();
     238                arrowheadFillColorField.setBackground(arrowheadFillColor);
     239                colorPanel.add(arrowheadFillColorField);
     240
    218241                visualizationPanel.add(colorPanel);
    219                
     242
    220243        }
    221        
     244
     245        arrowheadPlacementSlider = new JSlider(0, 100);
     246        arrowheadPlacementSlider.setToolTipText(tr("Arrowhead placement"));
     247        arrowheadPlacementSlider.setMajorTickSpacing(10);
     248        arrowheadPlacementSlider.setPaintTicks(true);
     249        arrowheadPlacementSlider.setName("name");
     250        arrowheadPlacementSlider.setLabelTable(null);
     251        arrowheadPlacementSlider.setValue((int)Math.round(
     252                        100 * GraphViewPreferences.getInstance().getArrowheadPlacement()));
     253        arrowheadPlacementSlider.addChangeListener(arrowheadPlacementChangeListener);
     254        visualizationPanel.add(arrowheadPlacementSlider);
     255
     256        arrowPreviewPanel = new ArrowPreviewPanel();
     257        visualizationPanel.add(arrowPreviewPanel);
     258
    222259        return visualizationPanel;
    223260    }
     
    239276        preferences.setNodeColor(nodeColorField.getBackground());
    240277        preferences.setSegmentColor(segmentColorField.getBackground());
    241        
     278        preferences.setArrowheadFillColor(arrowheadFillColorField.getBackground());
     279
     280        preferences.setArrowheadPlacement(
     281                        arrowheadPlacementSlider.getValue() / 100f);
     282
    242283        preferences.distributeChanges();
    243284
     
    371412        }
    372413    };
    373    
     414
    374415    private final ActionListener chooseNodeColorActionListener = new ActionListener() {
    375416        public void actionPerformed(ActionEvent e) {
    376                
     417
    377418                Color selectedColor = JColorChooser.showDialog(
    378419                                preferencePanel, tr("Choose node color"), nodeColorField.getBackground());
    379                
     420
    380421                if (selectedColor != null) {
    381422                        nodeColorField.setBackground(selectedColor);
    382423                }
    383                
    384         }
    385     };
    386    
     424
     425                arrowPreviewPanel.repaint();
     426
     427        }
     428    };
     429
    387430    private final ActionListener chooseSegmentColorActionListener = new ActionListener() {
    388431        public void actionPerformed(ActionEvent e) {
    389                
     432
    390433                Color selectedColor = JColorChooser.showDialog(
    391434                                preferencePanel, tr("Choose arrow color"), segmentColorField.getBackground());
    392                
     435
    393436                if (selectedColor != null) {
    394437                        segmentColorField.setBackground(selectedColor);
    395438                }
    396                
     439
     440                arrowPreviewPanel.repaint();
     441
     442        }
     443    };
     444
     445    private final ActionListener chooseArrowheadFillColorActionListener = new ActionListener() {
     446        public void actionPerformed(ActionEvent e) {
     447
     448                Color selectedColor = JColorChooser.showDialog(
     449                                preferencePanel, tr("Choose arrowhead fill color"), segmentColorField.getBackground());
     450
     451                if (selectedColor != null) {
     452                        arrowheadFillColorField.setBackground(selectedColor);
     453                }
     454
     455                arrowPreviewPanel.repaint();
     456
     457        }
     458    };
     459
     460    private final ChangeListener arrowheadPlacementChangeListener = new ChangeListener() {
     461        public void stateChanged(ChangeEvent e) {
     462                arrowPreviewPanel.repaint();
    397463        }
    398464    };
     
    426492    }
    427493
     494    private class ArrowPreviewPanel extends JPanel {
     495
     496        public ArrowPreviewPanel() {
     497                setPreferredSize(new Dimension(100, 50));
     498                        setBackground(Color.DARK_GRAY);
     499                }
     500
     501        @Override
     502        public void paint(Graphics g) {
     503
     504                super.paint(g);
     505
     506                Graphics2D g2D = (Graphics2D)g;
     507
     508                Point p1 = new Point(15, this.getHeight() / 2);
     509                Point p2 = new Point(this.getWidth()-15, this.getHeight() / 2);
     510
     511                g2D.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
     512                g2D.setColor(segmentColorField.getBackground());
     513                g2D.draw(new Line2D.Float(p1.x, p1.y, p2.x, p2.y));
     514
     515                GraphViewLayer.paintNode(g, p1, nodeColorField.getBackground());
     516                GraphViewLayer.paintNode(g, p2, nodeColorField.getBackground());
     517
     518                GraphViewLayer.paintArrowhead(g2D, p1, p2,
     519                                arrowheadPlacementSlider.getValue() / 100.0,
     520                                segmentColorField.getBackground(),
     521                                arrowheadFillColorField.getBackground());
     522
     523        }
     524
     525    }
     526
    428527}
  • applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/layer/GraphViewLayer.java

    r26174 r26481  
    6666    private static final Shape ARROW_HEAD;
    6767
     68    /** arrow head core, can be colored differently and is rendered on top */
     69    private static final Shape ARROW_HEAD_CORE;
     70
    6871    static {
    6972
     
    7174
    7275        head.addPoint(  0,  0);
    73         head.addPoint(-15, +4);
    74         head.addPoint(-15, -4);
     76        head.addPoint(-22, +6);
     77        head.addPoint(-22, -6);
    7578
    7679        ARROW_HEAD = head;
     80
     81        Polygon headCore = new Polygon();
     82
     83        headCore.addPoint(-12,  0);
     84        headCore.addPoint(-19, +2);
     85        headCore.addPoint(-19, -2);
     86
     87        ARROW_HEAD_CORE = headCore;
     88
     89
    7790    }
    7891
     
    8093
    8194    private ColorScheme colorScheme = null;
     95    private Double arrowheadPlacement = null;
    8296    private NodePositioner nodePositioner = new NonMovingNodePositioner();
    8397
     
    101115    public void setColorScheme(ColorScheme colorScheme) {
    102116        this.colorScheme = colorScheme;
     117        Main.panel.repaint();
     118    }
     119
     120    /** sets the arrowhead placement (relative offset from edge start) */
     121    public void setArrowheadPlacement(double arrowheadPlacement) {
     122        assert arrowheadPlacement >= 0 && arrowheadPlacement <= 1;
     123        this.arrowheadPlacement = arrowheadPlacement;
    103124        Main.panel.repaint();
    104125    }
     
    124145
    125146        Color color = colorScheme != null ? colorScheme.getNodeColor(node) : Color.LIGHT_GRAY;
    126 
    127147        Point p = getNodePoint(node, mv);
    128         g.setColor(color);
     148
     149        paintNode(g, p, color);
     150
     151    }
     152
     153        public static void paintNode(final Graphics g, Point p, Color color) {
     154                g.setColor(color);
    129155        g.fillOval(p.x - NODE_RADIUS, p.y - NODE_RADIUS, 2 * NODE_RADIUS, 2 * NODE_RADIUS);
    130 
    131     }
    132 
    133     private void paintGraphEdge(final GraphEdge e, final Graphics2D g2D, final MapView mv) {
     156        }
     157
     158    private void paintGraphEdge(final GraphEdge e, final Graphics2D g2D, final MapView mv,
     159                boolean drawLine, boolean drawDirectionIndicator) {
    134160
    135161        if (!CONNECT_ALL_NODE_PAIRS && GraphViewPreferences.getInstance().getSeparateDirections()) {
     
    175201                }
    176202
    177                 g2D.draw(new Line2D.Float(p1.x, p1.y, p2.x, p2.y));
     203                if (drawLine) {
     204                        g2D.draw(new Line2D.Float(p1.x, p1.y, p2.x, p2.y));
     205                }
    178206
    179207            }
     
    183211                Color color = GraphViewPreferences.getInstance().getSegmentColor();
    184212            g2D.setColor(color);
    185            
     213
    186214            Point p1 = getNodePoint(e.getStartNode(), mv);
    187215            Point p2 = getNodePoint(e.getTargetNode(), mv);
    188216
    189             g2D.draw(new Line2D.Float(p1.x, p1.y, p2.x, p2.y));
     217            if (drawLine) {
     218                g2D.draw(new Line2D.Float(p1.x, p1.y, p2.x, p2.y));
     219            }
    190220
    191221        }
     
    197227            Point p2 = getNodePoint(e.getTargetNode(), mv);
    198228
    199             if (edgeSegments.size() > 0) {
     229            if (edgeSegments.size() > 1) {
    200230                Segment lastSegment = edgeSegments.get(edgeSegments.size() - 1);
    201231                p1 = getNodePoint(lastSegment.getNode1(), mv);
    202232            }
    203233
    204             double angle = angleFromXAxis(p1, p2); // angle between x-axis and [p1,p2]
    205             Shape head = ARROW_HEAD;
    206             head = AffineTransform.getRotateInstance(angle).createTransformedShape(head);
    207             head = AffineTransform.getTranslateInstance(p2.x, p2.y).createTransformedShape(head);
    208 
    209             g2D.fill(head);
    210 
    211         }
    212     }
     234            if (drawDirectionIndicator) {
     235
     236                    paintArrowhead(g2D, p1, p2, arrowheadPlacement, null,
     237                                GraphViewPreferences.getInstance().getArrowheadFillColor());
     238
     239            }
     240
     241        }
     242    }
     243
     244        public static void paintArrowhead(Graphics2D g2D,
     245                        Point p1, Point p2, Double arrowheadPlacement2,
     246                        Color casingColor, Color fillColor) {
     247
     248                Point pTip = new Point(
     249                                (int)(p1.x + arrowheadPlacement2 * (p2.x - p1.x)),
     250                                (int)(p1.y + arrowheadPlacement2 * (p2.y - p1.y)));
     251
     252                double angle = angleFromXAxis(p1, p2); // angle between x-axis and [p1,p2]
     253
     254                { //draw head shape
     255
     256                        if (casingColor != null) {
     257                                g2D.setColor(casingColor);
     258                        }
     259
     260                    Shape head = ARROW_HEAD;
     261                    head = AffineTransform.getRotateInstance(angle).createTransformedShape(head);
     262                    head = AffineTransform.getTranslateInstance(pTip.x, pTip.y).createTransformedShape(head);
     263                    g2D.fill(head);
     264                }
     265
     266                { //draw head core shape
     267
     268                        if (fillColor != null) {
     269                                g2D.setColor(fillColor);
     270                        }
     271
     272                    Shape headCore = ARROW_HEAD_CORE;
     273                    headCore = AffineTransform.getRotateInstance(angle).createTransformedShape(headCore);
     274                    headCore = AffineTransform.getTranslateInstance(pTip.x, pTip.y).createTransformedShape(headCore);
     275                    g2D.fill(headCore);
     276                }
     277
     278        }
    213279
    214280    private Point getNodePoint(GraphNode node, MapView mv) {
     
    247313        return nodePoint;
    248314    }
    249     private Point getNodePoint(SegmentNode node, MapView mv) {
     315    private static Point getNodePoint(SegmentNode node, MapView mv) {
    250316        LatLonCoords coords = new LatLonCoords(node.getLat(), node.getLon());
    251317        return getNodePoint(coords, mv);
    252318    }
    253     private Point getNodePoint(LatLonCoords coords, MapView mv) {
     319    private static Point getNodePoint(LatLonCoords coords, MapView mv) {
    254320        LatLon latLon = new LatLon(coords.getLat(), coords.getLon());
    255321        EastNorth eastNorth = Main.getProjection().latlon2eastNorth(latLon);
     
    263329     * @return  angle in radians, in range [-Pi .. +Pi]
    264330     */
    265     private double angleFromXAxis(Point p1, Point p2) {
     331    private static double angleFromXAxis(Point p1, Point p2) {
    266332        assert p1 != null && p2 != null;
    267333
     
    293359
    294360            for (GraphEdge e : wayGraph.getEdges()) {
    295                 paintGraphEdge(e, g, mv);
     361                paintGraphEdge(e, g, mv, true, false);
     362            }
     363
     364            for (GraphEdge e : wayGraph.getEdges()) {
     365                //draw arrowheads last to make sure they end up on top
     366                paintGraphEdge(e, g, mv, false, true);
    296367            }
    297368
  • applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/preferences/GraphViewPreferences.java

    r26174 r26481  
    11package org.openstreetmap.josm.plugins.graphview.plugin.preferences;
    2 
    3 import static org.openstreetmap.josm.tools.I18n.marktr;
    42
    53import static org.openstreetmap.josm.plugins.graphview.core.property.VehiclePropertyTypes.AXLELOAD;
     
    3836 * changes will also be synchronized (two-way) with JOSM's preference storage.
    3937 * This is a singleton class.
    40  * 
     38 *
    4139 * Note: Currently, manual updates in the "advanced preferences" will not have any effect
    4240 * because this class isn't registered as a preference listener.
     
    6967    private Color nodeColor;
    7068    private Color segmentColor;
     69    private Color arrowheadFillColor;
    7170
    7271    private boolean separateDirections;
    7372
     73    private double arrowheadPlacement;
    7474
    7575    public synchronized boolean getUseInternalRulesets() {
     
    168168    }
    169169
    170     public synchronized boolean getSeparateDirections() {
     170    public synchronized Color getArrowheadFillColor() {
     171                return arrowheadFillColor;
     172        }
     173        public synchronized void setArrowheadFillColor(Color arrowheadFillColor) {
     174                this.arrowheadFillColor = arrowheadFillColor;
     175        }
     176
     177        public synchronized boolean getSeparateDirections() {
    171178        return separateDirections;
    172179    }
    173180    public synchronized void setSeparateDirections(boolean separateDirections) {
    174181        this.separateDirections = separateDirections;
     182    }
     183
     184    public synchronized double getArrowheadPlacement() {
     185        return arrowheadPlacement;
     186    }
     187    public synchronized void setArrowheadPlacement(double arrowheadPlacement) {
     188        this.arrowheadPlacement = arrowheadPlacement;
    175189    }
    176190
     
    220234        currentColorScheme = new PreferencesColorScheme(this);
    221235
     236        nodeColor = Color.WHITE;
     237        segmentColor = Color.WHITE;
     238        arrowheadFillColor = Color.BLACK;
     239
    222240        separateDirections = false;
    223241
     
    244262        }
    245263
    246         Main.pref.putColor(marktr("GraphView default node"), nodeColor);
    247         Main.pref.putColor(marktr("Graphview default segment"), segmentColor);
     264        Main.pref.put("graphview.defaultNodeColor", createColorString(nodeColor));
     265        Main.pref.put("graphview.defaultSegmentColor", createColorString(segmentColor));
     266        Main.pref.put("graphview.defaultArrowheadCoreColor", createColorString(arrowheadFillColor));
    248267
    249268        Main.pref.put("graphview.separateDirections", separateDirections);
     269
     270        Main.pref.putDouble("graphview.arrowheadPlacement", arrowheadPlacement);
    250271
    251272    }
     
    289310        }
    290311
    291         nodeColor = Main.pref.getColor(marktr("GraphView default node"), Color.white);
    292         segmentColor = Main.pref.getColor(marktr("Graphview default segment"), Color.white);
     312        if (Main.pref.hasKey("graphview.defaultNodeColor")) {
     313            Color color = parseColorString(Main.pref.get("graphview.defaultNodeColor"));
     314            if (color != null) {
     315                nodeColor = color;
     316            }
     317        }
     318        if (Main.pref.hasKey("graphview.defaultSegmentColor")) {
     319            Color color = parseColorString(Main.pref.get("graphview.defaultSegmentColor"));
     320            if (color != null) {
     321                segmentColor = color;
     322            }
     323        }
     324        if (Main.pref.hasKey("graphview.defaultArrowheadCoreColor")) {
     325            Color color = parseColorString(Main.pref.get("graphview.defaultArrowheadCoreColor"));
     326            if (color != null) {
     327                arrowheadFillColor = color;
     328            }
     329        }
     330
    293331        separateDirections = Main.pref.getBoolean("graphview.separateDirections", false);
     332
     333        arrowheadPlacement = Main.pref.getDouble("graphview.arrowheadPlacement", 1.0);
     334        if (arrowheadPlacement < 0.0 || arrowheadPlacement >= 1.0) {
     335                arrowheadPlacement = 1.0;
     336        }
    294337
    295338    }
     
    460503        }
    461504    }
     505
     506    private static final Pattern COLOR_PATTERN =
     507        Pattern.compile("^(\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})$");
     508
     509    private String createColorString(Color color) {
     510        return color.getRed() + ", " + color.getGreen() + ", " + color.getBlue();
     511    }
     512
     513    private Color parseColorString(String string) {
     514        Matcher matcher = COLOR_PATTERN.matcher(string);
     515        if (!matcher.matches()) {
     516            return null;
     517        } else {
     518            int r = Integer.parseInt(matcher.group(1));
     519            int g = Integer.parseInt(matcher.group(2));
     520            int b = Integer.parseInt(matcher.group(3));
     521            return new Color(r, g, b);
     522        }
     523    }
     524
    462525}
Note: See TracChangeset for help on using the changeset viewer.