/**************************************************************************
* ERA - Eclipse Requirements Analysis
* ==============================================
* Copyright (C) 2009-2013 by Georg Blaschke, Christoph P. Neumann
* and Bernd Haberstumpf (http://era.origo.ethz.ch)
**************************************************************************
* Licensed under the Eclipse Public License - v 1.0 (the "License");
* you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.eclipse.org/org/documents/epl-v10.html
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**************************************************************************
*/
package era.foss.typeeditor.view.layoutviewer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.RoundedRectangle;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartListener;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.swt.SWT;
import era.foss.erf.ErfPackage;
import era.foss.erf.ViewElement;
/**
* Our generic edit part.
*/
public class ViewElementEditPart extends AbstractGraphicalEditPart implements PropertyChangeListener, Adapter {
// default height and width in case the values are not retrieved by the model
private int elementHeightUnit = 20;
private int elementWidthUnit = 20;
RoundedRectangle labelFigure;
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
**/
protected IFigure createFigure() {
// add listener to react on changes of an view element
addEditPartListener();
// in case there is a grid use size of grid for the height units
Object viewerGridSpacingObject = this.getViewer().getProperty( SnapToGrid.PROPERTY_GRID_SPACING );
if( viewerGridSpacingObject instanceof Dimension ) {
this.elementHeightUnit = ((Dimension)viewerGridSpacingObject).height;
this.elementWidthUnit = ((Dimension)viewerGridSpacingObject).width;
}
// create the figure
RoundedRectangle rectangle = new RoundedRectangle();
rectangle.setSize( getModelRectangle().getSize() );
rectangle.setLocation( getModelRectangle().getLocation() );
rectangle.setBackgroundColor( ColorConstants.menuBackground );
// create figure for label
labelFigure = new RoundedRectangle();
labelFigure.setLineStyle( SWT.LINE_DOT );
labelFigure.setLocation( getModelRectangle().getLocation() );
labelFigure.setSize( this.elementWidthUnit, this.elementHeightUnit );
labelFigure.setBackgroundColor( ColorConstants.orange );
ViewElement viewElement = (ViewElement)getModel();
if( viewElement.isEditorShowLabel() == true ) {
rectangle.add( labelFigure );
}
return rectangle;
}
/**
* Add a listener for - changing colors for selected events
*/
private void addEditPartListener() {
this.addEditPartListener( new EditPartListener() {
@Override
public void childAdded( EditPart child, int index ) {
// TODO Auto-generated method stub
}
@Override
public void partActivated( EditPart editpart ) {
// TODO Auto-generated method stub
}
@Override
public void partDeactivated( EditPart editpart ) {
// TODO Auto-generated method stub
}
@Override
public void removingChild( EditPart child, int index ) {
// TODO Auto-generated method stub
}
@Override
public void selectedStateChanged( EditPart editpart ) {
if( editpart.getSelected() == EditPart.SELECTED
|| editpart.getSelected() == EditPart.SELECTED_PRIMARY ) {
ViewElementEditPart.this.getFigure().setBackgroundColor( ColorConstants.menuBackgroundSelected );
} else {
ViewElementEditPart.this.getFigure().setBackgroundColor( ColorConstants.menuBackground );
}
}
} );
}
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
**/
protected void createEditPolicies() {
}
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
**/
protected void refreshVisuals() {
Rectangle r = getModelRectangle();
((GraphicalEditPart)getParent()).setLayoutConstraint( this, getFigure(), r );
}
/**
* Get a rectangle with the position and size of the viewElement
*
* @return
*/
private Rectangle getModelRectangle() {
ViewElement viewElement = (ViewElement)getModel();
int x = viewElement.getEditorColumnPosition() * this.elementWidthUnit;
int y = viewElement.getEditorRowPosition() * this.elementHeightUnit;
int width = viewElement.getEditorColumnSpan() * this.elementWidthUnit;
int height = viewElement.getEditorRowSpan() * this.elementHeightUnit;
return new Rectangle( x, y, width, height );
}
/**
* @see org.eclipse.gef.EditPart#activate()
**/
public void activate() {
if( isActive() == false ) {
super.activate();
((ViewElement)getModel()).eAdapters().add( this );
}
}
/**
* @see org.eclipse.gef.EditPart#deactivate()
**/
public void deactivate() {
if( isActive() == true ) {
super.deactivate();
((ViewElement)getModel()).eAdapters().remove( this );
}
}
@Override
public void notifyChanged( Notification notification ) {
Object feature = notification.getFeature();
if( feature == null ) {
return;
}
if( feature.equals( ErfPackage.Literals.VIEW_ELEMENT__EDITOR_COLUMN_POSITION )
|| feature.equals( ErfPackage.Literals.VIEW_ELEMENT__EDITOR_ROW_POSITION )
|| feature.equals( ErfPackage.Literals.VIEW_ELEMENT__EDITOR_COLUMN_SPAN )
|| feature.equals( ErfPackage.Literals.VIEW_ELEMENT__EDITOR_ROW_SPAN ) ) {
refreshVisuals();
} else if( feature.equals( ErfPackage.Literals.VIEW_ELEMENT__EDITOR_SHOW_LABEL ) ) {
if( notification.getNewBooleanValue() == true ) {
ViewElementEditPart.this.getFigure().add( labelFigure );
} else {
ViewElementEditPart.this.getFigure().remove( labelFigure );
}
ViewElementEditPart.this.getFigure().repaint();
}
}
@Override
public Notifier getTarget() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setTarget( Notifier newTarget ) {
// TODO Auto-generated method stub
}
@Override
public boolean isAdapterForType( Object type ) {
if( type instanceof ViewElement ) {
return true;
} else {
return false;
}
}
@Override
public void propertyChange( PropertyChangeEvent evt ) {
// TODO Auto-generated method stub
}
}