blob: cdc995697a73200c758444339f2c4b705b793cef [file] [log] [blame]
/*
* Copyright (c) 2020 Eike Stepper (Loehne, Germany) and others.
* 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.internal.ui;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import java.util.Collection;
/**
* @author Eike Stepper
*/
public final class ViewerUtil
{
public static final Object[] NO_CHILDREN = {};
private ViewerUtil()
{
}
public static void update(StructuredViewer viewer, Object element)
{
update(viewer, element, true);
}
public static void update(final StructuredViewer viewer, final Object element, boolean async)
{
if (viewer != null)
{
final Control control = viewer.getControl();
if (!control.isDisposed())
{
Runnable runnable = new Runnable()
{
@Override
public void run()
{
if (!control.isDisposed())
{
if (element instanceof Object[])
{
Object[] array = (Object[])element;
viewer.update(array, null);
}
else if (element instanceof Collection)
{
Collection<?> collection = (Collection<?>)element;
viewer.update(collection.toArray(), null);
}
else
{
viewer.update(element, null);
}
}
}
};
Display display = control.getDisplay();
if (async)
{
display.asyncExec(runnable);
}
else
{
display.syncExec(runnable);
}
}
}
}
public static void refresh(StructuredViewer viewer, Object element)
{
refresh(viewer, element, true);
}
public static void refresh(final StructuredViewer viewer, final Object element, boolean async)
{
refresh(viewer, element, async, false);
}
public static void refresh(final StructuredViewer viewer, final Object element, boolean async, final boolean setSelectionBack)
{
if (viewer != null)
{
Control control = viewer.getControl();
if (!control.isDisposed())
{
Runnable runnable = new Runnable()
{
@Override
public void run()
{
if (!viewer.getControl().isDisposed())
{
ISelection selection = null;
if (setSelectionBack)
{
selection = viewer.getSelection();
}
if (element == null)
{
viewer.refresh();
}
else if (element instanceof Collection)
{
Collection<?> collection = (Collection<?>)element;
for (Object object : collection)
{
viewer.refresh(object);
}
}
else
{
viewer.refresh(element);
}
if (selection != null)
{
viewer.setSelection(selection);
}
}
}
};
Display display = control.getDisplay();
if (async)
{
display.asyncExec(runnable);
}
else
{
display.syncExec(runnable);
}
}
}
}
public static void expand(final TreeViewer viewer, final Object element, final boolean expanded)
{
if (viewer != null)
{
Tree tree = viewer.getTree();
if (!tree.isDisposed())
{
Display display = tree.getDisplay();
display.asyncExec(new Runnable()
{
@Override
public void run()
{
if (!viewer.getControl().isDisposed())
{
viewer.setExpandedState(element, expanded);
}
}
});
}
}
}
/**
* @author Eike Stepper
*/
public static final class Pending
{
private final Object parent;
private final String text;
public Pending(Object parent, String text)
{
this.parent = parent;
this.text = text;
}
public Object getParent()
{
return parent;
}
public String getText()
{
return text;
}
@Override
public String toString()
{
return text;
}
}
}