/* Copyright 2009 Tonny Kohar.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.qi4j.library.swing.entityviewer;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
import org.qi4j.api.structure.ApplicationDescriptor;
import org.qi4j.spi.Qi4jSPI;
import org.qi4j.tools.model.descriptor.ApplicationDetailDescriptor;
import org.qi4j.tools.model.descriptor.ApplicationDetailDescriptorBuilder;
import org.qi4j.tools.model.descriptor.EntityDetailDescriptor;
import org.qi4j.tools.model.descriptor.LayerDetailDescriptor;
import org.qi4j.tools.model.descriptor.ModuleDetailDescriptor;
/**
* Qi4J Application Tree Viewer as Swing Component.
*/
public class TreePanel
extends JPanel
{
protected JTree applicationTree;
protected Qi4jSPI qi4j;
private ApplicationDescriptor model;
public TreePanel()
{
this.setLayout( new BorderLayout() );
JScrollPane scrollPane = new JScrollPane();
this.add( scrollPane, BorderLayout.CENTER );
applicationTree = new JTree();
applicationTree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
scrollPane.setViewportView( applicationTree );
}
public void initializeQi4J( Qi4jSPI qi4j, ApplicationDescriptor model )
{
this.qi4j = qi4j;
this.model = model;
}
public JTree getTreeComponent()
{
return applicationTree;
}
public void reload()
{
// build the visitor which allow traverse qi4j model
ApplicationDetailDescriptor visitor = ApplicationDetailDescriptorBuilder.createApplicationDetailDescriptor( model );
DefaultTreeModel treeModel = new DefaultTreeModel( new TreeModelBuilder().build( visitor ) );
applicationTree.setModel( treeModel );
}
/**
* Helper class to build tree model for up to 3 level depth, which focusing on the entity
*/
class TreeModelBuilder
{
public MutableTreeNode build( ApplicationDetailDescriptor descriptor )
{
DefaultMutableTreeNode node = new DefaultMutableTreeNode( descriptor );
buildLayersNode( node, descriptor.layers() );
return node;
}
private void buildLayersNode( DefaultMutableTreeNode parent, Iterable<LayerDetailDescriptor> iter )
{
for( LayerDetailDescriptor descriptor : iter )
{
DefaultMutableTreeNode node = new DefaultMutableTreeNode( descriptor );
buildModulesNode( node, descriptor.modules() );
parent.add( node );
}
}
private void buildModulesNode( DefaultMutableTreeNode parent, Iterable<ModuleDetailDescriptor> iter )
{
for( ModuleDetailDescriptor descriptor : iter )
{
DefaultMutableTreeNode node = new DefaultMutableTreeNode( descriptor );
buildEntitiesNode( node, descriptor.entities() );
parent.add( node );
}
}
private void buildEntitiesNode( DefaultMutableTreeNode parent, Iterable<EntityDetailDescriptor> iter )
{
for( EntityDetailDescriptor descriptor : iter )
{
DefaultMutableTreeNode node = new DefaultMutableTreeNode( descriptor );
parent.add( node );
}
}
}
}