package net.sourceforge.pmd.eclipse.ui.preferences.panelmanagers; import java.util.List; import java.util.Map; import net.sourceforge.pmd.PropertyDescriptor; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.eclipse.plugin.UISettings; import net.sourceforge.pmd.eclipse.ui.PageBuilder; import net.sourceforge.pmd.eclipse.ui.StringArranger; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; import net.sourceforge.pmd.util.ClassUtil; import net.sourceforge.pmd.util.StringUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; /** * * @author Brian Remedios */ public class SummaryPanelManager extends AbstractRulePanelManager { private StyledText viewField; private PageBuilder pb = new PageBuilder(3, SWT.COLOR_BLUE, UISettings.CodeFontBuilder); private StringArranger arranger = new StringArranger(" "); public SummaryPanelManager(String theId, String theTitle, EditorUsageMode theMode, ValueChangeListener theListener) { super(theId, theTitle, theMode, theListener); } public static String asLabel(Class<?> type) { return type.isArray() ? ClassUtil.asShortestName(type.getComponentType()) + "[]" : ClassUtil.asShortestName(type); } public static int longestNameIn(Map<PropertyDescriptor<?>, Object> valuesByDescriptor) { int longest = 0; for (Map.Entry<PropertyDescriptor<?>, Object> entry : valuesByDescriptor.entrySet()) { longest = Math.max(longest, entry.getKey().name().length()); } return longest; } public static String pad(String text, int length, char padChar) { int delta = length - text.length(); if (delta == 0) return text; StringBuilder sb = new StringBuilder(length); sb.append(text); for (int i=0; i<delta; i++) sb.append(padChar); return sb.toString(); } @Override protected void adapt() { Rule rule = soleRule(); showFor(rule); } public void showFor(Rule rule) { pb.clear(); if (rule == null) { pb.showOn(viewField); return; } pb.addHeading(StringKeys.PREF_SUMMARY_LABEL_NAME); pb.addText( rule.getName() ); pb.addHeading(StringKeys.PREF_SUMMARY_LABEL_DESCRIPTION); pb.addRawText( arranger.format(rule.getDescription()).toString() ); String url = rule.getExternalInfoUrl(); if (StringUtil.isNotEmpty(url)) { pb.addRawText(arranger.withIndent("More information can be found ")); pb.addLink("here.\n", url); } Map<PropertyDescriptor<?>, Object> valuesByDescriptor = Configuration.filteredPropertiesOf(rule); if (!valuesByDescriptor.isEmpty()) { pb.addHeading(StringKeys.PREF_SUMMARY_LABEL_PARAMETERS); int longest = longestNameIn(valuesByDescriptor); for (Map.Entry<PropertyDescriptor<?>, Object> entry : valuesByDescriptor.entrySet()) { PropertyDescriptor<?> desc = entry.getKey(); pb.addText(pad(desc.name(), longest, ' ') + '\t' + asLabel(desc.type())); } } List<String> examples = rule.getExamples(); if (examples.isEmpty()) { pb.showOn(viewField); return; } pb.setLanguage(rule.getLanguage()); pb.addHeading(StringKeys.PREF_SUMMARY_LABEL_EXAMPLE); pb.addText(""); for (String example : rule.getExamples()) { pb.addCode(example.trim()); pb.addText(""); } pb.showOn(viewField); if (pb.hasLinks()) { pb.addLinkHandler(viewField); } viewField.setEditable(false); } public void setVisible(boolean flag) { viewField.setVisible(flag); } @Override protected boolean canManageMultipleRules() { return false; } protected boolean canWorkWith(Rule rule) { return true; } @Override protected void clearControls() { // TODO Auto-generated method stub } @Override public Control setupOn(Composite parent) { Composite panel = new Composite(parent, 0); panel.setLayout(new FillLayout()); viewField = new StyledText(panel, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); viewField.setWordWrap(true); viewField.setTabs(20); return panel; } @Override public void showControls(boolean flag) { viewField.setVisible(flag); } }