/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* 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 org.jkiss.dbeaver.ui.navigator.database.load;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.load.ILoadVisualizer;
import org.jkiss.dbeaver.ui.LoadingJob;
/**
* TreeLoadVisualizer
*/
public class TreeLoadVisualizer implements ILoadVisualizer<Object[]> {
public static final Object[] EMPTY_ELEMENT_ARRAY = new Object[0];
private DBNNode parent;
private TreeLoadNode placeHolder;
private AbstractTreeViewer viewer;
public TreeLoadVisualizer(AbstractTreeViewer viewer, TreeLoadNode placeHolder, DBNNode parent)
{
this.viewer = viewer;
this.placeHolder = placeHolder;
this.parent = parent;
}
@Override
public DBRProgressMonitor overwriteMonitor(DBRProgressMonitor monitor)
{
return monitor;
}
@Override
public boolean isCompleted()
{
return placeHolder.isDisposed() || viewer.testFindItem(parent) == null;
}
@Override
public void visualizeLoading()
{
viewer.refresh(placeHolder, true);
}
@Override
public void completeLoading(Object[] children)
{
final Control viewerControl = viewer.getControl();
if (viewerControl.isDisposed()) {
return;
}
try {
viewerControl.setRedraw(false);
Widget widget = viewer.testFindItem(parent);
if (widget != null && !widget.isDisposed()) {
TreeItem item = (TreeItem) viewer.testFindItem(placeHolder);
if (children == null) {
// Some error occurred. In good case children must be at least an empty array
viewer.collapseToLevel(parent, -1);
} else if (children.length != 0) {
viewer.add(parent, children);
}
if (item != null && !item.isDisposed()) {
if (item.getParentItem() != null && !item.getParentItem().isDisposed() || this.parent instanceof IWorkspaceRoot) {
viewer.remove(placeHolder);
}
}
}
}
finally {
placeHolder.dispose(parent);
if (!viewerControl.isDisposed()) {
viewerControl.setRedraw(true);
}
}
}
public static Object[] expandChildren(AbstractTreeViewer viewer, TreeLoadService service)
{
DBNNode parent = service.getParentNode();
TreeLoadNode placeHolder = TreeLoadNode.createPlaceHolder(parent);
if (placeHolder != null && TreeLoadNode.canBeginLoading(parent)) {
TreeLoadVisualizer visualizer = new TreeLoadVisualizer(viewer, placeHolder, parent);
LoadingJob.createService(service, visualizer).schedule();
return new Object[]{placeHolder};
}
return EMPTY_ELEMENT_ARRAY;
}
}