/**************************************************************************
* 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.objecteditor.specobject;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CommandStack;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.DeleteCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.viewers.StructuredSelection;
import era.foss.erf.Content;
import era.foss.erf.ErfFactory;
import era.foss.erf.ErfPackage;
import era.foss.erf.SpecHierarchy;
import era.foss.erf.SpecObject;
import era.foss.erf.SpecType;
import era.foss.erf.Specification;
import era.foss.objecteditor.ErfObjectsEditorPlugin;
/**
* This class holds methods for a handling {@link SpecObject}s like
* <ul>
* <li>creating a {@link SpecObject} in the desired hierarchy level</li>
* <li>deleting a {@link SpecObject} and all elements in the hirarchy below</li>
* </ul>
*
*/
public class SpecObjectHandler {
public SpecObjectHandler() {
}
/**
* Remove specObject and associated hierarchy element in {@link SpecHierarchy}
*
* @param specObject specObject to be deleted
* */
public static void deleteSpecObject( EditingDomain editingDomain, SpecObject specObject ) {
CompoundCommand compoundCommand = new CompoundCommand();
compoundCommand.setLabel( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_DeleteSpecObject_label" ) );
compoundCommand.setDescription( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_DeleteSpecObject_description" ) );
// delete SpecHierarachy
StructuredSelection specHierarchySelection = new StructuredSelection( specObject.getSpecHierarchy() );
if( !specHierarchySelection.isEmpty() ) {
Command deleteSpecHierarachyCommand = new DeleteCommand( editingDomain, specHierarchySelection.toList() );
compoundCommand.append( deleteSpecHierarachyCommand );
}
// delete SpecObject
Command deleteSpecObjectCommand = new DeleteCommand(
editingDomain,
new StructuredSelection( specObject ).toList() );
compoundCommand.append( deleteSpecObjectCommand );
editingDomain.getCommandStack().execute( compoundCommand );
}
/**
* Create a new SpecObject and a new SpecHierarchy which refers to the SpecObject
*
* The SpecHierachy is be created beneath the Specification
*
* @param specType the type of the SpecObject to create
*/
public static void createNewSpecObject( EditingDomain editingDomain,
Content content,
SpecType specType,
Specification specification ) {
createNewSpecObject( editingDomain, content, specType, specification, ErfPackage.SPECIFICATION__CHILDREN );
}
/**
* Create a new SpecObject and a new SpecHierarchy which refers to the SpecObject
*
* The SpecHierachy is be created beneath the Specification
*
* @param specType the type of the SpecObject to create
*/
public static void createNewSpecObject( EditingDomain editingDomain,
Content content,
SpecType specType,
SpecHierarchy specHierarchyParent ) {
createNewSpecObject( editingDomain,
content,
specType,
specHierarchyParent,
ErfPackage.SPEC_HIERARCHY__CHILDREN );
}
/**
* Create a new SpecObject and a new SpecHierarchy which refers to the SpecObject
*
* The SpecHierachy is be created beneath the Specification
*
* @param specType the type of the SpecObject to create
*/
private static void createNewSpecObject( EditingDomain editingDomain,
Content content,
SpecType specType,
EObject specHierachyParent,
Object feature ) {
SpecObject newSpecObject = ErfFactory.eINSTANCE.createSpecObject();
newSpecObject.setType( specType );
CompoundCommand compoundCommand = new CompoundCommand();
compoundCommand.setLabel( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_AddSpecObject_label" ) );
compoundCommand.setDescription( ErfObjectsEditorPlugin.INSTANCE.getString( "_UI_AddSpecObject_description" ) );
// command for creating a SpecObject
Command addSpecObjectCommand = AddCommand.create( editingDomain,
content,
ErfPackage.CONTENT__SPEC_OBJECTS,
newSpecObject );
compoundCommand.append( addSpecObjectCommand );
// command for creating a SpecHierarchy
SpecHierarchy newSpecHierarchy = ErfFactory.eINSTANCE.createSpecHierarchy();
newSpecHierarchy.setObject( newSpecObject );
Command addSpecHierarchyCommand = AddCommand.create( editingDomain,
specHierachyParent,
feature,
newSpecHierarchy );
compoundCommand.append( addSpecHierarchyCommand );
// execute compoundCommand
CommandStack commandStack = editingDomain.getCommandStack();
commandStack.execute( compoundCommand );
}
public static void createCommonMenuItems( IMenuManager manager, EditingDomain editingDomain, SpecObject specObject ) {
// menu entries for adding a specObject
Action addAction = new AddSpecObjectAction( editingDomain, specObject, true );
Action addBelowAction = new AddSpecObjectAction( editingDomain, specObject, false );
// Add menu entry for removal of SpecObject
Action removeAction = new RemoveSpecObjectAction( editingDomain, specObject );
if( specObject == null ) {
addAction.setEnabled( false );
addBelowAction.setEnabled( false );
removeAction.setEnabled( false );
}
manager.add( addAction );
manager.add( addBelowAction );
manager.add( removeAction );
}
}