; Written by Pavel A. Romashkin, November 1999.
; Type: object method for IDLgrPlot.
; Intended use: zooming inside an object graphics window.
; Side effects: none.
; Use: Call the method on an IDLgrPlot object, passing the coordinates of mouse press and release,
; corresponding to the corners of zooming rectangle.
; To zoom out, pass the full zoom out range through *_range keywords. In this case, mouse click
; coordinates are ignored.

pro IDLgrPlot::zoom, obj_window, $ ; Target object window.
	mouse_press, mouse_release, $ ; Intarr(2) or Lonarr(2) of the mouse action position.
	sym_size=sym_size, $ ; Size of symbol on the plot. If not specified, will be set to default.
	xrange=xrange, yrange=yrange, $  ; Set to zoom out to specified ranges.
	draw=draw ; Set to update the display after zooming.
	
compile_opt IDL2, OBSOLETE

Catch, Err_code
if (Err_code ne 0) then begin
	print,'IDLgrPlot::zoom error:'
	help, /last_message
	catch, /cancel
	return
endif

	; Check for minimum distance between mouse click and release.
if n_params() eq 3 then begin
	Delta = abs(mouse_release - mouse_press)
	if (Delta[0] < Delta[1]) lt 5 then return
endif

	; Must have object window reference.
if size(obj_window, /type) ne 11 then return

	; Obtain necessary object references.
self -> getProperty, Parent=Model, data=Data
Model -> getProperty, Parent=View
View -> getProperty, Parent=Scene

Plots_list = Model -> get(ISA='IDLGRPLOT', /all, count=n_plots)
	; Obtain axes if present. Search only current model: in case of
	; multi-pane plot, other panes will not change. Assume other panes
	; to be other models at least.
Axes_list = Model -> get(ISA='IDLGRAXIS', /all, count=n_axes)
y_list = (x_list = 0)
	; Ignore Z-axes since this is 2D graphics.
for i=0, n_axes-1 do begin
	Axes_list[i] -> getProperty, direction = axis_type
	if axis_type eq 0 then x_list = [x_list, i] else $
	if axis_type eq 1 then y_list = [y_list, i]
endfor

if not keyword_set(xrange) or not keyword_set(yrange) then begin
	if n_params() lt 3 then begin
		temp = dialog_message('Supply parameters to Zoom method.')
		return
	endif
	; Obtain the bracketing data coordinates from the screen range.
	Temp = Obj_window -> PickData(View, self, mouse_press, press_corner)
	Temp = Obj_window -> PickData(View, self, mouse_release, release_corner)
	; Ranges might be backwards, depending on how user drew the selection rectangle. Sort ranges.
	xrange = [press_corner[0] < release_corner[0], press_corner[0] > release_corner[0]]
	yrange = [press_corner[1] < release_corner[1], press_corner[1] > release_corner[1]]
endif

	; Normalize data coordinates for objects of interest.
norm_x = normalize(xrange)
norm_y = normalize(yrange)

	; Set properties of PLOT object.
for i=0, n_plots-1 do begin
	Plots_list[i] -> setProperty, xrange = xrange, yrange = yrange, $
		xcoord_conv = norm_x, ycoord_conv = norm_y
		; Plots may have symbols on vertices. Do not change their relative size.
	Plots_list[i] -> getProperty, symbol=Symbol
		; If symbol size not provided, use 0.06 of the normalized scale.
	if obj_valid(Symbol[0]) then begin
		if n_elements(sym_size) eq 0 then sym_size = [0.006/norm_x[1], 0.008/norm_y[1]]
		for j=0, n_elements(Symbol)-1 do Symbol[j] -> setProperty, size=sym_size
	endif
endfor

	; Set properties of X and Y AXIS objects.
for i=1, n_elements(x_list)-1 do begin
	Axes_list[x_list[i]] -> setProperty, range = xrange, xcoord_conv = norm_x
	;ticks1k, Axes_list[x_list[i]], xrange[1]
endfor
for i=1, n_elements(y_list)-1 do begin
	Axes_list[y_list[i]] -> setProperty, range = yrange, ycoord_conv = norm_y
	;ticks1k, Axes_list[y_list[i]], yrange[1]
endfor

if keyword_set(draw) then $
if obj_valid(Scene) then obj_window -> draw, Scene else obj_window -> draw, View

end