org.eclipse.mat.ui.internal.acquire.ProviderConfigurationDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mat.ui.internal.acquire.ProviderConfigurationDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2010 SAP AG 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:
 *    SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.mat.ui.internal.acquire;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.mat.SnapshotException;
import org.eclipse.mat.internal.acquire.HeapDumpProviderDescriptor;
import org.eclipse.mat.internal.acquire.HeapDumpProviderRegistry;
import org.eclipse.mat.query.registry.AnnotatedObjectArgumentsSet;
import org.eclipse.mat.query.registry.ArgumentDescriptor;
import org.eclipse.mat.query.registry.ArgumentFactory;
import org.eclipse.mat.snapshot.acquire.IHeapDumpProvider;
import org.eclipse.mat.ui.Messages;
import org.eclipse.mat.ui.accessibility.AccessibleCompositeAdapter;
import org.eclipse.mat.ui.internal.browser.QueryContextHelp;
import org.eclipse.mat.util.IProgressListener;
import org.eclipse.mat.util.MessageUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
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.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.PlatformUI;

public class ProviderConfigurationDialog extends Dialog {

    private ProviderArgumentsTable table;
    private Table availableProvidersTable;
    private QueryContextHelp helpPopup;

    protected ProviderConfigurationDialog(Shell parentShell) {
        super(parentShell);
        setShellStyle(getShellStyle() | SWT.SHELL_TRIM);

    }

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(Messages.ProviderConfigurationDialog_ConfigureProvidersDialogTitle);
        shell.setMinimumSize(530, 350);
    }

    @Override
    protected Control createDialogArea(Composite parent) {

        Composite composite = new Composite(parent, SWT.RESIZE);
        composite.setLayout(new GridLayout(1, false));
        GridDataFactory.fillDefaults().grab(true, true).span(1, 1).applyTo(composite);

        Label providersLabel = new Label(composite, SWT.NONE);
        providersLabel.setText(Messages.ProviderConfigurationDialog_AvailableProvidersLabel);
        GridDataFactory.swtDefaults().span(1, 1).applyTo(providersLabel);

        createProvidersTable(composite);
        GridDataFactory.fillDefaults().grab(true, true).span(1, 1).applyTo(availableProvidersTable);

        Label argumentsLabel = new Label(composite, SWT.NONE);
        argumentsLabel.setText(Messages.ProviderConfigurationDialog_ConfigurableParameteresLabel);
        GridDataFactory.swtDefaults().span(1, 1).applyTo(argumentsLabel);

        createArgumentsTable(composite);

        availableProvidersTable.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                if (e.item instanceof TableItem) {
                    AnnotatedObjectArgumentsSet argumentsSet = (AnnotatedObjectArgumentsSet) ((TableItem) e.item)
                            .getData();
                    table.providerSelected(argumentsSet);
                    relocateHelp(true);
                }
            }
        });

        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "org.eclipse.mat.ui.help.query_arguments"); //$NON-NLS-1$

        Listener listener = new Listener() {
            public void handleEvent(Event event) {
                relocateHelp(false);
            }
        };
        getShell().addListener(SWT.Resize, listener);
        getShell().addListener(SWT.Move, listener);

        return composite;

    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.YES_ID, Messages.ProviderConfigurationDialog_ApplyButtonLabel, false);
        super.createButtonsForButtonBar(parent);
    }

    @Override
    protected void buttonPressed(int buttonId) {
        if (buttonId == IDialogConstants.YES_ID || buttonId == IDialogConstants.OK_ID) {
            try {
                applyChanges();
            } catch (SnapshotException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        super.buttonPressed(buttonId);
    }

    private void applyChanges() throws SnapshotException {
        for (TableItem item : availableProvidersTable.getItems()) {
            AnnotatedObjectArgumentsSet argumentSet = (AnnotatedObjectArgumentsSet) item.getData();

            try {
                HeapDumpProviderDescriptor providerDescriptor = (HeapDumpProviderDescriptor) argumentSet
                        .getDescriptor();
                IHeapDumpProvider impl = providerDescriptor.getHeapDumpProvider();

                for (ArgumentDescriptor parameter : providerDescriptor.getArguments()) {
                    Object value = argumentSet.getArgumentValue(parameter);

                    if (value == null && parameter.isMandatory()) {
                        value = parameter.getDefaultValue();
                        if (value == null)
                            throw new SnapshotException(MessageUtil.format(
                                    Messages.ProviderConfigurationDialog_MissingParameterErrorMessage,
                                    parameter.getName()));
                    }

                    if (value == null) {
                        if (argumentSet.getValues().containsKey(parameter)) {
                            Logger.getLogger(getClass().getName()).log(Level.INFO,
                                    MessageUtil.format("Setting null value for: {0}", parameter.getName())); //$NON-NLS-1$
                            parameter.getField().set(impl, null);
                        }
                        continue;
                    }

                    try {
                        if (value instanceof ArgumentFactory) {
                            parameter.getField().set(impl, ((ArgumentFactory) value).build(parameter));
                        } else if (parameter.isArray()) {
                            List<?> list = (List<?>) value;
                            Object array = Array.newInstance(parameter.getType(), list.size());

                            int ii = 0;
                            for (Object v : list)
                                Array.set(array, ii++, v);

                            parameter.getField().set(impl, array);
                        } else if (parameter.isList()) {
                            // handle ArgumentFactory inside list
                            List<?> source = (List<?>) value;
                            List<Object> target = new ArrayList<Object>(source.size());
                            for (int ii = 0; ii < source.size(); ii++) {
                                Object v = source.get(ii);
                                if (v instanceof ArgumentFactory)
                                    v = ((ArgumentFactory) v).build(parameter);
                                target.add(v);
                            }

                            parameter.getField().set(impl, target);
                        } else {
                            parameter.getField().set(impl, value);
                        }
                    } catch (IllegalArgumentException e) {
                        throw new SnapshotException(MessageUtil.format(
                                Messages.ProviderConfigurationDialog_IllegalArgumentErrorMessage, value,
                                value.getClass().getName(), parameter.getName(), parameter.getType().getName()), e);
                    } catch (IllegalAccessException e) {
                        // should not happen as we check accessibility when
                        // registering queries
                        throw new SnapshotException(
                                MessageUtil.format("Unable to access field {0} of type {1}", parameter //$NON-NLS-1$
                                        .getName(), parameter.getType().getName()),
                                e);
                    }
                }

            } catch (IProgressListener.OperationCanceledException e) {
                throw e; // no nesting!
            } catch (SnapshotException e) {
                throw e; // no nesting!
            } catch (Exception e) {
                throw SnapshotException.rethrow(e);
            }
        }
    }

    private void createProvidersTable(Composite parent) {
        availableProvidersTable = new Table(parent,
                SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
        TableColumn column1 = new TableColumn(availableProvidersTable, SWT.NONE);
        column1.setText(Messages.ProviderConfigurationDialog_NameColumnHeader);
        column1.setWidth(200);

        TableColumn column2 = new TableColumn(availableProvidersTable, SWT.NONE);
        column2.setText(Messages.ProviderConfigurationDialog_DescriptionColumnHeader);
        column2.setWidth(300);

        availableProvidersTable.setHeaderVisible(true);
        availableProvidersTable.setLinesVisible(true);
        AccessibleCompositeAdapter.access(availableProvidersTable);

        Collection<HeapDumpProviderDescriptor> providers = HeapDumpProviderRegistry.instance()
                .getHeapDumpProviders();
        for (HeapDumpProviderDescriptor heapDumpProviderDescriptor : providers) {
            TableItem item = new TableItem(availableProvidersTable, SWT.NONE, 0);
            item.setData(new AnnotatedObjectArgumentsSet(heapDumpProviderDescriptor));
            item.setText(0, heapDumpProviderDescriptor.getName());
            if (heapDumpProviderDescriptor.getHelp() != null)
                item.setText(1, heapDumpProviderDescriptor.getHelp());
        }

        availableProvidersTable.layout();
        availableProvidersTable.pack();
    }

    private void createArgumentsTable(Composite parent) {
        ScrolledComposite composite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);

        composite.setLayout(new GridLayout());
        composite.setExpandHorizontal(true);
        composite.setExpandVertical(true);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(composite);

        Composite tableComposite = new Composite(composite, SWT.NONE);
        GridDataFactory.fillDefaults().grab(true, true).indent(0, 0).applyTo(tableComposite);

        Dialog.applyDialogFont(composite);
        table = new ProviderArgumentsTable(tableComposite, SWT.FULL_SELECTION | SWT.SINGLE);

        tableComposite.layout();
        tableComposite.pack();

        composite.setContent(tableComposite);
        GridDataFactory.fillDefaults().hint(300, 100).grab(true, true).span(1, 2).applyTo(composite);
    }

    public void relocateHelp(final boolean create) {
        final AnnotatedObjectArgumentsSet argumentSet = table.getArgumentSet();
        if (argumentSet == null)
            return;

        if (argumentSet.getDescriptor().isHelpAvailable() && //
                (create || (helpPopup != null && helpPopup.getShell() != null))) {
            if (getShell() == null) {
                helpPopup.close();
                return;
            }
            getShell().getDisplay().timerExec(100, new Runnable() {
                public void run() {
                    if (getShell() != null && !getShell().isDisposed()) {
                        Rectangle myBounds = getShell().getBounds();
                        Rectangle helpBounds = new Rectangle(myBounds.x, myBounds.y + myBounds.height,
                                myBounds.width, SWT.DEFAULT);

                        if (helpPopup != null) {
                            if (!create) {
                                helpPopup.resize(helpBounds);
                                return;
                            } else {
                                // Get ready to create a new pop-up with new help text
                                helpPopup.close();
                            }
                        }

                        helpPopup = new QueryContextHelp(getShell(), argumentSet.getDescriptor(), helpBounds);
                        helpPopup.open();
                    }
                }
            });
        }
    }
}