/*******************************************************************************
* Copyright (c) 2012 xored software, Inc.
* 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:
* xored software, Inc. - initial API and implementation (Ivan Lobachev)
******************************************************************************/
package com.xored.glance.ui.ccvs;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.team.internal.ccvs.core.CVSTag;
import org.eclipse.team.internal.ccvs.core.resources.RemoteFile;
import org.eclipse.team.internal.ccvs.core.resources.RemoteFolder;
import org.eclipse.team.internal.ccvs.ui.repo.RepositoryRoot;
import org.eclipse.team.internal.ui.Utils;
import org.eclipse.ui.progress.PendingUpdateAdapter;
@SuppressWarnings("restriction")
public class TreeUtils {
public static String getFullPath(TreeItem item) {
String res = "";
TreeItem curItem = item;
while (curItem != null) {
String itemName;
if (curItem.getData() instanceof RemoteFile) {
itemName = ((RemoteFile) (curItem.getData())).getName();
} else {
itemName = curItem.getText();
}
if (res.length() == 0) {
res = itemName;
} else {
res = itemName + "/" + res;
}
curItem = curItem.getParentItem();
}
return res;
}
public static String getTreeItemName(TreeItem treeItem) {
if (treeItem.getData() instanceof RemoteFolder) {
return ((RemoteFolder) treeItem.getData()).getName();
} else if (treeItem.getData() instanceof RepositoryRoot) {
return ((RepositoryRoot) treeItem.getData()).getRoot().toString();
} else if (treeItem.getData() instanceof RemoteFile) {
return ((RemoteFile) treeItem.getData()).getName();
} else if (treeItem.getData() instanceof CVSTag) {
return ((CVSTag) treeItem.getData()).getName();
}
return treeItem.getText();
}
public static TreeItem findTreeItem(Tree tree, String path, TreeItem item) {
TreeItem[] items;
if (item == null) {
items = tree.getItems();
} else {
items = item.getItems();
}
if (path == null) {
return item;
}
for (TreeItem treeItem : items) {
String curFolder = TreeUtils.getTreeItemName(treeItem);
if (treeItem.getData() != null
&& path.startsWith(curFolder)
&& ((path.length() == curFolder.length()) || (path
.charAt(curFolder.length()) == '/'))) {
String tPath = path.replace(curFolder, "");
if (tPath != null && tPath.length() > 0) {
tPath = (tPath.charAt(0) == '/') ? tPath.substring(1)
: tPath;
} else {
tPath = null;
}
return findTreeItem(tree, tPath, treeItem);
}
}
return null;
}
/**
* Expand Tree up to the element specified by <path>
*
* @param treeViewer
* @param path
* @param item
* @param treeExpandUpdater
*/
public static void expandElement(final TreeViewer treeViewer, String path,
final TreeItem item, ITreeExpandUpdater treeExpandUpdater) {
TreeItem[] items;
if (item == null) {
items = treeViewer.getTree().getItems();
} else {
if (item != null && !(item.getData() instanceof RemoteFile)
&& !item.getExpanded()) {
treeViewer.expandToLevel(item.getData(), 1);
treeExpandUpdater.updateOnExpand(item);
if (item.getItems().length > 0 && path != null) {
if (item.getItems()[0].getData() instanceof PendingUpdateAdapter) {
item.getItems()[0]
.addDisposeListener(new PendingDisposeListener(
treeViewer, path, item,
treeExpandUpdater));
} else {
expandElement(treeViewer, path, item, treeExpandUpdater);
}
return;
}
}
items = item.getItems();
}
if (path == null) {
// treeViewer.getTree().setSelection(item);
Utils.asyncExec(new Runnable() {
public void run() {
treeViewer.getTree().setSelection(item);
}
}, treeViewer);
// System.out.println("select: " + item.getText());
// textSource.setMatch(textSource.newMatch);
return;
}
for (TreeItem treeItem : items) {
String curFolder = TreeUtils.getTreeItemName(treeItem);
if (treeItem.getData() != null
&& path.startsWith(curFolder)
&& ((path.length() == curFolder.length()) || (path
.charAt(curFolder.length()) == '/'))) {
String tPath = path.replace(curFolder, "");
if (tPath != null && tPath.length() > 0) {
tPath = (tPath.charAt(0) == '/') ? tPath.substring(1)
: tPath;
} else {
tPath = null;
}
expandElement(treeViewer, tPath, treeItem, treeExpandUpdater);
return;
}
}
}
}
class PendingDisposeListener implements DisposeListener {
private final TreeViewer treeViewer;
private final String path;
private final TreeItem item;
private final ITreeExpandUpdater treeExpandUpdater;
public PendingDisposeListener(TreeViewer treeViewer, String path,
TreeItem item, ITreeExpandUpdater treeExpandUpdater) {
this.treeViewer = treeViewer;
this.path = path;
this.item = item;
this.treeExpandUpdater = treeExpandUpdater;
}
public void widgetDisposed(DisposeEvent e) {
TreeUtils.expandElement(this.treeViewer, this.path, this.item,
this.treeExpandUpdater);
}
}