/*
 * Copyright (c) 2011, 2012, 2015 Eike Stepper (Berlin, Germany) 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:
 *     Martin Fluegge - initial API and implementation
 *
 */
package org.eclipse.emf.cdo.dawn.examples.acore.graphiti.features;

import org.eclipse.emf.ecore.EObject;

import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.IAddConnectionContext;
import org.eclipse.graphiti.features.context.IAddContext;
import org.eclipse.graphiti.features.impl.AbstractAddFeature;
import org.eclipse.graphiti.mm.GraphicsAlgorithmContainer;
import org.eclipse.graphiti.mm.algorithms.Polyline;
import org.eclipse.graphiti.mm.algorithms.Text;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.ConnectionDecorator;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.services.IGaService;
import org.eclipse.graphiti.services.IPeCreateService;
import org.eclipse.graphiti.util.IColorConstant;

/**
 * @author Martin Fluegge
 */
public abstract class AcoreBasicAddConnectionFeature extends AbstractAddFeature
{
  public AcoreBasicAddConnectionFeature(IFeatureProvider fp)
  {
    super(fp);
  }

  public PictogramElement add(IAddContext context)
  {
    IAddConnectionContext addConContext = (IAddConnectionContext)context;
    // EReference addedEReference = (EReference)context.getNewObject();
    EObject addedObject = (EObject)context.getNewObject();
    IPeCreateService peCreateService = Graphiti.getPeCreateService();

    // CONNECTION WITH POLYLINE
    Connection connection = peCreateService.createFreeFormConnection(getDiagram());
    connection.setStart(addConContext.getSourceAnchor());
    connection.setEnd(addConContext.getTargetAnchor());

    IGaService gaService = Graphiti.getGaService();
    Polyline polyline = gaService.createPolyline(connection);
    polyline.setLineWidth(2);
    polyline.setForeground(manageColor(IColorConstant.BLACK));

    // we need to put in an object, otherwise the line will be marked dotted
    // link(connection, addedObject);

    ConnectionDecorator textDecorator = peCreateService.createConnectionDecorator(connection, true, 0.5, true);

    Text text = gaService.createDefaultText(getDiagram(), textDecorator);

    text.setForeground(manageColor(IColorConstant.BLACK));
    gaService.setLocation(text, 10, 0);

    text.setValue(getConnectionLabel());

    ConnectionDecorator cd;
    cd = peCreateService.createConnectionDecorator(connection, false, 1.0, true);
    createTargetDecoration(cd);
    return connection;
  }

  protected abstract String getConnectionLabel();

  public abstract boolean canAdd(IAddContext context);

  protected abstract Polyline createTargetDecoration(GraphicsAlgorithmContainer gaContainer);
}
