/*******************************************************************************
* 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", new String[] { "element1", "element2" }, new Class[] { Object.class, Object.class }, int.class); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (methodDescriptor != null) {
getCompareMethodDescriptor = methodDescriptor;
getCompareCodeDescriptor = codeDescriptor;
}
methodDescriptor = codeDescriptor
.getMethodDescriptor(
"isSorterProperty", new String[] { "element", "property" }, new Class[] { Object.class, String.class }, boolean.class); //$NON-NLS-1$ //$NON-NLS-2$
if (methodDescriptor != null) {
getIsSorterPropertyMethodDescriptor = methodDescriptor;
getIsSorterPropertyCodeDescriptor = codeDescriptor;
}
methodDescriptor = codeDescriptor
.getMethodDescriptor(
"sort", new String[] { "elements" }, new Class[] { Object[].class }, null); //$NON-NLS-1$ //$NON-NLS-2$
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);
}
}