;+
;NAME:
; spd_ui_check_overlap
;
;PURPOSE:
; Determins if any panels on the current
; page are overlapping.
; Prints message notifying user of those panels.
;
;CALLING SEQUENCE:
; bool = spd_ui_check_overlap( panels, cwindow )
;
;INPUT:
; panels: Array of current panel objects
; cwindow: Current window(page) object
;
;OUTPUT:
; 1 if overlaps are found, 0 otherwise
;
;HISTORY:
;
;
;-
function spd_ui_check_overlap, panels, cwindow
compile_opt idl2, hidden
;create grid to represent page
cwindow->getproperty, nrows=nrows, ncols=ncols
grid = strarr(ncols, nrows)
;loop over all panels
for i=0, n_elements(panels)-1 do begin
if ~obj_valid(panels[i]) then continue
;get position and span data
layout = panels[i]->getlayoutstructure()
;place the panel ID into the grid (use panel ID known to user)
for j=0, layout.cspan-1 do begin
for k=0, layout.rspan-1 do begin
grid[ layout.col-1+j, layout.row-1+k ] +=' '+strtrim(long(i)+1,2)
endfor
endfor
endfor
;overlapping panels will be found where there's more than one ID (i.e. string w/ spaces)
x = where( stregex(strtrim(grid,2), '.* .*', /bool),c)
if c gt 0 then overlaps = grid[x]
;loop over any overlaps and drop their ID's into the output message
msg=''
for i=0, c-1 do begin
;skip duplicates
x = where(overlaps eq overlaps[i], n)
if (n gt 1) and (x[0] lt i) then continue
;current = strjoin(strsplit(overlaps[i],/reg,/ext),', ',/single)
;13-march-2012 lphilpott
;Modifying so that it prints the panel names the user sees rather than an index into total number of panels
; overlapping panel numbers
panelnums = strsplit(overlaps[i],/reg,/ext)
for k=0, n_elements(panelnums)-1 do begin
fullpanelname = panels[panelnums[k]-1]->constructPanelName()
panelnameparts = strsplit(fullpanelname,'-',/extract) ; remove the name the user has given the panel (mainly because by default there is no name and in that case it looks silly)
; nb: not using array_concat below because paneloverlap needs to be reset for each set of conflicts
if k eq 0 then paneloverlap = [strtrim(panelnameparts[0],2)] else paneloverlap = [paneloverlap,strtrim(panelnameparts[0],2)]
endfor
paneloverlapmsg = strjoin(paneloverlap,', ',/single)
;msg=[msg,'('+current+')']
msg = [msg,'['+paneloverlapmsg+']']
endfor
if n_elements(msg) gt 1 then $
ok = dialog_message('The following sets of panels are overlapping on the page and'+ $
' must be moved before applying: '+strjoin(msg[1:*], ', '), $
/information, title='Panels overlapping')
;return boolean signifying if overlaps were found
return, (c gt 0)
end