/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.foundation.dm.action; import java.util.HashSet; import java.util.Vector; import java.util.logging.Logger; import org.openflexo.foundation.FlexoEditor; import org.openflexo.foundation.FlexoModelObject; import org.openflexo.foundation.action.FlexoAction; import org.openflexo.foundation.action.FlexoActionType; import org.openflexo.foundation.dm.DMObject; import org.openflexo.foundation.dm.DuplicateMethodSignatureException; import org.openflexo.foundation.dm.javaparser.ParserNotInstalledException; import org.openflexo.foundation.dm.javaparser.SourceCodeOwner; public class ResetSourceCode extends FlexoAction<ResetSourceCode, DMObject, DMObject> { private static final Logger logger = Logger.getLogger(CreateDMEOEntity.class.getPackage().getName()); public static FlexoActionType<ResetSourceCode, DMObject, DMObject> actionType = new FlexoActionType<ResetSourceCode, DMObject, DMObject>( "reset_source_code", FlexoActionType.defaultGroup, FlexoActionType.NORMAL_ACTION_TYPE) { /** * Factory method */ @Override public ResetSourceCode makeNewAction(DMObject focusedObject, Vector<DMObject> globalSelection, FlexoEditor editor) { return new ResetSourceCode(focusedObject, globalSelection, editor); } @Override public boolean isVisibleForSelection(DMObject object, Vector<DMObject> globalSelection) { return isEnabledForSelection(object, globalSelection); } @Override public boolean isEnabledForSelection(DMObject object, Vector<DMObject> globalSelection) { return object != null; } }; static { FlexoModelObject.addActionForClass(actionType, DMObject.class); } ResetSourceCode(DMObject focusedObject, Vector<DMObject> globalSelection, FlexoEditor editor) { super(actionType, focusedObject, globalSelection, editor); } @Override protected void doAction(Object context) { HashSet<DMObject> visited = new HashSet<DMObject>(); HashSet<SourceCodeOwner> codeOwner = new HashSet<SourceCodeOwner>(); if (getFocusedObject() != null) { processToAdditionOfSourceCodeOwner(getFocusedObject(), visited, codeOwner); } if (getGlobalSelection() != null) { for (DMObject object : getGlobalSelection()) { processToAdditionOfSourceCodeOwner(object, visited, codeOwner); } } for (SourceCodeOwner sourceCodeOwner : codeOwner) { try { sourceCodeOwner.resetSourceCode(); } catch (ParserNotInstalledException e) { e.printStackTrace(); // If parser is not installed for one object, it won't be for any. return; } catch (DuplicateMethodSignatureException e) { e.printStackTrace(); } } } private void processToAdditionOfSourceCodeOwner(DMObject object, HashSet<DMObject> visited, HashSet<SourceCodeOwner> codeOwner) { if (visited.contains(object)) { return; } visited.add(object); if (object instanceof SourceCodeOwner && !codeOwner.contains(object)) { codeOwner.add((SourceCodeOwner) object); } Vector<DMObject> embedded = object.getAllEmbeddedDMObjects(); for (DMObject o : embedded) { processToAdditionOfSourceCodeOwner(o, visited, codeOwner); } } }