package net.sourceforge.pmd.eclipse.ui.preferences.panelmanagers; import java.util.ArrayList; import java.util.Collections; import java.util.List; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.eclipse.ui.editors.SyntaxManager; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; import net.sourceforge.pmd.eclipse.ui.preferences.editors.SWTUtil; import net.sourceforge.pmd.eclipse.util.ColourManager; import net.sourceforge.pmd.lang.rule.properties.StringProperty; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** * Manages the UI form for rule exclusion fields for a designated property rule. * * @author Brian Remedios */ public class ExclusionPanelManager extends AbstractRulePanelManager { private Text excludeWidget; private StyledText xpathWidget; private Composite excludeColour; private Composite xPathColour; private ColourManager colourManager; private boolean showColourBoxes; private List<Control> miscControls = new ArrayList<Control>(); // hide-show as req'd public static final String ID = "exclusion"; /** * Constructor for ExclusionPanelManager. * @param listener ValueChangeListener */ public ExclusionPanelManager(String theTitle, EditorUsageMode theMode, ValueChangeListener theListener, boolean showColourBoxesFlag) { super(ID, theTitle, theMode, theListener); showColourBoxes = showColourBoxesFlag; } protected boolean canManageMultipleRules() { return true; } protected void clearControls() { excludeWidget.setText(""); xpathWidget.setText(""); } public void showControls(boolean flag) { for (Control control : miscControls) { control.setVisible(flag); } } protected List<String> fieldErrors() { return Collections.emptyList(); } private void addListeners(final Text control, final StringProperty desc, final Control colourWindow) { addTextListeners(control, desc); control.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String newText = control.getText(); if (colourWindow != null) { colourWindow.setBackground( colourManager.colourFor(newText) ); } changed(desc, newText); } }); } private void addListeners(final StyledText control, final StringProperty desc, final Control colourWindow) { addTextListeners(control, desc); control.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String newText = control.getText(); if (colourWindow != null) { colourWindow.setBackground( colourManager.colourFor(newText) ); } changed(desc, newText); } }); } private Composite newColourPanel(Composite parent, String label) { Composite panel = new Composite(parent, SWT.None); GridLayout layout = new GridLayout(2, false); layout.verticalSpacing = 0; layout.horizontalSpacing = 0; layout.marginHeight = 0; layout.marginWidth = 0; panel.setLayout(layout); Label labelWidget = new Label(panel, SWT.None); labelWidget.setText(label); Composite clrPanel = new Composite(panel, SWT.BORDER); GridData gridData = new GridData(); gridData.horizontalSpan = 1; gridData.heightHint = 15; gridData.widthHint = 15; gridData.grabExcessHorizontalSpace = false; clrPanel.setLayoutData(gridData); miscControls.add(clrPanel); miscControls.add(labelWidget); return clrPanel; } /** * @param parent Composite * @param regexExclusionLabel String * @param xpathExclusionLabel String * @return Control */ public Control setupOn(Composite parent) { String regexExclusionLabel = SWTUtil.stringFor(StringKeys.LABEL_EXCLUSION_REGEX); String xpathExclusionLabel = SWTUtil.stringFor(StringKeys.LABEL_XPATH_EXCLUSION); String colourBoxLabel = SWTUtil.stringFor(StringKeys.LABEL_COLOUR_CODE); colourManager = ColourManager.managerFor(parent.getDisplay()); GridData gridData; Composite panel = new Composite(parent, 0); GridLayout layout = new GridLayout(2, false); panel.setLayout(layout); Label labelA = new Label(panel, 0); labelA.setText(regexExclusionLabel); gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.horizontalSpan = 1; gridData.grabExcessHorizontalSpace = true; labelA.setLayoutData(gridData); // labelAIcon.setImage(ResourceManager.imageFor(PMDUiConstants.ICON_FILTER)); if (showColourBoxes) { excludeColour = newColourPanel(panel, colourBoxLabel); } excludeWidget = newTextField(panel); gridData = new GridData(GridData.FILL_BOTH); gridData.grabExcessHorizontalSpace = true; gridData.horizontalSpan = 2; excludeWidget.setLayoutData(gridData); addListeners(excludeWidget, Rule.VIOLATION_SUPPRESS_REGEX_DESCRIPTOR, excludeColour); Label labelB = new Label(panel, 0); labelB.setText(xpathExclusionLabel); gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.horizontalSpan = 1; labelB.setLayoutData(gridData); // labelAIcon.setImage(ResourceManager.imageFor(PMDUiConstants.ICON_FILTER_X)); if (showColourBoxes) { xPathColour = newColourPanel(panel, colourBoxLabel); } gridData = new GridData(GridData.FILL_BOTH); gridData.horizontalSpan = 2; gridData.grabExcessHorizontalSpace = true; xpathWidget = newCodeField(panel); xpathWidget.setLayoutData(gridData); SyntaxManager.adapt(xpathWidget, "xpath", null); addListeners(xpathWidget, Rule.VIOLATION_SUPPRESS_XPATH_DESCRIPTOR, xPathColour); miscControls.add(labelA); miscControls.add(labelB); miscControls.add(excludeWidget); miscControls.add(xpathWidget); panel.pack(); return panel; } protected void adapt() { if (rules == null) { shutdown(excludeWidget); shutdown(xpathWidget); return; } show(excludeWidget, rules.commonStringValue(Rule.VIOLATION_SUPPRESS_REGEX_DESCRIPTOR)); show(xpathWidget, rules.commonStringValue(Rule.VIOLATION_SUPPRESS_XPATH_DESCRIPTOR)); } }