com.google.dart.tools.ui.internal.dialogs.OverrideMethodDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.google.dart.tools.ui.internal.dialogs.OverrideMethodDialog.java

Source

/*
 * Copyright (c) 2011, the Dart project authors.
 * 
 * Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
 * 
 * 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.
 */
package com.google.dart.tools.ui.internal.dialogs;

import com.google.dart.core.dom.ITypeBinding;
import com.google.dart.tools.core.model.CompilationUnit;
import com.google.dart.tools.core.model.DartModelException;
import com.google.dart.tools.core.model.Method;
import com.google.dart.tools.core.model.Type;
import com.google.dart.tools.ui.CodeTemplateContextType;
import com.google.dart.tools.ui.DartToolsPlugin;
import com.google.dart.tools.ui.DartPluginImages;
import com.google.dart.tools.ui.DartUIMessages;
import com.google.dart.tools.ui.Messages;
import com.google.dart.tools.ui.internal.text.DartHelpContextIds;
import com.google.dart.tools.ui.internal.text.editor.CompilationUnitEditor;
import com.google.dart.tools.ui.internal.util.ViewerPane;
import com.google.dart.tools.ui.internal.viewsupport.BindingLabelProvider;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
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.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;

import java.util.ArrayList;
import java.util.HashSet;

public class OverrideMethodDialog extends SourceActionDialog {

    private class OverrideFlatTreeAction extends Action {

        private boolean fToggle;

        public OverrideFlatTreeAction() {
            setToolTipText(DartUIMessages.OverrideMethodDialog_groupMethodsByTypes);

            DartPluginImages.setLocalImageDescriptors(this, "impl_co.gif"); //$NON-NLS-1$

            fToggle = getOverrideContentProvider().isShowTypes();
            setChecked(fToggle);
        }

        @Override
        public void run() {
            // http://bugs.eclipse.org/bugs/show_bug.cgi?id=39264
            Object[] elementList = getOverrideContentProvider().getViewer().getCheckedElements();
            fToggle = !fToggle;
            setChecked(fToggle);
            getOverrideContentProvider().setShowTypes(fToggle);
            getOverrideContentProvider().getViewer().setCheckedElements(elementList);
        }

        private OverrideMethodContentProvider getOverrideContentProvider() {
            return (OverrideMethodContentProvider) getContentProvider();
        }

    }

    //  private static class OverrideMethodComparator extends ViewerComparator {
    //
    //    private ITypeBinding[] fAllTypes = new ITypeBinding[0];
    //
    //    public OverrideMethodComparator(ITypeBinding curr) {
    //      if (curr != null) {
    //        ITypeBinding[] superTypes = Bindings.getAllSuperTypes(curr);
    //        fAllTypes = new ITypeBinding[superTypes.length + 1];
    //        fAllTypes[0] = curr;
    //        System.arraycopy(superTypes, 0, fAllTypes, 1, superTypes.length);
    //      }
    //    }
    //
    //    /*
    //     * @see ViewerSorter#compare(Viewer, Object, Object)
    //     */
    //    @Override
    //    public int compare(Viewer viewer, Object first, Object second) {
    //      if (first instanceof ITypeBinding && second instanceof ITypeBinding) {
    //        final ITypeBinding left = (ITypeBinding) first;
    //        final ITypeBinding right = (ITypeBinding) second;
    //        if (right.getQualifiedName().equals("java.lang.Object")) {
    //          return -1;
    //        }
    //        if (left.isEqualTo(right)) {
    //          return 0;
    //        }
    //        if (Bindings.isSuperType(left, right)) {
    //          return +1;
    //        } else if (Bindings.isSuperType(right, left)) {
    //          return -1;
    //        }
    //        return 0;
    //      } else {
    //        return super.compare(viewer, first, second);
    //      }
    //    }
    //  }

    private static class OverrideMethodContentProvider implements ITreeContentProvider {

        private final Object[] fEmpty = new Object[0];

        private Method[] fMethods;

        private IDialogSettings fSettings;

        private boolean fShowTypes;

        // private Object[] fTypes;

        private ContainerCheckedTreeViewer fViewer;

        private final String SETTINGS_SECTION = "OverrideMethodDialog"; //$NON-NLS-1$

        private final String SETTINGS_SHOWTYPES = "showtypes"; //$NON-NLS-1$

