Skip to content
3 changes: 0 additions & 3 deletions src/main/java/org/broad/igv/Globals.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,6 @@ public class Globals {
public static final String DEFAULT_GENOME = "hg38";

public static final String CHR_ALL = "All";
public static final String TRACK_NAME_ATTRIBUTE = "NAME";
public static final String TRACK_DATA_FILE_ATTRIBUTE = "DATA FILE";
public static final String TRACK_DATA_TYPE_ATTRIBUTE = "DATA TYPE";

private static boolean headless = false;
private static boolean suppressMessages = false;
Expand Down
16 changes: 3 additions & 13 deletions src/main/java/org/broad/igv/event/IGVEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,8 @@
import org.broad.igv.ui.panel.FrameManager;

public sealed interface IGVEvent
permits
AlignmentTrackEvent,
DataLoadedEvent,
GenomeChangeEvent,
GenomeResetEvent,
RefreshEvent,
StopEvent,
TrackGroupEvent,
ViewChange,
OAuthProvider.AuthStateEvent,
PreferencesChangeEvent,
InsertionSelectionEvent,
FrameManager.ChangeEvent {
permits AlignmentTrackEvent, DataLoadedEvent, GenomeChangeEvent, GenomeResetEvent, RefreshEvent, StopEvent,
TrackFilterEvent, TrackGroupEvent, ViewChange, OAuthProvider.AuthStateEvent, PreferencesChangeEvent,
InsertionSelectionEvent, FrameManager.ChangeEvent {

}
16 changes: 16 additions & 0 deletions src/main/java/org/broad/igv/event/TrackFilterEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.broad.igv.event;

import org.broad.igv.util.Filter;

public final class TrackFilterEvent implements IGVEvent {

private Filter filter;

public TrackFilterEvent(Filter filter) {
this.filter = filter;
}

public Filter getFilter() {
return filter;
}
}
6 changes: 0 additions & 6 deletions src/main/java/org/broad/igv/feature/genome/GenomeManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -245,9 +245,6 @@ public void restoreGenomeTracks(Genome genome) {
// Fetch the gene track, defined by .genome files. In this format the genome data is encoded in the .genome file
FeatureTrack geneFeatureTrack = genome.getGeneTrack(); // Used for .genome and .gbk formats. Otherwise null
if (geneFeatureTrack != null) {
geneFeatureTrack.setAttributeValue(Globals.TRACK_NAME_ATTRIBUTE, geneFeatureTrack.getName());
geneFeatureTrack.setAttributeValue(Globals.TRACK_DATA_FILE_ATTRIBUTE, "");
geneFeatureTrack.setAttributeValue(Globals.TRACK_DATA_TYPE_ATTRIBUTE, geneFeatureTrack.getTrackType().toString());
IGV.getInstance().addTrack(geneFeatureTrack, PanelName.ANNOTATION_PANEL.getName());
}

Expand Down Expand Up @@ -283,9 +280,6 @@ public void restoreGenomeTracks(Genome genome) {
fn = fn.substring(lastSlashIdx + 1);
}
}
track.setAttributeValue(Globals.TRACK_NAME_ATTRIBUTE, track.getName());
track.setAttributeValue(Globals.TRACK_DATA_FILE_ATTRIBUTE, fn);
track.setAttributeValue(Globals.TRACK_DATA_TYPE_ATTRIBUTE, track.getTrackType().toString());
}
}
}
Expand Down
61 changes: 19 additions & 42 deletions src/main/java/org/broad/igv/session/IGVSessionReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,6 @@
import org.broad.igv.sam.SpliceJunctionTrack;
import org.broad.igv.track.*;
import org.broad.igv.ui.IGV;
import org.broad.igv.ui.TrackFilter;
import org.broad.igv.ui.TrackFilterElement;
import org.broad.igv.ui.color.ColorUtilities;
import org.broad.igv.ui.panel.FrameManager;
import org.broad.igv.ui.panel.ReferenceFrame;
Expand Down Expand Up @@ -89,15 +87,15 @@ public class IGVSessionReader implements SessionReader {
private Collection<ResourceLocator> dataFiles;
private Collection<ResourceLocator> missingDataFiles;
private boolean panelElementPresent = false; // Flag indicating if "Panel" sections are present
private TrackFilter filter; // There is a single TrackFilter object per session, usually null

/**
* List of combined data source tracks. Processing of combined data sources has to be deferred until all tracks
* are loaded
*/
private final List<Pair<CombinedDataTrack, Element>> combinedDataSourceTracks = new ArrayList<>();

private Set<Track> allocatedToPanel = new LinkedHashSet<>();; // List of tracks allocated to panels, if Panel elements are present.
private Set<Track> allocatedToPanel = new LinkedHashSet<>();
; // List of tracks allocated to panels, if Panel elements are present.

/**
* Map of id -> track, for second pass through when tracks reference each other
Expand All @@ -108,12 +106,6 @@ public class IGVSessionReader implements SessionReader {

private boolean hasTrackElments;

static {
attributeSynonymMap.put("DATA FILE", "DATA SET");
attributeSynonymMap.put("TRACK NAME", "NAME");
}


public IGVSessionReader(IGV igv) {
this.igv = igv;
currentReader = new WeakReference<IGVSessionReader>(this);
Expand Down Expand Up @@ -159,7 +151,7 @@ public void loadSession(InputStream inputStream, Session session, String session
List<Track> unallocatedTracks = new ArrayList<>();
for (List<Track> tracks : allTracks.values()) {
for (Track t : tracks) {
if (allocatedToPanel == null ||!allocatedToPanel.contains(t)) {
if (allocatedToPanel == null || !allocatedToPanel.contains(t)) {
unallocatedTracks.add(t);
}
}
Expand Down Expand Up @@ -307,8 +299,6 @@ private void process(Session session, Node element, String sessionPath) {
processGeneList(session, (Element) element);
} else if (nodeName.equalsIgnoreCase(SessionElement.FILTER)) {
processFilter(session, (Element) element, sessionPath);
} else if (nodeName.equalsIgnoreCase(SessionElement.FILTER_ELEMENT)) {
processFilterElement(session, (Element) element, sessionPath);
} else if (nodeName.equalsIgnoreCase(SessionElement.COLOR_SCALES)) {
processColorScales(session, (Element) element, sessionPath);
} else if (nodeName.equalsIgnoreCase(SessionElement.COLOR_SCALE)) {
Expand Down Expand Up @@ -692,47 +682,34 @@ private void processFilter(Session session, Element element, String sessionPath)
String showAllTracks = getAttribute(element, SessionAttribute.FILTER_SHOW_ALL_TRACKS);

String filterName = getAttribute(element, SessionAttribute.NAME);
filter = new TrackFilter(filterName, null);
boolean matchAll = "all".equalsIgnoreCase(match);
boolean showAll = "true".equalsIgnoreCase(showAllTracks);

NodeList elements = element.getChildNodes();
process(session, elements, sessionPath);

// Save the filter
List<FilterElement> filterElements = new ArrayList();
for (int i = 0; i < elements.getLength(); i++) {
Node childNode = elements.item(i);
if (childNode.getNodeName().equalsIgnoreCase(SessionElement.FILTER_ELEMENT)) {
filterElements.add(processFilterElement((Element) childNode));
} else {
// Unrecognized child element
log.warn("Unrecognized child element in <Filter>: " + childNode.getNodeName());
}
}

Filter filter = new Filter(showAll, matchAll, filterElements);
session.setFilter(filter);

// Update UI elements -- the matchAll and showAll state is kept in the UI, not the Filter object. This seems wrong. TODO
if ("all".equalsIgnoreCase(match)) {
igv.setFilterMatchAll(true);
} else if ("any".equalsIgnoreCase(match)) {
igv.setFilterMatchAll(false);
}
if ("true".equalsIgnoreCase(showAllTracks)) {
igv.setFilterShowAllTracks(true);
} else {
igv.setFilterShowAllTracks(false);
}
}

private void processFilterElement(Session session, Element element,
String sessionPath) {

if (filter == null) {
throw new RuntimeException("Filter elements defined before filter");
}
private FilterElement processFilterElement(Element element) {

String item = getAttribute(element, SessionAttribute.ITEM);
String operator = getAttribute(element, SessionAttribute.OPERATOR);
String value = getAttribute(element, SessionAttribute.VALUE);
String booleanOperator = getAttribute(element, SessionAttribute.BOOLEAN_OPERATOR);

Operator opEnum = CollUtils.findValueOf(Operator.class, operator);
BooleanOperator boolEnum = BooleanOperator.valueOf(booleanOperator.toUpperCase());
TrackFilterElement trackFilterElement = new TrackFilterElement(filter, item,
opEnum, value, boolEnum);
filter.add(trackFilterElement);

NodeList elements = element.getChildNodes();
process(session, elements, sessionPath);
return new FilterElement(item, opEnum, value);
}

/**
Expand Down
16 changes: 5 additions & 11 deletions src/main/java/org/broad/igv/session/Session.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,11 @@
import org.broad.igv.prefs.PreferencesManager;
import org.broad.igv.renderer.ContinuousColorScale;
import org.broad.igv.sam.InsertionManager;
import org.broad.igv.track.AttributeManager;
import org.broad.igv.track.TrackType;
import org.broad.igv.ui.IGV;
import org.broad.igv.ui.TrackFilter;
import org.broad.igv.ui.panel.FrameManager;
import org.broad.igv.ui.panel.ReferenceFrame;
import org.broad.igv.util.Filter;
import org.broad.igv.util.ObservableForObject;

import java.util.*;
Expand All @@ -69,7 +68,7 @@ public enum GeneListMode {
public boolean expandInsertions = false; //false;
private int nextAutoscaleGroup;
private ReferenceFrame referenceFrame = FrameManager.getDefaultFrame();
private TrackFilter filter;
private Filter filter;
private HashMap<String, String> preferences;
private HashMap<TrackType, ContinuousColorScale> colorScales;
private boolean removeEmptyPanels = false;
Expand Down Expand Up @@ -304,11 +303,11 @@ public String getLocus() {
return locus;
}

public TrackFilter getFilter() {
public Filter getFilter() {
return filter;
}

public void setFilter(TrackFilter filter) {
public void setFilter(Filter filter) {
this.filter = filter;
}

Expand Down Expand Up @@ -444,13 +443,8 @@ public int getNextAutoscaleGroup() {
* @return
*/
public Set<String> getHiddenAttributes() {
if (hiddenAttributes == null) {
return (PreferencesManager.getPreferences().getAsBoolean(SHOW_DEFAULT_TRACK_ATTRIBUTES)) ?
Collections.emptySet() :
new HashSet<>(AttributeManager.defaultTrackAttributes);
} else {
return hiddenAttributes;
}

}

public void setHiddenAttributes(Set<String> attributes) {
Expand Down
22 changes: 6 additions & 16 deletions src/main/java/org/broad/igv/session/SessionWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,10 @@
import org.broad.igv.track.AttributeManager;
import org.broad.igv.track.Track;
import org.broad.igv.ui.IGV;
import org.broad.igv.ui.TrackFilter;
import org.broad.igv.ui.TrackFilterElement;
import org.broad.igv.ui.panel.FrameManager;
import org.broad.igv.ui.panel.ReferenceFrame;
import org.broad.igv.ui.panel.TrackPanel;
import org.broad.igv.util.FileUtils;
import org.broad.igv.util.ResourceLocator;
import org.broad.igv.util.Utilities;
import org.broad.igv.util.*;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
Expand Down Expand Up @@ -182,16 +178,12 @@ public String createXmlFromSession(Session session, File outputFile) throws Runt


private void writeFilters(Session session, Element globalElement, Document document) {
TrackFilter trackFilter = session.getFilter();
Filter trackFilter = session.getFilter();
if (trackFilter != null) {

Element filter = document.createElement(SessionElement.FILTER);

filter.setAttribute(SessionAttribute.NAME, trackFilter.getName());

if (IGV.getInstance().isFilterMatchAll()) {
filter.setAttribute(SessionAttribute.FILTER_MATCH, "all");
} else if (!IGV.getInstance().isFilterMatchAll()) {
if (!IGV.getInstance().isFilterMatchAll()) {
filter.setAttribute(SessionAttribute.FILTER_MATCH, "any");
} else { // Defaults to match all
filter.setAttribute(SessionAttribute.FILTER_MATCH, "all");
Expand All @@ -208,20 +200,18 @@ private void writeFilters(Session session, Element globalElement, Document docum
Iterator iterator = session.getFilter().getFilterElements();
while (iterator.hasNext()) {

TrackFilterElement trackFilterElement = (TrackFilterElement) iterator.next();
FilterElement trackFilterElement = (FilterElement) iterator.next();

Element filterElementElement =
document.createElement(SessionElement.FILTER_ELEMENT);
filterElementElement.setAttribute(SessionAttribute.ITEM,
trackFilterElement.getSelectedItem());
trackFilterElement.getAttributeKey());
filterElementElement.setAttribute(
SessionAttribute.OPERATOR,
trackFilterElement.getComparisonOperator().getValue());
filterElementElement.setAttribute(SessionAttribute.VALUE,
trackFilterElement.getValue());
filterElementElement.setAttribute(
SessionAttribute.BOOLEAN_OPERATOR,
trackFilterElement.getBooleanOperator().getValue());

filter.appendChild(filterElementElement);
}
}
Expand Down
1 change: 0 additions & 1 deletion src/main/java/org/broad/igv/track/AbstractTrack.java
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,6 @@ public String getId() {

public void setName(String name) {
this.name = name;
this.setAttributeValue(Globals.TRACK_NAME_ATTRIBUTE, name);
}

public String getName() {
Expand Down
25 changes: 2 additions & 23 deletions src/main/java/org/broad/igv/track/AttributeManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
import org.broad.igv.ui.color.ColorTable;
import org.broad.igv.ui.color.ColorUtilities;
import org.broad.igv.ui.color.PaletteColorTable;
import org.broad.igv.util.FileUtils;
import org.broad.igv.util.ParsingUtils;
import org.broad.igv.util.ResourceLocator;
import org.broad.igv.util.Utilities;
Expand All @@ -54,19 +53,16 @@
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.List;
import java.util.*;

/**
* @author jrobinso
*/
public class AttributeManager {
public class AttributeManager implements AttributeSupplier {

public static final String GROUP_AUTOSCALE = "AUTOSCALE GROUP";
public static List<String> defaultTrackAttributes = Arrays.asList(Globals.TRACK_NAME_ATTRIBUTE,
Globals.TRACK_DATA_FILE_ATTRIBUTE, Globals.TRACK_DATA_TYPE_ATTRIBUTE);
private static Logger log = LogManager.getLogger(AttributeManager.class);

private static AttributeManager singleton;
Expand Down Expand Up @@ -126,11 +122,6 @@ public class AttributeManager {

private AttributeManager() {
propertyChangeSupport = new PropertyChangeSupport(this);

// The default attributes
addAttributeName("NAME");
addAttributeName("DATA TYPE");
addAttributeName("DATA FILE");
}

static synchronized public AttributeManager getInstance() {
Expand All @@ -152,6 +143,7 @@ public void removePropertyChangeListener(PropertyChangeListener listener) {
/**
* Return the attribute value for the given track (trackName) and key.
*/
@Override
public String getAttribute(String trackName, String attributeName) {
Map<String, String> attributes = attributeMap.get(trackName);
String key = attributeName.toUpperCase();
Expand Down Expand Up @@ -208,12 +200,6 @@ public List<String> getVisibleAttributes() {
public void clearAllAttributes() {
attributeMap.clear();
attributeNames.clear();

// The default attributes
addAttributeName("NAME");
addAttributeName("DATA TYPE");
addAttributeName("DATA FILE");

uniqueAttributeValues.clear();
//hiddenAttributes.clear();
loadedResources = new HashSet();
Expand All @@ -232,13 +218,6 @@ public void addAttribute(String rowId, String attributeName, String attributeVal
return;
}

// Add the 3 "special" attributes to ensure they are the first columns
if (attributeNames.isEmpty()) {
addAttributeName("NAME");
addAttributeName("DATA TYPE");
addAttributeName("DATA FILE");
}

addAttributeName(attributeName);

String key = attributeName.toUpperCase();
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/org/broad/igv/track/AttributeSupplier.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.broad.igv.track;

public interface AttributeSupplier {
String getAttribute(String trackName, String attributeName);
}
Loading
Loading