/**************************************************************************
* 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.util.ArrayList;
import java.util.List;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.value.IValueChangeListener;
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.IEMFListProperty;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.editparts.FreeformGraphicalRootEditPart;
import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import era.foss.erf.ErfPackage;
/**
* The Class ViewLayoutViewer.
*/
public class ViewLayoutViewer extends ScrollingGraphicalViewer {
/** The Constant ID. */
public static final String ID = "test.view";
// GEF editing domain
/** The gef editing domain. */
private EditDomain gefEditingDomain;
// eMF editing domain
/** The emf editing domain. */
private EditingDomain emfEditingDomain;
/** The view master. */
IViewerObservableValue viewMaster;
/** The viewer filter list. */
final private List<ViewerFilter> viewerFilterList = new ArrayList<ViewerFilter>();
/**
* Instantiates a new view layout viewer.
*
* @param editingDomain the editing domain
* @param parent the parent
*/
public ViewLayoutViewer( EditingDomain editingDomain, Composite parent ) {
super();
this.emfEditingDomain = editingDomain;
this.setControl( new FigureCanvas( parent, SWT.BORDER, getLightweightSystem() ) );
this.getControl().setBackground( ColorConstants.white );
this.setProperty( SnapToGrid.PROPERTY_GRID_ENABLED, true );
this.setProperty( SnapToGrid.PROPERTY_GRID_VISIBLE, true );
this.setProperty( SnapToGrid.PROPERTY_GRID_SPACING, new Dimension( 30, 30 ) );
this.setProperty( SnapToGrid.PROPERTY_GRID_ORIGIN, new Point( 0, 0 ) );
gefEditingDomain = new DefaultEditDomain( null );
gefEditingDomain.addViewer( this );
this.setEditPartFactory( new GraphicalPartFactory() );
this.setRootEditPart( new FreeformGraphicalRootEditPart() );
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#setContents(java.lang.Object)
*/
@Override
public void setContents( Object content ) {
assert (content instanceof IViewerObservableValue);
viewMaster = (IViewerObservableValue)content;
viewMaster.addValueChangeListener( new IValueChangeListener() {
@Override
public void handleValueChange( ValueChangeEvent event ) {
ViewLayoutViewer.this.refresh();
}
} );
IEMFListProperty viewsProperty = EMFProperties.list( ErfPackage.Literals.VIEW__VIEW_ELEMENTS );
viewsProperty.observeDetail( viewMaster ).addChangeListener( new IChangeListener() {
@Override
public void handleChange( ChangeEvent event ) {
ViewLayoutViewer.this.refresh();
}
} );
super.setContents( viewMaster.getValue() );
}
/**
* Refresh.
*/
public void refresh() {
ViewLayoutViewer.super.setContents( viewMaster.getValue() );
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#getSelection()
*/
public ISelection getSelection() {
@SuppressWarnings("unchecked")
List<EditPart> selectionEditPartList = this.getSelectedEditParts();
List<Object> modelElementList = new ArrayList<Object>();
// get model elements of edit parts
for( EditPart editPart : selectionEditPartList ) {
modelElementList.add( editPart.getModel() );
}
return new StructuredSelection( modelElementList );
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#setSelection(org.eclipse.jface.viewers.ISelection)
*/
public void setSelection( ISelection selection ) {
List<Object> newEditPartSelection = new ArrayList<Object>();
// find edit parts for model elements
for( Object modelElement : ((IStructuredSelection)selection).toList() ) {
newEditPartSelection.add( this.getEditPartRegistry().get( modelElement ) );
}
/*
* setting the viewport for the selection. seems we need black magic here....
* ((FigureCanvas)this.getControl()).getViewport() .setViewLocation(
* ((AbstractGraphicalEditPart)super.getSelectedEditParts() .get( 0 )).getFigure() .getBounds() .getLocation()
* );
*/
super.setSelection( new StructuredSelection( newEditPartSelection ) );
}
/**
* add a filter.
*
* @param filter the filter
*/
public void addFilter( ViewerFilter filter ) {
this.viewerFilterList.add( filter );
}
/**
* remove a filter.
*
* @param filter the filter
*/
public void removeFilter( ViewerFilter filter ) {
this.viewerFilterList.remove( filter );
}
/**
* add the emf editing domain.
*
* @return the emf editing domain
*/
public EditingDomain getEmfEditingDomain() {
return emfEditingDomain;
}
Object[] filter( Object parent, Object[] elements ) {
Object result[] = elements;
for( ViewerFilter filter : viewerFilterList ) {
result = filter.filter( null, parent, result );
}
// TODO Auto-generated method stub
return result;
}
}