/******************************************************************************* * This file is part of logisim-evolution. * * logisim-evolution 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. * * logisim-evolution 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 logisim-evolution. If not, see <http://www.gnu.org/licenses/>. * * Original code by Carl Burch (http://www.cburch.com), 2011. * Subsequent modifications by : * + Haute École Spécialisée Bernoise * http://www.bfh.ch * + Haute École du paysage, d'ingénierie et d'architecture de Genève * http://hepia.hesge.ch/ * + Haute École d'Ingénierie et de Gestion du Canton de Vaud * http://www.heig-vd.ch/ * The project is currently maintained by : * + REDS Institute - HEIG-VD * Yverdon-les-Bains, Switzerland * http://reds.heig-vd.ch *******************************************************************************/ package com.cburch.logisim.gui.main; import java.util.Collection; import java.util.HashSet; import com.cburch.logisim.comp.Component; class SelectionSave { public static SelectionSave create(Selection sel) { SelectionSave save = new SelectionSave(); Collection<Component> lifted = sel.getFloatingComponents(); if (!lifted.isEmpty()) { save.floating = lifted.toArray(new Component[lifted.size()]); } Collection<Component> selected = sel.getAnchoredComponents(); if (!selected.isEmpty()) { save.anchored = selected.toArray(new Component[selected.size()]); } return save; } private static boolean isSame(Component[] save, Collection<Component> sel) { if (save == null) { return sel.isEmpty(); } else { return toSet(save).equals(sel); } } private static boolean isSame(Component[] a, Component[] b) { if (a == null || a.length == 0) { return b == null || b.length == 0; } else if (b == null || b.length == 0) { return false; } else if (a.length != b.length) { return false; } else { return toSet(a).equals(toSet(b)); } } private static HashSet<Component> toSet(Component[] comps) { HashSet<Component> ret = new HashSet<Component>(comps.length); for (Component c : comps) ret.add(c); return ret; } private Component[] floating; private Component[] anchored; private SelectionSave() { } @Override public boolean equals(Object other) { if (other instanceof SelectionSave) { SelectionSave o = (SelectionSave) other; return isSame(this.floating, o.floating) && isSame(this.anchored, o.anchored); } else { return false; } } public Component[] getAnchoredComponents() { return anchored; } public Component[] getFloatingComponents() { return floating; } @Override public int hashCode() { int ret = 0; if (floating != null) { for (Component c : floating) ret += c.hashCode(); } if (anchored != null) { for (Component c : anchored) ret += c.hashCode(); } return ret; } public boolean isSame(Selection sel) { return isSame(floating, sel.getFloatingComponents()) && isSame(anchored, sel.getAnchoredComponents()); } }