Changeset 5114 in josm


Ignore:
Timestamp:
Mar 22, 2012 8:37:48 AM (15 months ago)
Author:
akks
Message:

see #4421: Mechanism to modify JOSM settings and store files, advanced preferences dialog modifications
+ JavaScript configuration API
+ Asynchronous file download task DownloadFileTask
+ Function to export arbitrary preference keys to file

Location:
trunk/src/org/openstreetmap/josm
Files:
3 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/Preferences.java

    r5069 r5114  
    17491749        } 
    17501750    } 
     1751 
     1752    public static boolean isEqual(Setting a, Setting b) { 
     1753        if (a==null && b==null) return true; 
     1754        if (a==null) return false; 
     1755        if (b==null) return false; 
     1756        if (a==b) return true; 
     1757         
     1758        if (a instanceof StringSetting)  
     1759            return (a.getValue().equals(b.getValue())); 
     1760        if (a instanceof ListSetting)  
     1761            return equalCollection((Collection<String>) a.getValue(), (Collection<String>) b.getValue()); 
     1762        if (a instanceof ListListSetting)  
     1763            return equalArray((Collection<Collection<String>>) a.getValue(), (Collection<List<String>>) b.getValue()); 
     1764        if (a instanceof MapListSetting)  
     1765            return equalListOfStructs((Collection<Map<String, String>>) a.getValue(), (Collection<Map<String, String>>) b.getValue()); 
     1766        return a.equals(b); 
     1767    } 
     1768 
    17511769} 
  • trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java

    r5069 r5114  
    33 
    44import static org.openstreetmap.josm.tools.I18n.tr; 
    5  
     5import static org.openstreetmap.josm.tools.I18n.marktr; 
     6 
     7import java.awt.Color; 
    68import java.awt.Component; 
    79import java.awt.Dimension; 
     
    1214import java.awt.event.MouseAdapter; 
    1315import java.awt.event.MouseEvent; 
     16 
     17import java.io.File; 
    1418import java.util.ArrayList; 
    1519import java.util.Collection; 
    1620import java.util.Collections; 
     21import java.util.Comparator; 
    1722import java.util.List; 
    1823import java.util.Map; 
     
    2328import javax.swing.DefaultCellEditor; 
    2429import javax.swing.JButton; 
     30import javax.swing.JFileChooser; 
    2531import javax.swing.JLabel; 
    2632import javax.swing.JOptionPane; 
     
    3238import javax.swing.event.DocumentEvent; 
    3339import javax.swing.event.DocumentListener; 
     40import javax.swing.filechooser.FileFilter; 
    3441import javax.swing.table.DefaultTableCellRenderer; 
    3542import javax.swing.table.DefaultTableModel; 
    3643 
    3744import org.openstreetmap.josm.Main; 
     45import org.openstreetmap.josm.data.CustomConfigurator; 
    3846import org.openstreetmap.josm.data.Preferences; 
    3947import org.openstreetmap.josm.data.Preferences.ListListSetting; 
     
    4351import org.openstreetmap.josm.data.Preferences.StringSetting; 
    4452import org.openstreetmap.josm.gui.ExtendedDialog; 
     53import org.openstreetmap.josm.gui.actionsupport.LogShowDialog; 
    4554import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting; 
    4655import org.openstreetmap.josm.gui.preferences.PreferenceSetting; 
     
    5867        } 
    5968    } 
    60      
     69 
    6170    private AdvancedPreference() { 
    6271        super("advanced", tr("Advanced Preferences"), tr("Setting Preference entries directly. Use with caution!")); 
     
    110119            return changed; 
    111120        } 
    112  
     121     
     122        private void markAsChanged() { 
     123            changed = true; 
     124        } 
     125     
    113126        public void reset() { 
    114127            value = defaultValue; 
     
    155168            } 
    156169        }); 
    157  
    158         Map<String, Setting> orig = Main.pref.getAllSettings(); 
    159         Map<String, Setting> defaults = Main.pref.getAllDefaults(); 
    160         orig.remove("osm-server.password"); 
    161         defaults.remove("osm-server.password"); 
    162         prepareData(orig, defaults); 
     170        readPreferences(Main.pref); 
    163171        model = new AllSettingsTableModel(); 
    164172        applyFilter(); 
     
    198206        }); 
    199207 
     208        JButton read = new JButton(tr("Read from file")); 
     209        p.add(read, GBC.std().insets(5,5,0,0)); 
     210        read.addActionListener(new ActionListener(){ 
     211            public void actionPerformed(ActionEvent e) { 
     212                File[] files = askUserForCustomSettingsFiles(false, tr("Open JOSM customization file")); 
     213                if (files.length==0) return; 
     214                 
     215                Preferences tmpPrefs = CustomConfigurator.clonePreferences(Main.pref); 
     216                 
     217                StringBuilder log = new StringBuilder(); 
     218                log.append("<html>"); 
     219                for (File f: files) { 
     220                    CustomConfigurator.readXML(f, tmpPrefs); 
     221                    log.append(CustomConfigurator.getLog()); 
     222                } 
     223                //try { Main.pref.save();  } catch (IOException ex) { } 
     224                log.append("</html>"); 
     225                String msg = log.toString().replace("\n", "<br/>"); 
     226                 
     227                new LogShowDialog(tr("Import log"), tr("<html>Here is file import summary. <br/>" 
     228                        + "You can reject preferences changes by pressing \"Cancel\" in preferences dialog <br/>" 
     229                        + "To activate some changes JOSM restart may be needed.</html>"), msg).showDialog(); 
     230                 
     231                //JOptionPane.showMessageDialog(Main.parent, 
     232                //   tr("Installed plugins and some changes in preferences will start to work after JOSM restart"), tr("Warning"), JOptionPane.WARNING_MESSAGE); 
     233 
     234                readPreferences(tmpPrefs); 
     235                // sorting after modification - first modified, then non-default, then default entries 
     236                Collections.sort(data, new Comparator<PrefEntry>() { 
     237                    @Override 
     238                    public int compare(PrefEntry o1, PrefEntry o2) { 
     239                        if (o1.changed && !o2.changed) return -1; 
     240                        if (o2.changed && !o1.changed) return 1; 
     241                        if (!(o1.isDefault) && o2.isDefault) return -1; 
     242                        if (!(o2.isDefault) && o1.isDefault) return 1; 
     243                        return o1.key.compareTo(o2.key); 
     244                    } 
     245                  }); 
     246 
     247                applyFilter(); 
     248                ((AllSettingsTableModel) list.getModel()).fireTableDataChanged(); 
     249            } 
     250 
     251        }); 
     252         
     253        JButton export = new JButton(tr("Export selected items")); 
     254        p.add(export, GBC.std().insets(5,5,0,0)); 
     255        export.addActionListener(new ActionListener(){ 
     256            public void actionPerformed(ActionEvent e) { 
     257                ArrayList<String> keys = new ArrayList<String>(); 
     258                boolean hasLists = false; 
     259                for (int row : list.getSelectedRows()) { 
     260                    PrefEntry p = (PrefEntry) model.getValueAt(row, -1); 
     261                    if (!p.isDefault()) { 
     262                        // preferences with default values are not saved 
     263                        if (!(p.getValue() instanceof StringSetting)) hasLists=true; // => append and replace differs 
     264                        keys.add(p.getKey()); 
     265                    } 
     266                } 
     267                if (keys.size()==0) { 
     268                     JOptionPane.showMessageDialog(Main.parent, 
     269                        tr("Please select some preference keys not marked as default"), tr("Warning"), JOptionPane.WARNING_MESSAGE); 
     270                     return; 
     271                } 
     272 
     273                File[] files = askUserForCustomSettingsFiles(true, tr("Export preferences keys to JOSM customization file")); 
     274                if (files.length==0) return; 
     275                 
     276                int answer = 0; 
     277                if (hasLists) {  
     278                    answer = JOptionPane.showOptionDialog(Main.parent, tr("What to with preference lists when this file is to be imported?"), tr("Question"), 
     279                       JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,  
     280                        null, new String[]{"Append preferences from file to existing values","Replace existing values"},0); 
     281                } 
     282                CustomConfigurator.exportPreferencesKeysToFile(files[0].getAbsolutePath(), answer==0, keys); 
     283            } 
     284        }); 
     285 
     286 
    200287        list.addMouseListener(new MouseAdapter(){ 
    201288            @Override public void mouseClicked(MouseEvent e) { 
     
    207294    } 
    208295 
    209     private void prepareData(Map<String, Setting> orig, Map<String, Setting> defaults) { 
     296    private void readPreferences(Preferences tmpPrefs) { 
     297        Map<String, Setting> loaded; 
     298        Map<String, Setting> orig = Main.pref.getAllSettings(); 
     299        Map<String, Setting> defaults = tmpPrefs.getAllDefaults(); 
     300        orig.remove("osm-server.password"); 
     301        defaults.remove("osm-server.password"); 
     302        if (tmpPrefs != Main.pref) { 
     303            loaded = tmpPrefs.getAllSettings(); 
     304        } else { 
     305            loaded = orig; 
     306        } 
     307        prepareData(loaded, orig, defaults); 
     308    } 
     309     
     310    private File[] askUserForCustomSettingsFiles(boolean saveFileFlag, String title) { 
     311        String dir = Main.pref.get("customsettings.lastDirectory"); 
     312        if (dir.length()==0) dir ="."; 
     313         
     314        JFileChooser fc = new JFileChooser(dir); 
     315        fc.setDialogTitle(title); 
     316        fc.setFileSelectionMode(JFileChooser.FILES_ONLY); 
     317        fc.setAcceptAllFileFilterUsed(false); 
     318        fc.setFileFilter(new FileFilter() { 
     319            @Override 
     320            public boolean accept(File f) { 
     321                return f.isDirectory() || f.getName().toLowerCase().endsWith(".xml"); 
     322            } 
     323            @Override 
     324            public String getDescription() { 
     325                return tr("JOSM custom settings files (*.xml)"); 
     326            } 
     327            }); 
     328         
     329            fc.setMultiSelectionEnabled(!saveFileFlag); 
     330            int result = saveFileFlag? fc.showSaveDialog(Main.parent) : fc.showOpenDialog(Main.parent); 
     331            if (result == JFileChooser.APPROVE_OPTION) { 
     332                if (!fc.getCurrentDirectory().getAbsolutePath().equals(dir)) { 
     333                    Main.pref.put("customsettings.lastDirectory", fc.getCurrentDirectory().getAbsolutePath()); 
     334                } 
     335                File sel[] = fc.isMultiSelectionEnabled() ? fc.getSelectedFiles() : (new File[]{fc.getSelectedFile()}); 
     336                if (sel.length==1 && !sel[0].getName().contains(".")) sel[0]=new File(sel[0].getAbsolutePath()+".xml"); 
     337                return sel; 
     338            }  
     339            return new File[0]; 
     340    } 
     341             
     342    private void prepareData(Map<String, Setting> loaded, Map<String, Setting> orig, Map<String, Setting> defaults) { 
    210343        data = new ArrayList<PrefEntry>(); 
    211         for (Entry<String, Setting> e : orig.entrySet()) { 
     344        for (Entry<String, Setting> e : loaded.entrySet()) { 
    212345            Setting value = e.getValue(); 
     346            Setting old = orig.get(e.getKey()); 
    213347            Setting def = defaults.get(e.getKey()); 
    214348            if (def == null) { 
     
    216350            } 
    217351            PrefEntry en = new PrefEntry(e.getKey(), value, def, false); 
     352            // after changes we have nondefault value. Value is changed if is not equal to old value 
     353            if ( !Preferences.isEqual(old, value) ) { 
     354                en.markAsChanged(); 
     355            } 
    218356            data.add(en); 
    219357        } 
    220358        for (Entry<String, Setting> e : defaults.entrySet()) { 
    221             if (!orig.containsKey(e.getKey())) { 
     359            if (!loaded.containsKey(e.getKey())) { 
    222360                PrefEntry en = new PrefEntry(e.getKey(), e.getValue(), e.getValue(), true); 
     361                // after changes we have default value. So, value is changed if old value is not default 
     362                Setting old = orig.get(e.getKey()); 
     363                if ( old!=null ) { 
     364                    en.markAsChanged(); 
     365                } 
    223366                data.add(en); 
    224367            } 
     
    264407 
    265408    private static class SettingCellRenderer extends DefaultTableCellRenderer { 
     409        private Color backgroundColor = Main.pref.getUIColor("Table.background"); 
     410        private Color changedColor = Main.pref.getColor( 
     411                         marktr("Advanced Background: Changed"), 
     412                         new Color(200,255,200)); 
     413        private Color foregroundColor = Main.pref.getUIColor("Table.foreground"); 
     414        private Color nonDefaultColor = Main.pref.getColor( 
     415                            marktr("Advanced Background: NonDefalut"), 
     416                            new Color(255,255,200)); 
     417         
    266418        @Override 
    267419        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     
    272424            Object val = setting.getValue(); 
    273425            String display = val != null ? val.toString() : "<html><i>&lt;"+tr("unset")+"&gt;</i></html>"; 
    274  
     426             
    275427            JLabel label = (JLabel)super.getTableCellRendererComponent(table, 
    276428                    display, isSelected, hasFocus, row, column); 
     429 
     430            label.setBackground(backgroundColor); 
     431            if (isSelected) { 
     432                label.setForeground(foregroundColor); 
     433            } 
     434            if(pe.isChanged()) { 
     435                label.setBackground(changedColor); 
     436            } else if(!pe.isDefault()) { 
     437                label.setBackground(nonDefaultColor); 
     438            } 
     439 
    277440            if (!pe.isDefault()) { 
    278441                label.setFont(label.getFont().deriveFont(Font.BOLD)); 
Note: See TracChangeset for help on using the changeset viewer.