package net.sf.openrocket.android.rocket;
import net.sf.openrocket.R;
import net.sf.openrocket.android.CurrentRocketHolder;
import net.sf.openrocket.android.rocket.RocketComponentTreeAdapter.RocketComponentWithId;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import pl.polidea.treeview.InMemoryTreeStateManager;
import pl.polidea.treeview.TreeBuilder;
import pl.polidea.treeview.TreeStateManager;
import pl.polidea.treeview.TreeViewList;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
public class Component extends Fragment {
private TreeViewList componentTree;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.rocket_component, container, false);
componentTree = (TreeViewList) v.findViewById(R.id.openrocketviewerComponentTree);
return v;
}
@Override
public void onResume() {
super.onResume();
final OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument();
componentTree.setAdapter( buildAdapter( rocketDocument.getRocket() ) );
}
private ListAdapter buildAdapter( Rocket rocket ) {
TreeStateManager<RocketComponentWithId> manager = new InMemoryTreeStateManager<RocketComponentWithId>();
TreeBuilder<RocketComponentWithId> treeBuilder = new TreeBuilder<RocketComponentWithId>(manager);
int depth = buildRecursive( rocket, treeBuilder, 0 );
return new RocketComponentTreeAdapter(this.getActivity(), manager, depth+1);
}
long id = 0;
private int buildRecursive( RocketComponent comp, TreeBuilder<RocketComponentWithId> builder, int depth ) {
int maxDepth = depth;
RocketComponentWithId rcid = new RocketComponentWithId(comp, id++);
// Add this component.
builder.sequentiallyAddNextNode(rcid, depth);
if ( comp.allowsChildren() ) {
for( RocketComponent child : comp.getChildren() ) {
int childDepth = buildRecursive( child, builder, depth+1);
if ( childDepth > maxDepth) {
maxDepth = childDepth;
}
}
}
return maxDepth;
}
}