package net.sourceforge.pmd.eclipse.plugin; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sourceforge.pmd.RulePriority; import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferences; import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferencesManager; import net.sourceforge.pmd.eclipse.ui.Shape; import net.sourceforge.pmd.eclipse.ui.ShapeDescriptor; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; import net.sourceforge.pmd.eclipse.ui.nls.StringTable; import net.sourceforge.pmd.eclipse.ui.priority.PriorityDescriptor; import net.sourceforge.pmd.eclipse.ui.priority.PriorityDescriptorCache; import net.sourceforge.pmd.eclipse.util.FontBuilder; import net.sourceforge.pmd.util.StringUtil; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.ImageLoader; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; /** * * @author Brian Remedios */ public class UISettings { private static String[] priorityLabels; private static Map<Object, ShapeDescriptor> shapesByPriority; private static Map<Integer, RulePriority> prioritiesByIntValue; private static Map<RulePriority, String> labelsByPriority = new HashMap<RulePriority, String>(); private static final int MAX_MARKER_DIMENSION = 9; private static IPreferencesManager preferencesManager = PMDPlugin.getDefault().getPreferencesManager(); private static final Map<RulePriority, PriorityDescriptor> uiDescriptorsByPriority = new HashMap<RulePriority, PriorityDescriptor>(5); public static final FontBuilder CodeFontBuilder = new FontBuilder("Courier", 11, SWT.NORMAL); public static void reloadPriorities() { uiDescriptorsByPriority.clear(); uiDescriptorsByPriority(); // cause a reload } private static Map<RulePriority, PriorityDescriptor> uiDescriptorsByPriority() { if (uiDescriptorsByPriority.isEmpty()) { IPreferences preferences = preferencesManager.loadPreferences(); for (RulePriority rp : currentPriorities(true)) { uiDescriptorsByPriority.put(rp, preferences.getPriorityDescriptor(rp)); } } return uiDescriptorsByPriority; } public static Shape[] allShapes() { return new Shape[] { Shape.circle, Shape.star, Shape.domeLeft, Shape.domeRight, Shape.diamond, Shape.square, Shape.roundedRect, Shape.minus, Shape.pipe, Shape.plus, Shape.triangleUp, Shape.triangleDown, Shape.triangleRight, Shape.triangleLeft, Shape.triangleNorthEast, Shape.triangleSouthEast, Shape.triangleSouthWest, Shape.triangleNorthWest }; } public static RulePriority[] currentPriorities(boolean sortAscending) { RulePriority[] priorities = RulePriority.values(); Arrays.sort(priorities, new Comparator<RulePriority>() { public int compare(RulePriority rpA, RulePriority rbB) { return rpA.getPriority() - rbB.getPriority(); } }); return priorities; } public static Map<Shape, ShapeDescriptor> shapeSet(RGB color, int size) { Map<Shape, ShapeDescriptor> shapes = new HashMap<Shape, ShapeDescriptor>(); for(Shape shape : EnumSet.allOf(Shape.class)) { shapes.put(shape, new ShapeDescriptor(shape, color, size)); } return shapes; } public static String markerFilenameFor(RulePriority priority) { String fileDir = PMDPlugin.getPluginFolder().getAbsolutePath(); return fileDir + "/" + relativeMarkerFilenameFor(priority); } public static String relativeMarkerFilenameFor(RulePriority priority) { return "icons/markerP" + priority.getPriority() + ".png"; } private static ImageDescriptor getImageDescriptor(final String fileName) { URL installURL = PMDPlugin.getDefault().getBundle().getEntry("/"); try { URL url = new URL(installURL, fileName); return ImageDescriptor.createFromURL(url); } catch (MalformedURLException mue) { mue.printStackTrace(); return null; } } public static ImageDescriptor markerDescriptorFor(RulePriority priority) { String path = relativeMarkerFilenameFor(priority); return getImageDescriptor(path); } public static Map<Integer, ImageDescriptor> markerImgDescriptorsByPriority() { RulePriority[] priorities = currentPriorities(true); Map<Integer, ImageDescriptor> overlaysByPriority = new HashMap<Integer, ImageDescriptor>(priorities.length); for (RulePriority priority : priorities) { overlaysByPriority.put( priority.getPriority(), markerDescriptorFor(priority) ); } return overlaysByPriority; } public static void createRuleMarkerIcons(Display display) { ImageLoader loader = new ImageLoader(); PriorityDescriptorCache pdc = PriorityDescriptorCache.instance; for (RulePriority priority : currentPriorities(true)) { Image image = pdc.descriptorFor(priority).getImage(display, MAX_MARKER_DIMENSION); loader.data = new ImageData[] { image.getImageData() }; String fullPath = markerFilenameFor( priority ); loader.save(fullPath, SWT.IMAGE_PNG); image.dispose(); } } private static String pLabelFor(RulePriority priority, boolean useCustom) { if (! useCustom) return priority.getName(); String custom = descriptorFor(priority).label; return StringUtil.isEmpty(custom) ? preferencesManager.defaultDescriptorFor(priority).label : custom; } public static void useCustomPriorityLabels(boolean flag) { labelsByPriority.clear(); for (RulePriority priority : currentPriorities(true)) { labelsByPriority.put( priority, pLabelFor(priority, flag) ); } } public static String descriptionFor(RulePriority priority) { return descriptorFor(priority).description; } public static PriorityDescriptor descriptorFor(RulePriority priority) { return uiDescriptorsByPriority().get(priority); } public static String labelFor(RulePriority priority) { if (labelsByPriority.isEmpty()) { useCustomPriorityLabels(preferencesManager.loadPreferences().useCustomPriorityNames()); } return labelsByPriority.get(priority); } public static Map<Object, ShapeDescriptor> shapesByPriority() { if (shapesByPriority != null) return shapesByPriority; Map<Object, ShapeDescriptor> shapesByPriority = new HashMap<Object, ShapeDescriptor>(uiDescriptorsByPriority().size()); for (Map.Entry<RulePriority, PriorityDescriptor> entry : uiDescriptorsByPriority().entrySet()) { shapesByPriority.put(entry.getKey(), entry.getValue().shape); } return shapesByPriority; } public static RulePriority priorityFor(int value) { if (prioritiesByIntValue == null) { prioritiesByIntValue = new HashMap<Integer, RulePriority>(uiDescriptorsByPriority().size()); for (Map.Entry<RulePriority, PriorityDescriptor> entry : uiDescriptorsByPriority().entrySet()) { prioritiesByIntValue.put(entry.getKey().getPriority(), entry.getKey()); } } return prioritiesByIntValue.get(value); } /** * Return the priority labels * @deprecated - not referenced in the modern UI */ public static String[] getPriorityLabels() { if (priorityLabels == null) { final StringTable stringTable = PMDPlugin.getDefault().getStringTable(); priorityLabels = new String[]{ stringTable.getString(StringKeys.PRIORITY_ERROR_HIGH), stringTable.getString(StringKeys.PRIORITY_ERROR), stringTable.getString(StringKeys.PRIORITY_WARNING_HIGH), stringTable.getString(StringKeys.PRIORITY_WARNING), stringTable.getString(StringKeys.PRIORITY_INFORMATION) }; } return priorityLabels; // NOPMD by Herlin on 11/10/06 00:22 } public static List<Integer> getPriorityIntValues() { List<Integer> values = new ArrayList<Integer>(); for (RulePriority priority : RulePriority.values()) { values.add(priority.getPriority()); } return values; } }