blob: cf8312174b172df14302af40a92d6d360797e4ca [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.ui.internal.provisional.views.markers;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.IShellProvider;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.Label;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.events.IExpansionListener;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.views.markers.internal.MarkerMessages;
/**
* FiltersConfigurationDialog is the dialog for configuring the filters for the
*
* @since 3.3
*
*/
public class FiltersConfigurationDialog extends Dialog {
private Collection filterAreas;
private Collection filterGroups;
private CheckboxTableViewer filtersList;
private FilterConfigurationArea scopeArea = new ScopeArea();
private MarkerFieldFilterGroup selectedFilterGroup;
/**
* Create a new instance of the receiver on group.
*
* @param parentShell
* @param groups
* Collection of MarkerFieldFilterGroup
* @param fieldFilterAreas -
* Collection of FilterConfigurationArea
*/
public FiltersConfigurationDialog(IShellProvider parentShell,
Collection groups, Collection fieldFilterAreas) {
super(parentShell);
filterGroups = makeWorkingCopy(groups);
filterAreas = fieldFilterAreas;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
Composite top = (Composite) super.createDialogArea(parent);
initializeDialogUnits(top);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.makeColumnsEqualWidth = false;
top.setLayout(layout);
createFilterSelectionArea(top);
final FormToolkit toolkit = new FormToolkit(top.getDisplay());
parent.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
toolkit.dispose();
}
});
final ScrolledForm form = toolkit.createScrolledForm(top);
form.setBackground(parent.getBackground());
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
form.setLayoutData(data);
form.getBody().setLayout(new GridLayout());
// Expand all of the filter areas if the choices are small
boolean expand = filterAreas.size() < 3;
createFieldArea(toolkit, form, scopeArea, expand);
Iterator areas = filterAreas.iterator();
while (areas.hasNext()) {
createFieldArea(toolkit, form, (FilterConfigurationArea) areas
.next(), expand);
}
if (!filterGroups.isEmpty()) {
filtersList.setSelection(new StructuredSelection(filterGroups
.iterator().next()));
}
return top;
}
/**
* Create a field area in the form for the FilterConfigurationArea
*
* @param toolkit
* @param form
* @param area
* @param expand
* <code>true</code> if the area should be expanded by default
*/
private void createFieldArea(final FormToolkit toolkit,
final ScrolledForm form, final FilterConfigurationArea area,
boolean expand) {
final ExpandableComposite expandable = toolkit
.createExpandableComposite(form.getBody(),
ExpandableComposite.TWISTIE);
expandable.setText(area.getTitle());
expandable.setBackground(form.getBackground());
expandable.setLayout(new GridLayout());
expandable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
expandable.addExpansionListener(new IExpansionListener(){
/* (non-Javadoc)
* @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanged(org.eclipse.ui.forms.events.ExpansionEvent)
*/
public void expansionStateChanged(ExpansionEvent e) {
expandable.getParent().layout(true);
}
/* (non-Javadoc)
* @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanging(org.eclipse.ui.forms.events.ExpansionEvent)
*/
public void expansionStateChanging(ExpansionEvent e) {
}
});
Composite sectionClient = toolkit.createComposite(expandable);
sectionClient.setLayout(new GridLayout());
sectionClient
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
sectionClient.setBackground(form.getBackground());
area.createContents(sectionClient);
expandable.setClient(sectionClient);
expandable.setExpanded(expand);
}
/**
* Create the area for selecting the filters and enabling/disabling them.
*
* @param top
*/
private void createFilterSelectionArea(Composite top) {
Composite filtersComposite = new Composite(top, SWT.NONE);
filtersComposite.setLayout(new GridLayout(2, false));
filtersComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
true));
Label title = new Label(filtersComposite, SWT.NONE);
title.setText(MarkerMessages.filtersDialog_title);
GridData titleData = new GridData();
titleData.horizontalSpan = 2;
title.setLayoutData(titleData);
filtersList = CheckboxTableViewer.newCheckList(filtersComposite,
SWT.BORDER);
filtersList.setContentProvider(new IStructuredContentProvider() {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
// Do nothing
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
return filterGroups.toArray();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
* java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
// Do nothing
}
});
filtersList.setLabelProvider(new LabelProvider() {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
*/
public String getText(Object element) {
return ((MarkerFieldFilterGroup) element).getName();
}
});
if (selectedFilterGroup != null)
filtersList.setSelection(new StructuredSelection(
selectedFilterGroup));
filtersList
.addSelectionChangedListener(new ISelectionChangedListener() {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
setSelectedFilter((MarkerFieldFilterGroup) ((IStructuredSelection) event
.getSelection()).getFirstElement());
}
});
filtersList.setInput(this);
Iterator filterIterator = filterGroups.iterator();
while (filterIterator.hasNext()) {
MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) filterIterator
.next();
filtersList.setChecked(group, group.isEnabled());
}
GridData listData = new GridData(SWT.FILL, SWT.FILL, true, true);
listData.widthHint = convertHorizontalDLUsToPixels(100);
filtersList.getControl().setLayoutData(listData);
Composite buttons = new Composite(filtersComposite, SWT.NONE);
GridLayout buttonLayout = new GridLayout();
buttonLayout.marginWidth = 0;
buttons.setLayout(buttonLayout);
GridData buttonsData = new GridData();
buttonsData.verticalAlignment = GridData.BEGINNING;
buttons.setLayoutData(buttonsData);
Button addNew = new Button(buttons, SWT.PUSH);
addNew.setText(MarkerMessages.MarkerFilter_addFilterName);
addNew.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
InputDialog newDialog = new InputDialog(getShell(),
MarkerMessages.MarkerFilterDialog_title,
MarkerMessages.MarkerFilterDialog_message,
MarkerMessages.MarkerFilter_newFilterName,
new IInputValidator() {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String)
*/
public String isValid(String newText) {
if (newText.length() == 0)
return MarkerMessages.MarkerFilterDialog_emptyMessage;
Iterator filterIterator = filterGroups
.iterator();
while (filterIterator.hasNext()) {
if (((MarkerFieldFilterGroup) filterIterator
.next()).getName().equals(newText))
return NLS
.bind(
MarkerMessages.filtersDialog_conflictingName,
newText);
}
return null;
}
});
newDialog.open();
String newName = newDialog.getValue();
if (newName != null) {
createNewFilter(newName);
}
}
});
setButtonLayoutData(addNew);
Button remove = new Button(buttons, SWT.PUSH);
remove.setText(MarkerMessages.MarkerFilter_deleteSelectedName);
remove.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
removeFilters(filtersList.getSelection());
}
});
setButtonLayoutData(remove);
}
/**
* Create a new filter called newName
*
* @param newName
*/
protected void createNewFilter(String newName) {
// TODO Create one
}
/**
* Return the filter groups modified by the receiver.
*
* @return Collection of {@link MarkerFieldFilterGroup}
*/
public Collection getFilters() {
return filterGroups;
}
/**
* Make a working copy of the groups.
*
* @param groups
* @return Collection of MarkerFieldFilterGroup
*/
private Collection makeWorkingCopy(Collection groups) {
Iterator initialFiltersIterator = groups.iterator();
Collection returnFilters = new ArrayList(groups.size());
while (initialFiltersIterator.hasNext()) {
MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) initialFiltersIterator
.next();
MarkerFieldFilterGroup copy = group.makeWorkingCopy();
if (copy != null)
returnFilters.add(copy);
}
return returnFilters;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
super.okPressed();
if (selectedFilterGroup == null)
return;
scopeArea.applyToGroup(selectedFilterGroup);
Iterator areas = filterAreas.iterator();
while (areas.hasNext()) {
((FilterConfigurationArea) areas.next())
.applyToGroup(selectedFilterGroup);
}
}
/**
* Remove the filters in selection.
*
* @param selection
*/
protected void removeFilters(ISelection selection) {
// TODO Auto-generated method stub
}
/**
* Set the filter that is being worked on.
*
* @param markerFieldFilterGroup
*/
void setSelectedFilter(MarkerFieldFilterGroup markerFieldFilterGroup) {
MarkerFieldFilterGroup old = selectedFilterGroup;
selectedFilterGroup = markerFieldFilterGroup;
if (old != null)
scopeArea.applyToGroup(old);
scopeArea.initializeFromGroup(selectedFilterGroup);
Iterator areas = filterAreas.iterator();
while (areas.hasNext()) {
FilterConfigurationArea area = (FilterConfigurationArea) areas
.next();
if (old != null)
area.applyToGroup(old);
area.initializeFromGroup(selectedFilterGroup);
}
}
}