/*
 * Licensed Materials - Property of Rogue Wave Software, Inc. 
 * © Copyright Rogue Wave Software, Inc. 2014, 2015 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */

/**
 * This examples shows a number of diagrams to illustrate some typical
 * uses of Rogue Wave JViews Diagrammer.
 */ 
import ilog.views.diagrammer.IlvDiagrammer;
import ilog.views.diagrammer.application.IlvDiagrammerAction;
import ilog.views.diagrammer.application.IlvDiagrammerApplication;
import ilog.views.diagrammer.application.IlvDiagrammerMenuBar;
import ilog.views.diagrammer.application.IlvDiagrammerMenu;
import ilog.views.diagrammer.project.IlvDiagrammerProject;
import ilog.views.sdm.renderer.IlvRendererUtil;
import ilog.views.util.swing.IlvJStreamTextArea;
import ilog.views.util.IlvProductUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.StringTokenizer;

public class DiagramGallery extends IlvDiagrammerApplication
{
  private ResourceBundle bundle;
  IlvDiagrammerProject[] diagrams;
  private JComboBox combo;
  private JTextField descriptionField;
  private JFrame messageWindow;
  private IlvJStreamTextArea messageArea;
  
  public static void main(final String[] args)
  {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new DiagramGallery().init(args);        
      }
    });
  }
  
  public DiagramGallery()
  {
    super(new String[] {
      "-simple"
    });
  }

  /**
   * This method is overridden to change the size of the frame.
   */ 
  public JFrame createFrame()
  {
    JFrame frame = super.createFrame();
    frame.setSize(800, 400);
    return frame;
  }

  /**
   * Initializes the GUI.
   * @param contentPane The container of the application or applet.
   */ 
  public void init(Container contentPane)
  {
    // This sample uses JViews Diagrammer features. When deploying an
    // application that includes this code, you need to be in possession
    // of a Rogue Wave JViews Diagrammer Deployment license.
    IlvProductUtil.DeploymentLicenseRequired(
        IlvProductUtil.JViews_Diagrammer_Deployment);

    bundle = ResourceBundle.getBundle("gallery");
    
    diagrams = readDiagrams();
    descriptionField = new JTextField();
    
    super.init(contentPane);
    
    // Create the combo box that lets the user choose a diagram.
    //
    JPanel topPanel = new JPanel(new GridBagLayout());
    contentPane.add(topPanel, BorderLayout.NORTH);
    
    GridBagConstraints c = new GridBagConstraints();
    c.gridy = 0;
    c.insets = new Insets(5, 5, 5, 5);
    c.weightx = 0;
    c.fill = GridBagConstraints.NONE;
    
    JLabel label = new JLabel(bundle.getString("DiagramGallery.ChooseDiagram"));
    c.gridx = 0;
    topPanel.add(label, c);
    
    combo = new JComboBox(diagrams);
    combo.setRenderer(new DefaultListCellRenderer(){
      public Component getListCellRendererComponent(
              JList list,
              Object value,
              int index,
              boolean isSelected,
              boolean cellHasFocus)
      {
        JLabel label =
                (JLabel) super.getListCellRendererComponent(list,
                                                            value,
                                                            index,
                                                            isSelected,
                                                            cellHasFocus);
        label.setText(getProperty((IlvDiagrammerProject)value,
                                  "ShortDescription"));
        return label;
      }
    });
    combo.addItemListener(new ItemListener(){
      public void itemStateChanged(ItemEvent e)
      {
        if(e.getStateChange() == ItemEvent.SELECTED){
          loadDiagram((IlvDiagrammerProject)combo.getSelectedItem());
        }
      }
    });
    c.gridx = 1;
    topPanel.add(combo, c);
    
    descriptionField.setEditable(false);
    c.weightx = 1;
    c.gridx = 2;
    c.fill = GridBagConstraints.HORIZONTAL;
    topPanel.add(descriptionField, c);

    // create a message window
    messageArea = new IlvJStreamTextArea();
    messageWindow = new JFrame();
    messageWindow.getContentPane().add(messageArea);
    messageWindow.pack();
    messageWindow.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

    // enhance the file menu with the tracing facility
    IlvDiagrammerMenuBar menuBar = getMenuBar();
    IlvDiagrammerMenu fileMenu = menuBar.getFileMenu();
    final IlvDiagrammerAction.ToggleAction traceAction =
      new IlvDiagrammerAction.ToggleAction("DiagramGallery.EnableTracing", bundle) {

      protected boolean isEnabled(IlvDiagrammer diagrammer) throws Exception {
        return true;
      }
      protected boolean isSelected(IlvDiagrammer diagrammer) throws Exception {
        return IlvRendererUtil.isTracingEnabled();
      }
      protected void setSelected(IlvDiagrammer diagrammer, boolean selected) throws Exception {
        if (selected) {
          // enable tracing for various rendering methods.
          // Nearly all methods of IlvSDMRenderer can be traced.
          messageWindow.setVisible(true);
          IlvRendererUtil.setTraceStream(messageArea.getPrintStream());
          // to trace ALL methods:
          // IlvRendererUtil.setTracingEnabled(true);
          // to trace specific methods:
          IlvRendererUtil.setTracingEnabled("renderingDone",
                                            "createNodeGraphic",
                                            "createLinkGraphic");
          // Can restrict tracing to certain renderers:
          // IlvRendererUtil.setTraceRenderers("GraphLayout", "LinkLayout");
          diagrammer.refresh();
        } else {
          if (IlvRendererUtil.isTracingEnabled()) {
            // disable tracing
            IlvRendererUtil.setTracingEnabled(false);
            diagrammer.refresh();
            messageWindow.setVisible(false);
          }
        }
      }
    };
    fileMenu.insertAction(traceAction, 1);

    messageWindow.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        if (IlvRendererUtil.isTracingEnabled()) {
          try {
            traceAction.perform(null, getCurrentDiagrammer());
          } catch (Exception ex) {
          }
        }
      }
    });
  }
  
  /**
   * Loads the first diagram.
   */ 
  protected void ready()
  {
    super.ready();
    loadDiagram(diagrams[0]);
  }

  /**
   * Loads a diagram.
   * @param project The diagram project to load.
   */ 
  private void loadDiagram(IlvDiagrammerProject project)
  {
    try {
      getCurrentDiagrammer().setProject(project, true);
      if (project.getProjectURL().toString().contains("classdiag"))
        getCurrentDiagrammer().resetZoom();
      else
        getCurrentDiagrammer().fitToContents();
      descriptionField.setText(getProperty(project, "LongDescription"));
    } catch (Exception e1) {
      IlvDiagrammerAction.error(
              getApplicationContentPane(),
              bundle,
              "DiagramGallery.ErrorWhileLoadingProject",
              new Object[] {
                project.getProjectURL()
              },
              e1);
    }
  }

  /**
   * Reads the list of diagrams from the property file.
   */ 
  private IlvDiagrammerProject[] readDiagrams()
  {
    ArrayList l = new ArrayList();
    try {
      URL documentBase;
      
      if(isApplet()){
        documentBase = getDocumentBase();
      } else {
        documentBase = new URL("file:./");
      }
      
      String list = bundle.getString("DiagramGallery.DiagramList");
      StringTokenizer tok = new StringTokenizer(list, " ,");
      while(tok.hasMoreTokens()){
        String name = tok.nextToken();
        IlvDiagrammerProject project =
                new IlvDiagrammerProject(new URL(documentBase, "data/"+name+".idpr"));
        l.add(project);
      }
    } catch(Exception ex){
      IlvDiagrammerAction.error(
              getApplicationContentPane(),
              bundle,
              "DiagramGallery.ErrorWhileListingProjects",
              null,
              ex);
    }
    return (IlvDiagrammerProject[]) l.toArray(new IlvDiagrammerProject[0]);
  }
  
  private String getProperty(IlvDiagrammerProject project, String property)
  {
    String key =
            project.getProjectURL().toExternalForm();
    key = key.substring(key.lastIndexOf('/')+1);
    key = key.substring(0, key.lastIndexOf('.'));
    return bundle.getString("DiagramGallery."+key+"."+property);
  }
}