package net.sourceforge.pmd.eclipse.ui.views.rules;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.sourceforge.pmd.PropertyDescriptor;
import net.sourceforge.pmd.PropertySource;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.RuleSet;
import net.sourceforge.pmd.eclipse.plugin.PMDPlugin;
import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferences;
import net.sourceforge.pmd.eclipse.runtime.preferences.impl.PreferenceUIStore;
import net.sourceforge.pmd.eclipse.ui.ModifyListener;
import net.sourceforge.pmd.eclipse.ui.nls.StringKeys;
import net.sourceforge.pmd.eclipse.ui.preferences.br.PMDPreferencePage2;
import net.sourceforge.pmd.eclipse.ui.preferences.br.RuleColumnDescriptor;
import net.sourceforge.pmd.eclipse.ui.preferences.br.RuleSelection;
import net.sourceforge.pmd.eclipse.ui.preferences.br.RuleSelectionListener;
import net.sourceforge.pmd.eclipse.ui.preferences.br.RuleTableManager;
import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener;
import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueResetHandler;
import net.sourceforge.pmd.eclipse.ui.preferences.panelmanagers.RulePropertyManager;
import net.sourceforge.pmd.eclipse.util.Util;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Sash;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.part.ViewPart;
/**
* @deprecated - temporary (don't add code here, demo/testing view only)
*
* @author br
*
*/
public class RuleEditorView extends ViewPart implements RuleSelectionListener, ModifyListener, ValueChangeListener, ValueResetHandler {
private TabFolder tabFolder;
private RulePropertyManager[] rulePropertyManagers;
private RuleTableManager tableManager;
private IPreferences preferences = PMDPlugin.getDefault().loadPreferences();
protected static PMDPlugin plugin = PMDPlugin.getDefault();
// columns shown in the rule treetable in the desired order
private static final RuleColumnDescriptor[] availableColumns = PMDPreferencePage2.availableColumns;
// last item in this list is the grouping used at startup
private static final Object[][] groupingChoices = PMDPreferencePage2.groupingChoices;
public RuleEditorView() {
}
protected String descriptionId() {
return StringKeys.PREF_RULESET_TITLE;
}
@Override
public void createPartControl(Composite parent) {
tableManager = new RuleTableManager("rules", availableColumns, PMDPlugin.getDefault().loadPreferences(), this);
tableManager.modifyListener(this);
tableManager.selectionListener(this);
populateRuleset();
Composite composite = new Composite(parent, SWT.NULL);
layoutControls(composite);
tableManager.populateRuleTable();
int i = PreferenceUIStore.instance.selectedPropertyTab() ;
tabFolder.setSelection( i );
}
private Composite createRuleSection(Composite parent) {
Composite ruleSection = new Composite(parent, SWT.NULL);
// Create the controls (order is important !)
Composite groupCombo = tableManager.buildGroupCombo(ruleSection, StringKeys.PREF_RULESET_RULES_GROUPED_BY, groupingChoices);
Tree ruleTree = tableManager.buildRuleTreeViewer(ruleSection);
tableManager.groupBy(null);
Composite ruleTableButtons = tableManager.buildRuleTableButtons(ruleSection);
Composite rulePropertiesTableButtons = PMDPreferencePage2.buildRulePropertiesTableButtons(ruleSection);
// Place controls on the layout
GridLayout gridLayout = new GridLayout(3, false);
ruleSection.setLayout(gridLayout);
GridData data = new GridData();
data.horizontalSpan = 3;
groupCombo.setLayoutData(data);
data = new GridData();
data.heightHint = 200; data.widthHint = 350;
data.horizontalSpan = 1;
data.horizontalAlignment = GridData.FILL; data.verticalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true; data.grabExcessVerticalSpace = true;
ruleTree.setLayoutData(data);
data = new GridData();
data.horizontalSpan = 1;
data.horizontalAlignment = GridData.FILL; data.verticalAlignment = GridData.FILL;
ruleTableButtons.setLayoutData(data);
data = new GridData();
data.horizontalSpan = 1;
data.horizontalAlignment = GridData.FILL; data.verticalAlignment = GridData.FILL;
rulePropertiesTableButtons.setLayoutData(data);
return ruleSection;
}
/**
* Method buildTabFolder.
* @param parent Composite
* @return TabFolder
*/
private TabFolder buildTabFolder(Composite parent) {
tabFolder = new TabFolder(parent, SWT.TOP);
rulePropertyManagers = PMDPreferencePage2.buildPropertyManagersOn(tabFolder, this);
tabFolder.pack();
return tabFolder;
}
public void changed(PropertySource source, PropertyDescriptor<?> desc, Object newValue) {
// TODO enhance to recognize default values
setModified();
tableManager.updated(source);
}
public void changed(RuleSelection selection, PropertyDescriptor<?> desc, Object newValue) {
// TODO enhance to recognize default values
for (Rule rule : selection.allRules()) {
if (newValue != null) { // non-reliable update behaviour, alternate trigger option - weird
tableManager.changed(selection, desc, newValue);
// System.out.println("doing redraw");
} else {
tableManager.changed(rule, desc, newValue);
// System.out.println("viewer update");
}
}
for (RulePropertyManager manager : rulePropertyManagers) {
manager.validate();
}
setModified();
}
/**
* Main layout
* @param parent Composite
*/
private void layoutControls(Composite parent) {
parent.setLayout(new FormLayout());
int ruleTableFraction = 55; //PreferenceUIStore.instance.tableFraction();
// Create the sash first, so the other controls can be attached to it.
final Sash sash = new Sash(parent, SWT.HORIZONTAL);
FormData data = new FormData();
data.left = new FormAttachment(0, 0); // attach to left
data.right = new FormAttachment(100, 0); // attach to right
data.top = new FormAttachment(ruleTableFraction, 0);
sash.setLayoutData(data);
sash.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
// Re-attach to the top edge, and we use the y value of the event to determine the offset from the top
((FormData)sash.getLayoutData()).top = new FormAttachment(0, event.y);
// PreferenceUIStore.instance.tableFraction(event.y);
sash.getParent().layout();
}
});
// Create the first text box and attach its bottom edge to the sash
Composite ruleSection = createRuleSection(parent);
data = new FormData();
data.top = new FormAttachment(0, 0);
data.bottom = new FormAttachment(sash, 0);
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(100, 0);
ruleSection.setLayoutData(data);
// Create the second text box and attach its top edge to the sash
TabFolder propertySection = buildTabFolder(parent);
data = new FormData();
data.top = new FormAttachment(sash, 0);
data.bottom = new FormAttachment(100, 0);
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(100, 0);
propertySection.setLayoutData(data);
}
/**
* @see org.eclipse.jface.preference.IPreferencePage#performOk()
*/
public void performOk() {
saveUIState();
// if (isModified()) {
// updateRuleSet();
// rebuildProjects();
// storeActiveRules();
// }
}
/**
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
protected void performDefaults() {
tableManager.populateRuleTable();
}
private void populateRuleset() {
RuleSet defaultRuleSet = plugin.getPreferencesManager().getRuleSet();
RuleSet ruleSet = new RuleSet();
ruleSet.addRuleSet(defaultRuleSet);
ruleSet.setName(defaultRuleSet.getName());
ruleSet.setDescription(Util.asCleanString(defaultRuleSet.getDescription()));
ruleSet.addExcludePatterns(defaultRuleSet.getExcludePatterns());
ruleSet.addIncludePatterns(defaultRuleSet.getIncludePatterns());
tableManager.useRuleSet(ruleSet);
}
public void selection(RuleSelection selection) {
if (rulePropertyManagers == null) return;
for (RulePropertyManager manager : rulePropertyManagers) {
manager.manage(selection);
manager.validate();
}
}
/**
* If user wants to, rebuild all projects
*/
private void rebuildProjects() {
// if (MessageDialog.openQuestion(getShell(), getMessage(StringKeys.MSGKEY_QUESTION_TITLE),
// getMessage(StringKeys.MSGKEY_QUESTION_RULES_CHANGED))) {
// try {
// ProgressMonitorDialog monitorDialog = new ProgressMonitorDialog(getShell());
// monitorDialog.run(true, true, new IRunnableWithProgress() {
// public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
// try {
// ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, monitor);
// } catch (CoreException e) {
// plugin.logError("Exception building all projects after a preference change", e);
// }
// }
// });
// } catch (Exception e) {
// plugin.logError("Exception building all projects after a preference change", e);
// }
// }
}
private void saveUIState() {
tableManager.saveUIState();
int i = tabFolder.getSelectionIndex();
PreferenceUIStore.instance.selectedPropertyTab( i );
PreferenceUIStore.instance.save();
}
/**
* Update the configured rule set
* Update also all configured projects
*/
private void updateRuleSet() {
// try {
// ProgressMonitorDialog monitorDialog = new ProgressMonitorDialog(getShell());
// monitorDialog.run(true, true, new IRunnableWithProgress() {
// public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
// plugin.getPreferencesManager().setRuleSet(tableManager.ruleSet());
// }
// });
// } catch (Exception e) {
// plugin.logError("Exception updating all projects after a preference change", e);
// }
}
protected String getMessage(String key) {
return PMDPlugin.getDefault().getStringTable().getString(key);
}
public void setModified() {
// TODO Auto-generated method stub
}
@Override
public void setFocus() {
// TODO Auto-generated method stub
}
public void resetValuesIn(RuleSelection rules) {
// TODO Auto-generated method stub
}
}