/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.gef.tree;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.xmind.gef.IViewer;
import org.xmind.gef.part.EditPart;
import org.xmind.gef.part.IPart;
/**
* @author Brian Sun
*/
public class TreePart extends EditPart implements ITreePart {
private Widget widget = null;
private boolean expanded = false;
public Widget getWidget() {
return widget;
}
public void setWidget(Widget widget) {
preSetWidget(widget);
this.widget = widget;
}
protected void preSetWidget(Widget widget) {
if (widget != null) {
widget.setData(this);
if (widget instanceof TreeItem) {
final TreeItem item = (TreeItem) widget;
item.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
expanded = item.getExpanded();
}
});
if (needsVisibleOnCreating()) {
ensureVisible(item);
}
}
for (IPart child : getChildren()) {
ITreePart treeChild = (ITreePart) child;
if (widget instanceof TreeItem)
treeChild.setWidget(new TreeItem((TreeItem) widget, 0));
else
treeChild.setWidget(new TreeItem((Tree) widget, 0));
//We have just assigned a new TreeItem to the EditPart
treeChild.refresh();
}
if (widget instanceof TreeItem)
((TreeItem) widget).setExpanded(expanded);
} else {
for (IPart child : getChildren()) {
((ITreePart) child).setWidget(null);
}
}
}
protected boolean needsVisibleOnCreating() {
return true;
}
protected void ensureVisible(TreeItem item) {
TreeItem p = item.getParentItem();
if (p != null) {
if (!p.getExpanded())
p.setExpanded(true);
ensureVisible(p);
} else
return;
}
protected void addChildView(IPart child, int index) {
IViewer viewer = getSite().getViewer();
if (viewer instanceof ITreeViewer) {
((ITreeViewer) viewer).scheduleRedraw();
}
Widget widget = getWidget();
TreeItem item;
if (widget instanceof Tree) {
item = new TreeItem((Tree) widget, SWT.NONE, index);
} else {
item = new TreeItem((TreeItem) widget, SWT.NONE, index);
}
((ITreePart) child).setWidget(item);
}
protected void removeChildView(IPart child) {
IViewer viewer = getSite().getViewer();
if (viewer instanceof ITreeViewer) {
((ITreeViewer) viewer).scheduleRedraw();
}
ITreePart treeChild = (ITreePart) child;
treeChild.getWidget().dispose();
treeChild.setWidget(null);
}
protected void updateView() {
super.updateView();
setWidgetImage(getImage());
setWidgetText(getText());
}
protected void reorderChild(IPart child, int index) {
super.reorderChild(child, index);
child.refresh();
}
protected boolean isValidTreeItem() {
return widget != null && !widget.isDisposed()
&& widget instanceof TreeItem;
}
protected void setWidgetImage(Image image) {
if (isValidTreeItem()) {
((TreeItem) widget).setImage(image);
}
}
protected void setWidgetText(String text) {
if (isValidTreeItem()) {
((TreeItem) widget).setText(text);
}
}
protected Image getImage() {
return null;
}
protected String getText() {
return ""; //$NON-NLS-1$
}
}