package net.sourceforge.pmd.eclipse.ui.reports;
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.eclipse.plugin.PMDPlugin;
import net.sourceforge.pmd.eclipse.ui.BasicTableLabelProvider;
import net.sourceforge.pmd.eclipse.ui.preferences.br.AbstractPMDPreferencePage;
import net.sourceforge.pmd.eclipse.ui.preferences.br.BasicTableManager;
import net.sourceforge.pmd.eclipse.ui.preferences.br.RuleSelection;
import net.sourceforge.pmd.eclipse.ui.preferences.br.SizeChangeListener;
import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener;
import net.sourceforge.pmd.eclipse.ui.preferences.panelmanagers.FormArranger;
import net.sourceforge.pmd.eclipse.ui.preferences.panelmanagers.PerRulePropertyPanelManager;
import net.sourceforge.pmd.renderers.Renderer;
import net.sourceforge.pmd.util.StringUtil;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
/**
* The available report formats and their properties.
*
* @author Brian Remedios
*/
public class ReportPreferencesPage extends AbstractPMDPreferencePage implements ValueChangeListener, SizeChangeListener {
private TableViewer tableViewer;
private FormArranger formArranger;
private BasicTableManager reportTableMgr;
/**
* Create and initialize the controls of the page
*
* @param parent Composite
* @return Control
* @see PreferencePage#createContents */
@Override
protected Control createContents(Composite parent) {
// Create parent composite
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
layout.verticalSpacing = 10;
composite.setLayout(layout);
ReportManager.loadReportProperties();
Composite reportGroup = buildReportGroup(composite);
Composite propertyGroup = buildPropertyGroup(composite);
propertyGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
reportGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
return composite;
}
/**
* Build the group of renderer property preferences
* @param parent the parent composite
* @return the group widget */
private Composite buildPropertyGroup(Composite parent) {
Group group = new Group(parent, SWT.SHADOW_IN);
group.setText("Properties");
group.setLayout(new GridLayout(1, false));
formArranger = new FormArranger(group, PerRulePropertyPanelManager.editorFactoriesByPropertyType, this, this);
return group;
}
/**
* Build the group of priority preferences
* @param parent the parent composite
* @return the group widget */
private Composite buildReportGroup(Composite parent) {
Composite group = new Composite(parent, SWT.NONE);
// group.setText("Formats");
group.setLayout(new GridLayout(2, false));
IStructuredContentProvider contentProvider = new IStructuredContentProvider() {
public void dispose() { }
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { }
public Object[] getElements(Object inputElement) { return (Renderer[])inputElement; }
};
BasicTableLabelProvider labelProvider = new BasicTableLabelProvider(ReportColumnUI.VisibleColumns);
reportTableMgr = new BasicTableManager("renderers", null, ReportColumnUI.VisibleColumns);
tableViewer = reportTableMgr.buildTableViewer(
group,
SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION | SWT.CHECK
);
reportTableMgr.setupColumns(ReportColumnUI.VisibleColumns);
Table table = tableViewer.getTable();
table.setLayoutData( new GridData(GridData.FILL, GridData.CENTER, true, true, 2, 1) );
tableViewer.setLabelProvider(labelProvider);
tableViewer.setContentProvider(contentProvider);
table.setHeaderVisible(true);
// labelProvider.addColumnsTo(table);
tableViewer.setInput( ReportManager.instance.allRenderers() );
selectCheckedRenderers();
TableColumn[] columns = table.getColumns();
for (TableColumn column : columns) column.pack();
Composite editorPanel = new Composite(group, SWT.None);
editorPanel.setLayoutData( new GridData(GridData.FILL, GridData.CENTER, true, true) );
editorPanel.setLayout(new GridLayout(4, false));
Label nameLabel = new Label(editorPanel, SWT.None);
nameLabel.setLayoutData( new GridData());
nameLabel.setText("Name:");
final Label rendererName = new Label(editorPanel, SWT.BORDER);
rendererName.setLayoutData( new GridData(GridData.FILL, GridData.CENTER, true, true) );
final Button suppressed = new Button(editorPanel, SWT.CHECK);
suppressed.setLayoutData( new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
suppressed.setText("Show suppressed violations");
Label descLabel = new Label(editorPanel, SWT.None);
descLabel.setLayoutData( new GridData());
descLabel.setText("Description:");
final Label descValue = new Label(editorPanel, SWT.BORDER);
descValue.setLayoutData( new GridData(GridData.FILL, GridData.CENTER, true, true, 3, 1) );
tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection)event.getSelection();
List items = selection.toList();
selectedRenderers(items, rendererName, descValue, suppressed);
if (items.size() == 1) {
formArranger.arrangeFor((Renderer)items.get(0));
} else {
formArranger.clearChildren();
}
}} );
tableViewer.getTable().addListener(SWT.Selection, new Listener () {
public void handleEvent(Event event) {
if (event.detail == SWT.CHECK) {
checked(event.item);
}
}
});
suppressed.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
}} );
rendererName.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
setName( rendererName.getText() );
}} );
return group;
}
/**
* Check the renderers as noted from the preferences.
*/
private void selectCheckedRenderers() {
Set<String> activeNames = preferences.activeReportRenderers();
for (TableItem item : tableViewer.getTable().getItems()) {
Renderer ren = (Renderer)item.getData();
item.setChecked(
activeNames.contains( ren.getName())
);
}
}
/**
*
* @return Set<String>
*/
private Set<String> currentCheckedRenderers() {
Set<String> names = new HashSet<String>();
for (Object renderer : checkedItems(tableViewer.getTable())) {
names.add(((Renderer)renderer).getName());
}
return names;
}
/**
* Method checkedItems.
* @param table Table
* @return Set<Object>
*/
private static Set<Object> checkedItems(Table table) {
Set<Object> checkedItems = new HashSet<Object>();
for (TableItem ti : table.getItems()) {
if (ti.getChecked()) checkedItems.add( ti.getData() );
}
return checkedItems;
}
/**
*
* @param item Object
*/
private void checked(Object item) {
boolean matches = currentCheckedRenderers().equals(preferences.activeReportRenderers());
setModified(!matches);
}
/**
*
* @param newName String
*/
private void setName(String newName) {
if (StringUtil.isEmpty(newName)) return;
for (Renderer ren : selectedRenderers()) {
//ren.label = newName;
}
tableViewer.refresh();
}
/**
*
* @return Renderer[]
*/
private Renderer[] selectedRenderers() {
Object[] items = ((IStructuredSelection)tableViewer.getSelection()).toArray();
Renderer[] renderers = new Renderer[items.length];
for (int i=0; i<renderers.length; i++) renderers[i] = (Renderer)items[i];
return renderers;
}
/**
*
* @param items List<Renderer>
* @param nameField Label
* @param descField Label
* @param suppressed Button
*/
private static void selectedRenderers(List<Renderer> items, Label nameField, Label descField, Button suppressed) {
if (items.size() != 1 ) {
nameField.setText("");
return;
}
Renderer renderer = items.get(0);
nameField.setText( renderer.getName());
descField.setText( renderer.getDescription());
suppressed.setSelection(renderer.isShowSuppressedViolations());
}
/**
* @see org.eclipse.jface.preference.PreferencePage#performDefaults() */
@Override
protected void performDefaults() {
}
/**
* Method performCancel.
* @return boolean
* @see org.eclipse.jface.preference.IPreferencePage#performCancel()
*/
@Override
public boolean performCancel() {
// clear out any changes for next possible usage
selectCheckedRenderers();
return true;
}
/**
* @return boolean
* @see org.eclipse.jface.preference.IPreferencePage#performOk() */
@Override
public boolean performOk() {
ReportManager.saveReportProperties();
preferences.activeReportRenderers( currentCheckedRenderers() );
preferences.sync();
PMDPlugin.getDefault().applyLogPreferences(preferences);
return true;
}
/**
* Method descriptionId.
* @return String
*/
@Override
protected String descriptionId() {
return "???"; // TODO
}
public void changed(PropertySource source, PropertyDescriptor<?> desc, Object newValue) {
// TODO enable/disable save/cancel buttons
}
// ignore these
public void addedRows(int newRowCount) { }
public void changed(RuleSelection rule, PropertyDescriptor<?> desc, Object newValue) { }
}