/*******************************************************************************
 * Copyright (c) 2009-2010 David Donahue and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     David Donahue - initial API, implementation and documentation
 *     Austin Riddle - improvements to widget hierarchy and data flow for 
 *                     consistency with SWT behavior.
 ******************************************************************************/
package org.eclipse.rap.rwt.visualization.google;

import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Layout;

/**
 * Base type for all of the Google Visualization implementations.
 * 
 * @See http://code.google.com/apis/visualization/
 *
 */
public abstract class VisualizationWidget extends Composite {
  
  public static final String CORE_CHART_API = "corechart";
  
  private String widgetData = "";
  String widgetOptions = "";
  String widgetSize = "";
  private String selectedItem = "";
  private String selectedRow = "";
  private String selectedColumn = "";
  private String selectedValue = "";
  private boolean dirty;
  
  /**
   * Constructs a visualization widget in the specified parent and style. A visualization widget by
   * default will auto-resize to fill its parent.
   * @param parent the parent composite (cannot be <code>null</code>)
   * @param style the style of this widget
   */
  protected VisualizationWidget( final Composite parent, final int style ) {
    super( parent, style );
    this.addControlListener(new ControlAdapter() {
      public void controlResized(ControlEvent e)
      {
          Point psz = getSize();
          if (widgetOptions.matches(".*width:.*") &&
              widgetOptions.matches(".*height:.*")) {
             widgetSize = "";
          }
          else {
             widgetSize = "width: "+psz.x+", height: "+psz.y;
             if (!(widgetOptions.length() == 0)) {
                widgetSize = ", "+widgetSize;
             }
          }
          redraw();
      }
    });
  }
  
  /**
   * Gets the google api that backs this chart.
   * @return a string identifier that is the google visualization api
   */
  public String getGoogleAPI () {
    return CORE_CHART_API;
  }

  /**
   * Returns the data that composes/defines the actual visualization.
   * @return a string representating the data, or <code>null</code> if no data has been set.
   */
  public String getWidgetData() {
    return widgetData;
  }

  /**
   * Sets the layout of the widget. Calling this method has no effect.
   */
  public void setLayout( final Layout layout ) {
    //noop
  }

  /**
   * Sets the data that composes/defines the actual visualization.
   * @param widgetData a JSON string that represents the data for this visualization.
   */
  public void setWidgetData( String widgetData ) {
    if (widgetData==null) {
      this.widgetData = "";
    } else {
      this.widgetData = widgetData;
    }
  }

  /**
   * Sets the configurable options for this visualization widget.
   * The actual value depends on the type of Google visualization represented by this widget.
   * @param widgetOptions the configurable options of this widget. Specifying <code>null</code> 
   * will clear the options. If a width and height are specified in the options they will override
   * the default behavior, which is to auto-resize with the parent composite.
   */
  public void setWidgetOptions( String widgetOptions ) {
    if (widgetOptions==null) {
      widgetOptions = "";
    } else {
      this.widgetOptions = widgetOptions;
    }
  }

  /**
   * Returns the configurable options for this visualization widget.
   * The actual value depends on the type of Google visualization represented by this widget.
   * @return a string representing the widget options
   */
  public String getWidgetOptions() {
    return widgetOptions+widgetSize;
  }
  
  /**
   * Asks this widget to perform a redraw which will update the visualization according to the 
   * current widget data and options.
   */
  public void redraw() {
    super.redraw();
    dirty = true;
  }
  
  /**
   * Marks this widget as 'dirty' which will update the visualization according to the 
   * current widget data and options.
   */
  public void setDirty (boolean dirty) {
    this.dirty = dirty;
  }
  
  /**
   * Returns the 'dirty' state of this widget.
   * @return <code>true</code> if the widget has been marked dirty, else <code>false</code>
   */
  public boolean isDirty () {
    return dirty; 
  }
  
  /**
   * Sets the selected item in the visualization. The actual effects of this depend on the visualization.
   * @param selectedItem a string representing the item to select in the visualization.
   */
  public void setSelectedItem( String selectedItem ) {
    this.selectedItem  = selectedItem;
  }

  /**
   * Returns the selected item in the visualization.  The actual selected item returned depends on the
   * visualization.
   * @return a string representing the selected item.
   */
  public String getSelectedItem() {
    return selectedItem;
  }

  /**
   * Sets the selected row in the visualization. The actual effects of this depend on the visualization.
   * @param selectedRow a string representing the row to select in the visualization.
   */
  public void setSelectedRow( String selectedRow ) {
    this.selectedRow = selectedRow;
  }

  /**
   * Returns the selected row in the visualization.  The actual selected item returned depends on the
   * visualization.
   * @return a string representing the selected row.
   */
  public String getSelectedRow() {
    return selectedRow;
  }

  /**
   * Sets the selected column in the visualization. The actual effects of this depend on the visualization.
   * @param selectedColumn a string representing the column to select in the visualization.
   */
  public void setSelectedColumn( String selectedColumn ) {
    this.selectedColumn = selectedColumn;
  }

  /**
   * Returns the selected column in the visualization.  The actual selected column returned depends on the
   * visualization.
   * @return a string representing the selected column.
   */
  public String getSelectedColumn() {
    return selectedColumn;
  }

  /**
   * Sets the selected value in the visualization. The actual effects of this depend on the visualization.
   * @param selectedValue a string representing the value to select in the visualization.
   */
  public void setSelectedValue( String selectedValue ) {
    this.selectedValue = selectedValue;
  }

  /**
   * Returns the selected value in the visualization.  The actual selected value returned depends on the
   * visualization.
   * @return a string representing the selected item.
   */
  public String getSelectedValue() {
    return selectedValue;
  }
  
}
