/*
* File Selection.java
*
* Copyright (C) 2010 Remco Bouckaert remco@cs.auckland.ac.nz
*
* This file is part of BEAST2.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST 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
* of the License, or (at your option) any later version.
*
* BEAST 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 BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package beast.app.draw;
import java.util.ArrayList;
import java.util.List;
import beast.core.util.Log;
public class Selection {
public List<TrackPoint> m_tracker = null;
List<Integer> m_Selection;
Document m_doc = null;
public Selection() {
m_Selection = new ArrayList<>(1);
} // c'tor
public void setDocument(Document doc) {
m_doc = doc;
}
public boolean isSingleSelection() {
return m_Selection.size() == 1;
}
boolean hasSelection() {
return m_Selection.size() > 0;
}
public int getSingleSelection() {
return m_Selection.get(0).intValue();
}
Shape getSingleSelectionShape() {
return m_doc.m_objects.get(getSingleSelection());
}
void setSingleSelection(int selection) {
m_Selection.removeAll(m_Selection);
m_Selection.add(new Integer(selection));
if (selection >= 0) {
m_tracker = m_doc.m_objects.get(selection).getTracker();
}
}
// void setSingleSelection(int selection, Document doc) {
// m_Selection.removeAllElements();
// m_Selection.add(selection);
// m_tracker = ((Shape) doc.m_objects.get(selection)).getTracker();
// }
boolean contains(int selectionIndex) {
for (int i = 0; i < m_Selection.size(); i++) {
if (selectionIndex == m_Selection.get(i).intValue()) {
return true;
}
}
return false;
} // contains
void addToSelection(int selectionIndex) {
if (contains(selectionIndex)) {
return;
}
m_Selection.add(new Integer(selectionIndex));
List<TrackPoint> tracker = m_doc.m_objects.get(selectionIndex).getTracker();
if (m_tracker == null) {
m_tracker = new ArrayList<>();
}
m_tracker.addAll(tracker);
} // addToSelection
void toggleSelection(int selectionIndex) {
if (!contains(selectionIndex)) {
addToSelection(selectionIndex);
} else {
m_tracker.removeAll(m_tracker);
for (int i = 0; i < m_Selection.size(); i++) {
if (selectionIndex == m_Selection.get(i).intValue()) {
m_Selection.remove(i);
i--;
} else {
List<TrackPoint> tracker = m_doc.m_objects.get(m_Selection.get(i).intValue()).getTracker();
m_tracker.addAll(tracker);
}
}
}
for (int i = 0; i < m_Selection.size(); i++) {
Log.warning.print(m_Selection.get(i) + " ");
}
Log.warning.println();
} // toggleSelection
public void clear() {
m_Selection.removeAll(m_Selection);
m_tracker = null;
} // clear
boolean intersects(int x, int y) {
for (int i = 0; i < m_Selection.size(); i++) {
int shapeIndex = m_Selection.get(i).intValue();
if (m_doc.m_objects.get(shapeIndex).intersects(x, y)) {
return true;
}
}
if (m_tracker != null) {
for (int i = 0; i < m_tracker.size(); i++) {
TrackPoint p = m_tracker.get(i);
if (x > p.m_nX - 5 && x < p.m_nX + 5 && y > p.m_nY - 5 && y < p.m_nY + 5) {
return true;
}
}
}
return false;
} // intersects
void offset(int dX, int dY) {
for (int i = 0; i < m_tracker.size(); i++) {
TrackPoint p = m_tracker.get(i);
p.m_nX += dX;
p.m_nY += dY;
}
for (int i = 0; i < m_Selection.size(); i++) {
int shapeIndex = m_Selection.get(i).intValue();
Shape shape = m_doc.m_objects.get(shapeIndex);
shape.offset(dX, dY);
}
}
public void refreshTracker() {
if (m_tracker == null) {
m_tracker = new ArrayList<>();
}
m_tracker.removeAll(m_tracker);
for (int i = 0; i < m_Selection.size(); i++) {
int selectionIndex = m_Selection.get(i).intValue();
List<TrackPoint> tracker = m_doc.m_objects.get(selectionIndex).getTracker();
m_tracker.addAll(tracker);
}
}
void setSelection(int[] selection) {
m_Selection.removeAll(m_Selection);
for (int i = 0; i < selection.length; i++) {
m_Selection.add(new Integer(i));
}
}
} // class Selection