/*
 * Licensed Materials - Property of Perforce Software, Inc. 
 * © Copyright Perforce Software, Inc. 2014, 2021 
 * © 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.
 */

import ilog.views.*;
import ilog.views.graphic.IlvIcon;
import ilog.views.accelerator.*;
import ilog.views.swing.*;
import ilog.views.util.swing.IlvSwingUtil;
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.net.*;
import javax.swing.*;

// You can uncomment the following import statements
// if you want to test IlvChart inside an IlvManager
/**
import ilog.views.chart.IlvChart;
import ilog.views.chart.IlvDataInterval;
import ilog.views.chart.IlvChartRenderer;
import ilog.views.chart.IlvStyle;
import ilog.views.chart.data.IlvDataSet;
import ilog.views.chart.data.IlvDefaultDataSet;
import ilog.views.chart.data.IlvDefaultDataSource;
import ilog.views.chart.java2d.IlvValueGradientPaint;
**/

/**
 * The main sample class.
 */
SuppressWarnings("serial")
public class GraphicComponent extends JRootPane
{
  {
    // This sample uses JViews Diagrammer features. When deploying an
    // application that includes this code, you need to be in possession
    // of a Perforce JViews Diagrammer Deployment license.
    //    IlvProductUtil.DeploymentLicenseRequired(
    //        IlvProductUtil.JViews_Diagrammer_Deployment);
  }

  /** The grapher. */
  private IlvGrapher grapher = new IlvGrapher();
  /** The view of the grapher.*/
  private IlvManagerView mgrview;

  /**
   * Initializes the sample.
   */
  public void init()
  {
    getContentPane().setLayout(new BorderLayout(0,0));

    // Creates the view for the grapher.
    mgrview = new IlvManagerView(grapher, null);
    mgrview.setKeepingAspectRatio(true);
    mgrview.setAntialiasing(true);

    // Adds the objects.
    addObjects();

    // Installs some accelerators.
    grapher.addAccelerator(new IlvIdentityAccelerator(KeyEvent.KEY_PRESSED,
                    KeyEvent.VK_I, 0));
    grapher.addAccelerator(new IlvZoomOutAccelerator(KeyEvent.KEY_PRESSED,
                    KeyEvent.VK_U, KeyEvent.CTRL_MASK));
    grapher.addAccelerator(new IlvZoomInAccelerator(KeyEvent.KEY_PRESSED,
                                                    KeyEvent.VK_Z, KeyEvent.CTRL_MASK));
    grapher.addAccelerator(new IlvFitToSizeAccelerator(KeyEvent.KEY_PRESSED,
                                                       KeyEvent.VK_F, 0));
    grapher.addAccelerator(new IlvRotateAccelerator(KeyEvent.KEY_PRESSED,
                                                    KeyEvent.VK_R, 0));
    grapher.addAccelerator(new IlvScrollUpAccelerator(KeyEvent.KEY_PRESSED,
                                                      KeyEvent.VK_UP, 0));
    grapher.addAccelerator(new IlvScrollDownAccelerator(KeyEvent.KEY_PRESSED,
                                                        KeyEvent.VK_DOWN, 0));
    grapher.addAccelerator(new IlvScrollRightAccelerator(KeyEvent.KEY_PRESSED,
                                                         KeyEvent.VK_RIGHT, 0));
    grapher.addAccelerator(new IlvScrollLeftAccelerator(KeyEvent.KEY_PRESSED,
                                                        KeyEvent.VK_LEFT, 0));
    IlvJScrollManagerView sc  = new IlvJScrollManagerView(mgrview);
    mgrview.setWheelZoomingEnabled(true);
    sc.setWheelScrollingEnabled(true);
    getContentPane().add(sc, BorderLayout.CENTER);
  }

