pro spd_ui_lock_axes::lock,windowId=windowid
compile_opt idl2
self->update,windowId=windowId
end
pro spd_ui_lock_axes::unlock,windowId=windowId
compile_opt idl2
self->update,/unlock,windowId=windowId
end
pro spd_ui_lock_axes::add,panel
compile_opt idl2
self->panel_change,panel
end
pro spd_ui_lock_axes::remove,panel
compile_opt idl2
self->panel_change,panel,/remove
end
pro spd_ui_lock_axes::panel_change,panel,remove=remove
compile_opt idl2
window = self.window_storage->getactive()
window->getProperty,locked=locked,panels=panels
if ~locked then return
panel->getProperty,settings=settings
if ~obj_valid(settings) then begin
ok = error_message('Malformed panel',/traceback)
return
endif
settings->getProperty,col=col,cspan=cspan
panel_list = panels->get(/all)
for i = 0,cspan-1 do begin
col_list = window->getColumn(col+i)
if is_num(col_list) then begin
ok = error_message('Column invariant not maintained',/traceback)
return
endif
if n_elements(col_list) eq 1 then continue
idx = where(panel eq col_list,c)
if c eq 0 then begin
ok = error_message('Column invariant not maintained',/traceback)
return
endif
range = self->get_range(col_list[ssl_set_complement([idx],indgen(n_elements(col_list)))],panel_list)
if n_elements(range) eq 1 then begin
ok = error_message('Could not properly calculate range, change failed',/traceback)
return
endif
if idx eq 0 then begin
if keyword_set(remove) then begin
self->lock_middle,col_list[1],range,/unlock
if n_elements(col_list) gt 2 then begin
self->lock_top,col_list[1],range
endif
endif else begin
self->lock_top,col_list[0],range
self->lock_middle,col_list[1],range
endelse
endif else if idx eq n_elements(col_list)-1 then begin
if keyword_set(remove) then begin
self->lock_middle,col_list[n_elements(col_list)-2],range,/unlock
if n_elements(col_list) gt 2 then begin
self->lock_bottom,col_list[n_elements(col_list)-2],range
endif
endif else begin
self->lock_bottom,col_list[n_elements(col_list)-1],range
self->lock_middle,col_list[n_elements(col_list)-2],range
endelse
endif else begin
self->lock_middle,col_list[idx],range
endelse
endfor
end
pro spd_ui_lock_axes::lock_middle,panel,range,unlock=unlock
compile_opt idl2
panel->getProperty,xaxis=xaxis,settings=settings,markers=markers
if keyword_set(unlock) then begin
panel->setProperty,showvariables = 1
endif else begin
panel->setProperty,showvariables = 0
endelse
if obj_valid(xaxis) then begin
if keyword_set(unlock) then begin
xaxis->setProperty,showdate=1,$
showlabels=1,$
annotateAxis=1
endif else begin
xaxis->setProperty,tickStyle=0, $
showdate=0,$
showlabels=0,$
annotateAxis=0,$
rangeOption=2
if n_elements(range) eq 2 then begin
xaxis->updateRange,range
endif
endelse
endif
if obj_valid(settings) then begin
settings->getProperty,titleobj=title
if obj_valid(title) then begin
if keyword_set(unlock) then begin
title->setProperty,show=1
endif else begin
title->setProperty,show=0
endelse
endif
endif
if obj_valid(markers) && ~keyword_set(unlock) then begin
marker_list = markers->get(/all)
if ~is_num(marker_list[0]) then begin
for i = 0,n_elements(marker_list)-1 do begin
marker_list[i]->getProperty,settings=msettings
if obj_valid(msettings) then begin
msettings->getProperty,vertPlacement=vert
if vert eq 6 || vert eq 0 then begin
msettings->setProperty,vertPlacement=3
endif
endif
endfor
endif
endif
end
pro spd_ui_lock_axes::lock_top,panel,range,unlock=unlock
compile_opt idl2
panel->getProperty,xaxis=xaxis,markers=markers
if keyword_set(unlock) then begin
panel->setProperty,showvariables = 1
endif else begin
panel->setProperty,showvariables = 0
endelse
if obj_valid(xaxis) then begin
xaxis->getProperty,placeAnnotation=pa
if keyword_set(unlock) then begin
if ~pa then begin
xaxis->setProperty,showlabels = 1
xaxis->setProperty,annotateAxis = 1
endif
xaxis->setProperty,showdate=1
endif else begin
if ~pa then begin
xaxis->setProperty,showlabels = 0
xaxis->setProperty,annotateAxis = 0
endif
xaxis->setProperty,tickStyle=0, $
showdate=0,$
rangeoption=2
if n_elements(range) eq 2 then begin
xaxis->updateRange,range
endif
endelse
endif
if obj_valid(markers) && ~keyword_set(unlock) then begin
marker_list = markers->get(/all)
if ~is_num(marker_list[0]) then begin
for i = 0,n_elements(marker_list)-1 do begin
marker_list[i]->getProperty,settings=msettings
if obj_valid(msettings) then begin
msettings->getProperty,vertPlacement=vert
if vert eq 6 then begin
msettings->setProperty,vertPlacement=3
endif
endif
endfor
endif
endif
end
pro spd_ui_lock_axes::lock_bottom,panel,range,unlock=unlock
compile_opt idl2
panel->getProperty,xaxis=xaxis,settings=settings,markers=markers
panel->setProperty,showvariables = 1
if obj_valid(xaxis) && ~keyword_set(unlock) then begin
xaxis->getProperty,placeAnnotation=pa
if pa then begin
xaxis->setProperty,placeAnnotation=0
endif
xaxis->setProperty,tickStyle=0,rangeoption=2
if n_elements(range) eq 2 then begin
xaxis->updateRange,range
endif
xaxis->setProperty,annotateAxis = 1
xaxis->setProperty,showdate=1
endif
if obj_valid(settings) then begin
settings->getProperty,titleobj=title
if obj_valid(title) then begin
if keyword_set(unlock) then begin
title->setProperty,show=1
endif else begin
title->setProperty,show=0
endelse
endif
endif
if obj_valid(markers) && ~keyword_set(unlock) then begin
marker_list = markers->get(/all)
if ~is_num(marker_list[0]) then begin
for i = 0,n_elements(marker_list)-1 do begin
marker_list[i]->getProperty,settings=msettings
if obj_valid(msettings) then begin
msettings->getProperty,vertPlacement=vert
if vert eq 6 || vert eq 0 then begin
msettings->setProperty,vertPlacement=3
endif
endif
endfor
endif
endif
end
function spd_ui_lock_axes::get_range,col,panels
compile_opt idl2
range = 0
for i = 0,n_elements(col)-1 do begin
idx = where(col[i] eq panels)
info = self.draw_object->getPanelInfo(idx)
if ~is_struct(info) then return,0
if ~info.hasLine && ~info.hasSpec then continue
if info.xscale eq 0 then begin
panel_range = info.xrange
endif else if info.xscale eq 1 then begin
panel_range = 10 ^ info.xrange
endif else if info.xrange eq 2 then begin
panel_range = exp(info.xrange)
endif
if ~keyword_set(range) then begin
range = panel_range
endif else begin
if panel_range[0] lt range[0] then begin
range[0] = panel_range[0]
endif
if panel_range[1] gt range[1] then begin
range[1] = panel_range[1]
endif
endelse
endfor
return,range
end
pro spd_ui_lock_axes::update,unlock=unlock,windowId=windowId
compile_opt idl2
if keyword_set(windowid) then begin
window = self.window_storage->getObjects(id=windowid)
if ~obj_valid(window[0]) then begin
ok = error_message('Illegal window id',/traceback)
return
endif
endif else begin
window = self.window_storage->getactive()
endelse
window->getproperty,nrows=nrows,ncols=ncols,panels=panels,settings=page_settings
if keyword_set(unlock) then begin
page_settings->setProperty,ypanelspacing=60
endif else begin
page_settings->setProperty,ypanelspacing=5
endelse
panel_list = panels->get(/all)
for i = 1,ncols do begin
cols = window->getColumn(i)
if is_num(cols) && $
n_elements(cols) eq 1 then continue
range = self->get_range(cols,panel_list)
if n_elements(cols) eq 1 then begin
self->lock_bottom,cols[0],/unlock
self->lock_top,cols[0],/unlock
cols[0]->getProperty,xaxis=xaxis
if obj_valid(xaxis) then begin
xaxis->setProperty,tickStyle=0,rangeoption=2
if n_elements(range) eq 2 then begin
xaxis->updateRange,range
endif
endif
continue
endif
for j = 0,n_elements(cols)-1 do begin
if j eq 0 then begin
self->lock_top,cols[j],range,unlock=unlock
endif else if j eq n_elements(cols)-1 then begin
self->lock_bottom,cols[j],range,unlock=unlock
endif else begin
self->lock_middle,cols[j],range,unlock=unlock
endelse
endfor
endfor
end
function spd_ui_lock_axes::init,window_storage,draw_object,loaded_data
compile_opt idl2
if ~obj_valid(window_storage) then return,0
if ~obj_valid(draw_object) then return,0
if ~obj_valid(loaded_Data) then return,0
self.window_storage = window_storage
self.draw_object = draw_object
self.loaded_data = loaded_data
return,1
end
pro spd_ui_lock_axes__define
compile_opt idl2
struct = { spd_ui_lock_axes, $
loaded_data:obj_new(), $
window_storage:obj_new(), $
draw_object:obj_new() }
end