blob: 01dd733c8a009b7ab7f008040b6e18bc7e2a8e54 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BSI Business Systems Integration AG.
* 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:
* BSI Business Systems Integration AG - initial API and implementation
******************************************************************************/
package org.eclipse.scout.sdk.ui.internal.view.outline;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.scout.commons.EventListenerList;
import org.eclipse.scout.sdk.Texts;
import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
import org.eclipse.scout.sdk.ui.internal.view.outline.job.LoadOutlineChildrenJob;
import org.eclipse.scout.sdk.ui.view.outline.pages.IPage;
public class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider {
private boolean m_autoLoadChildren;
private EventListenerList m_listener;
private boolean m_loadSync = false;
private IPage m_invisibleRootNode;
public ViewContentProvider() {
m_autoLoadChildren = true;
m_listener = new EventListenerList();
}
public void addContentProviderListener(IContentProviderListener listener) {
m_listener.add(IContentProviderListener.class, listener);
}
public void removeContentProviderListener(IContentProviderListener listener) {
m_listener.remove(IContentProviderListener.class, listener);
}
private void fireChildrenLoaded(IPage page) {
for (IContentProviderListener l : m_listener.getListeners(IContentProviderListener.class)) {
try {
l.handleChildrenLoaded(page);
}
catch (Exception e) {
ScoutSdkUi.logError("error during listerner notification.", e);
}
}
}
public void setAutoLoadChildren(boolean b) {
m_autoLoadChildren = b;
}
public boolean isAutoLoadChildren() {
return m_autoLoadChildren;
}
@Override
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
m_invisibleRootNode = (IPage) newInput;
}
@Override
public void dispose() {
}
/**
* root elements
*/
@Override
public Object[] getElements(Object parent) {
if (m_invisibleRootNode != null) {
return m_invisibleRootNode.getChildArray();
}
return new Object[0];
}
@Override
public Object getParent(Object child) {
if (child instanceof IPage) {
return ((IPage) child).getParent();
}
return null;
}
@Override
public Object[] getChildren(Object parent) {
if (parent instanceof IPage) {
final IPage node = (IPage) parent;
if (isAutoLoadChildren()) {
if (!node.isChildrenLoaded()) {
final LoadOutlineChildrenJob job = new LoadOutlineChildrenJob(node);
if (isLoadSync()) {
job.run(new NullProgressMonitor());
}
else {
Job.getJobManager().addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
if (event.getJob() == job) {
Job.getJobManager().removeJobChangeListener(this);
ScoutSdkUi.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
fireChildrenLoaded(node);
}
});
}
}
});
job.schedule();
try {
job.join(100);
}
catch (InterruptedException e) {
}
if (!job.isDone()) {
return new Object[]{Texts.get("Loading")};
}
}
}
}
return node.getChildArray();
}
return new Object[0];
}
@Override
public boolean hasChildren(Object parent) {
if (parent instanceof IPage) {
IPage node = (IPage) parent;
if (node.isChildrenLoaded()) {
return node.hasChildren();
}
return true;
}
return false;
}
public void setLoadSync(boolean loadSync) {
m_loadSync = loadSync;
}
public boolean isLoadSync() {
return m_loadSync;
}
}