001    // License: GPL. Copyright 2007 by Immanuel Scholz and others
002    package org.openstreetmap.josm.gui.preferences.display;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.awt.GridBagLayout;
007    import java.awt.event.ActionEvent;
008    import java.awt.event.ActionListener;
009    
010    import javax.swing.BorderFactory;
011    import javax.swing.Box;
012    import javax.swing.JCheckBox;
013    import javax.swing.JLabel;
014    import javax.swing.JPanel;
015    import javax.swing.JScrollPane;
016    
017    import org.openstreetmap.josm.Main;
018    import org.openstreetmap.josm.actions.ExpertToggleAction;
019    import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
020    import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
021    import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
022    import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
023    import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
024    import org.openstreetmap.josm.tools.GBC;
025    
026    public class DrawingPreference implements SubPreferenceSetting {
027    
028        public static class Factory implements PreferenceSettingFactory {
029            public PreferenceSetting createPreferenceSetting() {
030                return new DrawingPreference();
031            }
032        }
033    
034        private GPXSettingsPanel gpxPanel;
035        private JCheckBox directionHint = new JCheckBox(tr("Draw Direction Arrows"));
036        private JCheckBox headArrow = new JCheckBox(tr("Only on the head of a way."));
037        private JCheckBox onewayArrow = new JCheckBox(tr("Draw oneway arrows."));
038        private JCheckBox segmentOrderNumber = new JCheckBox(tr("Draw segment order numbers"));
039        private JCheckBox sourceBounds = new JCheckBox(tr("Draw boundaries of downloaded data"));
040        private JCheckBox virtualNodes = new JCheckBox(tr("Draw virtual nodes in select mode"));
041        private JCheckBox inactive = new JCheckBox(tr("Draw inactive layers in other color"));
042    
043        // Options that affect performance
044        private JCheckBox useHighlighting = new JCheckBox(tr("Highlight target ways and nodes"));
045        private JCheckBox drawHelperLine = new JCheckBox(tr("Draw rubber-band helper line"));
046        private JCheckBox useAntialiasing = new JCheckBox(tr("Smooth map graphics (antialiasing)"));
047        private JCheckBox useWireframeAntialiasing = new JCheckBox(tr("Smooth map graphics in wireframe mode (antialiasing)"));
048        private JCheckBox outlineOnly = new JCheckBox(tr("Draw only outlines of areas"));
049    
050        public void addGui(PreferenceTabbedPane gui) {
051            //gui.display.setPreferredSize(new Dimension(400,600));
052            gpxPanel = new GPXSettingsPanel();
053            gui.addValidationListener(gpxPanel);
054            JPanel panel = gpxPanel;
055    
056            JScrollPane scrollpane = new JScrollPane(panel);
057            scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
058            gui.getDisplayPreference().displaycontent.addTab(tr("GPS Points"), scrollpane);
059            panel = new JPanel(new GridBagLayout());
060            panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
061    
062            // directionHint
063            directionHint.addActionListener(new ActionListener(){
064                public void actionPerformed(ActionEvent e) {
065                    if (directionHint.isSelected()){
066                        headArrow.setSelected(Main.pref.getBoolean("draw.segment.head_only", false));
067                    }else{
068                        headArrow.setSelected(false);
069                    }
070                    headArrow.setEnabled(directionHint.isSelected());
071                }
072            });
073            directionHint.setToolTipText(tr("Draw direction hints for way segments."));
074            directionHint.setSelected(Main.pref.getBoolean("draw.segment.direction", false));
075            panel.add(directionHint, GBC.eop().insets(20,0,0,0));
076    
077            // only on the head of a way
078            headArrow.setToolTipText(tr("Only on the head of a way."));
079            headArrow.setSelected(Main.pref.getBoolean("draw.segment.head_only", false));
080            headArrow.setEnabled(directionHint.isSelected());
081            panel.add(headArrow, GBC.eop().insets(40, 0, 0, 0));
082    
083            // draw oneway arrows
084            onewayArrow.setToolTipText(tr("Draw arrows in the direction of oneways and other directed features."));
085            onewayArrow.setSelected(Main.pref.getBoolean("draw.oneway", true));
086            panel.add(onewayArrow, GBC.eop().insets(20,0,0,0));
087    
088            // segment order number
089            segmentOrderNumber.setToolTipText(tr("Draw the order numbers of all segments within their way."));
090            segmentOrderNumber.setSelected(Main.pref.getBoolean("draw.segment.order_number", false));
091            panel.add(segmentOrderNumber, GBC.eop().insets(20,0,0,0));
092    
093            // downloaded area
094            sourceBounds.setToolTipText(tr("Draw the boundaries of data loaded from the server."));
095            sourceBounds.setSelected(Main.pref.getBoolean("draw.data.downloaded_area", true));
096            panel.add(sourceBounds, GBC.eop().insets(20,0,0,0));
097    
098            // virtual nodes
099            virtualNodes.setToolTipText(tr("Draw virtual nodes in select mode for easy way modification."));
100            virtualNodes.setSelected(Main.pref.getInteger("mappaint.node.virtual-size", 8) != 0);
101            panel.add(virtualNodes, GBC.eop().insets(20,0,0,0));
102    
103            // background layers in inactive color
104            inactive.setToolTipText(tr("Draw the inactive data layers in a different color."));
105            inactive.setSelected(Main.pref.getBoolean("draw.data.inactive_color", true));
106            panel.add(inactive, GBC.eop().insets(20,0,0,0));
107    
108            // antialiasing
109            useAntialiasing.setToolTipText(tr("Apply antialiasing to the map view resulting in a smoother appearance."));
110            useAntialiasing.setSelected(Main.pref.getBoolean("mappaint.use-antialiasing", true));
111    
112            // wireframe mode antialiasing
113            useWireframeAntialiasing.setToolTipText(tr("Apply antialiasing to the map view in wireframe mode resulting in a smoother appearance."));
114            useWireframeAntialiasing.setSelected(Main.pref.getBoolean("mappaint.wireframe.use-antialiasing", false));
115    
116            // highlighting
117            useHighlighting.setToolTipText(tr("Hightlight target nodes and ways while drawing or selecting"));
118            useHighlighting.setSelected(Main.pref.getBoolean("draw.target-highlight", true));
119    
120            drawHelperLine.setToolTipText(tr("Draw rubber-band helper line"));
121            drawHelperLine.setSelected(Main.pref.getBoolean("draw.helper-line", true));
122            panel.add(drawHelperLine, GBC.eop().insets(20, 0, 0, 0));
123    
124            // outlineOnly
125            outlineOnly.setSelected(Main.pref.getBoolean("draw.data.area_outline_only", false));
126            outlineOnly.setToolTipText(tr("This option suppresses the filling of areas, overriding anything specified in the selected style."));
127    
128            JLabel performanceLabel = new JLabel(tr("Options that affect drawing performance"));
129            panel.add(performanceLabel, GBC.eop().insets(5,10,0,0));
130            panel.add(useAntialiasing, GBC.eop().insets(20,5,0,0));
131            panel.add(useWireframeAntialiasing, GBC.eop().insets(20, 0, 0, 0));
132            panel.add(useHighlighting, GBC.eop().insets(20,0,0,0));
133            panel.add(outlineOnly, GBC.eol().insets(20,0,0,5));
134    
135            ExpertToggleAction.addVisibilitySwitcher(performanceLabel);
136            ExpertToggleAction.addVisibilitySwitcher(useAntialiasing);
137            ExpertToggleAction.addVisibilitySwitcher(useWireframeAntialiasing);
138            ExpertToggleAction.addVisibilitySwitcher(useHighlighting);
139            ExpertToggleAction.addVisibilitySwitcher(outlineOnly);
140    
141            panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
142            scrollpane = new JScrollPane(panel);
143            scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
144            gui.getDisplayPreference().displaycontent.addTab(tr("OSM Data"), scrollpane);
145        }
146    
147        public boolean ok() {
148            gpxPanel.savePreferences();
149            Main.pref.put("draw.data.area_outline_only", outlineOnly.isSelected());
150            Main.pref.put("draw.segment.direction", directionHint.isSelected());
151            Main.pref.put("draw.segment.head_only", headArrow.isSelected());
152            Main.pref.put("draw.oneway", onewayArrow.isSelected());
153            Main.pref.put("draw.segment.order_number", segmentOrderNumber.isSelected());
154            Main.pref.put("draw.data.downloaded_area", sourceBounds.isSelected());
155            Main.pref.put("draw.data.inactive_color", inactive.isSelected());
156            Main.pref.put("mappaint.use-antialiasing", useAntialiasing.isSelected());
157            Main.pref.put("mappaint.wireframe.use-antialiasing", useWireframeAntialiasing.isSelected());
158            Main.pref.put("draw.target-highlight", useHighlighting.isSelected());
159            Main.pref.put("draw.helper-line", drawHelperLine.isSelected());
160            int vn = Main.pref.getInteger("mappaint.node.virtual-size", 8);
161            if (virtualNodes.isSelected()) {
162                if (vn < 1) {
163                    vn = 8;
164                }
165            }
166            else {
167                vn = 0;
168            }
169            Main.pref.putInteger("mappaint.node.virtual-size", vn);
170            return false;
171        }
172    
173        @Override
174        public boolean isExpert() {
175            return false;
176        }
177    
178        @Override
179        public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
180            return gui.getDisplayPreference();
181        }
182    }