fede.workspace.eclipse.java.fields.MethodField.java Source code

Java tutorial

Introduction

Here is the source code for fede.workspace.eclipse.java.fields.MethodField.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * Copyright (C) 2006-2010 Adele Team/LIG/Grenoble University, France
 */
package fede.workspace.eclipse.java.fields;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;

import fede.workspace.tool.view.WSPlugin;
import fr.imag.adele.cadse.core.Item;
import fr.imag.adele.cadse.si.workspace.uiplatform.swt.ui.DAbstractField;

/**
 * The Class MethodField.
 * 
 * @author <a href="mailto:stephane.chomat@imag.fr">Stephane Chomat</a>
 */
public class MethodField<IC extends IMethodInteractiveController> extends DAbstractField<IC> {

    /**
     * Instantiates a new method field.
     * 
     * @param key
     *            the key
     * @param label
     *            the label
     * @param poslabel
     *            the poslabel
     * @param mc
     *            the mc
     * @param ic
     *            the ic
     */
    public MethodField() {
    }

    /** The JAV a_ elemen t_ labe l_ provider. */
    private final JavaElementLabelProvider JAVA_ELEMENT_LABEL_PROVIDER = new JavaElementLabelProvider(
            JavaElementLabelProvider.SHOW_DEFAULT);

    /** The package table. */
    private Tree packageTable;

    /** The method selected. */
    private IMethod methodSelected = null;

    /** The select button. */
    private Button selectButton;

