/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsdl.ui.internal.graph;

import java.util.List;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.StackLayout;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.ContextMenuProvider;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.editparts.ScalableRootEditPart;
import org.eclipse.gef.tools.SelectionTool;
import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IEditorSite;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.WSDLElement;
import org.eclipse.wst.wsdl.ui.internal.WSDLEditor;
import org.eclipse.wst.wsdl.ui.internal.actions.ExtensibleMenuActionContributor;
import org.eclipse.wst.wsdl.ui.internal.gef.util.figures.CenterLayout;
import org.eclipse.wst.wsdl.ui.internal.graph.editparts.ComponentViewerRootEditPart;
import org.eclipse.wst.wsdl.ui.internal.graph.figures.MyConnectionRenderingHelper;
import org.eclipse.wst.wsdl.ui.internal.model.WSDLGroupObject;
import org.eclipse.wst.wsdl.ui.internal.util.OpenOnSelectionHelper;
import org.eclipse.wst.xsd.ui.internal.gef.util.figures.ConnectionRenderingFigure;
import org.eclipse.wst.xsd.ui.internal.gef.util.figures.IConnectionRenderingViewer;
import org.w3c.dom.Node;

public class WSDLComponentViewer extends ScrollingGraphicalViewer implements IConnectionRenderingViewer
{
  protected EditDomain editDomain;
  protected WSDLEditor editor;
  protected ISelectionProvider menuSelectionProvider;
  protected ComponentViewerRootEditPart componentViewerRootEditPart;
  protected ConnectionRenderingFigure connectionRenderingFigure;
  protected boolean isPreserveExpansionEnabled;

  public WSDLComponentViewer(WSDLEditor editor, ISelectionProvider menuSelectionProvider)
  {
    super();
    this.editor = editor;
    this.menuSelectionProvider = menuSelectionProvider;
  }

  public void setPreserveExpansionEnabled(boolean isPreserveExpansionEnabled)
  {
    this.isPreserveExpansionEnabled = isPreserveExpansionEnabled;
  }

  public boolean isPreserveExpansionEnabled()
  {
    return isPreserveExpansionEnabled;
  }

  public ConnectionRenderingFigure getConnectionRenderingFigure()
  {
    return connectionRenderingFigure;
  }

  public Object getInput()
  {
    return componentViewerRootEditPart.getModel();
  }

  public void setInput(Object object)
  {
    componentViewerRootEditPart.setInput(object);
    
    if (object instanceof Definition)
    {
      editor.getGraphViewer().setBackButtonEnabled(false);
    }
    else
    {
      editor.getGraphViewer().setBackButtonEnabled(true);
    }
    
    // todo.. revisit this to understand why we don't get a set input
    // when drilling down into a schema element or type
    //
    int layoutAlignment = (object instanceof Definition) ? 
                          CenterLayout.ALIGNMENT_TOP :
                          CenterLayout.ALIGNMENT_CENTER;
    
    ScalableRootEditPart graphicalRootEditPart = (ScalableRootEditPart)getRootEditPart();
    CenterLayout centerLayout = (CenterLayout)graphicalRootEditPart.getLayer(LayerConstants.PRIMARY_LAYER).getLayoutManager();
    centerLayout.setVerticalAlignment(layoutAlignment);
  }

  //public void setSelection(Object object)
  //{                                      
  //}

