//(c) Copyright 2008, Scott Vorthmann. All rights reserved. package org.vorthmann.zome.app.impl; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Map; import java.util.TreeMap; import org.vorthmann.ui.Controller; import org.vorthmann.ui.DefaultController; import com.vzome.core.editor.DocumentModel; import com.vzome.core.editor.Tool; import com.vzome.core.editor.ToolFactory; public class ToolsController extends DefaultController implements PropertyChangeListener { private final DocumentModel tools; // TODO this should be a ToolsModel private final Map<String,Controller> toolControllers = new TreeMap<>(); private final Map<String,Controller> factoryControllers = new TreeMap<>(); public ToolsController( DocumentModel tools ) { super(); this .tools = tools; tools .addPropertyChangeListener( this ); } @Override public Controller getSubController( String name ) { Controller subc = this .toolControllers .get( name ); if ( subc != null ) return subc; subc = this .factoryControllers .get( name ); if ( subc != null ) return subc; Tool tool = tools .getTool( name ); if ( tool != null ) { Controller controller = new ToolController( tool, tools ); controller .setNextController( this ); toolControllers .put( name, controller ); return controller; } ToolFactory factory = tools .getToolFactory( name ); if ( factory != null ) { Controller controller = new ToolFactoryController( factory, this ); controller .setNextController( this ); factoryControllers .put( name, controller ); return controller; } return null; } void addTool( Tool tool ) { Controller controller = new ToolController( tool, tools ); controller .setNextController( this ); toolControllers .put( tool .getName(), controller ); this .properties() .firePropertyChange( new PropertyChangeEvent( this, "tool.added", null, controller ) ); } @Override public String[] getCommandList( String listName ) { if ( "tool.instances" .equals( listName ) ) return (String[]) toolControllers .keySet() .toArray(); return super .getCommandList( listName ); } @Override public void propertyChange( PropertyChangeEvent evt ) { switch ( evt .getPropertyName() ) { case "tool.instances": String toolName = (String) evt .getNewValue(); // will be "group.N/label" Controller controller = this .getSubController( toolName ); if ( controller .propertyIsTrue( "predefined" ) ) // ignore the forced events at startup return; this .properties() .firePropertyChange( new PropertyChangeEvent( this, "tool.added", null, controller ) ); break; default: break; } } @Override public String getProperty( String name ) { switch (name) { case "next.tool.number": return "" + toolControllers .size(); default: return super .getProperty( name ); } } }