blob: 0550eade57bc3482c89c92731a8fdfb0c1926c23 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.util.EcoreEList;
import org.eclipse.epf.uma.DescribableElement;
import org.eclipse.epf.uma.Section;
import org.eclipse.epf.uma.Task;
import org.eclipse.epf.uma.util.AssociationHelper;
/**
* Reorder steps
*
* @author Phong Nguyen Le
* @since 1.0
*/
public class StepList {
/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 3257567325849858871L;
private static DescribableElement getDescribableElement(Section step) {
return (DescribableElement) step.eContainer().eContainer();
}
private Task currentTask;
private LinkedList stepLists;
public StepList(Task currentTask, List stepLists) {
this.currentTask = currentTask;
this.stepLists = new LinkedList(stepLists);
reorder();
}
/**
*
*/
private void reorder() {
Map ownerSectionsMap = new HashMap();
int size = stepLists.size();
for (int i = 0; i < size; i++) {
EcoreEList eList = (EcoreEList) stepLists.get(i);
ownerSectionsMap.put(eList.getNotifier(), eList);
}
for (Iterator iter = new ArrayList(stepLists).iterator(); iter
.hasNext();) {
List stepList = (List) iter.next();
if (!stepList.isEmpty()) {
Section step = (Section) stepList.get(0);
Section pred = step.getPredecessor();
if (pred == null) {
List oldFirstList = (List) stepLists.get(0);
// put this step list at beginning
//
stepLists.remove(stepList);
stepLists.add(0, stepList);
// set this step list to be the predecessor of the previous
// first list
//
if (!oldFirstList.isEmpty()) {
Section oldFirstStep = (Section) oldFirstList.get(0);
if (TngUtil.canReference(
getDescribableElement(oldFirstStep),
getDescribableElement(step))) {
oldFirstStep.setPredecessor(step);
}
}
} else {
List predList = (List) ownerSectionsMap.get(pred
.eContainer());
stepLists.remove(predList);
int id = stepLists.indexOf(stepList);
stepLists.add(id, predList);
}
}
}
}
// private void reassignPredecessors() {
//
// }
public List getSteps() {
List allSteps = new ArrayList();
int size = stepLists.size();
for (int i = 0; i < size; i++) {
List steps = (List) stepLists.get(i);
for (Iterator iter = steps.iterator(); iter.hasNext();) {
allSteps.add(iter.next());
}
}
return allSteps;
}
public boolean moveUp(Section step) {
List steps = currentTask.getPresentation().getSections();
int id = steps.indexOf(step);
if (id == -1)
return false;
if (id > 0) {
if (id == 1) {
}
// move the step within its list
//
Collections.swap(steps, id - 1, id);
return true;
}
// move the whole step list up
//
id = stepLists.indexOf(steps);
if (id == -1)
return false;
List predList = null;
int predListId = id - 1;
// look for non-empty predecessor list
//
find_predList: for (; predListId > -1; predListId--) {
List list = (List) stepLists.get(predListId);
if (!list.isEmpty()) {
predList = list;
break find_predList;
}
}
Section oldPred = ((Section) steps.get(0)).getPredecessor();
List oldSuccessors = AssociationHelper.getSuccessors((Section) steps
.get(steps.size() - 1));
if (predList != null) {
stepLists.remove(steps);
stepLists.add(predListId, steps);
Section last = (Section) predList.get(predList.size() - 1);
List oldPredSuccessors = AssociationHelper.getSuccessors(last);
if (TngUtil.canReference(currentTask, getDescribableElement(last))) {
step.setPredecessor(last);
for (Iterator iter = oldPredSuccessors.iterator(); iter
.hasNext();) {
Section sect = (Section) iter.next();
sect.setPredecessor(step);
}
}
} else {
stepLists.add(0, steps);
}
DescribableElement oldPredTask = getDescribableElement(oldPred);
for (Iterator iter = oldSuccessors.iterator(); iter.hasNext();) {
Section sect = (Section) iter.next();
if (TngUtil.canReference(getDescribableElement(sect), oldPredTask)) {
sect.setPredecessor(oldPred);
}
}
return true;
}
public boolean moveDown(Section step) {
List steps = currentTask.getPresentation().getSections();
int id = steps.indexOf(step);
if (id == -1)
return false;
if (id < steps.size() - 1) {
// move the step within its list
//
Collections.swap(steps, id + 1, id);
return true;
}
// move the whole step list up
//
id = stepLists.indexOf(steps);
if (id == -1)
return false;
List succList = null;
int succListId = id + 1;
int size = stepLists.size();
// look for non-empty successor list
//
find_List: for (; succListId < size; succListId++) {
List list = (List) stepLists.get(succListId);
if (!list.isEmpty()) {
succList = list;
break find_List;
}
}
if (succList != null) {
stepLists.remove(succList);
stepLists.add(id, succList);
} else {
stepLists.add(steps);
}
return true;
}
}