  protected void hookControl()
  {
    super.hookControl();

    getControl().setBackground(ColorConstants.white);

    editDomain = new DefaultEditDomain(null);
    ((DefaultEditDomain)editDomain).setDefaultTool(new SelectionTool());
    editDomain.loadDefaultTool();
    editDomain.addViewer(this);

    componentViewerRootEditPart = new ComponentViewerRootEditPart();

    KeyAdapter keyListener = new KeyAdapter()
    {
      public void keyReleased(KeyEvent e)
      {   	
        if (e.keyCode == SWT.F3)
        {
          ISelection selection = editor.getSelectionManager().getSelection();
          if (selection instanceof IStructuredSelection)
          {
            Object object = ((IStructuredSelection)selection).getFirstElement();
            if (object instanceof EObject)
            {
			  OpenOnSelectionHelper helper = new OpenOnSelectionHelper(editor.getDefinition());
              helper.openEditor((EObject)object);
            }
          }

        }
      }
    };
    getControl().addKeyListener(keyListener);

    setContents(componentViewerRootEditPart);
    //getFigureCanvas().addKeyListener(new FigureCanvasKeyboardHandler(editor));
    getRootEditPart().activate();

    componentViewerRootEditPart.setInput(editor.getDefinition());

    ScalableRootEditPart graphicalRootEditPart = (ScalableRootEditPart)getRootEditPart();

    // set the layout for the primary layer so that the children are always centered
    //
    CenterLayout centerLayout = new CenterLayout();
    centerLayout.setVerticalAlignment(CenterLayout.ALIGNMENT_TOP);
    graphicalRootEditPart.getLayer(LayerConstants.PRIMARY_LAYER).setLayoutManager(centerLayout); //new ContainerLayout());//

    ContextMenuProvider menuProvider = new InternalContextMenuProvider(this, editor); 
    setContextMenu(menuProvider);
    
    // add context menu to the graph
    MenuManager manager = new MenuManager("#popup");
    manager.addMenuListener(menuProvider);
    manager.setRemoveAllWhenShown(true);
    Menu menu = manager.createContextMenu(getControl());
    getControl().setMenu(menu);    
    
    // enable popupMenus extension
    ((IEditorSite) editor.getSite()).registerContextMenu("org.eclipse.wst.wsdl.ui.popup.graph", manager, menuSelectionProvider, false);
  
    // add the ConnectionFigure which is responsible for drawing all of the lines in the view
    //                       
    IFigure figure = graphicalRootEditPart.getLayer(LayerConstants.CONNECTION_LAYER);
    figure.setLayoutManager(new StackLayout());

    final MyConnectionRenderingHelper connectionRenderingHelper = new MyConnectionRenderingHelper(this);

    connectionRenderingFigure = new ConnectionRenderingFigure(graphicalRootEditPart.getLayer(LayerConstants.PRIMARY_LAYER))
    {
      protected void fillShape(Graphics graphics)
      {
        super.fillShape(graphics);
        connectionRenderingHelper.fillShapeHelper(graphics);
      }
    };
    figure.add(connectionRenderingFigure);
    figure.validate();
  }
  
  public WSDLEditor getWSDLEditor() {
  	return editor;
  }

  public class InternalContextMenuProvider extends ContextMenuProvider
  {
    protected EditPartViewer viewer;
    protected ExtensibleMenuActionContributor extensibleMenuActionContributor;

    public InternalContextMenuProvider(EditPartViewer viewer, WSDLEditor editor)
    {
      super(viewer);
      this.viewer = viewer;
      extensibleMenuActionContributor = new ExtensibleMenuActionContributor(editor);
    }

    public void buildContextMenu(IMenuManager menu)
    {
      List list = getSelectedEditParts();
      if (list.size() > 0)
      {
        EditPart editPart = (EditPart)list.get(0);
        Object object = editPart.getModel();

        //if (editPart instanceof PropertyEditPart)
        //{
        //  object = ((PropertyEditPart)editPart).getOwnerModel();
        //}               

        if (object != null)
        {
          Node node = null;
          if (object instanceof Node)
          {
            node = (Node)object;
          }
          else if (object instanceof WSDLElement)
          {
            node = ((WSDLElement)object).getElement();
          }
          else if (object instanceof WSDLGroupObject)
          {
            node = ((WSDLGroupObject)object).getDefinition().getElement();
          }
          extensibleMenuActionContributor.contributeMenuActions(menu, node, object);
        }
      }
    }
  }
}
