Project

General

Profile

1
/*
2
License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
3
Dependancies: Context
4
$Id$
5
*/
6

    
7
// Ensure this object's dependancies are loaded.
8
mapbuilder.loadScript(baseDir+"/tool/ToolBase.js");
9
mapbuilder.loadScript(baseDir+"/model/Proj.js");
10

    
11
/**
12
 * Controller for the locator map widget.  
13
 * Specify the context that this widget follows by setting the targetModel 
14
 * property in config.
15
 * This will display the AOI of the target model using the AoiBox tool. 
16
 * This will also process mouse events (click and dragbox) to recenter the 
17
 * target model and includes coordinate projection transformations if required.
18
 * Checking for extent limits is not yet implemented.
19
 * @constructor
20
 * @base ToolBase
21
 * @author Adair
22
 * @param toolNode      The tool node from the config document for this tool
23
 * @param model  Reference to the widget object that creates this tool
24
 */
25
function ZoomToAoi(toolNode, model) {
26
  ToolBase.apply(this, new Array(toolNode, model));
27

    
28
  /**
29
   * Target model loadModel change listener.  This resets the projection objects
30
   * if the target model changes.
31
   * @param tool        Pointer to this ZoomToAoi object.
32
   */
33
  this.initProj = function( toolRef ) {
34
    if( toolRef.model.doc && toolRef.targetModel.doc ) {
35
      if ( toolRef.model.getSRS() != toolRef.targetModel.getSRS() ) {
36
          toolRef.model.proj = new Proj( toolRef.model.getSRS() );
37
          toolRef.targetModel.proj = new Proj( toolRef.targetModel.getSRS() );
38
      }
39
    }
40
  }
41
  this.setListeners = function( toolRef ) {
42
    toolRef.model.addListener( "loadModel", toolRef.initProj, toolRef );
43
    toolRef.targetModel.addListener( "loadModel", toolRef.initProj, toolRef );
44
    toolRef.initProj( toolRef );
45
  }
46
  this.model.addListener( "loadModel", this.setListeners, this);
47

    
48
  /**
49
   * Target model bbox change listener.  This sets this model's AOI to be the
50
   * same as the target model bounding box.
51
   * @param tool        Pointer to this ZoomToAoi object.
52
   */
53
  this.showTargetAoi = function( tool ) {
54
    if( tool.targetModel.doc ) {
55
	    var bbox = tool.targetModel.getBoundingBox();  
56
	    var ul = new Array(bbox[0],bbox[3]);
57
	    var lr = new Array(bbox[2],bbox[1]);
58
	    if ( tool.model.getSRS() != tool.targetModel.getSRS() ) {
59
	      ul = tool.targetModel.proj.Inverse( ul ); //to lat-long
60
	      lr = tool.targetModel.proj.Inverse( lr );
61
	      if (ul[0]>lr[0]) ul[0] = ul[0]-360.0;     //make sure ul is left of lr
62
	      ul = tool.model.proj.Forward( ul );       //back to XY
63
	      lr = tool.model.proj.Forward( lr );
64
	    }
65
	    tool.model.setParam("aoi", new Array(ul, lr) );
66
    }
67
  }
68
  this.firstInit = function(tool) {
69
    tool.targetModel.addListener( "loadModel", tool.showTargetAoi, tool );
70
    tool.targetModel.addListener( "bbox", tool.showTargetAoi, tool );
71
    tool.showTargetAoi(tool);
72
  }
73
  this.model.addListener( "loadModel", this.firstInit, this );
74

    
75

    
76
  /**
77
   * Process a mouse up action.  This will recenter the target model's bbox
78
   * to be equal to this model's AOI.
79
   * @param tool        Pointer to this ZoomToAoi object.
80
   * @param targetNode  The node for the enclosing HTML tag for this widget, not used.
81
   */
82
  this.mouseUpHandler = function(tool,targetNode) {
83
    var bbox = tool.model.getParam("aoi");
84
    var ul = bbox[0];
85
    var lr = bbox[1];
86
    if ( tool.model.getSRS() != tool.targetModel.getSRS() ) {
87
      //TBD: convert XY to lat/long first
88
      ul = tool.targetModel.proj.Forward( ul ); //to target XY
89
      lr = tool.targetModel.proj.Forward( lr );
90
    }
91
    if ( ( ul[0]==lr[0] ) && ( ul[1]==lr[1] ) ) {
92
      tool.targetModel.extent.centerAt( ul, tool.targetModel.extent.res[0] );
93
    } else {
94
      tool.targetModel.extent.zoomToBox( ul, lr );
95
    }
96
  }
97
  this.model.addListener('mouseup',this.mouseUpHandler,this);
98
}
(12-12/12)