/*******************************************************************************
* Copyright (c) 2017 Rogue Wave Software Inc. 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:
* Rogue Wave Software Inc. - initial implementation
*******************************************************************************/
package org.eclipse.php.profile.ui.dialogs;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.Window;
import org.eclipse.php.profile.ui.PHPProfileUIMessages;
import org.eclipse.php.profile.ui.ProfilerUIImages;
import org.eclipse.php.profile.ui.filters.ExecutionStatisticsFilter;
import org.eclipse.php.profile.ui.filters.ExecutionStatisticsFiltersRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
/**
* Filters dialog.
*/
public class FiltersDialog extends StatusDialog {
private Label fMainLabel;
private TableViewer fViewer;
private Button fNewButton;
private Button fEditButton;
private Button fRemoveButton;
private List<ExecutionStatisticsFilter> fFilters;
public FiltersDialog(Shell parent) {
super(parent);
setShellStyle(getShellStyle() | SWT.RESIZE);
setTitle(PHPProfileUIMessages.getString("FiltersDialog_0")); //$NON-NLS-1$
fFilters = new ArrayList<ExecutionStatisticsFilter>();
}
private void addButtonsGroup(Composite parent) {
Composite buttonGroup = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
buttonGroup.setLayout(layout);
fNewButton = new Button(buttonGroup, SWT.NONE);
fNewButton.setText(PHPProfileUIMessages.getString("FiltersDialog_1")); //$NON-NLS-1$
fNewButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
doEditFilter(null);
}
});
fEditButton = new Button(buttonGroup, SWT.NONE);
fEditButton.setText(PHPProfileUIMessages.getString("FiltersDialog_2")); //$NON-NLS-1$
fEditButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
doEditFilter((ExecutionStatisticsFilter) selection.getFirstElement());
}
});
fRemoveButton = new Button(buttonGroup, SWT.NONE);
fRemoveButton.setText(PHPProfileUIMessages.getString("FiltersDialog_3")); //$NON-NLS-1$
fRemoveButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
fFilters.remove((ExecutionStatisticsFilter) selection.getFirstElement());
fViewer.refresh();
}
});
}
private void updateNewEditRemoveButtonsStates() {
ExecutionStatisticsFilter filter = (ExecutionStatisticsFilter) ((IStructuredSelection) fViewer.getSelection())
.getFirstElement();
fEditButton.setEnabled(filter != null);
fRemoveButton.setEnabled(filter != null && filter.isRemovable());
}
private void doEditFilter(ExecutionStatisticsFilter filter) {
ExecutionStatisticsFilterDialog dialog = new ExecutionStatisticsFilterDialog(getShell(), filter, fFilters);
if (dialog.open() == Window.OK) {
if (filter == null) {
fFilters.add(dialog.getFilter());
}
}
fViewer.refresh();
}
public ExecutionStatisticsFilter[] getFilters() {
return (ExecutionStatisticsFilter[]) fFilters.toArray(new ExecutionStatisticsFilter[fFilters.size()]);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
ExecutionStatisticsFiltersRegistry.saveFilters(
(ExecutionStatisticsFilter[]) fFilters.toArray(new ExecutionStatisticsFilter[fFilters.size()]));
super.okPressed();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets
* .Composite)
*/
protected Control createDialogArea(Composite parent) {
parent = (Composite) super.createDialogArea(parent);
fMainLabel = new Label(parent, SWT.NONE);
fMainLabel.setText(PHPProfileUIMessages.getString("FiltersDialog_4")); //$NON-NLS-1$
GridData layoutData = new GridData();
layoutData.grabExcessHorizontalSpace = true;
layoutData.horizontalAlignment = SWT.FILL;
fMainLabel.setLayoutData(layoutData);
fViewer = new TableViewer(parent);
layoutData = new GridData();
layoutData.grabExcessHorizontalSpace = true;
layoutData.horizontalAlignment = SWT.FILL;
layoutData.verticalAlignment = SWT.FILL;
layoutData.heightHint = 300;
layoutData.widthHint = 250;
fViewer.getControl().setLayoutData(layoutData);
fViewer.setContentProvider(new FiltersListContentProvider());
fViewer.setLabelProvider(new FiltersListLabelProvider());
ExecutionStatisticsFiltersRegistry.getFilters(fFilters);
fViewer.setInput(fFilters);
fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#
* selectionChanged
* (org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
updateNewEditRemoveButtonsStates();
}
});
addButtonsGroup(parent);
updateNewEditRemoveButtonsStates();
return parent;
}
class FiltersListContentProvider implements IStructuredContentProvider {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.IStructuredContentProvider#getElements(
* java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
if (inputElement instanceof List) {
@SuppressWarnings("unchecked")
List<Object> list = (List<Object>) inputElement;
return (Object[]) list.toArray(new Object[list.size()]);
}
return new Object[0];
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
}
/*
* (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) {
}
}
class FiltersListLabelProvider extends LabelProvider {
private Image fFilterImage;
public FiltersListLabelProvider() {
fFilterImage = ProfilerUIImages.get(ProfilerUIImages.IMG_OBJ_STAT_FILTER);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
*/
public Image getImage(Object element) {
return fFilterImage;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
*/
public String getText(Object element) {
if (element instanceof ExecutionStatisticsFilter) {
return ((ExecutionStatisticsFilter) element).getName();
}
return null;
}
}
}