/* * Copyright 2000-2010 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 * * 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 com.intellij.openapi.vcs; import java.util.HashSet; import java.util.Set; public class QuantitySelection<T> implements SelectionManipulation<T>, SelectionState<T> { private final Group<T> mySelected; private final Group<T> myUnselected; public QuantitySelection(final boolean startFromSelectAll) { mySelected = new Group<T>(); myUnselected = new Group<T>(); if (startFromSelectAll) { mySelected.setAll(); } else { myUnselected.setAll(); } } public void add(T t) { if (mySelected.isAll()) { myUnselected.remove(t); } else { mySelected.add(t); } } public void remove(T t) { if (mySelected.isAll()) { myUnselected.add(t); } else { mySelected.remove(t); } } public void clearAll() { mySelected.clearAll(); myUnselected.setAll(); } public void setAll() { myUnselected.clearAll(); mySelected.setAll(); } public SelectionResult<T> getSelected() { return mySelected; } public SelectionResult<T> getUnselected() { return myUnselected; } public boolean isSelected(final T t) { return mySelected.isAll() && (! myUnselected.hasPoint(t)) || myUnselected.isAll() && mySelected.hasPoint(t); } public static class Group<T> implements SelectionManipulation<T>, SelectionResult<T> { private boolean myAll; private final Set<T> myMarked; private Group() { myMarked = new HashSet<T>(); } public void add(final T t) { myMarked.add(t); } // +- consistency check not here public void remove(final T t) { myAll = false; myMarked.remove(t); } public void clearAll() { myAll = false; myMarked.clear(); } public void setAll() { myAll = true; myMarked.clear(); } public Set<T> getMarked() { return myMarked; } public boolean isAll() { return myAll; } public boolean hasPoint(final T t) { return myMarked.contains(t); } public boolean isIncluded(final T t) { return myAll || myMarked.contains(t); } } }