content: package aimax.osm.viewer;
  
  import aimax.osm.data.EntityClassifier;
  import aimax.osm.data.entities.EntityViewInfo;
  import aimax.osm.viewer.EntityIcon.PinIcon;
  import aimax.osm.viewer.EntityIcon.SimpleIcon;
  import aimax.osm.viewer.EntityIcon.TentIcon;
  
  /**
   * Provides useful static methods for defining map styles. Technically spoken,
   * in this framework a map style is entity classifiers which map entities on
   * {@link aimax.osm.data.entities.EntityViewInfo} objects. Method
   * {@link #createDefaultClassifier()} is perhaps the most interesting one. Its
   * implementation provides a useful example how to map presentation aspects like
   * colors, line widths, symbols etc on OSM map entities.
   * 
   * @author Ruediger Lunde
   */
  public class MapStyleFactory {
  	public static final UColor GRAY_TRANS = new UColor(0, 0, 0, 40);
  	public static final UColor LIGHT_GRAY_TRANS = new UColor(0, 0,
  			0, 20);
  	public static final UColor LIGHT_RED_TRANS = new UColor(255, 0,
  			0, 30);
  	public static final UColor LIGHT_RED = new UColor(230, 130, 130);
  	public static final UColor LIGHT_ORANGE = new UColor(255, 240,
  			120);
  	public static final UColor LIGHT_YELLOW = new UColor(255, 255,
  			200);
  	public static final UColor LIGHT_GREEN_TRANS = new UColor(114,
  			254, 86, 30);
  	public static final UColor VERY_LIGHT_GREEN = new UColor(200,
  			254, 184);
  	public static final UColor VERY_LIGHT_BLUE = new UColor(220,
  			220, 230);
  	public static final UColor LIGHT_GREEN = new UColor(116, 252,
  			133);
  	public static final UColor GREEN = new UColor(91, 210, 95);
  	public static final UColor LIGHT_BLUE = new UColor(164, 164,
  			255);
  
  	/**
  	 * Maintains default values. Used in specialized creator methods for
  	 * unspecified attributes.
  	 */
  	private static DefaultEntityViewInfo DEFAULT_INFO = new DefaultEntityViewInfo(
  			1f / 6000, // minVisibleScale
  			1f / 1800, // minNameScale
  			100, // printOrder
  			UColor.LIGHT_GRAY.darker(), // nameColor
  			createRectangle(4, UColor.GRAY), // icon
  			false, // isWayIcon
  			UColor.GRAY, // wayColor
  			0.5f, // wayWidth
  			false, // wayDashed
  			LIGHT_GRAY_TRANS, // wayFillColor
  			true); // fillAreasOnly
  
  	/** Changes the default values. */
  	public static void setDefaults(DefaultEntityViewInfo info) {
  		DEFAULT_INFO = info;
  	}
  
  	/**
  	 * Creates an entity classifier, which maps entities on
  	 * {@link aimax.osm.viewer.DefaultEntityViewInfo} instances and can be used
  	 * to draw general purpose maps for traveling. Default rules are applied to
  	 * be able to visualize every kind of entity, even completely unexpected
  	 * ones.
  	 */
  	public EntityClassifier<EntityViewInfo> createDefaultClassifier() {
  		EntityClassifier<EntityViewInfo> result = new EntityClassifier<>();
  		EntityClassifier<EntityViewInfo> sc;
  		result.setDefaultEntityClass(createDefaultInfo());
  		result.addRule(
  				"highway",
  				"motorway",
  				createWayInfo(1f / 2000000, 1f / 20000, 50, UColor.BLUE,
  						3));
  		result.addRule(
  				"highway",
  				"motorway_link",
  				createWayInfo(1f / 200000, 1f / 20000, 51, UColor.BLUE, 1));
  		result.addRule(
  				"highway",
  				"trunk",
  				createWayInfo(1f / 2000000, 1f / 6000, 52, UColor.BLUE, 2));
  		result.addRule("highway", "trunk_link",
  				createWayInfo(1f / 200000, 1f / 6000, 53, UColor.BLUE, 1));
  		result.addRule(
  				"highway",
  				"primary",
  				createWayInfo(1f / 1000000, 1f / 6000, 54, UColor.PINK, 4));
  		result.addRule("highway", "primary_link",
  				createWayInfo(1f / 100000, 1f / 6000, 55, UColor.PINK, 4));
  		result.addRule("highway", "secondary",
  				createWayInfo(1f / 500000, 1f / 6000, 56, UColor.PINK, 3));
  		result.addRule("highway", "tertiary",
  				createWayInfo(1f / 250000, 1f / 6000, 57, UColor.PINK, 2));
  		result.addRule("highway", "road",
  				createWayInfo(1f / 190000, 1f / 6000, 58, UColor.PINK, 1));
  		result.addRule(
  				"highway",
  				"residential",
  				createWayInfo(1f / 100000, 1f / 3500, 65,
  						UColor.LIGHT_GRAY, 1));
  		result.addRule(
  				"highway",
  				"living_street",
  				createWayInfo(1f / 100000, 1f / 3500, 65,
  						UColor.LIGHT_GRAY, 1));
  		result.addRule(
  				"highway",
  				"pedestrian",
  				createWayInfo(1f / 190000, 1f / 3500, 65, UColor.ORANGE,
  						2, UColor.ORANGE, true));
  		result.addRule(
  				"highway",
  				"cycleway",
  				createWayInfo(1f / 100000, 1f / 3500, 65,
  						UColor.GREEN.darker(), 1));
  		result.addRule(
  				"highway",
  				"service",
  				createWayInfo(1f / 100000, 1f / 3500, 65, UColor.LIGHT_GRAY, 1,
  						UColor.LIGHT_GRAY, true));
  		result.addRule("highway", "path",
  				createWayInfo(1f / 100000, 1f / 3500, 65, UColor.YELLOW, 1));
  		result.addRule("highway", "track",
  				createWayInfo(1f / 60000, 1f / 3500, 65, UColor.YELLOW, 1));
  		result.addRule("highway", "unclassified",
  				createWayInfo(1f / 35000, 1f / 2500, 65, UColor.LIGHT_GRAY, 1));
  		result.addRule(
  				"highway",
  				"footway",
  				createWayInfo(1f / 60000, 1f / 2500, 68, UColor.ORANGE, 1,
  						UColor.ORANGE, true));
  		result.addRule(
  				"highway",
  				"steps",
  				createWayInfo(1f / 35000, 1f / 2500, 68, UColor.ORANGE, 1,
  						UColor.ORANGE, true));
  		result.addRule(
  				"highway",
  				"speed_camera",
  				createPoiInfo(1f / 60000, 1f / 1800, 68, UColor.GRAY,
  						createTriangle(6, UColor.RED, UColor.WHITE), false));
  
  		result.addRule(
  				"natural",
  				"land",
  				createWayInfo(1f / 2000000, 1f / 35000, 40, LIGHT_BLUE, 1,
  						UColor.WHITE, false));
  		result.addRule("natural", "island",
  				createWayInfo(1f / 2000000, 1f / 100000, 40, LIGHT_BLUE, 2));
  		result.addRule("natural", "coastline",
  				createWayInfo(1e-9f, 1f / 5000000, 40, LIGHT_BLUE, 2));
  		result.addRule("natural", "cliff",
  				createWayInfo(1f / 750000, 1f / 12000, 41, UColor.GRAY, 1));
  		result.addRule(
  				"natural",
  				"water",
  				createInfo(1f / 2000000, 1f / 35000, 39, UColor.GRAY, null,
  						false, LIGHT_BLUE, 1, false, LIGHT_BLUE, false));
  		result.addRule(
  				"natural",
  				"glacier",
  				createWayInfo(1f / 750000, 1f / 35000, 40, LIGHT_BLUE, 1,
  						LIGHT_BLUE.brighter(), false));
  		result.addRule(
  				"natural",
  				"beach",
  				createWayInfo(1f / 100000, 1f / 12000, 80, UColor.YELLOW, 1,
  						UColor.YELLOW, false));
  		result.addRule(
  				"natural",
  				"wood",
  				createWayInfo(1f / 750000, 1f / 12000, 80, GREEN, 1, GREEN,
  						false));
  		result.addRule(
  				"natural",
  				"scrub",
  				createWayInfo(1f / 500000, 1f / 12000, 80, LIGHT_GREEN, 1,
  						LIGHT_GREEN, false));
  		result.addRule(
  				"natural",
  				"heath",
  				createWayInfo(1f / 500000, 1f / 12000, 80, LIGHT_GREEN, 1,
  						LIGHT_GREEN, false));
  		result.addRule(
  				"natural",
  				"fell",
  				createWayInfo(1f / 500000, 1f / 12000, 80, LIGHT_GREEN, 1,
  						UColor.LIGHT_GRAY, false));
  		result.addRule(
  				"natural",
  				"peak",
  				createPoiInfo(1f / 350000, 1f / 35000, 38, UColor.DARK_GRAY,
  						createTriangle(10, UColor.ORANGE), false));
  		result.addRule(
  				"natural",
  				null,
  				createInfo(1f / 350000, 1f / 12000, 80, UColor.DARK_GRAY,
  						createTriangle(8, UColor.GREEN.darker()), false,
  						VERY_LIGHT_GREEN, 1, false, LIGHT_GREEN_TRANS, false));
  		result.addRule(
  				"leisure",
  				"park",
  				createWayInfo(1f / 350000, 1f / 6000, 80, VERY_LIGHT_GREEN, 1,
  						VERY_LIGHT_GREEN, false));
  		result.addRule(
  				"leisure",
  				"garden",
  				createWayInfo(1f / 60000, 1f / 3500, 80, VERY_LIGHT_GREEN, 1,
  						VERY_LIGHT_GREEN, false));
  		result.addRule(
  				"landuse",
  				"forest",
  				createWayInfo(1f / 750000, 1f / 12000, 80, GREEN, 1, GREEN,
  						false));
  		result.addRule(
  				"landuse",
  				"reservoir",
  				createWayInfo(1f / 750000, 1f / 12000, 80, LIGHT_BLUE, 1,
  						LIGHT_BLUE, false));
  		result.addRule(
  				"landuse",
  				"farm",
  				createWayInfo(1f / 750000, 1f / 12000, 80, LIGHT_YELLOW, 1,
  						LIGHT_YELLOW, false));
  		result.addRule(
  				"landuse",
  				"farmland",
  				createWayInfo(1f / 750000, 1f / 12000, 80, LIGHT_YELLOW, 1,
  						LIGHT_YELLOW, false));
  		result.addRule(
  				"landuse",
  				"residential",
  				createWayInfo(1f / 750000, 1f / 12000, 80, LIGHT_RED_TRANS, 1,
  						LIGHT_RED_TRANS, false));
  		result.addRule(
  				"landuse",
  				"village_green",
  				createWayInfo(1f / 60000, 1f / 3500, 80, VERY_LIGHT_GREEN, 1,
  						VERY_LIGHT_GREEN, false));
  		result.addRule(
  				"landuse",
  				"recreation_ground",
  				createWayInfo(1f / 60000, 1f / 3500, 80, VERY_LIGHT_GREEN, 1,
  						VERY_LIGHT_GREEN, false));
  		result.addRule(
  				"landuse",
  				"grass",
  				createWayInfo(1f / 350000, 1f / 3500, 80, VERY_LIGHT_GREEN, 1,
  						VERY_LIGHT_GREEN, false));
  		result.addRule(
  				"landuse",
  				null,
  				createInfo(1f / 350000, 1f / 1800, 80, UColor.GRAY, null, false,
  						LIGHT_GRAY_TRANS, 1, false, LIGHT_GRAY_TRANS, false));
  		addBuildingRules(
  				result,
  				"leisure",
  				null,
  				createInfo(1f / 60000, 1f / 3500, 80, UColor.GRAY, null, false,
  						LIGHT_ORANGE, 1, false, LIGHT_ORANGE, false));
  
  		sc = result.addRule(
  				"boundary",
  				null,
  				createInfo(1f / 60000, 1f / 3500, 90, UColor.GRAY, null, false,
  						UColor.GRAY, 1, true, null, false));
  		sc.addRule(
  				"admin_level",
  				"1",
  				createInfo(1e-9f, 1f / 12000, 86, UColor.GRAY, null, false,
  						UColor.GRAY, 2, true, null, false));
  		sc.addRule(
  				"admin_level",
  				"2",
  				createInfo(1e-9f, 1f / 12000, 87, UColor.GRAY, null, false,
  						UColor.GRAY, 2, true, null, false));
  		sc.addRule(
  				"admin_level",
  				"3",
  				createInfo(1f / 750000, 1f / 3500, 88, UColor.GRAY, null, false,
  						UColor.GRAY, 1, true, null, false));
  		sc.addRule(
  				"admin_level",
  				"4",
  				createInfo(1f / 750000, 1f / 3500, 89, UColor.GRAY, null, false,
  						UColor.GRAY, 1, true, null, false));
  
  		result.addRule(
  				"waterway",
  				"riverbank",
  				createWayInfo(1f / 200000, 1f / 12000, 80, LIGHT_BLUE, 1,
  						LIGHT_BLUE, false));
  		result.addRule(
  				"waterway",
  				null,
  				createWayInfo(1f / 100000, 1f / 12000, 76, LIGHT_BLUE, 1,
  						LIGHT_BLUE, true));
  		result.addRule(
  				"route",
  				"ferry",
  				createInfo(1f / 100000, 1f / 12000, 70, UColor.GRAY, null,
  						false, UColor.BLUE, 1, true, null, false));
  		result.addRule("railway", "rail",
  				createWayInfo(1f / 100000, 1f / 3500, 95, UColor.GRAY, 1));
  		addBuildingRules(
  				result,
  				"railway",
  				"station",
  				createPoiInfo(1f / 35000, 1f / 6000, 60, UColor.DARK_GRAY,
  						createRectangle(4, UColor.DARK_GRAY), false));
  		result.addRule("aeroway", null,
  				createWayInfo(1f / 350000, 1f / 12000, 60, UColor.LIGHT_GRAY, 1));
  		result.addRule("aerialway", null,
  				createWayInfo(1f / 350000, 1f / 6000, 60, UColor.GRAY, 1));
  		result.addRule(
  				"mountain_pass",
  				null,
  				createPoiInfo(1e-9f, 1f / 350000, 10, UColor.DARK_GRAY, null,
  						false));
  
  		result.addRule("place", "city",
  				createPoiInfo(0, 0, 1, UColor.BLACK, null, false));
  		result.addRule(
  				"place",
  				"town",
  				createPoiInfo(1f / 750000, 1f / 750000, 2, UColor.BLACK, null,
  						false));
  		result.addRule(
  				"place",
  				"village",
  				createPoiInfo(1f / 200000, 1f / 200000, 3, UColor.DARK_GRAY,
  						null, false));
  		result.addRule(
  				"place",
  				null,
  				createPoiInfo(1f / 50000, 1f / 50000, 30, UColor.DARK_GRAY,
  						null, false));
  
  		result.addRule(
  				"tourism",
  				"caravan_site",
  				createPoiInfo(1f / 350000, 1f / 6000, 75, UColor.GRAY,
  						createRectangle(8, "P", UColor.BLUE, UColor.RED), true));
  		result.addRule(
  				"tourism",
  				"camp_site",
  				createPoiInfo(1f / 350000, 1f / 6000, 73, UColor.GRAY,
  						new TentIcon(8, UColor.DARK_GRAY, UColor.GREEN.darker()),
  						true));
  		addBuildingRules(
  				result,
  				"tourism",
  				"alpine_hut",
  				createPoiInfo(
  						1f / 350000,
  						1f / 35000,
  						74,
  						UColor.GRAY,
  						createRectangle(8, "H", UColor.GREEN.darker(), UColor.RED),
  						true));
  		addBuildingRules(
  				result,
  				"tourism",
  				"attraction",
  				createInfo(
  						1f / 60000,
  						1f / 6000,
  						74,
  						UColor.GRAY,
  						createCircle(11, "A", UColor.GREEN.darker(), UColor.WHITE),
  						true, UColor.GRAY, 1, false, null, false));
  		result.addRule(
  				"tourism",
  				"viewpoint",
  				createPoiInfo(
  						1f / 60000,
  						1f / 1800,
  						75,
  						UColor.GRAY,
  						createCircle(11, "V", UColor.GREEN.darker(), UColor.WHITE),
  						true));
  		addBuildingRules(
  				result,
  				"tourism",
  				"museum",
  				createPoiInfo(
  						1f / 60000,
  						1f / 2500,
  						75,
  						UColor.GRAY,
  						createCircle(11, "M", UColor.GREEN.darker(), UColor.WHITE),
  						true));
  		addBuildingRules(
  				result,
  				"tourism",
  				"hotel",
  				createPoiInfo(
  						1f / 12000,
  						1f / 1800,
  						76,
  						UColor.GRAY,
  						createRectangle(8, "H", UColor.GREEN.darker(),
  								UColor.WHITE), true));
  		addBuildingRules(
  				result,
  				"tourism",
  				null,
  				createPoiInfo(1f / 12000, 1f / 3500, 77, UColor.GREEN.darker(),
  						createRectangle(4, UColor.GREEN.darker()), false));
  		addBuildingRules(
  				result,
  				"historic",
  				"castle",
  				createPoiInfo(1f / 60000, 1f / 6000, 40, UColor.GRAY,
  						new EntityIcon.CastleIcon(8, UColor.DARK_GRAY,
  								UColor.ORANGE), true));
  		result.addRule(
  				"historic",
  				"memorial",
  				createPoiInfo(1f / 6000, 1f / 1800, 81, UColor.GRAY,
  						createCircle(11, "M", UColor.ORANGE, UColor.WHITE), true));
  		addBuildingRules(
  				result,
  				"historic",
  				null,
  				createPoiInfo(1f / 60000, 1f / 1800, 75, UColor.GRAY,
  						createCircle(11, "H", UColor.ORANGE, UColor.WHITE), true));
  		result.addRule(
  				"amenity",
  				"parking",
  				createInfo(1f / 12000, 1f / 1800, 85, UColor.GRAY,
  						createRectangle(8, "P", UColor.BLUE, UColor.WHITE), true,
  						UColor.LIGHT_GRAY, 1, false, VERY_LIGHT_BLUE, false));
  		addBuildingRules(
  				result,
  				"amenity",
  				"place_of_worship",
  				createPoiInfo(1f / 20000, 1f / 1800, 85, UColor.GRAY,
  						new EntityIcon.ChurchIcon(8, UColor.DARK_GRAY,
  								UColor.BLUE), true));
  		addBuildingRules(
  				result,
  				"amenity",
  				null,
  				createPoiInfo(1f / 12000, 1f / 1800, 89, UColor.BLUE,
  						createRectangle(4, UColor.BLUE), true));
  		addBuildingRules(
  				result,
  				"shop",
  				null,
  				createPoiInfo(40000, 1f / 1800, 89, UColor.CYAN,
  						createRectangle(4, UColor.CYAN), true));
  		result.addRule(
  				"building",
  				"yes",
  				createWayInfo(1f / 6000, 1f / 1800, 89, LIGHT_RED, 1,
  						LIGHT_RED, false));
  		result.addRule(
  				"addr:housenumber",
  				null,
  				createPoiInfo(1f / 1800, 1f / 1800, 90, UColor.GRAY,
  						createRectangle(4, UColor.LIGHT_GRAY), true));
  
  		result.addRule(
  				"marker",
  				"yes",
  				createPoiInfo(1e-9f, 1e-9f, 0, UColor.RED, new PinIcon(12,
  						UColor.RED, UColor.RED), false));
  		result.addRule("track_type", "GPS", createTrackInfo(UColor.GREEN));
  		result.addRule("track_type", null, createTrackInfo(UColor.RED));
  
  		return result;
  	}
  
  	/**
  	 * Demonstrates, how an entity classifier for view information objects can
  	 * be customized.
  	 */
  	public EntityClassifier<EntityViewInfo> createNightViewClassifier() {
  		EntityClassifier<EntityViewInfo> result = createDefaultClassifier();
  
  		result.replaceRule(
  				"highway",
  				"path",
  				createWayInfo(1f / 100000, 1f / 3500, 38,
  						UColor.YELLOW.darker(), 1));
  		result.replaceRule(
  				"highway",
  				"track",
  				createWayInfo(1f / 60000, 1f / 3500, 37, UColor.YELLOW.darker(),
  						1));
  
  		result.replaceRule(
  				"place",
  				"city",
  				createPoiInfo(1e-9f, 1f / 3500000, 30, UColor.WHITE, null, false));
  		result.replaceRule("place", "town",
  				createPoiInfo(1e-9f, 1f / 350000, 29, UColor.WHITE, null, false));
  		result.replaceRule("place", "village",
  				createPoiInfo(1e-9f, 1f / 100000, 29, UColor.GRAY, null, false));
  		result.replaceRule("place", null,
  				createPoiInfo(1e-9f, 1f / 35000, 28, UColor.GRAY, null, false));
  
  		result.replaceRule(
  				"marker",
  				"yes",
  				createPoiInfo(1e-9f, 1e-9f, 0, UColor.YELLOW, new PinIcon(12,
  						UColor.YELLOW, UColor.YELLOW), false));
  		result.replaceRule("track_type", null, createTrackInfo(UColor.WHITE));
  
  		return result;
  	}
  
  	public void addBuildingRules(EntityClassifier<EntityViewInfo> ec,
  			String attName, String attValue, DefaultEntityViewInfo eclass) {
  		ec = ec.addRule(attName, attValue, eclass);
  		try {
  			DefaultEntityViewInfo bclass = (DefaultEntityViewInfo) eclass
  					.clone();
  			bclass.isWayIcon = true;
  			bclass.wayFillColor = LIGHT_RED;
  			bclass.fillAreasOnly = false;
  			ec.addRule("building", "yes", bclass);
  		} catch (CloneNotSupportedException e) {
  			e.printStackTrace();
  		}
  	}
  
  	/** Creates an entity view info with default values. */
  	public DefaultEntityViewInfo createDefaultInfo() {
  		DefaultEntityViewInfo result = null;
  		try {
  			result = (DefaultEntityViewInfo) DEFAULT_INFO.clone();
  		} catch (CloneNotSupportedException e) {
  			e.printStackTrace();
  		}
  		return result;
  	}
  
  	/** Creates an entity view info for points of interest (simple version). */
  	public DefaultEntityViewInfo createPoiInfo(float minScale, int printOrder,
  			EntityIcon icon) {
  		DefaultEntityViewInfo result = createDefaultInfo();
  		result.minVisibleScale = minScale;
  		result.printOrder = printOrder;
  		result.icon = icon;
  		return result;
  	}
  
  	/** Creates an entity view info for points of interest. */
  	public DefaultEntityViewInfo createPoiInfo(float minScale,
  			float minNameScale, int printOrder, UColor nameColor,
  			EntityIcon icon, boolean isWayIcon) {
  		DefaultEntityViewInfo result = createDefaultInfo();
  		result.minVisibleScale = minScale;
  		result.minNameScale = minNameScale;
  		result.printOrder = printOrder;
  		result.nameColor = nameColor;
  		result.icon = icon;
  		result.isWayIcon = isWayIcon;
  		return result;
  	}
  
  	/** Creates an entity view info for ways (simple version). */
  	public DefaultEntityViewInfo createWayInfo(float minScale,
  			float minNameScale, int printOrder, UColor wayColor,
  			float wayWidth) {
  		DefaultEntityViewInfo result = createDefaultInfo();
  		result.minVisibleScale = minScale;
  		result.minNameScale = minNameScale;
  		result.printOrder = printOrder;
  		result.wayColor = wayColor;
  		result.wayWidth = wayWidth;
  		return result;
  	}
  
  	/** Creates an entity view info for ways. */
  	public DefaultEntityViewInfo createWayInfo(float minScale,
  			float minNameScale, int printOrder, UColor wayColor, float wayWidth,
  			UColor wayFillColor, boolean fillAreasOnly) {
  		DefaultEntityViewInfo result = createDefaultInfo();
  		result.minVisibleScale = minScale;
  		result.minNameScale = minNameScale;
  		result.printOrder = printOrder;
  		result.wayColor = wayColor;
  		result.wayWidth = wayWidth;
  		result.wayFillColor = wayFillColor;
  		result.fillAreasOnly = fillAreasOnly;
  		return result;
  	}
  
  	/** Creates an entity view info for tracks. */
  	public DefaultEntityViewInfo createTrackInfo(UColor color) {
  		return new DefaultEntityViewInfo(1e-9f, 0, 0, color, createCircle(12,
  				color, GRAY_TRANS), true, color, 2f, true, null, false);
  	}
  
  	/** Creates an entity view info (equivalent to general constructor call). */
  	public DefaultEntityViewInfo createInfo(float minScale, float minNameScale,
  			int printOrder, UColor nameColor, EntityIcon icon,
  			boolean isWayIcon, UColor wayColor, float wayWidth,
  			boolean wayDashed, UColor wayFillColor, boolean fillAreasOnly) {
  		return new DefaultEntityViewInfo(minScale, minNameScale, printOrder,
  				nameColor, icon, isWayIcon, wayColor, wayWidth, wayDashed,
  				wayFillColor, fillAreasOnly);
  	}
  
  	// ///////////////////////////////////////////////////////////////
  	// useful icon creators
  
  	public static EntityIcon createCircle(float size, UColor color) {
  		return new SimpleIcon(SimpleIcon.Shape.CIRCLE, size, null, color,
  				color, null);
  	}
  
  	public static EntityIcon createCircle(float size, UColor line,
  			UColor fill) {
  		return new SimpleIcon(SimpleIcon.Shape.CIRCLE, size, null, line, fill,
  				null);
  	}
  
  	public static EntityIcon createCircle(float size, String symbol,
  			UColor color, UColor sym) {
  		return new SimpleIcon(SimpleIcon.Shape.CIRCLE, size, symbol, color,
  				color, sym);
  	}
  
  	public static EntityIcon createRectangle(float size, UColor color) {
  		return new SimpleIcon(SimpleIcon.Shape.RECTANGLE, size, null, color,
  				color, null);
  	}
  
  	public static EntityIcon createRectangle(float size, UColor line,
  			UColor fill) {
  		return new SimpleIcon(SimpleIcon.Shape.RECTANGLE, size, null, line,
  				fill, null);
  	}
  
  	public static EntityIcon createRectangle(float size, String symbol,
  			UColor color, UColor sym) {
  		return new SimpleIcon(SimpleIcon.Shape.RECTANGLE, size, symbol, color,
  				color, sym);
  	}
  
  	public static EntityIcon createTriangle(float size, UColor color) {
  		return new SimpleIcon(SimpleIcon.Shape.TRIANGLE, size, null, color,
  				color, null);
  	}
  
  	public static EntityIcon createTriangle(float size, UColor line,
  			UColor fill) {
  		return new SimpleIcon(SimpleIcon.Shape.TRIANGLE, size, null, line,
  				fill, null);
  	}
  
  	public static EntityIcon createTriangle(float size, String symbol,
  			UColor color, UColor sym) {
  		return new SimpleIcon(SimpleIcon.Shape.TRIANGLE, size, symbol, color,
  				color, sym);
  	}
  }
  