Skip to content

Commit

Permalink
Allow linking TaggedAxis1D without linking tags
Browse files Browse the repository at this point in the history
  • Loading branch information
ulmangt committed Jun 24, 2016
1 parent 036e829 commit eb0c5a0
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
*/
package com.metsci.glimpse.examples.axis;

import com.metsci.glimpse.axis.Axis1D;
import com.metsci.glimpse.axis.tagged.TaggedAxis1D;
import com.metsci.glimpse.examples.Example;
import com.metsci.glimpse.examples.basic.TaggedHeatMapExample;
import com.metsci.glimpse.layout.GlimpseLayout;
Expand All @@ -48,12 +50,17 @@ public static void main( String[] args ) throws Exception
final ColorAxisPlot2D layout1 = example.getLayout( ColorGradients.greenBone );
final ColorAxisPlot2D layout2 = example.getLayout( ColorGradients.jet );

// create a parent TaggedAxis1D and set it not to link the tags of its children
TaggedAxis1D parent = new TaggedAxis1D( );
parent.setLinkTags( false );

// link the z (color) axis of the two plots
layout1.getAxisZ( ).setParent( parent, true );
layout2.getAxisZ( ).setParent( parent, true );

// link x and y axes of the two plots
layout1.getAxis( ).setParent( layout2.getAxis( ) );

// link z (color) axes of the two plots
layout1.getAxisZ( ).setParent( layout2.getAxisZ( ) );

Example.showWithSwing( new GlimpseLayoutProvider( )
{
@Override
Expand Down
9 changes: 7 additions & 2 deletions core/src/main/java/com/metsci/glimpse/axis/Axis1D.java
Original file line number Diff line number Diff line change
Expand Up @@ -1100,12 +1100,17 @@ protected void broadcastAxisUpdateUp( )
broadcastAxisUpdateUp( this, new HashSet<Axis1D>( ) );
}

// walk up the chain of parents until we reach the top level
protected void broadcastAxisUpdateUp( Axis1D source, Set<Axis1D> visited )
{
broadcastAxisUpdateUp0( source, visited );
}

// walk up the chain of parents until we reach the top level
protected void broadcastAxisUpdateUp0( Axis1D source, Set<Axis1D> visited )
{
if ( this.parentAxis != null && this.parentAxis.linkChildren )
{
parentAxis.broadcastAxisUpdateUp( source, visited );
parentAxis.broadcastAxisUpdateUp0( source, visited );
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.metsci.glimpse.axis.Axis1D;

Expand All @@ -59,6 +61,8 @@ public class TaggedAxis1D extends Axis1D
protected List<Tag> tags;
protected Collection<Constraint> constraints;

protected boolean linkTags = true;

protected Comparator<Tag> valueComparator = new Comparator<Tag>( )
{
@Override
Expand Down Expand Up @@ -110,6 +114,16 @@ public TaggedAxis1D clone( )
return axis;
}

public boolean isLinkTags( )
{
return linkTags;
}

public void setLinkTags( boolean link )
{
this.linkTags = link;
}

public void validateTags( )
{
applyTagConstraints( );
Expand Down Expand Up @@ -199,14 +213,85 @@ protected void updateConstraintArray( )
}

@Override
protected void axisUpdated0( Axis1D axis )
protected void broadcastAxisUpdateUp( Axis1D source, Set<Axis1D> visited )
{
HashSet<Axis1D> visitedCopy = new HashSet<>( visited );

super.broadcastAxisUpdateUp( source, visited );

if ( source instanceof TaggedAxis1D )
{
broadcastTaggedAxisUpdateUp( ( TaggedAxis1D ) source, visitedCopy );
}

}

protected void broadcastTaggedAxisUpdateUp( TaggedAxis1D source, Set<Axis1D> visited )
{
broadcastTaggedAxisUpdateUp0( source, visited );
}

protected void broadcastTaggedAxisUpdateUp0( TaggedAxis1D source, Set<Axis1D> visited )
{
TaggedAxis1D parentTaggedAxis = getLinkedParentAxis( );

if ( parentTaggedAxis != null )
{
parentTaggedAxis.broadcastTaggedAxisUpdateUp0( source, visited );
}
else
{
taggedAxisUpdated( source, visited );
}
}

protected TaggedAxis1D getLinkedParentAxis( )
{
super.axisUpdated0( axis );
if ( this.parentAxis != null && this.parentAxis instanceof TaggedAxis1D )
{
TaggedAxis1D parentTaggedAxis = ( TaggedAxis1D ) this.parentAxis;
if ( parentTaggedAxis.isLinkTags( ) )
{
return parentTaggedAxis;
}
}

return null;
}

// recursively apply the update to all linked children
protected void taggedAxisUpdated( TaggedAxis1D source, Set<Axis1D> visited )
{
// if we've already been visited, don't revisit and cause a loop
if ( !visited.add( this ) )
{
return;
}

if ( axis instanceof TaggedAxis1D )
// update ourself
this.taggedAxisUpdated0( source );

// updated our children
if ( this.linkChildren )
{
TaggedAxis1D taggedAxis = ( TaggedAxis1D ) axis;
for ( Axis1D axis : this.children )
{
if ( axis instanceof TaggedAxis1D )
{
( ( TaggedAxis1D ) axis ).taggedAxisUpdated( source, visited );
}
}
}

//XXX should axis listeners be fired here like axisUpdated( )?
}

protected void taggedAxisUpdated0( TaggedAxis1D axis )
{
TaggedAxis1D taggedAxis = ( TaggedAxis1D ) axis;

if ( taggedAxis.isLinkTags( ) )
{
for ( Tag tag : taggedAxis.getSortedTags( ) )
{
Tag myTag = this.getTag( tag.getName( ) );
Expand Down

0 comments on commit eb0c5a0

Please sign in to comment.