Project: dawn-third
/*******************************************************************************
 * Copyright (c) 2010 Oak Ridge National Laboratory. 
 * 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 
 ******************************************************************************/
package org.csstudio.swt.xygraph.toolbar; 
 
import java.util.ArrayList; 
import java.util.List; 
 
import org.csstudio.swt.xygraph.figures.Annotation; 
import org.csstudio.swt.xygraph.figures.Axis; 
import org.csstudio.swt.xygraph.figures.Trace; 
import org.csstudio.swt.xygraph.figures.XYGraph; 
import org.csstudio.swt.xygraph.undo.XYGraphConfigCommand; 
import org.eclipse.jface.dialogs.Dialog; 
import org.eclipse.jface.dialogs.IDialogConstants; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.custom.StackLayout; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.graphics.Point; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Combo; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Control; 
import org.eclipse.swt.widgets.Group; 
import org.eclipse.swt.widgets.Shell; 
import org.eclipse.swt.widgets.TabFolder; 
import org.eclipse.swt.widgets.TabItem; 
 
/**The dialog for configuring XYGraph properties.
 * @author Xihui Chen 
 * 
 */
 
public class XYGraphConfigDialog extends Dialog { 
  
 private GraphConfigPage graphConfigPage; 
 protected List<AnnotationConfigPage> annotationConfigPageList; 
 private List<AxisConfigPage> axisConfigPageList; 
 protected Combo traceCombo; 
 protected Combo annotationsCombo; 
 protected List<TraceConfigPage> traceConfigPageList; 
 protected XYGraph xyGraph; 
 protected XYGraphConfigCommand command; 
 private boolean changed = false
  
