Ignore:
Timestamp:
2013-03-21T21:30:58+01:00 (11 years ago)
Author:
zverik
Message:

iodb updates

Location:
applications/editors/josm/plugins/imagery_offset_db/src/iodb
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetPlugin.java

    r29377 r29382  
    2626        offsetMenu.add(getAction);
    2727        offsetMenu.add(storeAction);
    28 
    29         // todo: add a button on toolbar
    30         // todo: make MapMode for viewing and updating imagery offsets (is it needed?)
    3128    }
    3229}
  • applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetTools.java

    r29380 r29382  
    176176        Projection proj = Main.getProjection();
    177177        EastNorth pos = proj.latlon2eastNorth(offset.getPosition());
    178         LatLon correctedCenterLL = proj.eastNorth2latlon(pos.add(dx, dy));
     178        LatLon correctedCenterLL = proj.eastNorth2latlon(pos.add(-dx, -dy));
    179179        double length = correctedCenterLL.greatCircleDistance(offset.getImageryPos());
    180180        double direction = length < 1e-2 ? 0.0 : correctedCenterLL.heading(offset.getImageryPos());
    181181        // todo: north vs south. Meanwhile, let's fix this dirty:
    182         direction = Math.PI - direction;
     182//        direction = Math.PI - direction;
    183183        if( direction < 0 )
    184184            direction += Math.PI * 2;
  • applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java

    r29380 r29382  
    1111import javax.swing.border.EmptyBorder;
    1212import org.openstreetmap.josm.Main;
     13import org.openstreetmap.josm.data.Bounds;
    1314import org.openstreetmap.josm.gui.JosmUserIdentityManager;
     15import org.openstreetmap.josm.gui.MapView;
    1416import org.openstreetmap.josm.gui.NavigatableComponent;
    1517import org.openstreetmap.josm.gui.layer.ImageryLayer;
     18import org.openstreetmap.josm.gui.layer.MapViewPaintable;
    1619import static org.openstreetmap.josm.tools.I18n.tr;
    1720import org.openstreetmap.josm.tools.ImageProvider;
     
    2326 * @author zverik
    2427 */
    25 public class OffsetDialog extends JDialog implements ActionListener, NavigatableComponent.ZoomChangeListener {
     28public class OffsetDialog extends JDialog implements ActionListener, NavigatableComponent.ZoomChangeListener, MapViewPaintable {
    2629    protected static final String PREF_CALIBRATION = "iodb.show.calibration";
    2730    protected static final String PREF_DEPRECATED = "iodb.show.deprecated";
     
    106109        }
    107110        pack();
     111        Main.map.mapView.repaint();
    108112    }
    109113
     
    131135        }
    132136    }
     137
     138    public void paint( Graphics2D g, MapView mv, Bounds bbox ) {
     139        if( offsets == null )
     140            return;
     141
     142        Graphics2D g2 = (Graphics2D)g.create();
     143        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     144        g2.setStroke(new BasicStroke(2));
     145        for( ImageryOffsetBase offset : filterOffsets() ) {
     146            Point p = mv.getPoint(offset.getPosition());
     147            g2.setColor(Color.BLACK);
     148            g2.fillOval(p.x - 2, p.y - 2, 5, 5);
     149            g2.setColor(Color.WHITE);
     150            g2.drawOval(p.x - 3, p.y - 3, 7, 7);
     151        }
     152    }
    133153   
    134154    public ImageryOffsetBase showDialog() {
     155        // todo: add a temporary layer showing all offsets
    135156        selectedOffset = null;
    136157        prepareDialog();
     158        if( !MODAL ) {
     159            Main.map.mapView.addTemporaryLayer(this);
     160            Main.map.mapView.repaint();
     161        }
    137162        setVisible(true);
    138163        return selectedOffset;
     
    173198        NavigatableComponent.removeZoomChangeListener(this);
    174199        setVisible(false);
    175         if( !MODAL && selectedOffset != null )
    176             applyOffset();
     200        if( !MODAL ) {
     201            Main.map.mapView.removeTemporaryLayer(this);
     202            Main.map.mapView.repaint();
     203            if( selectedOffset != null )
     204                applyOffset();
     205        }
    177206    }
    178207
  • applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java

    r29380 r29382  
    11package iodb;
    22
    3 import java.awt.Component;
    4 import java.awt.Dimension;
    5 import java.awt.Graphics;
     3import java.awt.*;
    64import javax.swing.Icon;
    75import javax.swing.ImageIcon;
     
    2523        super();
    2624        this.offset = offset;
    27         setMinimumSize(new Dimension(500, 10));
    28         setMaximumSize(new Dimension(500, 150));
     25//        setMinimumSize(new Dimension(500, 10));
     26//        setMaximumSize(new Dimension(500, 150));
    2927        setRelevantText();
    3028        setIcon(new OffsetIcon(offset));
     
    3230        offsetLength = offset instanceof ImageryOffset ? getLengthAndDirection((ImageryOffset)offset)[0] : 0.0;
    3331        // todo: layout, info, map distance and direction
     32        // http://stackoverflow.com/questions/1048224/get-height-of-multi-line-text-with-fixed-width-to-make-dialog-resize-properly
     33        // http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html#size
     34        // http://stackoverflow.com/questions/8012646/setting-size-of-jbutton-inside-jpanel-with-boxlayout-doesnt-work-as-expected
     35        // http://blog.nobel-joergensen.com/2009/01/18/changing-preferred-size-of-a-html-jlabel/
     36        // http://thebadprogrammer.com/swing-layout-manager-sizing/
     37        // http://stackoverflow.com/questions/3692987/why-will-boxlayout-not-allow-me-to-change-the-width-of-a-jbutton-but-let-me-chan
     38
     39        // http://stackoverflow.com/questions/2158/creating-a-custom-button-in-java
    3440    }
    3541
     
    3844     */
    3945    public void setRelevantText() {
    40         setText("<html>"
     46        setText("<html><div style=\"width: 400px;\">"
    4147                + ImageryOffsetTools.formatDistance(offset.getPosition().greatCircleDistance(ImageryOffsetTools.getMapCenter()))
    42                 + ": " + offset.getDescription() + "</html>");
     48                + ": " + offset.getDescription() + "</div></html>");
    4349    }
    4450
     
    4753    }
    4854
    49     @Override
     55/*    @Override
    5056    public Dimension getPreferredSize() {
    5157        Dimension size = super.getPreferredSize();
     
    5359        size.height = 70;
    5460        return size;
    55     }
     61    }*/
    5662
    5763    /**
     
    7278        private boolean isDeprecated;
    7379        private boolean isCalibration;
    74         private double direction;
     80        private double direction = -1.0;
    7581        private double length;
    7682        private ImageIcon background;
     
    9197        }
    9298
    93         public void paintIcon( Component c, Graphics g, int x, int y ) {
    94             background.paintIcon(c, g, x, y);
    95             // todo: draw an arrow
    96             // todo: apply deprecation
     99        public void paintIcon( Component comp, Graphics g, int x, int y ) {
     100            background.paintIcon(comp, g, x, y);
     101
     102            Graphics2D g2 = (Graphics2D)g.create();
     103            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     104            if( direction >= 0 ) {
     105                g2.setColor(Color.black);
     106                Point c = new Point(x + getIconWidth() / 2, y + getIconHeight() / 2);
     107                if( length < 1e-2 ) {
     108                    // no offset
     109                    g2.fillOval(c.x - 3, c.y - 3, 7, 7);
     110                } else {
     111                    // draw an arrow
     112                    double arrowLength = length < 5 ? getIconWidth() / 2 - 1 : getIconWidth() - 4;
     113                    g2.setStroke(new BasicStroke(2));
     114                    int dx = (int)Math.round(Math.sin(direction) * arrowLength / 2);
     115                    int dy = (int)Math.round(Math.cos(direction) * arrowLength / 2);
     116                    g2.drawLine(c.x - dx, c.y - dy, c.x + dx, c.y + dy);
     117                    double wingLength = arrowLength / 3;
     118                    double d1 = direction - Math.PI / 6;
     119                    int dx1 = (int)Math.round(Math.sin(d1) * wingLength);
     120                    int dy1 = (int)Math.round(Math.cos(d1) * wingLength);
     121                    g2.drawLine(c.x + dx, c.y + dy, c.x + dx - dx1, c.y + dy - dy1);
     122                    double d2 = direction + Math.PI / 6;
     123                    int dx2 = (int)Math.round(Math.sin(d2) * wingLength);
     124                    int dy2 = (int)Math.round(Math.cos(d2) * wingLength);
     125                    g2.drawLine(c.x + dx, c.y + dy, c.x + dx - dx2, c.y + dy - dy2);
     126                }
     127            }
     128            if( isDeprecated ) {
     129                // big red X
     130                g2.setColor(Color.red);
     131                g2.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
     132                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
     133                g2.drawLine(x + 2, y + 2, x + getIconWidth() - 2, y + getIconHeight() - 2);
     134                g2.drawLine(x + 2, y + getIconHeight() - 2, x + getIconWidth() - 2, y + 2);
     135            }
    97136        }
    98137
  • applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetInfoAction.java

    r29381 r29382  
    3434        StringBuilder sb = new StringBuilder();
    3535        if( offset instanceof ImageryOffset ) {
    36             double[] ld = ImageryOffsetTools.getLengthAndDirection((ImageryOffset)offset);
    37             sb.append(ld[0] < 1e-2 ? tr("An imagery offset of 0 mm") : tr("An imagery offset of {0} to {1}",
    38                     ImageryOffsetTools.formatDistance(ld[0]), explainDirection(ld[1]))).append('\n');
     36            double odist = ((ImageryOffset)offset).getImageryPos().greatCircleDistance(offset.getPosition());
     37            sb.append(odist < 1e-2 ? tr("An imagery offset of 0 mm") : tr("An imagery offset of {0}",
     38                    ImageryOffsetTools.formatDistance(odist))).append('\n');
    3939            sb.append("Imagery ID: ").append(((ImageryOffset)offset).getImagery()).append('\n');
    4040        } else {
     
    4343       
    4444        double dist = ImageryOffsetTools.getMapCenter().greatCircleDistance(offset.getPosition());
    45         double heading = dist < 10 ? 0.0 : ImageryOffsetTools.getMapCenter().heading(offset.getPosition());
    46         sb.append(dist < 50 ? tr("Determined right here") : tr("Determined at a point {0} to the {1}",
    47                 ImageryOffsetTools.formatDistance(dist), explainDirection(heading)));
     45        sb.append(dist < 50 ? tr("Determined right here") : tr("Determined at a point {0} away",
     46                ImageryOffsetTools.formatDistance(dist)));
    4847       
    4948        sb.append('\n').append('\n');
     
    7574            return "geometry";
    7675    }
    77 
    78     public static String explainDirection( double dir ) {
    79         dir = dir * 8 / Math.PI;
    80         if( dir < 1 || dir >= 15 ) return tr("north");
    81         if( dir < 3 ) return tr("northeast");
    82         if( dir < 5 ) return tr("east");
    83         if( dir < 7 ) return tr("southeast");
    84         if( dir < 9 ) return tr("south");
    85         if( dir < 11 ) return tr("southwest");
    86         if( dir < 13 ) return tr("west");
    87         if( dir < 15 ) return tr("northwest");
    88         return "nowhere";
    89     }
    9076}
  • applications/editors/josm/plugins/imagery_offset_db/src/iodb/StoreImageryOffsetAction.java

    r29381 r29382  
    4040            return;
    4141        }
     42        if( userName.indexOf('@') > 0 )
     43            userName = userName.replace('@', ',');
    4244           
    4345        // check if an object suitable for calibration is selected
Note: See TracChangeset for help on using the changeset viewer.