FUNCTION SPD_UI_WINDOWS::Add, $
Name=name, $
IsActive=isactive, $
NRows=nrows, $
NCols=ncols, $
Panels=panels, $
Settings=settings, $
Locked=locked, $
Tracking=tracking
compile_opt idl2
Catch, theError
IF theError NE 0 THEN BEGIN
Catch, /Cancel
ok = Error_Message('An error occured while adding pages. See console for details.',/noname)
RETURN, 0
ENDIF
IF N_Elements(name) EQ 0 THEN name='Page: ' + strtrim(string(self.id),2)
IF N_Elements(isactive) EQ 0 THEN isactive = 1
IF N_Elements(nrows) EQ 0 THEN nrows=2
IF N_Elements(ncols) EQ 0 THEN ncols=1
IF N_Elements(locked) EQ 0 THEN locked=0 ELSE locked=locked
if obj_valid(settings) then begin
newsettings=settings->copy()
endif
if obj_valid(self.template) then begin
self.template->getProperty,page=page
if obj_valid(page) then begin
newsettings = page->copy()
endif
endif
IF NOT Obj_Valid(panels) THEN Begin
panels = Obj_New('IDL_Container')
endif else begin
if ~obj_isa(panels,'IDL_Container') then begin
ok=error_message('Non container object passed where one expected',/traceback,/noname)
return,0
endif
panelObjs = panels->get(/all)
for i = 0,n_elements(panelObjs)-1L do begin
if obj_valid(panelObjs[i]) then panelObjs[i]->setProperty,windowID=self.id
endfor
endelse
IF N_Elements(tracking) EQ 0 THEN tracking = 1
IF isactive EQ 1 THEN self->clearAllActive
newWindow = Obj_New("SPD_UI_WINDOW", self.id, Name=name, $
IsActive=isactive, NRows=nrows, NCols=ncols, Settings=newsettings, $
Tracking=tracking, Locked=locked, Panels=panels)
IF NOT Obj_Valid(newWindow) THEN RETURN, 0
result=self->AddObject(newWindow)
IF result EQ 0 THEN RETURN, 0
if keyword_set(isActive) then self->setActive,id=self.id
self.id = self.id + 1
RETURN, 1
END
FUNCTION SPD_UI_WINDOWS::AddNewObject, windowObj
compile_opt idl2
Catch, theError
IF theError NE 0 THEN BEGIN
Catch, /Cancel
ok = Error_Message('An error occured while adding pages. See console for details.',/traceback,/noname)
RETURN, 0
ENDIF
IF ~Obj_Valid(windowObj) THEN RETURN, 0
windowObj->GetProperty, Name=name,Id=id,NRows=nrows, NCols=ncols, $
IsActive=isactive,Locked=locked,Panels=panels,Settings=settings, $
PanelId=panelid,Tracking=tracking
name='Page: ' + strtrim(string(self.id),2)
windowObj->SetProperty,name=name
IF N_Elements(id) EQ 0 THEN id = 0
IF N_Elements(nrows) EQ 0 THEN nrows=1
IF N_Elements(ncols) EQ 0 THEN ncols=1
IF N_Elements(isactive) EQ 0 THEN isactive = 1
IF N_Elements(panelid) EQ 0 THEN panelid = 0
IF N_Elements(tracking) EQ 0 THEN tracking = 1
IF N_Elements(locked) EQ 0 THEN locked = 1
if obj_valid(settings) then begin
newsettings=settings->copy()
endif
if obj_valid(self.template) then begin
self.template->getProperty,page=page
if obj_valid(page) then begin
newsettings = page->copy()
endif
endif
IF NOT Obj_Valid(panels) THEN Begin
panels = Obj_New('IDL_Container')
endif else begin
if ~obj_isa(panels,'IDL_Container') then begin
ok=error_message('Non container object passed where one expected',/traceback,/noname)
return,0
endif
panelObjs = panels->get(/all)
IF Obj_Valid(panelObjs[0]) THEN BEGIN
for i = 0,n_elements(panelObjs)-1L do begin
panelObjs[i]->setProperty,windowID=self.id
endfor
ENDIF
endelse
IF isactive EQ 1 THEN self->clearAllActive
newWindow = Obj_New("SPD_UI_WINDOW", self.id, Name=name, $
IsActive=isactive, NRows=nrows, NCols=ncols, Settings=newsettings, $
Tracking=tracking, Panels=panels,Locked=locked, Panelid=panelid)
IF NOT Obj_Valid(newWindow) THEN RETURN, 0
result=self->AddObject(newWindow)
IF result EQ 0 THEN RETURN, 0
if keyword_set(isActive) then self->setActive,id=self.id
self.id = self.id + 1
RETURN, 1
END
PRO SPD_UI_WINDOWS::Copy
activeWindow=self->GetActive()
newWindow=activeWindow[0]->Copy()
newWindow->GetProperty, $
NRows=nrows, $
NCols=ncols, $
Panels=panels, $
Settings=settings, $
Tracking=tracking
result=self->Add( $
NRows=nrows, $
NCols=ncols, $
Panels=panels, $
Settings=settings, $
Tracking=tracking)
END
PRO SPD_UI_WINDOWS::Remove
END
PRO SPD_UI_WINDOWS::SetActive, Id=id
compile_opt idl2
IF Ptr_Valid(self.windowObjs) EQ 0 THEN RETURN
numObjects = N_Elements(*self.windowObjs)
IF numObjects LT 1 THEN RETURN
dataArr=*self.windowObjs
self->clearAllActive
FOR i=0, numObjects-1 DO BEGIN
dataObj=dataArr[i]
dataObj->GetProperty, Id=thisID
IF id EQ thisID THEN BEGIN
dataObj->SetProperty, IsActive=1
return
ENDIF
ENDFOR
END
PRO SPD_UI_WINDOWS::SetButtonActive, ID=id
compile_opt idl2
IF Ptr_Valid(self.windowButtons) EQ 0 THEN RETURN
numObjects = N_Elements(self.windowButtons)
IF numObjects LT 1 THEN RETURN
FOR i=0, numObjects-1 DO BEGIN
IF id EQ self.windowButtons[i] THEN BEGIN
name = self.windowNames[i]
Widget_Control, id, Set_Button=1
ENDIF ELSE BEGIN
Widget_Control, self.windowButtons[i], Set_Button=1
ENDELSE
ENDFOR
self->clearAllActive
IF Ptr_Valid(self.windowObjs) EQ 0 THEN RETURN
numObjects = N_Elements(self.windowObjs)
IF numObjects LT 1 THEN RETURN
dataArr=*self.windowObjs
FOR i=0, numObjects-1 DO BEGIN
dataObj=dataArr[i]
dataObj->GetProperty, Name=thisName
IF N_Elements(name) GT 0 && name EQ thisName THEN BEGIN
dataObj->GetProperty, Id=id
self->SetActive, id
return
ENDIF
ENDFOR
END
FUNCTION SPD_UI_WINDOWS::GetActive
compile_opt idl2
IF Ptr_Valid(self.windowObjs) EQ 0 THEN RETURN,0
numObjects = N_Elements(*self.windowObjs)
IF numObjects LT 1 THEN RETURN, 0
dataArr=*self.windowObjs
FOR i=0, numObjects-1 DO BEGIN
dataObj=dataArr[i]
dataObj->GetProperty, IsActive=isactive
IF isactive EQ 1 THEN BEGIN
IF N_Elements(activeArr) EQ 0 THEN activeArr = [dataObj] $
ELSE activeArr = [activeArr, dataObj]
ENDIF
ENDFOR
IF N_Elements(activeArr) EQ 0 THEN RETURN, 0 ELSE RETURN, activeArr
END
pro spd_ui_windows::Reset, callSequence=callSequence
ptr_free,self.windowObjs
self.windowObjs=ptr_new()
ptr_free,self.windowButtons
self.windowButtons=ptr_new()
ptr_free,self.windowNames
self.windowNames=ptr_new()
obj_destroy,self.callSequence
self.callSequence = callSequence
self.id = 1L
end
PRO SPD_UI_WINDOWS::ClearActive, Id=id
compile_opt idl2
IF Ptr_Valid(self.windowObjs) EQ 0 THEN RETURN
IF N_Elements(id) EQ 0 THEN RETURN
numObjects = N_Elements(*self.windowObjs)
IF numObjects LT 1 THEN RETURN
dataArr=*self.windowObjs
FOR i=0, numObjects-1 DO BEGIN
dataObj=dataArr[i]
dataObj->GetProperty, Id=thisId
IF id EQ thisId THEN BEGIN
dataObj->SetProperty, IsActive=0
ENDIF
ENDFOR
END
PRO SPD_UI_WINDOWS::ClearAllActive
IF Ptr_Valid(self.windowObjs) EQ 0 THEN RETURN
numObjects = N_Elements(*self.windowObjs)
IF numObjects LT 1 THEN RETURN
dataArr=*self.windowObjs
FOR i=0L, numObjects-1L DO BEGIN
dataObj=dataArr[i]
dataObj->SetProperty, IsActive=0
ENDFOR
END
FUNCTION SPD_UI_WINDOWS::AddObject, dataObject
compile_opt idl2
IF NOT Obj_Valid(dataObject) THEN RETURN, 0
IF NOT Ptr_Valid(self.windowObjs) THEN BEGIN
temp = ObjArr(1)
temp[0] = dataObject
Ptr_Free, self.windowObjs
self.windowObjs = Ptr_New(temp)
ENDIF ELSE BEGIN
numObjects = N_Elements(*self.windowObjs)
temp = Objarr(numObjects)
temp = [*self.windowObjs, dataObject]
Ptr_Free, self.windowObjs
self.windowObjs = Ptr_New(temp)
ENDELSE
RETURN, 1
END
FUNCTION SPD_UI_WINDOWS::RemoveObject, dataObject
compile_opt idl2
IF NOT Obj_Valid(dataObject) THEN RETURN, -1
IF NOT Ptr_Valid(self.windowObjs) THEN RETURN, 1
numObjects = N_Elements(*self.windowObjs)
IF numObjects LT 1 THEN RETURN, 1 ELSE dataArr=*self.windowObjs
dataObject->GetProperty, ID=removeId, IsActive=isactive
index=-1
FOR i=0, numObjects-1 DO BEGIN
thisObj=dataArr[i]
thisObj->GetProperty, ID=thisId
IF thisId EQ removeId THEN BEGIN
index=i
BREAK
ENDIF
ENDFOR
IF index EQ -1 THEN RETURN, 1
IF index EQ 0 && numObjects EQ 1 THEN BEGIN
Ptr_Free, self.windowObjs
self.id = 1
RETURN, 1
ENDIF
temp = ObjArr(numObjects-1)
IF index EQ 0 THEN temp = dataArr[1:numObjects-1]
IF index EQ numObjects-1 THEN temp = dataArr[0:numObjects-2]
IF index GT 0 && index LT numObjects-1 THEN temp = [dataArr[0:index-1],dataArr[index+1:numObjects-1]]
IF isActive EQ 1 THEN BEGIN
if index eq 0 then begin
temp[0]->SetProperty, IsActive=1
endif else begin
temp[index-1]->setProperty, isactive=1
endelse
endif
Ptr_Free, self.windowObjs
self.windowObjs = Ptr_New(temp)
self->renumber
RETURN, 1
END
PRO SPD_UI_WINDOWS::Renumber
compile_opt idl2
if ~ptr_valid(self.windowObjs) then return
dataArr = *self.windowObjs
valids = where(obj_valid(dataArr), count, complement=invalids)
if count lt 1 then return else begin
for i=0, count-1 do begin
dataArr[valids[i]]->SetProperty, ID=i+1
name='Page: ' + strtrim(string(i+1),2)
dataArr[valids[i]]->SetProperty, Name=name
endfor
endelse
self.id = count+1
Ptr_Free, self.windowObjs
self.windowObjs = Ptr_New(dataArr)
END
FUNCTION SPD_UI_WINDOWS::GetObjects, Id=id
compile_opt idl2
IF Ptr_Valid(self.windowObjs) EQ 0 THEN RETURN, 0
IF ~keyword_Set(id) then begin
RETURN, *self.windowObjs
endif else begin
numObjects = N_Elements(*self.windowObjs)
IF numObjects LT 1 THEN RETURN, 0
dataArr=*self.windowObjs
FOR i=0, numObjects-1 DO BEGIN
dataObj=dataArr[i]
dataObj->GetProperty, Id=thisId
if id eq thisId then begin
if n_elements(objList) eq 0 then begin
objList = [dataObj]
endif else begin
objList = [objList,dataObj]
endelse
endif
endfor
endelse
if n_elements(objList) eq 0 then begin
return,0
endif else begin
return,objList
endelse
END
pro spd_ui_windows::reloadWindowMenus,windowMenus
compile_opt idl2
windows = self->getObjects()
if obj_valid(windows[0]) then begin
for i = 0,n_elements(windows)-1 do begin
windows[i]->getProperty,name=name
windowMenus->add,name
endfor
endif
end
pro spd_ui_windows::updatedatareference,oldnames,newnames
compile_opt idl2
windows = self->getObjects()
if ~obj_valid(windows[0]) then return
for i = 0,n_elements(windows)-1 do begin
windows[i]->updatedatareference,oldnames,newnames
endfor
end
FUNCTION SPD_UI_WINDOWS::Init,loadedData
Catch, theError
IF theError NE 0 THEN BEGIN
Catch, /Cancel
ok = Error_Message('Error initializing window storage object. See console output for details.',/traceback,/noname)
RETURN, 0
ENDIF
if ~obj_valid(loadedData) then begin
ok = error_message('Loaded Data must be valid to create window storage object',/traceback,/noname)
return,0
endif
self.windowObjs = Ptr_New()
self.windowButtons = Ptr_New()
self.windowNames = Ptr_New()
self.callSequence = obj_new('spd_ui_call_sequence',loadedData)
self.template = obj_new('spd_ui_template')
self.id = 1
RETURN, 1
END
PRO SPD_UI_WINDOWS__DEFINE
struct = { SPD_UI_WINDOWS, $
windowObjs: Ptr_New(), $
windowButtons: Ptr_New(), $
windowNames: Ptr_New(), $
callSequence:obj_new(), $
template:obj_new(), $
id: 0L, $
inherits spd_ui_getset $
}
END