 protected XYGraphConfigDialog(Shell parentShell, XYGraph xyGraph) { 
  super(parentShell);  
  this.xyGraph = xyGraph; 
  graphConfigPage = new GraphConfigPage(xyGraph); 
  annotationConfigPageList = new ArrayList<AnnotationConfigPage>(); 
  axisConfigPageList = new ArrayList<AxisConfigPage>(); 
  traceConfigPageList = new ArrayList<TraceConfigPage>(); 
  command = new XYGraphConfigCommand(xyGraph); 
  command.savePreviousStates(); 
        // Allow resize 
        setShellStyle(getShellStyle() | SWT.RESIZE); 
 
  
 @Override 
 protected void configureShell(Shell newShell) { 
  super.configureShell(newShell); 
  newShell.setText("Configure Graph Settings"); 
 
  
 @Override 
 protected Control createDialogArea(Composite parent) { 
  final Composite parent_composite = (Composite) super.createDialogArea(parent); 
  parent_composite.setLayout(new FillLayout()); 
        final TabFolder tabFolder = new TabFolder(parent_composite, SWT.NONE);    
         
        Composite graphTabComposite = new Composite(tabFolder, SWT.NONE);         
        graphConfigPage.createPage(graphTabComposite); 
         
        TabItem graphConfigTab = new TabItem(tabFolder, SWT.NONE); 
        graphConfigTab.setText("Graph"); 
        graphConfigTab.setToolTipText("Configure General Graph Settings"); 
        graphConfigTab.setControl(graphTabComposite); 
         
         
        //Axis Configure Page 
        Composite axisTabComposite = new Composite(tabFolder, SWT.NONE); 
     axisTabComposite.setLayout(new GridLayout(1false));          
     TabItem axisConfigTab = new TabItem(tabFolder, SWT.NONE); 
     axisConfigTab.setText("Axes"); 
     axisConfigTab.setToolTipText("Configure Axes Settings"); 
     axisConfigTab.setControl(axisTabComposite); 
      
     Group axisSelectGroup = new Group(axisTabComposite, SWT.NONE); 
     axisSelectGroup.setLayoutData(new GridData( 
       SWT.FILL, SWT.FILL,truefalse)); 
     axisSelectGroup.setText("Select Axis"); 
     axisSelectGroup.setLayout(new GridLayout(1false));              
     final Combo axisCombo = new Combo(axisSelectGroup, SWT.DROP_DOWN); 
     axisCombo.setLayoutData(new GridData(SWT.FILL, 0truefalse)); 
     for(Axis axis : xyGraph.getAxisList()) 
         axisCombo.add(axis.getTitle() + (axis.isHorizontal() ? "(X-Axis)" : "(Y-Axis)"));     
     axisCombo.select(0); 
      
     final Composite axisConfigComposite = new Composite(axisTabComposite, SWT.NONE); 
     axisConfigComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, truefalse)); 
     final StackLayout axisStackLayout = new StackLayout(); 
     axisConfigComposite.setLayout(axisStackLayout);          
     for(Axis axis : xyGraph.getAxisList()){ 
         Group axisConfigGroup = new Group(axisConfigComposite, SWT.NONE);            
         axisConfigGroup.setText("Change Settings"); 
         axisConfigGroup.setLayoutData(new GridData( 
           SWT.FILL, SWT.FILL,truetrue)); 
         AxisConfigPage axisConfigPage =  
          new AxisConfigPage(xyGraph, axis); 
         axisConfigPageList.add(axisConfigPage); 
         axisConfigPage.createPage(axisConfigGroup);             
     }           
     axisStackLayout.topControl = axisConfigPageList.get(0).getComposite(); 
     axisCombo.addSelectionListener(new SelectionAdapter(){ 
         @Override 
      public void widgetSelected(SelectionEvent e) { 
       axisStackLayout.topControl = axisConfigPageList.get( 
         axisCombo.getSelectionIndex()).getComposite(); 
       axisConfigComposite.layout(truetrue); 
      
     });  
         
    //Trace Configure Page      
    if(xyGraph.getPlotArea().getTraceList().size() > 0){ 
         Composite traceTabComposite = new Composite(tabFolder, SWT.NONE); 
      traceTabComposite.setLayout(new GridLayout(1false));          
      TabItem traceConfigTab = new TabItem(tabFolder, SWT.NONE); 
      traceConfigTab.setText("Traces"); 
      traceConfigTab.setToolTipText("Configure Traces Settings"); 
      traceConfigTab.setControl(traceTabComposite); 
       
      Group traceSelectGroup = new Group(traceTabComposite, SWT.NONE); 
      traceSelectGroup.setLayoutData(new GridData( 
        SWT.FILL, SWT.FILL,truefalse)); 
      traceSelectGroup.setText("Select Trace"); 
      traceSelectGroup.setLayout(new GridLayout(1false));              
      this.traceCombo = new Combo(traceSelectGroup, SWT.DROP_DOWN); 
      traceCombo.setLayoutData(new GridData(SWT.FILL, 0truefalse)); 
      for(Trace trace : xyGraph.getPlotArea().getTraceList()) 
          traceCombo.add(trace.getName());     
      traceCombo.select(0); 
       
      final Composite traceConfigComposite = new Composite(traceTabComposite, SWT.NONE); 
      traceConfigComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, truefalse)); 
      final StackLayout traceStackLayout = new StackLayout(); 
      traceConfigComposite.setLayout(traceStackLayout);          
      for(Trace trace : xyGraph.getPlotArea().getTraceList()){ 
          Group traceConfigGroup = new Group(traceConfigComposite, SWT.NONE);            
          traceConfigGroup.setText("Change Settings"); 
          traceConfigGroup.setLayoutData(new GridData( 
            SWT.FILL, SWT.FILL,truetrue)); 
          TraceConfigPage traceConfigPage =  
           new TraceConfigPage(xyGraph, trace); 
          traceConfigPageList.add(traceConfigPage); 
          traceConfigPage.createPage(traceConfigGroup);             
      }           
          traceStackLayout.topControl = traceConfigPageList.get(0).getComposite(); 
          traceCombo.addSelectionListener(new SelectionAdapter(){ 
       @Override 
       public void widgetSelected(SelectionEvent e) { 
        traceStackLayout.topControl = traceConfigPageList.get( 
          traceCombo.getSelectionIndex()).getComposite(); 
        traceConfigComposite.layout(truetrue); 
       
      });  
    } 
          
         
        //Annotation Configure Page 
        if(xyGraph.getPlotArea().getAnnotationList().size()>0){ 
         Composite annoTabComposite = new Composite(tabFolder, SWT.NONE); 
         annoTabComposite.setLayout(new GridLayout(1false));          
         TabItem annoConfigTab = new TabItem(tabFolder, SWT.NONE); 
      annoConfigTab.setText("Annotations"); 
      annoConfigTab.setToolTipText("Configure Annotation Settings"); 
      annoConfigTab.setControl(annoTabComposite); 
       
         Group annoSelectGroup = new Group(annoTabComposite, SWT.NONE); 
         annoSelectGroup.setLayoutData(new GridData( 
           SWT.FILL, SWT.FILL,truefalse)); 
         annoSelectGroup.setText("Select Annotation"); 
         annoSelectGroup.setLayout(new GridLayout(1false));              
         this.annotationsCombo = new Combo(annoSelectGroup, SWT.DROP_DOWN); 
         annotationsCombo.setLayoutData(new GridData(SWT.FILL, 0truefalse)); 
          for(Annotation annotation : xyGraph.getPlotArea().getAnnotationList()) 
           annotationsCombo.add(annotation.getName()); 
          annotationsCombo.select(0); 
          
          final Composite annoConfigComposite = new Composite(annoTabComposite, SWT.NONE); 
          annoConfigComposite.setLayoutData(new GridData( 
            SWT.FILL, SWT.FILL, truefalse)); 
          final StackLayout stackLayout = new StackLayout(); 
         annoConfigComposite.setLayout(stackLayout);          
          for(Annotation annotation : xyGraph.getPlotArea().getAnnotationList()){ 
           Group annoConfigGroup = new Group(annoConfigComposite, SWT.NONE);            
          annoConfigGroup.setText("Change Settings"); 
          annoConfigGroup.setLayoutData(new GridData( 
            SWT.FILL, SWT.FILL,truetrue)); 
          AnnotationConfigPage annotationConfigPage =  
           new AnnotationConfigPage(xyGraph, annotation); 
          annotationConfigPageList.add(annotationConfigPage); 
          annotationConfigPage.createPage(annoConfigGroup);             
          }           
          stackLayout.topControl = annotationConfigPageList.get(0).getComposite(); 
          annotationsCombo.addSelectionListener(new SelectionAdapter(){ 
          @Override 
          public void widgetSelected(SelectionEvent e) { 
           stackLayout.topControl = annotationConfigPageList.get( 
             annotationsCombo.getSelectionIndex()).getComposite(); 
           annoConfigComposite.layout(truetrue); 
          
         });          
        } 
         
  return parent_composite; 
 
  
 @Override 
 protected void createButtonsForButtonBar(Composite parent) { 
  ((GridLayout) parent.getLayout()).numColumns++; 
  Button button = new Button(parent, SWT.PUSH); 
  button.setText("Apply"); 
  GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL); 
  int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); 
  Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); 
  data.widthHint = Math.max(widthHint, minSize.x); 
  button.setLayoutData(data); 
  button.addSelectionListener(new SelectionAdapter(){ 
   @Override 
   public void widgetSelected(SelectionEvent e) { 
    applyChanges(); 
   
  });   
  super.createButtonsForButtonBar(parent); 
  Shell shell = parent.getShell(); 
  if (shell != null) { 
   shell.setDefaultButton(button); 
  
 
  
  
 @Override 
 protected void okPressed() {  
  applyChanges(); 
  command.saveAfterStates(); 
  xyGraph.getOperationsManager().addCommand(command); 
  super.okPressed(); 
 
  
 protected void applyChanges(){  
  changed = true
  graphConfigPage.applyChanges(); 
  for(AxisConfigPage axisConfigPage : axisConfigPageList) 
   axisConfigPage.applyChanges(); 
  for(TraceConfigPage traceConfigPage : traceConfigPageList) 
   traceConfigPage.applyChanges(); 
  for(AnnotationConfigPage annotationConfigPage : annotationConfigPageList) 
   annotationConfigPage.applyChanges();      
 
  
 @Override 
 protected void cancelPressed() { 
  if(changed){ 
   command.saveAfterStates(); 
   xyGraph.getOperationsManager().addCommand(command); 
  }    
  super.cancelPressed(); 
 
}