        /**
         * Constructor for OverrideMethodContentProvider.
         */
        public OverrideMethodContentProvider() {
            IDialogSettings dialogSettings = DartToolsPlugin.getDefault().getDialogSettings();
            fSettings = dialogSettings.getSection(SETTINGS_SECTION);
            if (fSettings == null) {
                fSettings = dialogSettings.addNewSection(SETTINGS_SECTION);
                fSettings.put(SETTINGS_SHOWTYPES, true);
            }
            fShowTypes = fSettings.getBoolean(SETTINGS_SHOWTYPES);
        }

        /*
         * @see IContentProvider#dispose()
         */
        @Override
        public void dispose() {
        }

        /*
         * @see ITreeContentProvider#getChildren(Object)
         */
        @Override
        public Object[] getChildren(Object parentElement) {
            if (parentElement instanceof CompilationUnit) {
                ArrayList<Method> result = new ArrayList<Method>(fMethods.length);
                for (int index = 0; index < fMethods.length; index++) {
                    if (fMethods[index].getCompilationUnit() == parentElement) {
                        result.add(fMethods[index]);
                    }
                }
                return result.toArray();
            }
            return fEmpty;
        }

        /*
         * @see IStructuredContentProvider#getElements(Object)
         */
        @Override
        public Object[] getElements(Object inputElement) {
            return fMethods;
        }

        /*
         * @see ITreeContentProvider#getParent(Object)
         */
        @Override
        public Object getParent(Object element) {
            if (element instanceof Method) {
                return ((Method) element).getCompilationUnit();
            }
            return null;
        }

        public ContainerCheckedTreeViewer getViewer() {
            return fViewer;
        }

        /*
         * @see ITreeContentProvider#hasChildren(Object)
         */
        @Override
        public boolean hasChildren(Object element) {
            return getChildren(element).length > 0;
        }

        public void init(Method[] methods) {
            fMethods = methods;
            // fTypes= types;
        }

        /*
         * @see IContentProvider#inputChanged(Viewer, Object, Object)
         */
        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            fViewer = (ContainerCheckedTreeViewer) viewer;
        }

        public boolean isShowTypes() {
            return fShowTypes;
        }

