/*******************************************************************************
 * 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.xsd.ui.internal.graph;

import java.util.Iterator;

import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.StackLayout;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.KeyHandler;
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.MenuManager;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.wst.xsd.ui.internal.XSDEditor;
import org.eclipse.wst.xsd.ui.internal.XSDMenuListener;
import org.eclipse.wst.xsd.ui.internal.gef.util.figures.ConnectionRenderingFigure;
import org.eclipse.wst.xsd.ui.internal.gef.util.figures.IConnectionRenderingViewer;
import org.eclipse.wst.xsd.ui.internal.graph.figures.CenterLayout;
import org.eclipse.xsd.XSDConcreteComponent;


/**
 * @author ernest
 *
 * To change this generated comment go to 
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public abstract class BaseGraphicalViewer extends ScrollingGraphicalViewer implements IConnectionRenderingViewer
{
  protected FigureCanvasKeyboardHandler figureCanvasKeyboardHandler;

  protected EditDomain editDomain;

  protected boolean isInputEnabled = true;

  protected boolean isSelectionEnabled = true;

  protected ISelectionProvider menuSelectionProvider;

  protected GraphContextMenuProvider menuProvider;

  protected XSDEditor editor;

  protected XSDConcreteComponent input;

  protected ConnectionRenderingFigure connectionRenderingFigure;

  public BaseGraphicalViewer(XSDEditor editor, ISelectionProvider selectionProvider)
  {
    super();
    this.editor = editor;
    menuSelectionProvider = selectionProvider;
  }
  
  public ConnectionRenderingFigure getConnectionRenderingFigure()
  {
    return connectionRenderingFigure;
  }

  public void setInputEnabled(boolean enabled)
  {
    isInputEnabled = enabled;
  }

  public void setSelectionEnabled(boolean enabled)
  {
    isSelectionEnabled = enabled;
  }

  public XSDMenuListener getMenuListener()
  {
    return menuProvider.getMenuListener();
  }

  protected static Color white = null;
  protected void hookControl()
  {                     
    super.hookControl();
  
    if (white == null)
    {
      white = new Color(getControl().getDisplay(), 255, 255, 255);
    }
    getControl().setBackground(white); 
  
    editDomain = new DefaultEditDomain(null);
    ((DefaultEditDomain)editDomain).setDefaultTool(new SelectionTool());
    editDomain.loadDefaultTool();
    editDomain.addViewer(this);
  
    //jvh - gef port - moved this from below so it is available when adding context menu below
    menuProvider = new GraphContextMenuProvider(this, menuSelectionProvider);
    setContextMenu(menuProvider);
  
    // add context menu to the graph
    MenuManager manager = new MenuManager();
    manager.addMenuListener(getMenuListener());  //jvh - gef port
    manager.setRemoveAllWhenShown(true);
    Menu menu = manager.createContextMenu(getControl());
    getControl().setMenu(menu);
    
    // enable popupMenus extension
    //BUG 68938 eclipse bug fixed. Bug 112955 - Filter out menu contributions.
    editor.getEditorSite().registerContextMenu("org.eclipse.wst.xsd.ui.popup.graph", manager, menuSelectionProvider, false);
    
//    KeyAdapter keyListener = new KeyAdapter()
//    {
//      /**
//       * @see org.eclipse.swt.events.KeyAdapter#keyReleased(KeyEvent)
//       */
//      public void keyReleased(KeyEvent e)
//      {
//        if (e.character == SWT.DEL)
//        {
//          getMenuListener().getDeleteAction().run();
//        }
//      }
//    };
  
    setKeyHandler(new XSDGraphicalViewerKeyHandler(this).setParent(new KeyHandler()));
    
//    getControl().addKeyListener(keyListener);

    figureCanvasKeyboardHandler = new FigureCanvasKeyboardHandler(this);
    getFigureCanvas().addKeyListener(figureCanvasKeyboardHandler);
    
  	getRootEditPart().activate();		
                       
  	ScalableRootEditPart graphicalRootEditPart = (ScalableRootEditPart)getRootEditPart();
     
    // set the layout for the primary layer so that the children are always centered
    //
    graphicalRootEditPart.getLayer(LayerConstants.PRIMARY_LAYER).setLayoutManager(new CenterLayout());
  
    // add the ConnectionRenderingFigure which is responsible for drawing all of the lines in the view
    //                       
    IFigure figure = graphicalRootEditPart.getLayer(LayerConstants.HANDLE_LAYER);
    figure.setLayoutManager(new StackLayout());          
    connectionRenderingFigure = new ConnectionRenderingFigure(graphicalRootEditPart.getLayer(LayerConstants.PRIMARY_LAYER));      
    figure.add(connectionRenderingFigure);
  
    figure.validate();      
  }

  public XSDConcreteComponent getInput()
  {
    return input;
  }

  protected EditPart getEditPart(EditPart parent, Object object)
  {
    EditPart result = null;
    for (Iterator i = parent.getChildren().iterator(); i.hasNext(); )
    {
      EditPart editPart = (EditPart)i.next();
      if (editPart.getModel() == object)
      {  
        result = editPart;
        break;
      }
    }             
  
    if (result == null)
    { 
      for (Iterator i = parent.getChildren().iterator(); i.hasNext(); )
      {
        EditPart editPart = getEditPart((EditPart)i.next(), object);
        if (editPart != null)
        {
          result = editPart;
          break;
        }
      }            
    }
  
    return result;
  }
  
  public abstract void setInput(XSDConcreteComponent comp);
  
  public abstract void setSelection(XSDConcreteComponent comp);
  
  
}