    /*
     * (non-Javadoc)
     * 
     * @see fr.imag.adele.cadse.core.ui.UIField#createControl(fr.imag.adele.cadse.core.ui.IPageController,
     *      fr.imag.adele.cadse.core.ui.IFedeFormToolkit, java.lang.Object, int)
     */
    @Override
    public void createControl(Composite container, int hspan) {
        GridData gd;
        packageTable = new Tree((Composite) container, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.heightHint = 65;
        gd.verticalSpan = 1;
        gd.horizontalSpan = hspan - 1;
        packageTable.setLayoutData(gd);

        selectButton = new Button((Composite) container, SWT.PUSH);
        selectButton.setText("...");
        selectButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(@SuppressWarnings("unused") SelectionEvent e) {
                IMethod oldm = methodSelected;
                handleSelect();
                if (oldm != methodSelected) {
                    _swtuiplatform.broadcastValueChanged(_page, _field, getVisualValue());
                }

            }
        });
        gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
        gd.verticalSpan = 1;
        gd.horizontalSpan = 1;
        selectButton.setLayoutData(gd);
    }

    /*
     * (non-Javadoc)
     * 
     * @see fr.imag.adele.cadse.core.ui.UIField#thisFieldHasChanged()
     */
    @Override
    public void thisFieldHasChanged() {
        selectButton.setEnabled(getReferencedItem() != null);
    }

    /**
     * Gets the method.
     * 
     * @return the method
     */
    public IMethod getMethod() {
        return methodSelected;
    }

    /**
     * Sets the method.
     * 
     * @param m
     *            the new method
     */
    protected void setMethod(IMethod m) {
        packageTable.removeAll();

        IType t = getType(m);
        if (t == null) {
            return;
        }

        IPackageFragment p = getPackage(t);
        if (p == null) {
            return;
        }

        this.methodSelected = m;

        packageTable.removeAll();

        TreeItem pi = new TreeItem(packageTable, SWT.NONE);
        pi.setText(JAVA_ELEMENT_LABEL_PROVIDER.getText(p));
        pi.setImage(JAVA_ELEMENT_LABEL_PROVIDER.getImage(p));

        TreeItem ti = new TreeItem(pi, SWT.NONE);
        ti.setText(JAVA_ELEMENT_LABEL_PROVIDER.getText(t));
        ti.setImage(JAVA_ELEMENT_LABEL_PROVIDER.getImage(t));

        TreeItem mi = new TreeItem(ti, SWT.NONE);
        mi.setText(JAVA_ELEMENT_LABEL_PROVIDER.getText(m));
        mi.setImage(JAVA_ELEMENT_LABEL_PROVIDER.getImage(m));

        pi.setExpanded(true);
        ti.setExpanded(true);
    }

    /**
     * Handle select.
     */
    protected void handleSelect() {

        IMethod m = chooseMethod();
        if (m == null) {
            return;
        }

        setMethod(m);

    }

    /**
     * Gets the package.
     * 
     * @param t
     *            the t
     * 
     * @return the package
     */
    private IPackageFragment getPackage(IType t) {
        IJavaElement je = t.getParent();
        while (je != null) {
            if (je instanceof IPackageFragment) {
                return (IPackageFragment) je;
            }
            je = je.getParent();
        }
        return null;
    }

    /**
     * Gets the type.
     * 
     * @param m
     *            the m
     * 
     * @return the type
     */
    private IType getType(IMethod m) {
        IJavaElement je = m.getParent();
        while (je != null) {
            if (je instanceof IType) {
                return (IType) je;
            }
            je = je.getParent();
        }
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see fr.imag.adele.cadse.core.ui.UIField#setVisualValue(java.lang.Object)
     */
    public void setVisualValue(Object visualValue, boolean sendNotification) {
        String methodString = (String) visualValue;
        if (methodString != null) {
            IMethod m = (IMethod) JavaCore.create(methodString);
            if (m != null) {
                setMethod(m);
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see fr.imag.adele.cadse.core.ui.UIField#getVisualValue()
     */
    @Override
    public Object getVisualValue() {
        return getMethod() == null ? null : getMethod().getHandleIdentifier();
    }

    /**
     * Choose method.
     * 
     * @return the i method
     */
    private IMethod chooseMethod() {
        IJavaElement[] packages = getPackageFragment();

        if (packages == null) {
            packages = new IJavaElement[0];
        }

        StandardJavaElementContentProvider standardJavaElementContentProvider = new StandardJavaElementContentProvider(
                true) {
            @Override
            public Object[] getChildren(Object element) {
                if (element instanceof IJavaElement[]) {
                    return (Object[]) element;
                }
                if (element instanceof IPackageFragment) {
                    try {
                        return mygetPackageContents((IPackageFragment) element);
                    } catch (JavaModelException e) {
                        return new Object[0];
                    }
                }

                return super.getChildren(element);
            }

            private Object[] mygetPackageContents(IPackageFragment fragment) throws JavaModelException {
                List<IType> types = new ArrayList<IType>();
                if (fragment.getKind() == IPackageFragmentRoot.K_SOURCE) {
                    ICompilationUnit[] cu = fragment.getCompilationUnits();
                    for (ICompilationUnit oneCu : cu) {
                        types.addAll(Arrays.asList(oneCu.getTypes()));
                    }
                    return types.toArray();
                    // concatenate(fragment.getCompilationUnits(),
                    // fragment.getNonJavaResources());
                }
                IClassFile[] cfs = fragment.getClassFiles();
                for (IClassFile cf : cfs) {
                    types.add(cf.getType());
                }
                return types.toArray();
                // return concatenate(fragment.getClassFiles(),
                // fragment.getNonJavaResources());
            }

            @Override
            public boolean hasChildren(Object element) {
                if (element instanceof IJavaElement[]) {
                    return true;
                }
                return super.hasChildren(element);
            }
        };
        ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(packageTable.getShell(),
                JAVA_ELEMENT_LABEL_PROVIDER, standardJavaElementContentProvider);
        // dialog.setIgnoreCase(false);
        dialog.setTitle(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_title);
        dialog.setMessage(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_description);
        dialog.setEmptyListMessage(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_empty);
        dialog.setAllowMultiple(false);
        dialog.setDoubleClickSelects(false);
        dialog.setValidator(new ISelectionStatusValidator() {
            public IStatus validate(Object[] selection) {
                if (selection != null && selection.length == 1 && selection[0] instanceof IMethod) {
                    return Status.OK_STATUS;
                }
                return new Status(IStatus.ERROR, WSPlugin.PLUGIN_ID, 0, "Select a method", null);
            }
        });

        dialog.setInput(packages);

        if (methodSelected != null) {
            dialog.setInitialSelections(new Object[] { methodSelected });
        }

        if (dialog.open() == Window.OK) {
            return (IMethod) dialog.getFirstResult();
        }
        return null;
    }

    /**
     * Gets the package fragment.
     * 
     * @return the package fragment
     */
    private IPackageFragment[] getPackageFragment() {
        Item _referencedItem = getReferencedItem();
        if (_referencedItem == null) {
            return null;
        }
        return _ic.getPackageFragment(_referencedItem);
    }

    /**
     * Gets the referenced item.
     * 
     * @return the referenced item
     */
    protected Item getReferencedItem() {
        return _ic.getReferencedItem();
    }

    /**
     * Dialog has changed.
     */
    public void dialogHasChanged() {

    }

    /*
     * (non-Javadoc)
     * 
     * @see fr.imag.adele.cadse.core.ui.UIField#setEnabled(boolean)
     */
    @Override
    public void setEnabled(boolean v) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see fr.imag.adele.cadse.core.ui.UIField#setEditable(boolean)
     */
    @Override
    public void setEditable(boolean v) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see fede.workspace.model.manager.properties.impl.ui.DAbstractField#setVisible(boolean)
     */
    @Override
    public void setVisible(boolean v) {
    }

    @Override
    public Control getMainControl() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object[] getSelectedObjects() {
        // TODO Auto-generated method stub
        return null;
    }
}