?? test_widget_tree.pro
字號:
;+
;:Description:
; 樹形結構列系統的文件目錄
;
; Author: DYQ 2009-4-16;
;
; E-Mail: sdlcdyq@sina.com
; QQ362463351
;-
;
PRO Test_widget_tree_event,event
WIDGET_CONTROL, event.top,get_UValue = pState
;系統關閉事件
IF TAG_NAMES(event, /STRUCTURE_NAME) EQ $
'WIDGET_KILL_REQUEST' THEN BEGIN
OBJ_DESTROY, (*pState).treeObj
WIDGET_CONTROL,event.top,/destroy
PTR_FREE, pState
RETURN
ENDIF
uName = WIDGET_INFO(event.id,/UName)
CASE uName OF
;修改大小事件
'tlb': BEGIN
;
WIDGET_CONTROL, (*pState).wTreeParent, ySize = event.y-20, xSize = event.x
xSize = (event.x - 90 )/6.4; ≈ ^_^
WIDGET_CONTROL,(*pState).tx,xsize = xSize
END
;選擇文件按鈕
'select': BEGIN
;
dirname = DIALOG_PICKFILE(/directory,path = (*pState).rootpath, get_path = path)
IF dirname NE '' THEN BEGIN
;
WIDGET_CONTROL, (*pState).tx,Set_Value = dirname
(*pState).rootpath = path
;確保新建立的與原來的寬度一致
info = WIDGET_INFO((*pState).wTreeParent,/GEOMETRY )
WIDGET_CONTROL,(*pState).wTreeParent,/Destroy
(*pState).wTreeParent = WIDGET_TREE((*pState).fBase, $
value = dirname, $
xSize = info.xSize, $
ySize = info.ySize, $
/Folder)
IF OBJ_VALID((*pState).treeObj) THEN OBJ_DESTROY,(*pState).treeObj
(*pState).treeObj = OBJ_NEW('dirlist',dirname, (*pState).wTreeParent,(*pState).tx)
ENDIF
END
;點擊了目錄
'folder': BEGIN
WIDGET_CONTROL, event.id,get_UValue = treeObj
IF (WIDGET_INFO(event.id,/TREE_EXPANDED ) EQ 0 )THEN treeObj->Createchildren
END
ELSE:
ENDCASE
END
;+
;
;-
PRO Test_widget_tree
tlb = WIDGET_BASE(title ='widget_Tree', $
/TLB_SIZE_EVENTS, $
uName = 'tlb', $
/TLB_KILL_REQUEST_EVENTS , $
/Column)
WIDGET_CONTROL,tlb,/realize
;
tBase = WIDGET_BASE(tlb,/row)
fl = WIDGET_LABEL(tbase,value ='文件夾')
tx = WIDGET_TEXT(tbase,xSize = 18,/editable)
fb = WIDGET_BUTTON(tBase,value = '選擇',uName = 'select')
;
fbase = WIDGET_BASE(tlb)
WIDGET_CONTROL,fbase,/realize
path = 'E:\操作系統'
wTreeParent = WIDGET_TREE(fBase, $
value = path, $
/Folder)
treeObj = OBJ_NEW('dirlist', path, wTreeParent,tx)
;Createfiletree,path , wTreeParent
;
pState = PTR_NEW({ $
tx: tx, $
wTreeParent : wTreeParent, $
fbase : fbase, $
rootpath : path, $
treeObj: treeObj, $
tlb : tlb $
})
WIDGET_CONTROL, tlb, set_uValue = pState
;
Xmanager,'test_widget_tree',tlb,/No_Block
END
;
;;根據pathname創建文件夾或文件tree
;+
;dd
;-
PRO dirlist::Cleanup
;
OBJ_DESTROY, self.oContainer
END
;
PRO dirlist::CreateChildren
CATCH, error_stat
IF error_stat NE 0 THEN BEGIN
PRINT, !err_string
RETURN
END
IF self.HaveCreated THEN RETURN
WIDGET_CONTROL, self.pathlist,set_value =self.dirname+Path_sep()
;*********
CD, self.dirname+Path_sep()
children = FILE_SEARCH(count = count)
;*********
FOR i=0,count-1 DO BEGIN
IF (STRPOS(children[i],Path_sep(),/Reverse_Search)+1) EQ STRLEN(children[i]) THEN BEGIN
children[i] = STRMID(children[i],0,STRLEN(children[i])-1)
ENDIF
childTree = OBJ_NEW('dirlist', self.dirname +Path_sep()+children[i], self.dTree,self.pathlist)
self.oContainer->Add,childTree
ENDFOR
self.HaveCreated = 1
END
;+
;
;-
PRO dirlist::CreateTree,treeID
info = FILE_INFO(self.dirname)
pathPos = STRPOS(self.dirname,Path_sep(),/Reverse_Search)
sLen = STRLEN(self.dirname)
value= STRMID(self.dirname, pathPos+1, sLen-pathPos-1)
IF (info.directory EQ 1) THEN BEGIN
self.dTree = WIDGET_TREE(treeID,value = value, $
uName = 'folder', $
uValue = self, $
/Folder)
ENDIF ELSE BEGIN
self.dTree = WIDGET_TREE(treeID,value = FILE_BASENAME(self.dirname))
ENDELSE
END
;+
;
;-
FUNCTION dirlist::Init, location, treeID,pathlist
pathPos = STRPOS(location,Path_sep(),/Reverse_Search)
sLen = STRLEN(location)
;根目錄的情況
IF ((pathpos+1) EQ sLen) THEN location = STRMID(location,0,sLen-1)
self.dirname = location
self.pathlist = pathlist
self.oContainer = OBJ_NEW('IDL_Container')
self->Createtree,treeID
RETURN,1
END
;+
;
;-
PRO Dirlist__define
void = {dirlist, $
dtree : 0L , $
HaveCreated : 0B, $
oContainer : OBJ_NEW(), $
pathlist : 0L , $
dirname :'' $ ;
}
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -