blob: 737684b99a12fc870158d6d907f33f72ed7a2ac6 [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en">
<head>
<!-- Generated by javadoc (19) -->
<title>CanvasFollower (Apache SIS 1.3 API)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="description" content="declaration: package: org.apache.sis.portrayal, class: CanvasFollower">
<meta name="generator" content="javadoc/ClassWriterImpl">
<meta name="keywords" content="org.apache.sis.portrayal.CanvasFollower class">
<meta name="keywords" content="source">
<meta name="keywords" content="target">
<meta name="keywords" content="initialize()">
<meta name="keywords" content="isDisabled()">
<meta name="keywords" content="setDisabled()">
<meta name="keywords" content="getFollowRealWorld()">
<meta name="keywords" content="setFollowRealWorld()">
<meta name="keywords" content="getSourceObjectivePOI()">
<meta name="keywords" content="getSourceDisplayPOI()">
<meta name="keywords" content="getDisplayTransform()">
<meta name="keywords" content="propertyChange()">
<meta name="keywords" content="filter()">
<meta name="keywords" content="transformObjectiveCoordinates()">
<meta name="keywords" content="transformDisplayCoordinates()">
<meta name="keywords" content="transformedSource()">
<meta name="keywords" content="transformedTarget()">
<meta name="keywords" content="dispose()">
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../sis.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../script-dir/jquery-ui.min.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../jquery-ui.overrides.css" title="Style">
<script type="text/javascript" src="../../../../script.js"></script>
<script type="text/javascript" src="../../../../script-dir/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../../../../script-dir/jquery-ui.min.js"></script>
</head>
<body class="class-declaration-page">
<script type="text/javascript">var pathtoroot = "../../../../";
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<div class="flex-box">
<header role="banner" class="flex-header">
<nav role="navigation">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="top-nav" id="navbar-top"><button id="navbar-toggle-button" aria-controls="navbar-top" aria-expanded="false" aria-label="Toggle navigation links"><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span><span class="nav-bar-toggle-icon">&nbsp;</span></button>
<div class="skip-nav"><a href="#skip-navbar-top" title="Skip navigation links">Skip navigation links</a></div>
<ul id="navbar-top-firstrow" class="nav-list" title="Navigation">
<li><a href="../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="nav-bar-cell1-rev">Class</li>
<li><a href="class-use/CanvasFollower.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../index-all.html">Index</a></li>
<li><a href="../../../../help-doc.html#class">Help</a></li>
</ul>
<ul class="sub-nav-list-small">
<li>
<p>Summary:</p>
<ul>
<li>Nested</li>
<li><a href="#field-summary">Field</a></li>
<li><a href="#constructor-summary">Constr</a></li>
<li><a href="#method-summary">Method</a></li>
</ul>
</li>
<li>
<p>Detail:</p>
<ul>
<li><a href="#field-detail">Field</a></li>
<li><a href="#constructor-detail">Constr</a></li>
<li><a href="#method-detail">Method</a></li>
</ul>
</li>
</ul>
</div>
<div class="sub-nav">
<div id="navbar-sub-list">
<ul class="sub-nav-list">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li><a href="#field-summary">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor-summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method-summary">Method</a></li>
</ul>
<ul class="sub-nav-list">
<li>Detail:&nbsp;</li>
<li><a href="#field-detail">Field</a>&nbsp;|&nbsp;</li>
<li><a href="#constructor-detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method-detail">Method</a></li>
</ul>
</div>
<div class="nav-list-search"><a href="../../../../search.html">SEARCH</a>
<input type="text" id="search-input" disabled placeholder="Search">
<input type="reset" id="reset-button" disabled value="reset">
</div>
</div>
<!-- ========= END OF TOP NAVBAR ========= -->
<span class="skip-nav" id="skip-navbar-top"></span></nav>
</header>
<div class="flex-content">
<main role="main">
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="sub-title"><span class="package-label-in-type">Package</span>&nbsp;<a href="package-summary.html">org.apache.sis.portrayal</a></div>
<h1 title="Class CanvasFollower" class="title">Class CanvasFollower</h1>
</div>
<div class="inheritance" title="Inheritance Tree"><a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>
<div class="inheritance">CanvasFollower</div>
</div>
<section class="class-description" id="class-description">
<dl class="notes">
<dt>All Implemented Interfaces:</dt>
<dd><code><a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/beans/PropertyChangeListener.html" title="class or interface in java.beans" class="external-link">Property­Change­Listener</a></code>, <code><a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/EventListener.html" title="class or interface in java.util" class="external-link">Event­Listener</a></code>, <code><a href="../util/Disposable.html" title="interface in org.apache.sis.util">Disposable</a></code></dd>
</dl>
<dl class="notes">
<dt>Direct Known Subclasses:</dt>
<dd><code><a href="../gui/map/GestureFollower.html" title="class in org.apache.sis.gui.map">Gesture­Follower</a></code></dd>
</dl>
<hr>
<div class="type-signature"><span class="modifiers">public class </span><span class="element-name type-name-label">CanvasFollower</span>
<span class="extends-implements">extends <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a>
implements <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/beans/PropertyChangeListener.html" title="class or interface in java.beans" class="external-link">PropertyChangeListener</a>, <a href="../util/Disposable.html" title="interface in org.apache.sis.util">Disposable</a></span></div>
<div class="block">A listener of displacements in a source canvas which can reproduce the same displacement in a target canvas.
For example if a translation of 100 meters is applied in a source canvas, the same translation (in meters)
can be applied in the target canvas. This class does automatically the necessary conversions for taking in
account the differences in zoom levels and map projections. For example, a translation of 10 pixels in one
canvas may map to a translation of 20 pixels in the other canvas for reproducing the same "real world" translation.
<h2>Listeners</h2>
<code>Canvas­Follower</code> listeners need to be registered explicitly by a call to the <a href="#initialize()"><code>initialize()</code></a> method.
The <a href="#dispose()"><code>dispose()</code></a> convenience method is provided for unregistering all those listeners.
The listeners registered by this class implement an unidirectional binding:
changes in source are applied on target, but not the converse.
<h2>Multi-threading</h2>
This class is <strong>not</strong> thread-safe.
All events should be processed in the same thread.</div>
<dl class="notes">
<dt>Since:</dt>
<dd>1.3</dd>
<p><font size="-1">Defined in the <code>sis-portrayal</code> module</font></p>
</dl>
</section>
<section class="summary">
<ul class="summary-list">
<!-- =========== FIELD SUMMARY =========== -->
<li>
<section class="field-summary" id="field-summary">
<h2>Field Summary</h2>
<div class="caption"><span>Fields</span></div>
<div class="summary-table three-column-summary">
<div class="table-header col-first">Modifier and Type</div>
<div class="table-header col-second">Field</div>
<div class="table-header col-last">Description</div>
<div class="col-first even-row-color"><code>protected final <a href="PlanarCanvas.html" title="class in org.apache.sis.portrayal">Planar­Canvas</a></code></div>
<div class="col-second even-row-color"><code><a href="#source" class="member-name-link">source</a></code></div>
<div class="col-last even-row-color">
<div class="block">The canvas which is the source of zoom, translation or rotation events.</div>
</div>
<div class="col-first odd-row-color"><code>protected final <a href="PlanarCanvas.html" title="class in org.apache.sis.portrayal">Planar­Canvas</a></code></div>
<div class="col-second odd-row-color"><code><a href="#target" class="member-name-link">target</a></code></div>
<div class="col-last odd-row-color">
<div class="block">The canvas on which to apply the change of zoom, translation or rotation.</div>
</div>
</div>
</section>
</li>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<li>
<section class="constructor-summary" id="constructor-summary">
<h2>Constructor Summary</h2>
<div class="caption"><span>Constructors</span></div>
<div class="summary-table two-column-summary">
<div class="table-header col-first">Constructor</div>
<div class="table-header col-last">Description</div>
<div class="col-constructor-name even-row-color"><code><a href="#%3Cinit%3E(org.apache.sis.portrayal.PlanarCanvas,org.apache.sis.portrayal.PlanarCanvas)" class="member-name-link">Canvas­Follower</a><wbr>(<a href="PlanarCanvas.html" title="class in org.apache.sis.portrayal">Planar­Canvas</a>&nbsp;source,
<a href="PlanarCanvas.html" title="class in org.apache.sis.portrayal">Planar­Canvas</a>&nbsp;target)</code></div>
<div class="col-last even-row-color">
<div class="block">Creates a new listener for synchronizing "objective to display" transform changes
between the specified canvas.</div>
</div>
</div>
</section>
</li>
<!-- ========== METHOD SUMMARY =========== -->
<li>
<section class="method-summary" id="method-summary">
<h2>Method Summary</h2>
<div id="method-summary-table">
<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button id="method-summary-table-tab0" role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table', 3)" class="active-table-tab">All Methods</button><button id="method-summary-table-tab2" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab2', 3)" class="table-tab">Instance Methods</button><button id="method-summary-table-tab4" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab4', 3)" class="table-tab">Concrete Methods</button></div>
<div id="method-summary-table.tabpanel" role="tabpanel">
<div class="summary-table three-column-summary" aria-labelledby="method-summary-table-tab0">
<div class="table-header col-first">Modifier and Type</div>
<div class="table-header col-second">Method</div>
<div class="table-header col-last">Description</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#dispose()" class="member-name-link">dispose</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Removes all listeners documented in the <a href="#initialize()"><code>initialize()</code></a> method.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>protected boolean</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#filter(org.apache.sis.portrayal.TransformChangeEvent)" class="member-name-link">filter</a><wbr>(<a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal">Transform­Change­Event</a>&nbsp;event)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Returns <code>true</code> if this listener should replicate the following changes on the target canvas.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/Optional.html" title="class or interface in java.util" class="external-link">Optional</a>&lt;<a href="http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/referencing/operation/MathTransform2D.html" title="class or interface in org.opengis.referencing.operation" class="external-link">Math­Transform2D</a>&gt;</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getDisplayTransform()" class="member-name-link">get­Display­Transform</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Returns the transform from source display coordinates to target display coordinates.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getFollowRealWorld()" class="member-name-link">get­Follow­Real­World</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Returns whether this instance is following changes in "real world" coordinates.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/Optional.html" title="class or interface in java.util" class="external-link">Optional</a>&lt;<a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/awt/geom/Point2D.html" title="class or interface in java.awt.geom" class="external-link">Point2D</a>&gt;</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getSourceDisplayPOI()" class="member-name-link">get­Source­Display­POI</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Returns the display coordinates of the Point Of Interest (POI) in source canvas.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/geometry/DirectPosition.html" title="class or interface in org.opengis.geometry" class="external-link">Direct­Position</a></code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#getSourceObjectivePOI()" class="member-name-link">get­Source­Objective­POI</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Returns the objective coordinates of the Point Of Interest (POI) in source canvas.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#initialize()" class="member-name-link">initialize</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Registers all listeners needed by this object.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>boolean</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#isDisabled()" class="member-name-link">is­Disabled</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Returns <code>true</code> if this object stopped to replicate changes from source canvas to target canvas.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#propertyChange(java.beans.PropertyChangeEvent)" class="member-name-link">property­Change</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/beans/PropertyChangeEvent.html" title="class or interface in java.beans" class="external-link">Property­Change­Event</a>&nbsp;event)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Invoked when the objective CRS, zoom, translation or rotation changed on a map that we are tracking.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#setDisabled(boolean)" class="member-name-link">set­Disabled</a><wbr>(boolean&nbsp;stop)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Sets whether to stop to replicate changes from source canvas to target canvas.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#setFollowRealWorld(boolean)" class="member-name-link">set­Follow­Real­World</a><wbr>(boolean&nbsp;real)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Sets whether this instance should following changes in "real world" coordinates.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>protected void</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#transformDisplayCoordinates(org.apache.sis.portrayal.TransformChangeEvent,java.awt.geom.AffineTransform)" class="member-name-link">transform­Display­Coordinates</a><wbr>(<a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal">Transform­Change­Event</a>&nbsp;event,
<a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/awt/geom/AffineTransform.html" title="class or interface in java.awt.geom" class="external-link">Affine­Transform</a>&nbsp;after)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Invoked by <a href="#propertyChange(java.beans.PropertyChangeEvent)"><code>property­Change(Property­Change­Event)</code></a> for updating the transform of the target canvas
in display units (typically pixels).</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>protected void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#transformedSource(org.apache.sis.portrayal.TransformChangeEvent)" class="member-name-link">transformed­Source</a><wbr>(<a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal">Transform­Change­Event</a>&nbsp;event)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Invoked after the source "objective to display" transform has been updated.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>protected void</code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#transformedTarget(org.apache.sis.portrayal.TransformChangeEvent)" class="member-name-link">transformed­Target</a><wbr>(<a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal">Transform­Change­Event</a>&nbsp;event)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Invoked after the target "objective to display" transform has been updated.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>protected void</code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#transformObjectiveCoordinates(org.apache.sis.portrayal.TransformChangeEvent,java.awt.geom.AffineTransform)" class="member-name-link">transform­Objective­Coordinates</a><wbr>(<a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal">Transform­Change­Event</a>&nbsp;event,
<a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/awt/geom/AffineTransform.html" title="class or interface in java.awt.geom" class="external-link">Affine­Transform</a>&nbsp;before)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">
<div class="block">Invoked by <a href="#propertyChange(java.beans.PropertyChangeEvent)"><code>property­Change(Property­Change­Event)</code></a> for updating the transform of the target canvas
in units of the objective CRS.</div>
</div>
</div>
</div>
</div>
<div class="inherited-list">
<h3 id="methods-inherited-from-class-Object">Methods inherited from class&nbsp;<a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></h3>
<code><a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#clone()" title="class or interface in java.lang" class="external-link">clone</a>, <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)" title="class or interface in java.lang" class="external-link">equals</a>, <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#finalize()" title="class or interface in java.lang" class="external-link">finalize</a>, <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#getClass()" title="class or interface in java.lang" class="external-link">get­Class</a>, <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#hashCode()" title="class or interface in java.lang" class="external-link">hash­Code</a>, <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#notify()" title="class or interface in java.lang" class="external-link">notify</a>, <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#notifyAll()" title="class or interface in java.lang" class="external-link">notify­All</a>, <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#toString()" title="class or interface in java.lang" class="external-link">to­String</a>, <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#wait()" title="class or interface in java.lang" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#wait(long)" title="class or interface in java.lang" class="external-link">wait</a>, <a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#wait(long,int)" title="class or interface in java.lang" class="external-link">wait</a></code></div>
</section>
</li>
</ul>
</section>
<section class="details">
<ul class="details-list">
<!-- ============ FIELD DETAIL =========== -->
<li>
<section class="field-details" id="field-detail">
<h2>Field Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="source">
<h3>source</h3>
<div class="member-signature"><span class="modifiers">protected final</span>&nbsp;<span class="return-type"><a href="PlanarCanvas.html" title="class in org.apache.sis.portrayal">PlanarCanvas</a></span>&nbsp;<span class="element-name">source</span></div>
<div class="block">The canvas which is the source of zoom, translation or rotation events.</div>
</section>
</li>
<li>
<section class="detail" id="target">
<h3>target</h3>
<div class="member-signature"><span class="modifiers">protected final</span>&nbsp;<span class="return-type"><a href="PlanarCanvas.html" title="class in org.apache.sis.portrayal">PlanarCanvas</a></span>&nbsp;<span class="element-name">target</span></div>
<div class="block">The canvas on which to apply the change of zoom, translation or rotation.</div>
</section>
</li>
</ul>
</section>
</li>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<li>
<section class="constructor-details" id="constructor-detail">
<h2>Constructor Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="&lt;init&gt;(org.apache.sis.portrayal.PlanarCanvas,org.apache.sis.portrayal.PlanarCanvas)">
<h3>CanvasFollower</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name">CanvasFollower</span><wbr><span class="parameters">(<a href="PlanarCanvas.html" title="class in org.apache.sis.portrayal">PlanarCanvas</a>&nbsp;source,
<a href="PlanarCanvas.html" title="class in org.apache.sis.portrayal">PlanarCanvas</a>&nbsp;target)</span></div>
<div class="block">Creates a new listener for synchronizing "objective to display" transform changes
between the specified canvas. This is a unidirectional binding: changes in source
are applied on target, but not the converse.
<p>Caller needs to register listeners by a call to the <a href="#initialize()"><code>initialize()</code></a> method.
This is not done automatically by this constructor for allowing users to control
when to start listening to changes.</p></div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>source</code> - the canvas which is the source of zoom, pan or rotation events.</dd>
<dd><code>target</code> - the canvas on which to apply the changes of zoom, pan or rotation.</dd>
</dl>
</section>
</li>
</ul>
</section>
</li>
<!-- ============ METHOD DETAIL ========== -->
<li>
<section class="method-details" id="method-detail">
<h2>Method Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="initialize()">
<h3>initialize</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">initialize</span>()</div>
<div class="block">Registers all listeners needed by this object. This method must be invoked at least
once after <a href="#%3Cinit%3E(org.apache.sis.portrayal.PlanarCanvas,org.apache.sis.portrayal.PlanarCanvas)">construction</a>,
but not necessarily immediately after (it is okay to defer until first needed).
The default implementation registers the following listeners:
<blockquote><pre>source.<b>addPropertyChangeListener</b>(PlanarCanvas.OBJECTIVE_CRS_PROPERTY, <font color="green">this</font>);
target.<b>addPropertyChangeListener</b>(PlanarCanvas.OBJECTIVE_CRS_PROPERTY, <font color="green">this</font>);
source.<b>addPropertyChangeListener</b>(PlanarCanvas.OBJECTIVE_TO_DISPLAY_PROPERTY, <font color="green">this</font>);
target.<b>addPropertyChangeListener</b>(PlanarCanvas.OBJECTIVE_TO_DISPLAY_PROPERTY, <font color="green">this</font>);</pre></blockquote>
This method is idempotent (it is okay to invoke it twice).</div>
<dl class="notes">
<dt>See Also:</dt>
<dd>
<ul class="see-list">
<li><a href="#dispose()"><code>dispose()</code></a></li>
</ul>
</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="isDisabled()">
<h3>isDisabled</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name">isDisabled</span>()</div>
<div class="block">Returns <code>true</code> if this object stopped to replicate changes from source canvas to target canvas.
If <code>true</code>, this object continues to listen to changes in order to keep its state consistent,
but does not replicate those changes on the target canvas.
<p>A non-<a href="#initialize()">initialized</a> object is considered disabled.</p></div>
<dl class="notes">
<dt>Returns:</dt>
<dd>whether this object stopped to replicate changes from source canvas to target canvas.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="setDisabled(boolean)">
<h3>setDisabled</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">setDisabled</span><wbr><span class="parameters">(boolean&nbsp;stop)</span></div>
<div class="block">Sets whether to stop to replicate changes from source canvas to target canvas.
It does not stop this object to listen to events, because it is necessary for keeping its state consistent.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>stop</code> - <code>true</code> for stopping to replicate changes from source canvas to target canvas.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getFollowRealWorld()">
<h3>getFollowRealWorld</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name">getFollowRealWorld</span>()</div>
<div class="block">Returns whether this instance is following changes in "real world" coordinates.
If <code>true</code> (the default value), then changes applied on the <a href="#source">source</a> canvas
and converted into changes to apply on the <a href="#target"><code>target</code></a> canvas in such a way that the two
canvas got the same translations in real world units. It may result in a different amount of
pixels is the two canvas have different zoom level, or a different direction if a canvas is
rotated relatively to the other canvas.</div>
<dl class="notes">
<dt>Returns:</dt>
<dd>whether this instance is following changes in "real world" coordinates.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="setFollowRealWorld(boolean)">
<h3>setFollowRealWorld</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">setFollowRealWorld</span><wbr><span class="parameters">(boolean&nbsp;real)</span></div>
<div class="block">Sets whether this instance should following changes in "real world" coordinates.
The default value is <code>true</code>. If this is set to <code>false</code>, then the same changes
in pixel coordinates will be applied on canvas regardless the difference in rotation or zoom level.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>real</code> - whether this instance should following changes in "real world" coordinates.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getSourceObjectivePOI()">
<h3>getSourceObjectivePOI</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/geometry/DirectPosition.html" title="class or interface in org.opengis.geometry" class="external-link">DirectPosition</a></span>&nbsp;<span class="element-name">getSourceObjectivePOI</span>()</div>
<div class="block">Returns the objective coordinates of the Point Of Interest (POI) in source canvas.
This information is used when the source and target canvases do not use the same CRS.
Changes in "real world" coordinates on the <a href="#target">target</a> canvas are guaranteed
to reflect the changes in "real world" coordinates of the <a href="#source">source</a> canvas
at that location only. At all other locations, the "real world" coordinate changes
may differ because of map projection deformations.
<p>The default implementation computes the value from <a href="#getSourceDisplayPOI()"><code>get­Source­Display­POI()</code></a>
if present, or fallback on <code>source​.get­Point­Of­Interest(true)</code> otherwise.
Subclasses can override this method for using a different point of interest.</p>
<p>The CRS associated to the position shall be <a href="Canvas.html#getObjectiveCRS()"><code>Canvas​.get­Objective­CRS()</code></a>.
For performance reason, this is not verified by this <code>Canvas­Follower</code> class.</p></div>
<dl class="notes">
<dt>Returns:</dt>
<dd>objective coordinates in source canvas where displacements, zooms and rotations
applied on the source canvas should be mirrored exactly on the target canvas.</dd>
<dt>See Also:</dt>
<dd>
<ul class="see-list-long">
<li><a href="Canvas.html#getPointOfInterest(boolean)"><code>Canvas​.get­Point­Of­Interest(boolean)</code></a></li>
</ul>
</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getSourceDisplayPOI()">
<h3>getSourceDisplayPOI</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/Optional.html" title="class or interface in java.util" class="external-link">Optional</a>&lt;<a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/awt/geom/Point2D.html" title="class or interface in java.awt.geom" class="external-link">Point2D</a>&gt;</span>&nbsp;<span class="element-name">getSourceDisplayPOI</span>()</div>
<div class="block">Returns the display coordinates of the Point Of Interest (POI) in source canvas.
This method provides the same information than <a href="#getSourceObjectivePOI()"><code>get­Source­Objective­POI()</code></a>,
but in units that are more convenient for expressing the location of mouse cursor
for example.
<p>The default implementation returns an empty value.</p></div>
<dl class="notes">
<dt>Returns:</dt>
<dd>display coordinates in source canvas where displacements, zooms and rotations
applied on the source canvas should be mirrored exactly on the target canvas.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getDisplayTransform()">
<h3>getDisplayTransform</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/Optional.html" title="class or interface in java.util" class="external-link">Optional</a>&lt;<a href="http://www.geoapi.org/3.0/javadoc/org.opengis.geoapi/org/opengis/referencing/operation/MathTransform2D.html" title="class or interface in org.opengis.referencing.operation" class="external-link">MathTransform2D</a>&gt;</span>&nbsp;<span class="element-name">getDisplayTransform</span>()</div>
<div class="block">Returns the transform from source display coordinates to target display coordinates.
This transform may change every time that a zoom; translation or rotation is applied
on at least one canvas. The transform may be absent if an error prevent to compute it,
for example is no coordinate operation has been found between the objective CRS of the
source and target canvases.</div>
<dl class="notes">
<dt>Returns:</dt>
<dd>transform from source display coordinates to target display coordinates.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="propertyChange(java.beans.PropertyChangeEvent)">
<h3>propertyChange</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">propertyChange</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/beans/PropertyChangeEvent.html" title="class or interface in java.beans" class="external-link">PropertyChangeEvent</a>&nbsp;event)</span></div>
<div class="block">Invoked when the objective CRS, zoom, translation or rotation changed on a map that we are tracking.
If the event is an instance of <a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal"><code>Transform­Change­Event</code></a>, then this method applies the same change
on the <a href="#target">target</a> canvas.
<p>This method delegates part of its work to the following methods,
which can be overridden for altering the changes:</p>
<ul>
<li><a href="#transformObjectiveCoordinates(org.apache.sis.portrayal.TransformChangeEvent,java.awt.geom.AffineTransform)"><code>transform­Objective­Coordinates(Transform­Change­Event, Affine­Transform)</code></a>
if <a href="#getFollowRealWorld()">following real world coordinates</a>.</li>
<li><a href="#transformDisplayCoordinates(org.apache.sis.portrayal.TransformChangeEvent,java.awt.geom.AffineTransform)"><code>transform­Display­Coordinates(Transform­Change­Event, Affine­Transform)</code></a>
if following pixel coordinates instead of real world.</li>
<li><a href="#transformedSource(org.apache.sis.portrayal.TransformChangeEvent)"><code>transformed­Source(Transform­Change­Event)</code></a> after the change has been applied on <a href="#source">source</a>.</li>
<li><a href="#transformedTarget(org.apache.sis.portrayal.TransformChangeEvent)"><code>transformed­Target(Transform­Change­Event)</code></a> after the change has been applied on <a href="#target">target</a>.</li>
</ul></div>
<dl class="notes">
<dt>Specified by:</dt>
<dd><code><a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/beans/PropertyChangeListener.html#propertyChange(java.beans.PropertyChangeEvent)" title="class or interface in java.beans" class="external-link">property­Change</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/beans/PropertyChangeListener.html" title="class or interface in java.beans" class="external-link">Property­Change­Listener</a></code></dd>
<dt>Parameters:</dt>
<dd><code>event</code> - a change in the canvas that this listener is tracking.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="filter(org.apache.sis.portrayal.TransformChangeEvent)">
<h3>filter</h3>
<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">boolean</span>&nbsp;<span class="element-name">filter</span><wbr><span class="parameters">(<a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal">TransformChangeEvent</a>&nbsp;event)</span></div>
<div class="block">Returns <code>true</code> if this listener should replicate the following changes on the target canvas.
The default implementation returns <code>true</code> if the transform reason is
<a href="TransformChangeEvent.Reason.html#OBJECTIVE_NAVIGATION"><code>Transform­Change­Event​.Reason​.OBJECTIVE_NAVIGATION</code></a> or
<a href="TransformChangeEvent.Reason.html#DISPLAY_NAVIGATION"><code>Transform­Change­Event​.Reason​.DISPLAY_NAVIGATION</code></a>.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>event</code> - a transform change event that occurred on the <a href="#source">source</a> canvas.</dd>
<dt>Returns:</dt>
<dd>whether to replicate that change on the <a href="#target">target</a> canvas.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="transformObjectiveCoordinates(org.apache.sis.portrayal.TransformChangeEvent,java.awt.geom.AffineTransform)">
<h3>transformObjectiveCoordinates</h3>
<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">transformObjectiveCoordinates</span><wbr><span class="parameters">(<a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal">TransformChangeEvent</a>&nbsp;event,
<a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/awt/geom/AffineTransform.html" title="class or interface in java.awt.geom" class="external-link">AffineTransform</a>&nbsp;before)</span></div>
<div class="block">Invoked by <a href="#propertyChange(java.beans.PropertyChangeEvent)"><code>property­Change(Property­Change­Event)</code></a> for updating the transform of the target canvas
in units of the objective CRS. The <a href="#target">target</a> canvas is updated by this method as if the given
transform was applied <em>before</em> its current <cite>objective to display</cite> transform.
<p>The default implementation delegates to <a href="PlanarCanvas.html#transformObjectiveCoordinates(java.awt.geom.AffineTransform)"><code>Planar­Canvas​.transform­Objective­Coordinates(Affine­Transform)</code></a>.
Subclasses can override if they need to transform additional data.</p></div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>event</code> - the change in the <a href="#source">source</a> canvas.</dd>
<dd><code>before</code> - the change to apply on the <a href="#target">target</a> canvas, in unit of objective CRS.</dd>
<dt>See Also:</dt>
<dd>
<ul class="see-list-long">
<li><a href="PlanarCanvas.html#transformObjectiveCoordinates(java.awt.geom.AffineTransform)"><code>Planar­Canvas​.transform­Objective­Coordinates(Affine­Transform)</code></a></li>
</ul>
</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="transformDisplayCoordinates(org.apache.sis.portrayal.TransformChangeEvent,java.awt.geom.AffineTransform)">
<h3>transformDisplayCoordinates</h3>
<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">transformDisplayCoordinates</span><wbr><span class="parameters">(<a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal">TransformChangeEvent</a>&nbsp;event,
<a href="https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/java/awt/geom/AffineTransform.html" title="class or interface in java.awt.geom" class="external-link">AffineTransform</a>&nbsp;after)</span></div>
<div class="block">Invoked by <a href="#propertyChange(java.beans.PropertyChangeEvent)"><code>property­Change(Property­Change­Event)</code></a> for updating the transform of the target canvas
in display units (typically pixels). The <a href="#target">target</a> canvas is updated by this method as if the
given transform was applied <em>after</em> its current <cite>objective to display</cite> transform.
<p>The default implementation delegates to <a href="PlanarCanvas.html#transformDisplayCoordinates(java.awt.geom.AffineTransform)"><code>Planar­Canvas​.transform­Display­Coordinates(Affine­Transform)</code></a>.
Subclasses can override if they need to transform additional data.</p></div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>event</code> - the change in the <a href="#source">source</a> canvas.</dd>
<dd><code>after</code> - the change to apply on the <a href="#target">target</a> canvas, in display units (typically pixels).</dd>
<dt>See Also:</dt>
<dd>
<ul class="see-list-long">
<li><a href="PlanarCanvas.html#transformDisplayCoordinates(java.awt.geom.AffineTransform)"><code>Planar­Canvas​.transform­Display­Coordinates(Affine­Transform)</code></a></li>
</ul>
</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="transformedSource(org.apache.sis.portrayal.TransformChangeEvent)">
<h3>transformedSource</h3>
<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">transformedSource</span><wbr><span class="parameters">(<a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal">TransformChangeEvent</a>&nbsp;event)</span></div>
<div class="block">Invoked after the source "objective to display" transform has been updated.
This method is invoked automatically by <a href="#propertyChange(java.beans.PropertyChangeEvent)"><code>property­Change(Property­Change­Event)</code></a>.
The default implementation does nothing.
Subclasses can override if they need to transform additional data.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>event</code> - the change which has been applied on the <a href="#source">source</a> canvas.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="transformedTarget(org.apache.sis.portrayal.TransformChangeEvent)">
<h3>transformedTarget</h3>
<div class="member-signature"><span class="modifiers">protected</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">transformedTarget</span><wbr><span class="parameters">(<a href="TransformChangeEvent.html" title="class in org.apache.sis.portrayal">TransformChangeEvent</a>&nbsp;event)</span></div>
<div class="block">Invoked after the target "objective to display" transform has been updated.
This method is invoked automatically by <a href="#propertyChange(java.beans.PropertyChangeEvent)"><code>property­Change(Property­Change­Event)</code></a>.
The default implementation does nothing.
Subclasses can override if they need to transform additional data.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>event</code> - the change which has been applied on the <a href="#target">target</a> canvas.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="dispose()">
<h3>dispose</h3>
<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name">dispose</span>()</div>
<div class="block">Removes all listeners documented in the <a href="#initialize()"><code>initialize()</code></a> method.
This method should be invoked when <code>Canvas­Follower</code> is no longer needed, in order to avoid memory leak.</div>
<dl class="notes">
<dt>Specified by:</dt>
<dd><code><a href="../util/Disposable.html#dispose()">dispose</a></code>&nbsp;in interface&nbsp;<code><a href="../util/Disposable.html" title="interface in org.apache.sis.util">Disposable</a></code></dd>
<dt>See Also:</dt>
<dd>
<ul class="see-list">
<li><a href="#initialize()"><code>initialize()</code></a></li>
</ul>
</dd>
</dl>
</section>
</li>
</ul>
</section>
</li>
</ul>
</section>
<!-- ========= END OF CLASS DATA ========= -->
</main>
<footer role="contentinfo">
<hr>
<p class="legal-copy"><small>Copyright &#169; 2010&#x2013;2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
</footer>
</div>
</div>
</body>
</html>