/home/volc/47/gshute/netbeans/CS5741Source/swing/components/Info.java
package swing.components;

import appBase.AppBase;
import conversion.NamedNamer;
import conversion.ToStringConverter;
import gui.Wrapper;
import java.awt.BorderLayout;
import java.net.URL;
import javax.swing.JComponent;
import javax.swing.JPanel;
import mvc.Callback;
import mvc.CardView;
import mvc.Choice;
import mvc.Choice.Model;
import mvc.ComboBoxChooser;
import mvc.HTMLView;
import mvc.NamedDirectModel;
import mvc.NamedModel;
import mvc.TabbedChooser;
import swing.components.button.Button;
import swing.components.checkbox.CheckBox;
import swing.components.combobox.ComboBox;
import swing.components.label.Label;
import swing.components.passwordfield.PasswordField;
import swing.components.radiobutton.RadioButton;
import swing.components.slider.Slider;
import swing.components.numberspinner.Spinner;
import swing.components.table.Table;
import swing.components.textarea.TextArea;
import swing.components.textfield.TextField;
import swing.components.togglebutton.ToggleButton;

class URLModel
        extends NamedDirectModel<URL>  {
  
  private mvc.Model<SwingComponent> componentModel;
  private mvc.Model<String> topicModel;
  
  public URLModel(mvc.Model<SwingComponent> cm, mvc.Model<String> tm) {
    super("URL Model");
    componentModel = cm;
    topicModel = tm;
    Callback sourcesCallback = new Callback() {
      public void execute() {
        notifyObservers();
      }
    };
    componentModel.addCallback(sourcesCallback);
    topicModel.addCallback(sourcesCallback);
  }
  
  public URL getValue() {
    String topic = topicModel.getValue();
    return componentModel.getValue().getURL(topic);
  }
  
}

/**
 *
 * @author gshute
 */
public class Info
        extends AppBase {
  
  private Model<String> topicModel;
  private Model<SwingComponent> componentModel;
  
  private Choice<String> createTopicChoice() {
    String[] topics = {
      "use",
      "config",
      "behavior",
      "more"
    };
    return new Choice<String>(topics);
  }
  
  private Choice<SwingComponent> createComponentChoice() {
    SwingComponent[] components = {
      new Label(),
      new Button(),
      new ToggleButton(),
      new RadioButton(),
      new Slider(),
      new Spinner(),
      new CheckBox(),
      new TextField(),
      new PasswordField(),
      new ComboBox(),
      new TextArea(),
      new Table()
    };
    return new Choice<SwingComponent>(components);
  }
  
  public String getTitle() {
    return "Components Information";
  }
  
  public JComponent createContentPane() {
    
    // Create choice, model, and controller for topics.
    Choice<String> topicChoice = createTopicChoice();
    final Choice.Model<String> topicModel =
            topicChoice.createModel("Topics");
    TabbedChooser<String> topicChooser =
            new TabbedChooser<String>(topicModel,
            new ToStringConverter(), 400);
    
    // Create choice, model, and controller for components.
    Choice<SwingComponent> componentChoice =
            createComponentChoice();
    final Choice.Model<SwingComponent> componentModel =
            componentChoice.createModel("Components");
    ComboBoxChooser<SwingComponent> componentChooser =
            new ComboBoxChooser<SwingComponent>(
            componentModel, new NamedNamer<SwingComponent>());
    
    // Create a viewer for the component model.
    CardView<SwingComponent> componentView =
            new CardView<SwingComponent>(componentModel);
    
    // Create a url model and its viewer.
    NamedModel<URL> urlModel =
            new URLModel(componentModel, topicModel);
    HTMLView urlView = new HTMLView(urlModel);
    
    // Lay out the content pane and return it.
    JPanel leftPanel = new JPanel(new BorderLayout());
    leftPanel.add(Wrapper.paneled(componentChooser),
            BorderLayout.NORTH);
    JComponent componentPanel = Wrapper.unwrapped(componentView);
    leftPanel.add(componentPanel, BorderLayout.CENTER);
    JPanel rightPanel = new JPanel(new BorderLayout());
    rightPanel.add(Wrapper.unwrapped(topicChooser),
            BorderLayout.NORTH);
    rightPanel.add(Wrapper.scrolled(urlView, 600, 400),
            BorderLayout.CENTER);
    JPanel contentPane = new JPanel(new BorderLayout());
    contentPane.add(leftPanel, BorderLayout.WEST);
    contentPane.add(rightPanel, BorderLayout.CENTER);
    return contentPane;
  }
  
  public static void main(String[] args) {
    Info app = new Info();
    app.installApplication();
  }
  
}