/* * Contributions to FindBugs * Copyright (C) 2008, Andrei Loskutov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package de.tobject.findbugs.view.explorer; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.StringTokenizer; import org.eclipse.ui.IMemento; import org.eclipse.ui.IPersistable; public class Grouping implements IPersistable { private final LinkedList<GroupType> groupOrder; private Grouping(List<GroupType> types){ groupOrder = new LinkedList<GroupType>(types); // at least marker should be shown if(!groupOrder.contains(GroupType.Marker)){ groupOrder.add(GroupType.Marker); } } private static Grouping createDefault(){ List<GroupType> order = new ArrayList<GroupType>(); order.add(GroupType.Project); order.add(GroupType.Pattern); order.add(GroupType.Marker); return createFrom(order); } public static Grouping createFrom(List<GroupType> types){ return new Grouping(types); } public List<GroupType> asList(){ return new LinkedList<GroupType>(groupOrder); } public GroupType getFirstType(){ return groupOrder.size() > 0? groupOrder.getFirst() : GroupType.Undefined; } public GroupType getLastType() { return groupOrder.size() > 0 ? groupOrder.getLast() : GroupType.Undefined; } public GroupType getChildType(GroupType parent) { if (parent == GroupType.Marker) { return parent; } for (int i = 0; i < groupOrder.size(); i++) { if (groupOrder.get(i) == parent) { return i + 1 < groupOrder.size() ? groupOrder.get(i + 1) : GroupType.Marker; } } return GroupType.Marker; } Iterator<GroupType> iterator(){ return groupOrder.iterator(); } public GroupType getParentType(GroupType child) { for (int i = 0; i < groupOrder.size(); i++) { if (groupOrder.get(i) == child) { return i - 1 >= 0 ? groupOrder.get(i - 1) : GroupType.Undefined; } } return GroupType.Undefined; } public void saveState(IMemento memento) { memento.putString("Grouping", groupOrder.toString()); } static Grouping restoreFrom(IMemento memento) { if(memento == null){ return createDefault(); } String string = memento.getString("Grouping"); return restoreFrom(string); } static Grouping restoreFrom(String saved) { if(saved == null || saved.length() == 0){ return createDefault(); } StringTokenizer st = new StringTokenizer(saved, "[] ,", false); List<GroupType> types = new ArrayList<GroupType>(); while(st.hasMoreTokens()){ GroupType type = GroupType.valueOf(st.nextToken()); types.add(type); } if(types.isEmpty()){ return createDefault(); } return createFrom(types); } public boolean contains(GroupType type) { return groupOrder.contains(type); } int compare(GroupType g1, GroupType g2){ return groupOrder.indexOf(g1) - groupOrder.indexOf(g2); } @Override public String toString() { return groupOrder.toString(); } }