⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_widget_tree.pro

📁 IDL开发的小型的计算器
💻 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 + -