//{HEADER
/**
* This class is part of jnex 'Nexirius Application Framework for Java'
*
* Copyright (C) Nexirius GmbH, CH-4450 Sissach, Switzerland (www.nexirius.ch)
*
* <p>This library is free software; you can redistribute it and/or<br>
* modify it under the terms of the GNU Lesser General Public<br>
* License as published by the Free Software Foundation; either<br>
* version 2.1 of the License, or (at your option) any later version.</p>
*
* <p>This library is distributed in the hope that it will be useful,<br>
* but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br>
* Lesser General Public License for more details.</p>
*
* <p>You should have received a copy of the GNU Lesser General Public<br>
* License along with this library; if not, write to the Free Software<br>
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</p>
* </blockquote>
*
* <p>
* Nexirius GmbH, hereby disclaims all copyright interest in<br>
* the library jnex' 'Nexirius Application Framework for Java' written<br>
* by Marcel Baumann.</p>
*/
//}HEADER
package com.nexirius.framework.dataviewer;
import com.nexirius.framework.datamodel.DataModel;
import com.nexirius.framework.datamodel.DataModelEvent;
import com.nexirius.framework.datamodel.DataModelVector;
import com.nexirius.util.EventMulticaster;
import javax.swing.*;
import java.lang.ref.SoftReference;
public class DataModelTreeViewer extends DataViewer {
DataModelTreeComponent rootTreeComponent;
private int xGap = 30;
private int yGap = 3;
private TransferHandler transferHandler;
protected Icon foldedIcon;
protected Icon expandedIcon;
protected Icon noChildrenIcon;
Object listenerList = null;
public DataModelTreeViewer(DataModel model) {
super(model);
}
public DataModelVector getSelectedDataModels() {
DataModelVector v = new DataModelVector();
if (rootTreeComponent != null) {
rootTreeComponent.getSelectedDataModels(v);
}
return v;
}
public DataModelVector getFoldedDataModels(boolean isFolded) {
DataModelVector v = new DataModelVector();
if (rootTreeComponent != null) {
rootTreeComponent.getFoldedDataModels(v, isFolded);
}
return v;
}
public void create() {
rootTreeComponent = createDataModelTreeViewer(getDataModel());
update();
setJComponent(rootTreeComponent);
}
public DataModelTreeComponent createDataModelTreeViewer(DataModel model) {
DataModelTreeComponent ret;
DataModelTreeComponentCreator treeComponentViewerCreator = getFactory().getViewerCreatorMap().getTreeComponentViewerCreator(model.getClass());
if (treeComponentViewerCreator == null) {
ret = new DataModelTreeComponent(this, model);
} else {
ret = treeComponentViewerCreator.createDataModelTreeComponent(this, model);
}
ret.init();
return ret;
}
public void setTransferHandler(TransferHandler transferHandler) {
this.transferHandler = transferHandler;
}
public void update(DataModel source) {
rootTreeComponent.updateComponent(source);
}
public void update() {
rootTreeComponent.updateComponent(null);
}
public String getViewerName() {
return "DataModelTreeViewer";
}
public void dataModelChangeValue(DataModelEvent event) {
update(event.getDataModel());
}
public void dataModelChangeStructure(DataModelEvent event) {
update();
}
public int getXGap() {
return xGap;
}
public void setXGap(int xGap) {
this.xGap = xGap;
}
public int getYGap() {
return yGap;
}
public void setYGap(int yGap) {
this.yGap = yGap;
}
public TransferHandler getTransferHandler() {
return transferHandler;
}
public DataModelTreeComponent getTreeComponentFor(DataModel child, boolean forceCreate) {
if (rootTreeComponent == null) {
create();
}
if (child == rootTreeComponent.getChildModel()) {
return rootTreeComponent;
}
DataModelTreeComponent tc = rootTreeComponent;
DataModel dm = child;
DataModelVector path = new DataModelVector();
while (dm != null) {
if (dm == rootTreeComponent.getChildModel()) {
break;
}
path.insert(dm);
dm = dm.getParentDataModel();
}
if (dm == null) {
return null;
}
for (dm = path.firstItem(); dm != null; dm = path.nextItem()) {
DataModelTreeComponent childTreeComponent = tc.getTreeComponentFor(dm);
if (childTreeComponent != null) {
if (dm == child) {
return childTreeComponent;
} else {
tc = childTreeComponent;
}
} else {
continue;
}
}
return null;
}
public Icon getFoldedIcon() {
if (foldedIcon == null) {
foldedIcon = getFactory().getClientResource().getIcon("folded");
}
return foldedIcon;
}
public Icon getExpandedIcon() {
if (expandedIcon == null) {
expandedIcon = getFactory().getClientResource().getIcon("expanded");
}
return expandedIcon;
}
public Icon getNoChildrenIcon() {
if (noChildrenIcon == null) {
noChildrenIcon = getFactory().getClientResource().getIcon("noChildren");
}
return noChildrenIcon;
}
public DataModelTreeComponent getRootTreeComponent() {
return rootTreeComponent;
}
public void addDataModelTreeViewerListener(DataModelTreeViewerListener listener) {
listenerList = EventMulticaster.addEventListener(listenerList, listener);
}
public void addSoftDataModelTreeViewerListener(DataModelTreeViewerListener listener) {
listenerList = EventMulticaster.addEventListener(listenerList, new SoftReference(listener));
}
public void removeDataModelTreeViewerListener(DataModelTreeViewerListener listener) {
listenerList = EventMulticaster.removeEventListener(listenerList, listener);
}
public void callDataModelTreeViewerListenerSelection(DataModelTreeComponent treeComponent) {
Object listeners[] = EventMulticaster.getArray(listenerList);
boolean needGarbageCollect = false;
for (int i = 0; listeners != null && i < listeners.length; ++i) {
DataModelTreeViewerListener listener = (DataModelTreeViewerListener) listeners[i];
if (listener == null) {
needGarbageCollect = true;
} else {
listener.treeSelectionChanged(this, treeComponent);
}
}
if (needGarbageCollect) {
listenerList = EventMulticaster.garbageCollect(listenerList);
}
}
public void callDataModelTreeViewerListenerFolding(DataModelTreeComponent treeComponent, boolean recursive) {
Object listeners[] = EventMulticaster.getArray(listenerList);
boolean needGarbageCollect = false;
for (int i = 0; listeners != null && i < listeners.length; ++i) {
DataModelTreeViewerListener listener = (DataModelTreeViewerListener) listeners[i];
if (listener == null) {
needGarbageCollect = true;
} else {
listener.treeFoldingChanged(this, treeComponent, recursive);
}
}
if (needGarbageCollect) {
listenerList = EventMulticaster.garbageCollect(listenerList);
}
}
}