/* * #%L * org.gitools.heatmap * %% * Copyright (C) 2013 - 2014 Universitat Pompeu Fabra - Biomedical Genomics group * %% * This program 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. * * This program 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 this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ package org.gitools.heatmap; import com.google.common.collect.Iterables; import com.google.common.primitives.Ints; import com.jgoodies.binding.beans.Model; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlTransient; import java.util.*; @XmlAccessorType(XmlAccessType.FIELD) public class Bookmarks extends Model { public static String PROPERTY_CONTENTS = "contents"; @XmlElement(name = "bookmark") private List<Bookmark> bookmarks; @XmlTransient private Map<String, Integer> nameMap; @XmlTransient public static int ROWS = 1; @XmlTransient public static int COLUMNS = 2; @XmlTransient public static int LAYER = 3; public Bookmarks() { this.bookmarks = new ArrayList<>(); } public void add(Bookmark b) { for (Bookmark existing : bookmarks) { if (existing.getName().equals(b.getName())) { bookmarks.remove(existing); break; } } bookmarks.add(b); Collections.sort(bookmarks, new Comparator<Bookmark>() { @Override public int compare(Bookmark o1, Bookmark o2) { return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase()); } }); firePropertyChange(PROPERTY_CONTENTS, null, this); updateMap(); } private void updateMap() { if (nameMap == null) { nameMap = new HashMap<>(); } nameMap.clear(); Integer counter = 0; for (Bookmark b : bookmarks) { nameMap.put(b.getName(), counter++); } } public void removeBookmark(Bookmark b) { if (nameMap == null) { updateMap(); } bookmarks.remove(b); nameMap.remove(b.getName()); firePropertyChange(PROPERTY_CONTENTS, null, this); } public Bookmark get(String name) { if (nameMap == null) { updateMap(); } if (!nameMap.containsKey(name)) { return null; } return bookmarks.get(nameMap.get(name)); } public List<Bookmark> getAll() { return bookmarks; } public void setBookmarks(List<Bookmark> bookmarks) { this.bookmarks = bookmarks; updateMap(); } public Bookmark createNew(Heatmap heatmap, String bookmarkName) { return createNew(heatmap, bookmarkName, "", null); } public Bookmark createNew(Heatmap heatmap, String bookmarkName, String description, int[] include) { String name = bookmarkName; int counter = 1; while (nameOccupied(name)) { name = bookmarkName + "-" + counter++; } if (include == null || include.length == 0) { include = new int[]{ROWS, COLUMNS, LAYER}; } List<String> rows = null; List<String> cols = null; if (Ints.contains(include, ROWS)) { rows = new ArrayList<>(); Iterables.addAll(rows, heatmap.getRows()); } if (Ints.contains(include, COLUMNS)) { cols = new ArrayList<>(); Iterables.addAll(cols, heatmap.getColumns()); } String layerId = Ints.contains(include, LAYER) ? heatmap.getLayers().getTopLayer().getId() : null; Bookmark b = new Bookmark(name, rows, cols, layerId); b.setDescription(description); add(b); return b; } private boolean nameOccupied(String name) { for (Bookmark b : bookmarks) { if (b.getName().toLowerCase().equals(name.toLowerCase())) { return true; } } return false; } }