/*
 * 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.cdo.dawn.examples.acore.AClass;

import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.IAddContext;
import org.eclipse.graphiti.mm.algorithms.styles.Color;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.util.ColorConstant;
import org.eclipse.graphiti.util.IColorConstant;

/**
 * @author Martin Fluegge
 */
public class AcoreAddAClassFeature extends AcoreBasicAddElementFeature
{
  private static final IColorConstant CLASS_TEXT_FOREGROUND = new ColorConstant(51, 51, 153);

  private static final IColorConstant CLASS_FOREGROUND = new ColorConstant(150, 150, 255);

  private static final IColorConstant CLASS_BACKGROUND = new ColorConstant(230, 230, 255);

  public AcoreAddAClassFeature(IFeatureProvider fp)
  {
    super(fp);
  }

  @Override
  public boolean canAdd(IAddContext context)
  {
    // check if user wants to add a AClass
    if (context.getNewObject() instanceof AClass)
    {
      // check if user wants to add to a diagram
      if (context.getTargetContainer() instanceof Diagram)
      {
        return true;
      }
    }
    return false;
  }

  @Override
  protected Color getBackgroundColor()
  {
    return manageColor(CLASS_BACKGROUND);
  }

  @Override
  protected Color getForegroundColor()
  {
    return manageColor(CLASS_FOREGROUND);
  }
}