        public void setShowTypes(boolean showTypes) {
            if (fShowTypes != showTypes) {
                fShowTypes = showTypes;
                fSettings.put(SETTINGS_SHOWTYPES, showTypes);
                if (fViewer != null) {
                    fViewer.refresh();
                }
            }
        }
    }

    private static class OverrideMethodValidator implements ISelectionStatusValidator {

        private static int fNumMethods;

        public OverrideMethodValidator(int entries) {
            fNumMethods = entries;
        }

        /*
         * @see ISelectionValidator#validate(Object[])
         */
        @Override
        public IStatus validate(Object[] selection) {
            int count = 0;
            for (int index = 0; index < selection.length; index++) {
                if (selection[index] instanceof Method) {
                    count++;
                }
            }
            if (count == 0) {
                return new StatusInfo(IStatus.ERROR, ""); //$NON-NLS-1$
            }
            return new StatusInfo(IStatus.INFO,
                    Messages.format(DartUIMessages.OverrideMethodDialog_selectioninfo_more,
                            new String[] { String.valueOf(count), String.valueOf(fNumMethods) }));
        }
    }

    private static final boolean SHOW_ONLY_SUPER = true;

    @SuppressWarnings("unused")
    private static ITypeBinding getSuperType(final ITypeBinding binding, final String name) {

        if (binding.isArray() || binding.isPrimitive()) {
            return null;
        }

        if (binding.getQualifiedName().startsWith(name)) {
            return binding;
        }

        final ITypeBinding type = binding.getSuperclass();
        if (type != null) {
            final ITypeBinding result = getSuperType(type, name);
            if (result != null) {
                return result;
            }
        }
        return null;
    }

    private CompilationUnit fUnit = null;

    public OverrideMethodDialog(Shell shell, CompilationUnitEditor editor, Type type, boolean isSubType)
            throws DartModelException {
        super(shell, new BindingLabelProvider(), new OverrideMethodContentProvider(), editor, type, false);

        //      IMethod[] methods = type.getMethods();
        String parentName = type.getSuperclassName();
        Type superType = type.getLibrary().findType(parentName);
        // TODO(brianwilkerson) Do the following two lines need to filter out
        // constructors?
        Method pMethods[] = superType.getMethods();
        Method tMethods[] = type.getMethods();

        Method parentMethods[] = new Method[0];

        if (OverrideMethodDialog.SHOW_ONLY_SUPER) {

            ArrayList<Method> show = new ArrayList<Method>();
            start: for (int i = 0; pMethods != null && i < pMethods.length; i++) {
                for (int k = 0; k < tMethods.length; k++) {
                    if (tMethods[k].getElementName().equals(pMethods[i].getElementName())) {
                        continue start;
                    }
                }
                show.add(pMethods[i]);

            }
            parentMethods = show.toArray(new Method[show.size()]);

        }

        // IMethodBinding[] toImplementArray= (IMethodBinding[])
        // toImplement.toArray(new IMethodBinding[toImplement.size()]);
        setInitialSelections(parentMethods);

        HashSet<Method> expanded = new HashSet<Method>(parentMethods.length);
        for (int i = 0; i < parentMethods.length; i++) {
            expanded.add(parentMethods[i]);
        }

        HashSet<Method> types = new HashSet<Method>(parentMethods.length);
        for (int i = 0; i < parentMethods.length; i++) {
            types.add(parentMethods[i]);
        }

        Method[] typesArrays = types.toArray(new Method[types.size()]);
        //OverrideMethodComparator comparator = null;// new OverrideMethodComparator(binding);
        if (expanded.isEmpty() && typesArrays.length > 0) {
            //comparator.sort(null, typesArrays);
            expanded.add(typesArrays[0]);
        }
        setExpandedElements(expanded.toArray());

        ((OverrideMethodContentProvider) getContentProvider()).init(parentMethods);

        setTitle(DartUIMessages.OverrideMethodDialog_dialog_title);
        setMessage(null);
        setValidator(new OverrideMethodValidator(parentMethods.length));
        // TODO(devoncarew): replace this with OverrideMethodComparator
        setComparator(new ViewerComparator());
        setContainerMode(true);
        setSize(60, 18);
        setInput(new Object());
    }

    public CompilationUnit getCompilationUnit() {
        return fUnit;
    }

    public boolean hasMethodsToOverride() {
        return getContentProvider().getElements(null).length > 0;
    }

    /*
     * @see org.eclipse.jface.window.Window#configureShell(Shell)
     */
    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
                DartHelpContextIds.OVERRIDE_TREE_SELECTION_DIALOG);
    }

    /*
     * @see com.google.dart.tools.ui.dialogs.SourceActionDialog#createLinkControl(org
     * .eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createLinkControl(Composite composite) {
        Link link = new Link(composite, SWT.WRAP);
        link.setText(DartUIMessages.OverrideMethodDialog_link_message);
        link.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                openCodeTempatePage(CodeTemplateContextType.OVERRIDECOMMENT_ID);
            }
        });
        link.setToolTipText(DartUIMessages.OverrideMethodDialog_link_tooltip);

        GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
        gridData.widthHint = convertWidthInCharsToPixels(40); // only expand further
        // if anyone else requires it
        link.setLayoutData(gridData);
        return link;
    }

    /*
     * @see CheckedTreeSelectionDialog#createTreeViewer(Composite)
     */
    @Override
    protected CheckboxTreeViewer createTreeViewer(Composite composite) {
        initializeDialogUnits(composite);
        ViewerPane pane = new ViewerPane(composite, SWT.BORDER | SWT.FLAT);
        pane.setText(DartUIMessages.OverrideMethodDialog_dialog_description);
        CheckboxTreeViewer treeViewer = super.createTreeViewer(pane);
        pane.setContent(treeViewer.getControl());
        GridLayout paneLayout = new GridLayout();
        paneLayout.marginHeight = 0;
        paneLayout.marginWidth = 0;
        paneLayout.numColumns = 1;
        pane.setLayout(paneLayout);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = convertWidthInCharsToPixels(55);
        gd.heightHint = convertHeightInCharsToPixels(15);
        pane.setLayoutData(gd);
        ToolBarManager manager = pane.getToolBarManager();
        manager.add(new OverrideFlatTreeAction()); // create after tree is created
        manager.update(true);
        treeViewer.getTree().setFocus();
        return treeViewer;
    }

}