/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.navigator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Control;
import org.jboss.tools.common.model.XModel;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.event.XModelTreeEvent;
import org.jboss.tools.common.model.event.XModelTreeListener;
import org.jboss.tools.common.model.util.XModelObjectCache;
public class TreeViewerModelListenerImpl implements XModelTreeListener {
protected TreeViewer viewer;
protected XModelObject root;
public void setViewer(TreeViewer viewer) {
this.viewer = viewer;
root = getRoot();
}
protected XModelObject getRoot() {
Object i = viewer.getInput();
return (i instanceof XModelObjectCache) ? ((XModelObjectCache)i).getObject()
: (i instanceof XModelObject) ? (XModelObject)i : null;
}
public void nodeChanged(XModelTreeEvent event) {
if (event == null) return;
updateNode(event.getModelObject());
}
public void updateNode(XModelObject object) {
if (viewer == null) return;
Control ctrl = viewer.getControl();
if (ctrl == null || ctrl.isDisposed()) return;
viewer.update(object, null);
}
protected XModelObject getSelectedObject() {
ISelection selection = viewer.getSelection();
if(!(selection instanceof IStructuredSelection) || selection.isEmpty()) return null;
IStructuredSelection ss = (IStructuredSelection)selection;
Object o = ss.getFirstElement();
return (!(o instanceof XModelObject)) ? null : (XModelObject)o;
}
static int reportRefreshProblemCount = 0;
public void structureChanged(XModelTreeEvent event) {
if (viewer == null || event == null) return;
Control ctrl = viewer.getControl();
if (ctrl == null || ctrl.isDisposed()) return;
XModelObject r = getRoot();
if(root != r) {
root = r;
viewer.refresh();
return;
}
XModelObject selected = getSelectedObject();
XModelObject refreshObject = event.getModelObject();
if(refreshObject != null) {
if(isFileParent(refreshObject, r)) {
viewer.refresh(r);
} else {
viewer.refresh(refreshObject);
}
}
if(event.kind() == XModelTreeEvent.CHILD_ADDED) {
// XModelObject c = (XModelObject)event.getInfo();
//Attention! wizard shall decide when select created object
// but files may be in tree children of later updated nodes
// if(c.getParent() == selected && hasChild(selected, c)) {
// setSelection(c);
// }
} else if(event.kind() == XModelTreeEvent.CHILD_REMOVED) {
if(selected != null && !selected.isActive() &&
event.getInfo().toString().endsWith("/" + selected.getPathPart())) { //$NON-NLS-1$
setSelection(event.getModelObject());
}
}
}
boolean isFileParent(XModelObject refreshObject, XModelObject r) {
if(refreshObject == null || refreshObject.getFileType() != XModelObject.FILE) return false;
while(r != null && r != refreshObject) r = r.getParent();
return r == refreshObject;
}
protected void setSelection(XModelObject o) {
if(viewer.getControl() == null || viewer.getControl().isDisposed()) return;
viewer.setSelection(new StructuredSelection(o), true);
}
//never invoked
boolean hasChild(XModelObject p, XModelObject c) {
ITreeContentProvider cp = (ITreeContentProvider)viewer.getContentProvider();
Object[] os = cp.getChildren(p);
if(os == null || os.length == 0) return false;
for (int i = 0; i < os.length; i++) {
if(os[i] == c) return true;
}
return false;
}
public void disopse() {
viewer = null;
// try disconnect from model
if (root!=null) {
XModel model = root.getModel();
if (model!=null) {
model.removeModelTreeListener(this);
}
}
}
}