  /**
   * Adds the graphic objects to the grapher.
   */
  private void addObjects()
  {
    JEditorPane mainPane = new JEditorPane();
    mainPane.setEditorKit(new javax.swing.text.html.HTMLEditorKit());
    mainPane.setEditable(false);
    mainPane.setText("<html><body><p>This demo shows how you can embed <code>JComponent</code> instances in a Perforce JViews <code>IlvGrapher</code></p><p>In that order from left to right, top to bottom, you will find: a <code>JTextArea</code>, a <code>JTree</code>, the same <code>JEditorPane</code> shown at different zoom levels, and a rotated version of the <code>JTextArea</code>.</p><p>You can zoom in or out on the view using Ctrl-Z and Ctrl-U accelerators, or rotate using R accelerator.</p><p>You can navigate the manager using arrow keys.</p></body></html>");
    JScrollPane sPane = new JScrollPane(mainPane, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                                        JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    IlvJComponentGraphic wrapper = new IlvJComponentGraphic(new IlvRect(40, 20, 320, 120),
                                                            sPane);
    grapher.addObject(wrapper, false);

    // You can uncomment the following if you want
    // to test IlvChart inside an IlvManager
    /*
      IlvChart chart = new IlvChart();
      chart.getYScale(0).setMajorTickVisible(false);
      IlvDataSet[] sets = new IlvDefaultDataSet[] {
      new IlvDefaultDataSet("DataSet 1",
      ilog.views.chart.util.IlvArrays.randomValues(31, 0., 20.)),
      new IlvDefaultDataSet("DataSet 2",
      ilog.views.chart.util.IlvArrays.randomValues(31, 0., 20.))
      };
      chart.setDataSource(new IlvDefaultDataSource(sets));
      IlvDataInterval range = chart.getYAxis(0).getDataRange();
      double[] values = {range.getMin(), range.getMiddle(), range.getMax()};
      Color[]  colors = {Color.green, Color.orange, Color.red};
      IlvValueGradientPaint gp = new IlvValueGradientPaint(chart, 0, values, colors);
      
      IlvStyle[] styles = new IlvStyle[] {
      new IlvStyle(new BasicStroke(2), gp, Color.red),
      new IlvStyle(new BasicStroke(2), gp, Color.red)
      };
      chart.getRenderer(0).setStyles(styles);
      wrapper = new IlvJComponentGraphic(new IlvRect(40, 160, 150, 70), chart);
      grapher.addObject(wrapper, false);
    */
    try {
      grapher.addObject(new IlvIcon(IlvSwingUtil.getRelativeURL(this, "data/chart.png"),
                                    new IlvRect(40, 160, 150, 65)), false);
    } catch (MalformedURLException e) {
    }

    JTextArea text = 
      new JTextArea("you can type a message here and\n look at " +
                    "the rotated text area\n below");
    sPane =  new JScrollPane(text, JScrollPane.VERTICAL_SCROLLBAR_NEVER,
                             JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    wrapper = new IlvJComponentGraphic(new IlvRect(210, 160, 200, 100), sPane);
    wrapper.resize(150, 70);
    grapher.addObject(wrapper, false);

    wrapper = new IlvJComponentGraphic(new IlvRect(210, 160, 150, 70), sPane);
    wrapper.rotate(new IlvPoint(285, 195), 90);
    wrapper.moveResize(new IlvRect(308, 240, 50, 90));
    grapher.addObject(wrapper, false);

    JTree tree = new JTree();
    sPane =  new JScrollPane(tree);
    wrapper = new IlvJComponentGraphic(new IlvRect(40, 240, 200, 200), sPane);
    wrapper.resize(90, 90);
    grapher.addObject(wrapper, false);

    JEditorPane pane1 = new JEditorPane();
    pane1.setEditorKit(new javax.swing.text.html.HTMLEditorKit());
    pane1.setEditable(false);
    try {
      pane1.setPage(IlvSwingUtil.getRelativeURL(this, "data/sample.html"));
    } catch (java.io.IOException e) {
      e.printStackTrace();
    }
    sPane = new JScrollPane(pane1, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                            JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    wrapper = new IlvJComponentGraphic(new IlvRect(140, 240, 240, 320),
                                       sPane);
    wrapper.resize(67.5, 90);
    grapher.addObject(wrapper, false);

    wrapper = new IlvJComponentGraphic(new IlvRect(240, 240, 33, 45), sPane);
    grapher.addObject(wrapper, false);

    wrapper = new IlvJComponentGraphic(new IlvRect(230, 300, 16, 22), sPane);
    grapher.addObject(wrapper, false);

    wrapper = new IlvJComponentGraphic(new IlvRect(266, 300, 16, 22), sPane);
    grapher.addObject(wrapper, false);

    String[] data1 = { "France", "Germany", "Great Britain", "USA", "Spain" };
    JComboBox<String> comboBox = new JComboBox<String>(data1);
    wrapper = new IlvJComponentGraphic(new IlvRect(40, 340, 100, 25), comboBox);
    wrapper.getComboBoxOptions().setMaximumPopupZoomFactor(3.0);
    grapher.addObject(wrapper, false);

    String[] data2 = { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn",
              "Uranus", "Neptune", "Pluto" };
    comboBox = new JComboBox<String>(data2);
    wrapper = new IlvJComponentGraphic(new IlvRect(230, 340, 100, 25), comboBox);
    wrapper.resize(50, 12.5);
    wrapper.getComboBoxOptions().setMaximumPopupZoomFactor(3.0);
    wrapper.getComboBoxOptions().setKeepingAspectRatio(false);
    grapher.addObject(wrapper, false);

    String[] data3 = { "Spring", "Summer", "Fall", "Winter" };
    comboBox = new JComboBox<String>(data3);
    wrapper = new IlvJComponentGraphic(new IlvRect(310, 340, 100, 25), comboBox);
    wrapper.resize(50, 12.5);
    wrapper.getComboBoxOptions().setAutoPopupWidth(false);
    // wrapper.getComboBoxOptions().setMaximumPopupWidth(100);
    // wrapper.getComboBoxOptions().setMaximumPopupHeight(100);
    wrapper.getComboBoxOptions().setMinimumPopupZoomFactor(1.0);
    wrapper.getComboBoxOptions().setMaximumPopupZoomFactor(1.0);
    // wrapper.getComboBoxOptions().setKeepingAspectRatio(false);
    grapher.addObject(wrapper, false);
  }

  /**
   * Allows you to run the demo as a standalone application.
   */
  public static void main(String[] arg)
  {
    // Sun recommends that to put the entire GUI initialization into the
    // AWT thread
    SwingUtilities.invokeLater(
      new Runnable() {
        Override
        public void run() {
          GraphicComponent sample = new GraphicComponent();
          sample.init();

          JFrame frame = new JFrame("Component Graphic Demo");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setSize(600, 600);
          frame.getContentPane().add(sample);
          frame.setVisible(true);
        }
      });
  }
}