/* * (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.wkf; import java.util.Enumeration; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.foundation.utils.FlexoIndexManager; import org.openflexo.foundation.wkf.dm.ProcessFolderAdded; import org.openflexo.foundation.wkf.dm.ProcessFolderRemoved; import org.openflexo.localization.FlexoLocalization; import org.openflexo.logging.FlexoLogger; import org.openflexo.toolbox.ToolBox; public abstract class FlexoFolderContainerNode extends WorkflowModelObject { private static final Logger logger = FlexoLogger.getLogger(FlexoFolderContainerNode.class.getPackage().getName()); private Vector<ProcessFolder> folders; public FlexoFolderContainerNode(FlexoProject project, FlexoWorkflow workflow) { super(project, workflow); folders = new Vector<ProcessFolder>(); } @Override public void delete() { for (ProcessFolder folder : new Vector<ProcessFolder>(getFolders())) { folder.delete(); } super.delete(); } public Vector<ProcessFolder> getFolders() { return folders; } public void setFolders(Vector<ProcessFolder> folders) { this.folders = folders; } public void addToFolders(ProcessFolder folder) { if (folder == this) { return; } if (!folders.contains(folder)) { if (!isDeserializing()) { for (FlexoProcessNode node : folder.getProcesses()) { if (node.getFatherProcessNode() != getProcessNode()) { if (logger.isLoggable(Level.WARNING)) { logger.warning("Folder " + folder.getName() + " cannot be added to " + this.getName() + " because process " + node.getName() + " is not one of my sub-processes"); } return; } } } folders.add(folder); folder.setParent(this); if (!isDeserializing()) { folder.setIndexValue(folders.size()); setChanged(); notifyObservers(new ProcessFolderAdded(folder)); getPropertyChangeSupport().firePropertyChange("sortedFolders", null, folder); } } } public void removeFromFolders(ProcessFolder folder) { if (folders.contains(folder)) { folders.remove(folder); folder.setParent(null); FlexoIndexManager.reIndexObjectOfArray(folders.toArray(new ProcessFolder[0])); setChanged(); notifyObservers(new ProcessFolderRemoved(folder)); getPropertyChangeSupport().firePropertyChange("sortedFolders", folder, null); } } public ProcessFolder getFolderWithName(String name) { if (name == null) { return null; } for (ProcessFolder folder : getFolders()) { if (name.equals(folder.getName())) { return folder; } } return null; } public Enumeration<ProcessFolder> getSortedFolders() { disableObserving(); ProcessFolder[] o = FlexoIndexManager.sortArray(getFolders().toArray(new ProcessFolder[0])); enableObserving(); return ToolBox.getEnumeration(o); } public String getNewFolderName() { String base = FlexoLocalization.localizedForKey("process_folder"); String attempt = base; int i = 0; while (getFolderWithName(attempt) != null || attempt.equals(getName())) { attempt = base + "-" + i++; } return attempt; } public abstract FlexoProcessNode getProcessNode(); }