package net.sourceforge.pmd.eclipse.ui.preferences.panelmanagers;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.pmd.PMD;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.eclipse.ui.editors.SyntaxManager;
import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener;
import net.sourceforge.pmd.lang.rule.RuleReference;
import net.sourceforge.pmd.util.StringUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
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.Event;
import org.eclipse.swt.widgets.Listener;
/**
*
* @author Brian Remedios
*/
public class ExamplePanelManager extends AbstractRulePanelManager {
private StyledText exampleField;
private ModifyListener modifyListener;
public static final String ID = "example";
public ExamplePanelManager(String theTitle, EditorUsageMode theMode, ValueChangeListener theListener) {
super(ID, theTitle, theMode, theListener);
}
protected boolean canManageMultipleRules() { return false; }
protected void clearControls() {
exampleField.setText("");
}
public void showControls(boolean flag) {
exampleField.setVisible(flag);
}
protected void updateOverridenFields() {
Rule rule = soleRule();
if (rule instanceof RuleReference) {
RuleReference ruleReference = (RuleReference)rule;
exampleField.setBackground(ruleReference.getOverriddenExamples() != null ? overridenColour: null);
}
}
public Control setupOn(Composite parent) {
GridData gridData;
Composite panel = new Composite(parent, 0);
GridLayout layout = new GridLayout(2, false);
panel.setLayout(layout);
exampleField = newCodeField(panel);
gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalSpan = 1;
exampleField.setLayoutData(gridData);
exampleField.addListener(SWT.FocusOut, new Listener() {
public void handleEvent(Event event) {
Rule soleRule = soleRule();
String cleanValue = exampleField.getText().trim();
String existingValue = soleRule.getDescription();
if (StringUtil.areSemanticEquals(existingValue, cleanValue)) return;
soleRule.setDescription(cleanValue);
valueChanged(null, cleanValue);
}
});
return panel;
}
private void formatExampleOn(StringBuilder sb, String example) {
// sb.append(example.trim());
String[] lines = example.split("\n");
List<String> realLines = new ArrayList<String>(lines.length);
for (String line : lines) if (StringUtil.isNotEmpty(line)) realLines.add(line);
lines = realLines.toArray(new String[realLines.size()]);
int trimDepth = StringUtil.maxCommonLeadingWhitespaceForAll(lines);
if (trimDepth > 0) {
lines = StringUtil.trimStartOn(lines, trimDepth);
}
for (String line : lines) {
sb.append(line).append(PMD.EOL);
}
}
private String examples(Rule rule) {
List<String> examples = rule.getExamples();
if (examples.isEmpty()) return "";
StringBuilder sb = new StringBuilder();
formatExampleOn(sb, examples.get(0));
for (int i=1; i<examples.size(); i++) {
sb.append("----------");
formatExampleOn(sb, examples.get(i));
}
return sb.toString();
}
protected void adapt() {
Rule soleRule = soleRule();
if (soleRule == null) {
shutdown(exampleField);
} else {
show(exampleField, examples(soleRule));
modifyListener = SyntaxManager.adapt(
exampleField,
soleRule.getLanguage().getTerseName(),
modifyListener
);
}
}
}