org.eclipse.wazaabi.engine.swt.commons.views.collections.DynamicComparatorProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.wazaabi.engine.swt.commons.views.collections.DynamicComparatorProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Olivier Moises
 *
 * 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:
 *   Olivier Moises- initial API and implementation
 *******************************************************************************/

package org.eclipse.wazaabi.engine.swt.commons.views.collections;

import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.wazaabi.engine.core.gef.EditPartViewer;
import org.eclipse.wazaabi.engine.edp.EDPUtils;
import org.eclipse.wazaabi.engine.edp.coderesolution.AbstractCodeDescriptor;

public class DynamicComparatorProvider extends ViewerComparator {

    private AbstractCodeDescriptor.MethodDescriptor getCategoryMethodDescriptor = null;
    private AbstractCodeDescriptor.MethodDescriptor getCompareMethodDescriptor = null;
    private AbstractCodeDescriptor.MethodDescriptor getIsSorterPropertyMethodDescriptor = null;
    private AbstractCodeDescriptor.MethodDescriptor getSortMethodDescriptor = null;
    // TODO : very bad and verbose code
    // we should be able to get the codeDescriptor from the methodDescriptor
    private AbstractCodeDescriptor getCategoryCodeDescriptor = null;
    private AbstractCodeDescriptor getCompareCodeDescriptor = null;
    private AbstractCodeDescriptor getIsSorterPropertyCodeDescriptor = null;
    private AbstractCodeDescriptor getSortCodeDescriptor = null;

    public void updateDynamicProviderURI(String uri, EditPartViewer editPartViewer, StructuredViewer viewer) {
        if (uri == null || uri.length() == 0)
            return;
        String baseURI = editPartViewer.getCodeLocatorBaseUri();
        if (baseURI != null && baseURI.length() != 0)
            uri = EDPUtils.normalizeURI(baseURI, uri);
        AbstractCodeDescriptor codeDescriptor = (AbstractCodeDescriptor) editPartViewer.createComponent(this, uri,
                null, AbstractCodeDescriptor.class);
        if (codeDescriptor != null) {
            AbstractCodeDescriptor.MethodDescriptor methodDescriptor = codeDescriptor.getMethodDescriptor(
                    "category", new String[] { "element" }, new Class[] { Object.class }, int.class); //$NON-NLS-1$ //$NON-NLS-2$
            if (methodDescriptor != null) {
                getCategoryMethodDescriptor = methodDescriptor;
                getCategoryCodeDescriptor = codeDescriptor;
            }
            methodDescriptor = codeDescriptor.getMethodDescriptor("compare", //$NON-NLS-1$
                    new String[] { "element1", "element2" }, new Class[] { Object.class, Object.class }, int.class); //$NON-NLS-1$ //$NON-NLS-2$
            if (methodDescriptor != null) {
                getCompareMethodDescriptor = methodDescriptor;
                getCompareCodeDescriptor = codeDescriptor;
            }

            methodDescriptor = codeDescriptor.getMethodDescriptor("isSorterProperty", //$NON-NLS-1$
                    new String[] { "element", "property" }, new Class[] { Object.class, String.class }, //$NON-NLS-1$
                    boolean.class);
            if (methodDescriptor != null) {
                getIsSorterPropertyMethodDescriptor = methodDescriptor;
                getIsSorterPropertyCodeDescriptor = codeDescriptor;
            }
            methodDescriptor = codeDescriptor.getMethodDescriptor("sort", new String[] { "elements" }, //$NON-NLS-1$//$NON-NLS-2$
                    new Class[] { Object[].class }, null);
            if (methodDescriptor != null) {
                getSortMethodDescriptor = methodDescriptor;
                getSortCodeDescriptor = codeDescriptor;
            }
        }
    }

    @Override
    public int category(Object element) {
        if (getCategoryMethodDescriptor != null && getCategoryCodeDescriptor != null)
            return (Integer) getCategoryCodeDescriptor.invokeMethod(getCategoryMethodDescriptor,
                    new Object[] { element });
        return super.category(element);
    }

    @Override
    public int compare(Viewer viewer, Object e1, Object e2) {
        if (getCompareMethodDescriptor != null && getCompareCodeDescriptor != null)
            return (Integer) getCompareCodeDescriptor.invokeMethod(getCompareMethodDescriptor,
                    new Object[] { e1, e2 });
        return super.compare(viewer, e1, e2);
    }

    @Override
    public boolean isSorterProperty(Object element, String property) {
        if (getIsSorterPropertyMethodDescriptor != null && getIsSorterPropertyCodeDescriptor != null)
            return (Boolean) getIsSorterPropertyCodeDescriptor.invokeMethod(getIsSorterPropertyMethodDescriptor,
                    new Object[] { element, property });
        return super.isSorterProperty(element, property);
    }

    @Override
    public void sort(Viewer viewer, Object[] elements) {
        if (getSortMethodDescriptor != null && getSortCodeDescriptor != null)
            getSortCodeDescriptor.invokeMethod(getSortMethodDescriptor, new Object[] { elements });
        else
            super.sort(viewer, elements);
    }

}