001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.gui.preferences; 003 004 import java.io.File; 005 import java.util.regex.Matcher; 006 import java.util.regex.Pattern; 007 008 import static org.openstreetmap.josm.tools.Utils.equal; 009 010 /** 011 * A source entry primarily used to save the user's selection of mappaint styles, 012 * but also for preset sources. 013 */ 014 public class SourceEntry { 015 016 /** 017 * A URL can be anything that MirroredInputStream understands, i.e. 018 * a local file, http://, or a file from the current jar 019 */ 020 public String url; 021 022 /** 023 * Name is used as a namespace for color preferences and (currently) only 024 * one file with a name can be loaded at a time. Additional styles must 025 * either have the same name as the main style or no name at all. 026 * If no name is provided, it will be set to the default value "standard". 027 * The name can also be given in the xml file as attribute for the rules tag. 028 * (This overrides the name given in the preferences, otherwise both 029 * methods are equivalent.) 030 */ 031 public String name; 032 033 /** 034 * A title that can be used as menu entry. 035 */ 036 public String title; 037 038 /** 039 * active is a boolean flag that can be used to turn the style on or off 040 * at runtime. 041 */ 042 public boolean active; 043 044 public SourceEntry(String url, String name, String title, Boolean active) { 045 this.url = url; 046 this.name = equal(name, "") ? null : name; 047 this.title = equal(title, "") ? null : title; 048 this.active = active; 049 } 050 051 public SourceEntry(SourceEntry e) { 052 this.url = e.url; 053 this.name = e.name; 054 this.title = e.title; 055 this.active = e.active; 056 } 057 058 @Override 059 public boolean equals(Object obj) { 060 if (obj == null || getClass() != obj.getClass()) 061 return false; 062 final SourceEntry other = (SourceEntry) obj; 063 return equal(other.url, url) && 064 equal(other.name, name) && 065 equal(other.title, title) && 066 other.active == active; 067 } 068 069 @Override 070 public int hashCode() { 071 int hash = 5; 072 hash = 89 * hash + (this.url != null ? this.url.hashCode() : 0); 073 hash = 89 * hash + (this.name != null ? this.name.hashCode() : 0); 074 hash = 89 * hash + (this.title != null ? this.title.hashCode() : 0); 075 hash = 89 * hash + (this.active ? 1 : 0); 076 return hash; 077 } 078 079 @Override 080 public String toString() { 081 return title != null ? title : url; 082 } 083 084 /** 085 * String to show in menus and error messages. 086 * @return Usually the shortdescription, but can be the file name 087 * if no shortdescription is available. 088 */ 089 public String getDisplayString() { 090 if (title != null) 091 return title; 092 else 093 return getFileNamePart(); 094 } 095 096 /** 097 * extract file part from url, e.g.: 098 * http://www.test.com/file.xml?format=text --> file.xml 099 */ 100 public String getFileNamePart() { 101 Pattern p = Pattern.compile("([^/\\\\]*?)([?].*)?$"); 102 Matcher m = p.matcher(url); 103 if (m.find()) { 104 return m.group(1); 105 } else { 106 System.err.println("Warning: Unexpected URL format: "+url); 107 return url; 108 } 109 } 110 111 /** 112 * the name / identifier that should be used to save custom color values 113 * and similar stuff to the preference file 114 * @return the identifier; never null. Usually the result is "standard" 115 */ 116 public String getPrefName() { 117 return name == null ? "standard" : name; 118 } 119 120 public boolean isLocal() { 121 if (url.startsWith("http://") || url.startsWith("resource://")) 122 return false; 123 return true; 124 } 125 126 public String getLocalSourceDir() { 127 if (!isLocal()) 128 return null; 129 File f = new File(url); 130 File dir = f.getParentFile(); 131 if (dir == null) 132 return null; 133 return dir.getPath(); 134 } 135 }