/******************************************************************************* * Copyright (c) 2012 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 java.util.List; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.wazaabi.engine.core.gef.EditPartViewer; import org.eclipse.wazaabi.engine.edp.EDPUtils; import org.eclipse.wazaabi.engine.edp.coderesolution.AbstractCodeDescriptor; import org.eclipse.wazaabi.mm.core.styles.collections.DynamicProvider; public class DynamicContentProvider implements IStructuredContentProvider, ITreeContentProvider { private static final Object[] EMPTY_ARRAY = {}; private AbstractCodeDescriptor.MethodDescriptor getChildrenMethodDescriptor = null; // TODO : very bad and verbose code // we should be able to get the codeDescriptor from the methodDescriptor private AbstractCodeDescriptor getChildrenCodeDescriptor = null; private AbstractCodeDescriptor.MethodDescriptor getParentMethodDescriptor = null; private AbstractCodeDescriptor getParentCodeDescriptor = null; private AbstractCodeDescriptor.MethodDescriptor hasChildrenMethodDescriptor = null; private AbstractCodeDescriptor hasChildrenCodeDescriptor = null; public DynamicContentProvider() { System.out.println("create Dynamic content provider"); } public void updateDynamicProviderURIs( List<DynamicProvider> dynamicProviders, EditPartViewer editPartViewer) { for (DynamicProvider dynamicProvider : dynamicProviders) { String uri = dynamicProvider.getUri(); 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( "getChildren", new String[] { "parent" }, new Class[] { Object.class }, List.class); //$NON-NLS-1$ if (methodDescriptor != null) { getChildrenMethodDescriptor = methodDescriptor; getChildrenCodeDescriptor = codeDescriptor; } methodDescriptor = codeDescriptor .getMethodDescriptor( "getParent", new String[] { "element" }, new Class[] { Object.class }, Object.class); //$NON-NLS-1$ if (methodDescriptor != null) { getParentMethodDescriptor = methodDescriptor; getParentCodeDescriptor = codeDescriptor; } methodDescriptor = codeDescriptor .getMethodDescriptor( "hasChildren", new String[] { "element" }, new Class[] { Object.class }, Boolean.class); //$NON-NLS-1$ if (methodDescriptor != null) { hasChildrenMethodDescriptor = methodDescriptor; hasChildrenCodeDescriptor = codeDescriptor; } } } } public void dispose() { // TODO Auto-generated method stub } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // TODO Auto-generated method stub } public Object[] getElements(Object inputElement) { if (getChildrenMethodDescriptor != null && getChildrenCodeDescriptor != null) { List<?> children = (List<?>) getChildrenCodeDescriptor .invokeMethod(getChildrenMethodDescriptor, new Object[] { inputElement }); if (children != null) return children.toArray(); } return EMPTY_ARRAY; } public Object[] getChildren(Object parentElement) { return getElements(parentElement); } public Object getParent(Object element) { if (getParentMethodDescriptor != null && getParentCodeDescriptor != null) { return getParentCodeDescriptor.invokeMethod( getParentMethodDescriptor, new Object[] { element }); } return null; } public boolean hasChildren(Object element) { if (hasChildrenMethodDescriptor != null && hasChildrenCodeDescriptor != null) { return (Boolean) hasChildrenCodeDescriptor.invokeMethod( hasChildrenMethodDescriptor, new Object[] { element }); } return false; } }