/**
* Copyright 2010 The University of North Carolina at Chapel Hill
*
* Licensed 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.
*/
package unc.lib.cdr.workbench.arrange;
//import gov.loc.mets.DivType;
import gov.loc.mets.AmdSecType;
import gov.loc.mets.DivType;
import gov.loc.mets.FileType;
import gov.loc.mets.MdSecType;
import gov.loc.mets.MetsType;
import gov.loc.mets.SmLinkType;
import gov.loc.mets.StructLinkType;
import gov.loc.mets.util.METSConstants;
import gov.loc.mets.util.METSUtils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.views.properties.IPropertySource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import unc.lib.cdr.workbench.originals.OriginalFileStore;
import unc.lib.cdr.workbench.project.ICustomEObjectBucket;
import unc.lib.cdr.workbench.project.MetsProjectNature;
public class ArrangementContentProvider extends AdapterFactoryContentProvider /* implements IResourceChangeListener */{
private static final Logger log = LoggerFactory.getLogger(ArrangementContentProvider.class);
private TreeViewer tviewer = null;
// private AdapterFactoryContentProvider provider = new
// AdapterFactoryContentProvider(MetsProjectNature.getAdapterFactory());
// private static final Class<?> ITreeItemContentProviderClass =
// ITreeItemContentProvider.class;
// private TreeViewer viewer = null;
public ArrangementContentProvider() {
super(MetsProjectNature.getAdapterFactory());
// ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
MetsProjectNature.getAdapterFactory().addListener(this);
}
/*
* Returns the Original File Sets for a project and descendents. (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang. Object)
*/
@Override
public Object[] getChildren(Object parent) {
// log.debug("getChildren: {}", parent.toString());
List<Object> results = new ArrayList<Object>();
try {
if (parent instanceof IProject) {
IProject p = (IProject) parent;
if (p.isOpen()) {
MetsProjectNature n = (MetsProjectNature) p.getNature(MetsProjectNature.NATURE_ID);
results.add(n.getArrangementElement());
}
} else if (parent instanceof ArrangementProjectElement) {
MetsType mets = null;
ArrangementProjectElement e = (ArrangementProjectElement) parent;
// return all the snapshots of this URI
mets = e.getProjectNature().getMets();
return METSUtils.findBagDiv(mets).getDiv().toArray();
// ITreeItemContentProvider treeItemContentProvider =
// (ITreeItemContentProvider) MetsProjectNature
// .getAdapterFactory().adapt(METSUtils.findBagDiv(mets),
// ITreeItemContentProviderClass);
// if (treeItemContentProvider != null) {
// results.addAll(treeItemContentProvider.getChildren(METSUtils.findBagDiv(mets)));
// } else {
// log.debug("Cannot find tree item provider for bag div");
// }
} else if (parent instanceof DivType) {
DivType div = (DivType) parent;
MetsType mets = MetsProjectNature.getNatureForMetsObject(div).getMets();
if (mets.getStructLink() != null && mets.getStructLink().getSmLink() != null) {
for (SmLinkType l : mets.getStructLink().getSmLink()) {
if (div.equals(l.getXlinkFrom())) {
results.add(l);
}
}
}
for (Object o : super.getChildren(parent)) {
results.add(o);
}
} else if (parent instanceof ICustomEObjectBucket) {
ICustomEObjectBucket bucket = (ICustomEObjectBucket) parent;
return bucket.getChildren();
} else {
for (Object o : super.getChildren(parent)) {
results.add(o);
}
}
/*
* else if (parent instanceof DivType) { ITreeItemContentProvider treeItemContentProvider =
* (ITreeItemContentProvider) MetsProjectNature .getAdapterFactory().adapt(parent,
* ITreeItemContentProviderClass); if (treeItemContentProvider != null) {
* results.addAll(treeItemContentProvider.getChildren(parent)); } }
*/
} catch (CoreException e) {
throw new Error(e);
}
return results.toArray();
}
@Override
public Object getParent(Object element) {
if (element instanceof ArrangementProjectElement) {
return ((ArrangementProjectElement) element).getParent();
} else if (element instanceof ICustomEObjectBucket) {
return ((ICustomEObjectBucket) element).getParent();
} else {
return super.getParent(element);
}
/*
* else if (element instanceof EObject) { ITreeItemContentProvider treeItemContentProvider =
* (ITreeItemContentProvider) MetsProjectNature .getAdapterFactory().adapt(element,
* ITreeItemContentProviderClass); if (treeItemContentProvider != null) { return
* treeItemContentProvider.getParent(element); } } return null;
*/
}
@Override
public boolean hasChildren(Object element) {
// log.debug("hasChildren: {}", element.toString());
if (element instanceof IProject) {
return true;
} else if (element instanceof ArrangementProjectElement) {
return true;
} else if (element instanceof ICustomEObjectBucket) {
return true;
} else {
return super.hasChildren(element);
}
/*
* else if (element instanceof DivType) { DivType d = (DivType) element; if (d.getDiv().size() > 0) { return true;
* } else { return false; } } else { return false; }
*/
}
@Override
public Object[] getElements(Object element) {
return this.getChildren(element);
}
@Override
public IPropertySource getPropertySource(Object object) {
log.debug("getPropertySource called with {}", object);
return super.getPropertySource(object);
}
@Override
public void dispose() {
// ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
MetsProjectNature.getAdapterFactory().removeListener(this);
super.dispose();
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.viewer = viewer;
this.tviewer = (TreeViewer) viewer;
super.inputChanged(viewer, oldInput, newInput);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.edit.provider.INotifyChangedListener#notifyChanged(org
* .eclipse.emf.common.notify.Notification)
*/
@Override
public void notifyChanged(final Notification notification) {
if (tviewer != null) {
final Set<Object> updates = new HashSet<Object>();
if (notification.getNotifier() instanceof FileType) {
FileType f = (FileType) notification.getNotifier();
OriginalFileStore orig = MetsProjectNature.getOriginal(f);
updates.add(orig);
updates.add(orig.getMetsDivType());
} else if (notification.getNotifier() instanceof DivType) {
DivType d = (DivType) notification.getNotifier();
if (METSConstants.Div_Bag.equals(d.getTYPE())) {
updates.add(MetsProjectNature.getNatureForMetsObject(d).getArrangementElement());
updates.add(d);
} else if (METSConstants.Div_File.equals(d.getTYPE())) {
updates.add(d);
updates.add(MetsProjectNature.getOriginalFileStore(d));
} else {
updates.add(d);
}
} else if (notification.getNotifier() instanceof MetsType) {
MetsType mets = (MetsType) notification.getNotifier();
if (notification.getOldValue() instanceof MdSecType) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (tviewer != null && tviewer.getControl() != null && !tviewer.getControl().isDisposed()) {
tviewer.refresh();
}
}
});
}
} else if(notification.getNotifier() instanceof AmdSecType) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (tviewer != null && tviewer.getControl() != null && !tviewer.getControl().isDisposed()) {
tviewer.refresh();
}
}
});
} else if(notification.getNotifier() instanceof StructLinkType) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (tviewer != null && tviewer.getControl() != null && !tviewer.getControl().isDisposed()) {
tviewer.refresh();
}
}
});
}
if (updates.size() > 0) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (tviewer != null && tviewer.getControl() != null && !tviewer.getControl().isDisposed()) {
for (Object o : updates) {
if (o != null)
tviewer.refresh(o, true);
}
}
}
});
}
}
}
}