/*************************************************************************************************/ /* Desc:Ressource Explorator Library Client */ /* Written: J.Dumay */ /* Date : 10-04-2000 */ /* Version: 1.0 */ /*************************************************************************************************/ /*********************** functions for the explorator *************************************/ struct Dfile=[ Dname :S, /* nom du fichier */ Ddone :I, Dtotal :I, Dsign :S /* signature du fichier */ ]mkDfile;; struct Files=[ Dimg :S, /* path de la bmp de liste de fichiers */ Dfiles :[Dfile r1] /* liste des fichiers */ ]mkFiles;; struct NoeudType=[ NFat :NoeudType, /* Noeud pere */ NBro :NoeudType, /* Noeud frere */ NSon :NoeudType, /* Noeud fils */ NItem :ObjTreeItem, /* noeud de l'arbre associé */ NInd0 :BitmapIndex, /* index de la map dossier fermé */ NInd1 :BitmapIndex, /* index de la map dossier ouvert */ NLocalRef :S, /* refentiel du chemin local */ NServerRef :S, /* referentiel du chemin serveur */ NPath :S, /* chemin sans referentiel */ NLabel :S, /* label du NItem */ NFiles :Files, /* liste des fichiers dans le noeud */ NType :I ]mkNoeudType;; var NOEUD_LOCAL =1;; var NOEUD_SERVER =2;; var NOEUD_UPLOAD =4;; struct Explorator=[ Explui : UserI, /* user instance */ ExplChannel : Chn, /* canal */ ExplMainWin : ObjWin, /* la fenetre de l'explorateur */ ExplTree : ObjTree, /* l'arbre de l'explorateur */ ExplRoot : NoeudType, /* arbre des noeuds */ ExplCurrentNoeud : NoeudType, /* noeud courant */ ExplCurrentFile : S, /* fichier courant */ ExplIniFile : S, /* fichier selectionné à l'ouverture */ ExplListWin : ObjWin, /* fenetre encapsulant le listab pour le pb de repaint */ ExplList : ObjListTab, /* list multicolonne */ ExplBmpList : ObjBitmapList, /* list de bitmaps associée à la list multi */ ExplCheck1 : ObjCheck, /* check box 1 paramétré */ ExplCheck2 : ObjCheck, /* check box 2 paramétré */ ExplBmpListSize : I, /* size des bmps dans la liste */ ExplBmpViewSizeH : I, /* taille de la bmpview */ ExplExt : [S r1], /* extension des fichiers */ ExplType : I, /* type de l'explorateur */ ExplView : View, /* la vue des ressources */ ExplListSignName : S, /* nom du fichier des signatures locales */ ExplListSign : [[S S]r1], /* liste des des signatures des fichiers locaux */ ExplListSignChanged : I /* liste des signatures a changée */ ]mkExplorator;; /**************************************Explorator Manager**********************************/ struct ExploratorManager=[ ExplMui :UserI, /* user instance */ ExplMchannel :Chn, /* canal */ ExplMwin :ObjWin, /* fenetre */ ExplMm3d :Explorator, /* explorateur de m3d */ ExplMtext :Explorator, /* explorateur de texture */ ExplMbox :Explorator, /* explorateur de box */ ExplMwinNorm :ObjWin, /* fenetre de boutons normaux */ ExplMwinSelect :ObjWin, /* fenetre de boutons de selection */ ExplMcbSelectFile :fun [S I I] I /* callback de selecrion d'un fichier */ ]mkExploratorManager;; typeof DownloadMap =ObjBitmap;; /*typeof ArialFont12 =ObjFont;;*/ typeof WinExpl =ExploratorManager;; typeof ExplApplyBtn =ObjButton;; typeof ExplCancelBtn =ObjButton;; typeof TypeExplo =I;; var FileLocalSignText ="tmp/expl/locsigntext.tmp";; var FileLocalSignM3d ="tmp/expl/locsignm3d.tmp";; var FileLocalSignBox ="tmp/expl/locsignbox.tmp";; var OpenBitmap ="Dms/3d/plugins/DynEditor/lib/open.bmp";; var ClosedBitmap ="Dms/3d/plugins/DynEditor/lib/closed.bmp";; var DownloadBitmap="Dms/3d/plugins/DynEditor/lib/download.bmp";; var M3dViewCamFile="Dms/3d/cam1.m3d";; var EXPLO_M3D =1;; var EXPLO_TEXTURE =2;; var EXPLO_SELECT =4;; var EXPLO_NORM =8;; var EXPLO_BOX =16;; var W_EXPLO =400;; var H_EXPLO =300;; var Y_TREE =20;; var BMPVIEW_DECAL =5;; var SIZEBAR_EPAIS =5;; var W_TREEVIEW_MIN =60;; var W_TREEVIEW_MAX =60;; var H_BMPVIEW_MIN =40;; var H_BMPVIEW_MAX =80;; /********************************************* Fonction qui renvoie l'index du premier slash dans la chaine s *********************************************/ fun search_first_path(s)= let strlen s -> l in let 0 -> i in (while i i in ( while i>=0 && (nth_char s i)!='/ do set i=i-1; if i<0 then nil else substr s 0 i );; fun compExt(s1,s2)=!strcmpi s1 s2;; /********************************************* Fonction revoyant l'indice du dernier point de la chaine de charactere s **********************************************/ fun search_last_point(s)= let [(strlen s)-1 0]-> [i res]in ( while i>=0 && (nth_char s i)!='. do set i=i-1; i );; /********************************************* Fonction de chargement d'une bitmap Renvoie la bitmap **********************************************/ fun loadBitmap(Channel,file)= let _checkpack file -> pack in if pack==nil then nil else let _LDbitmap Channel pack -> bmp in if bmp==nil then ( let _LDjpeg Channel pack -> jpeg in if jpeg==nil then nil else jpeg ) else bmp;; /********* fonctions relatives à l'arbre et à la liste des fichiers **********************/ fun newFiles(n)= mkFiles[n nil];; fun addFiles(f,n)= if f==nil then nil else set f.Dfiles=(mkDfile[n nil nil nil])::f.Dfiles;; fun getDimg(noeud)= if noeud==nil then nil else noeud.NFiles.Dimg;; fun listNameFiles(l)= if l==nil then nil else let l -> [d nxt] in d.Dname::listNameFiles nxt;; fun getDFiles(noeud)= if noeud==nil then nil else noeud.NFiles.Dfiles;; fun reverseDFiles(f)= if f==nil then nil else set f.Dfiles=mirror f.Dfiles;; var NODE_FIRST=1;; var NODE_SORT=2;; fun addNoeud(Noeud,expl,n,path,ref,srvref,type,insert)= if Noeud==nil then nil else let mkNoeudType[ Noeud Noeud.NSon nil _ADDtreeChild expl.ExplTree Noeud.NItem insert n Noeud.NInd0 Noeud.NInd1 ref srvref (if !(strcmp Noeud.NPath "") then path else strcatn Noeud.NPath::"/"::path::nil) n nil type ] -> newnoeud in ( set Noeud.NSon=newnoeud; _SETtreeItemBitmap expl.ExplTree newnoeud.NItem Noeud.NInd0 Noeud.NInd1; newnoeud );; fun removeNoeud(Noeud,expl)= if Noeud==nil then nil else ( let Noeud.NFat.NSon -> node in if node==Noeud then set Noeud.NFat.NSon=Noeud.NBro else ( while node.NBro!=Noeud do set node=node.NBro; set node.NBro=Noeud.NBro; ); _DStreeItem expl.ExplTree Noeud.NItem; 0 );; fun getSrvPath(Noeud,file)= let if !(strcmp file "") || (file==nil) then nil else "/"::file::nil -> end in strcatn if !strcmp Noeud.NServerRef "" then Noeud.NPath::end else if Noeud.NType&NOEUD_UPLOAD then /* MODIF pour enlever le / en trop dans le cas d'un fichier dans UPLOAD */ Noeud.NServerRef::Noeud.NPath::end else Noeud.NServerRef::"/"::Noeud.NPath::end ;; fun getLocalPath(Noeud, file) = let if !(strcmp file "") || (file==nil) then nil else if !(strcmp Noeud.NPath "") then file::nil else "/"::file::nil -> end in strcatn if !strcmp Noeud.NLocalRef "" then Noeud.NPath::end else Noeud.NLocalRef::"/"::Noeud.NPath::end ;; fun searchNoeud(Noeud,func,param)= if Noeud==nil then nil else if exec func with [Noeud param] then Noeud else let searchNoeud Noeud.NSon func param -> resSon in if resSon!= nil then resSon else searchNoeud Noeud.NBro func param;; fun suppDoublon(s1,s2)=strcmpi s1 s2;; fun compFile(s1,param)= let param -> [noeud s2] in !strcmpi getSrvPath noeud s1 s2;; fun compItem(Noeud,item)= (Noeud.NItem==item);; /********************************************** fonction creant la liste de sauvegarde du fichiers des signatures locales ***********************************************/ fun crSaveFileLocalSign(l)= if l==nil then nil else let l -> [[f sign] nxt] in (f::sign::nil)::crSaveFileLocalSign nxt;; /************************************** Fonction recursive de fermeture de tous les repertoires de l'arbre tree Renvoie 0 ***************************************/ fun recurseCloseDir(tree,noeud)= if noeud==nil then 0 else ( if noeud.NItem!=nil then _SETtreeItemState tree noeud.NItem 0 else nil; recurseCloseDir tree noeud.NBro; recurseCloseDir tree noeud.NSon; );; /************************************** Fonction recursive d'ouverture des repertoires de l'arbre tree correspondant au chemin l Renvoie 0 ***************************************/ fun recurseOpenDir(tree,noeud,lastnode,l,i)= if i==1 then ( _SELtreeItem tree lastnode.NItem; hd l ) else let l -> [s nxt] in if !strcmpi noeud.NLabel s then recurseOpenDir tree noeud.NSon noeud nxt i-1 else if noeud.NBro==nil then nil else recurseOpenDir tree noeud.NBro noeud l i;; fun initDownloadBarView(expl)=0;; /********** fonctions relatives à la zone de vision de la ressource selectionnée ***********/ struct View=[ Vchannel :Chn, Vwin :ObjWin, Vposx :I, Vposy :I, Vsizex :I, Vsizey :I, VviewInit :fun [View Explorator] I, VviewDs :fun [View] I ]mkView;; fun ViewInit(expl,view)= exec view.VviewInit with [view expl];; fun ViewDs(view)= exec view.VviewDs with [view]; set view.VviewInit=nil; set view.VviewDs=nil; 0;; fun evalViewSizePos(expl,view,w,h)= let [_GETtreePositionSize expl.ExplTree SIZEBAR_EPAIS]-> [[_ _ x y] epaisseur]in ( /* evaluation du positionnement horizontal */ let x-2*BMPVIEW_DECAL -> maxw in if w>maxw then ( set view.Vposx=BMPVIEW_DECAL; set view.Vsizex=maxw; ) else ( set view.Vposx=(x-w)/2; set view.Vsizex=w; ); /* evaluation du positionnement vertical */ let expl.ExplBmpViewSizeH-epaisseur-2*BMPVIEW_DECAL-> maxh in if h>expl.ExplBmpViewSizeH then ( set view.Vposy=y+epaisseur+BMPVIEW_DECAL; set view.Vsizey=maxh; ) else ( set view.Vposy=y+(expl.ExplBmpViewSizeH-h)/2; set view.Vsizey=h; ); 0 );; /****************************** la view pour les textures **********************************/ struct TextureView=[ Tsrc:ObjBitmap, Tsrcw:I, Tsrch:I, Twin:ObjWin, Tbmp:ObjBitmap, Tx :I, Ty :I, Tw :I, Th :I ]mkTextureView;; fun refreshTWin(win,t)= _BLTbitmap win t.Tbmp 0 0;; fun initTextureView(view,expl,t)= evalViewSizePos expl view t.Tsrcw t.Tsrch; if t.Tw!=view.Vsizex || t.Th!=view.Vsizey then let t.Twin -> oldwin in ( /* la taille de la view a ete modifiée */ /* creation de la fenetre */ set t.Twin=_CBwinPaint _CRwindow view.Vchannel view.Vwin (set t.Tx=view.Vposx) (set t.Ty=view.Vposy) (set t.Tw=view.Vsizex) (set t.Th=view.Vsizey) WN_CHILDINSIDE|WN_DOWN|WN_NOCAPTION|WN_HIDDEN nil @refreshTWin t; /* creation de la map */ _DSbitmap t.Tbmp; set t.Tbmp=_SCPbitmap (_CRbitmap view.Vchannel t.Tw t.Th) 0 0 t.Tw-1 t.Th-1 t.Tsrc 0 0 t.Tsrcw t.Tsrch nil; _DSwindow oldwin; _SHOWwindow t.Twin WINDOW_UNHIDDEN; ) else if t.Tx!=view.Vposx || t.Ty!=view.Vposy then _MVwindow t.Twin (set t.Tx=view.Vposx) (set t.Ty=view.Vposy) else nil; refreshTWin t.Twin t; 0;; fun dsTextureView(view,t)= _DSwindow t.Twin; _DSbitmap t.Tsrc; _DSbitmap t.Tbmp; 0;; fun newTextureView(view,f)= let loadBitmap view.Vchannel f -> bmpsrc in let _GETbitmapSize bmpsrc -> [w h] in let mkTextureView[bmpsrc w h nil nil nil nil nil nil] -> t in ( set view.VviewDs=mkfun2 @dsTextureView t; set view.VviewInit=mkfun3 @initTextureView t; t );; /****************************** la view pour les m3d **********************************/ struct Mini3d=[ miniWin :ObjWin, miniSession :S3d, miniShell :H3d, miniCam :H3d, miniOb :H3d, miniBuff :ObjSurface, miniTarget :H3d, miniTimer :Timer, miniBackgnd :I ]mkMini3d;; fun targetcam(session,c,h)= let M3getFather session c -> f in let M3getObjVec session c -> src in let M3calcPosRef session h f -> [dst _] in let M3angularTarget src dst -> [an bn _] in M3setObjAng session c [an bn 0] ;; fun Mini3dclock(a,z)= let z->[mini w h i] in ( mutate z<-[_ _ _ i+1]; M3rotateObjExt mini.miniSession mini.miniOb [1000 0 0]; let M3getObjAng mini.miniSession mini.miniOb ->[x _ _] in M3setObjAng mini.miniSession mini.miniOb [x ftoi (itof 5000)*.cos((itof i)/.(itof 100)) 0]; targetcam mini.miniSession mini.miniCam mini.miniTarget; MX3render mini.miniSession mini.miniBuff mini.miniCam 0 0 mini.miniBackgnd; _BLTsurface mini.miniWin 0 0 mini.miniBuff 0 0 w h ) ;; fun getRadius(session,h,shell)= let M3getRadius session h->r in if r==nil then nil else let M3convVec session h shell [r 0 0] -> [x y z] in ftoi sqrt (sqr itof x)+.(sqr itof y)+.(sqr itof z);; fun compareradius(session,h1,h2,shell)= let getRadius session h1 shell->r1 in let getRadius session h2 shell->r2 in if r1==nil then h2 else if r2==nil then h1 else if r1>r2 then h1 else h2;; fun maxradius(session,h,shell)= if h==nil then nil else compareradius session h compareradius session (maxradius session M3getBrother session h shell) (maxradius session M3getFirstSon session h shell) shell shell;; fun initMini3d(channel,win,f,w,h)= let mkMini3d [win nil nil nil nil nil nil nil make_rgb 255 255 255] -> mini in ( set mini.miniSession = MX3create channel 1024 1024 1024 1024 1024*1024; if mini.miniSession==nil then nil else ( /* le buffer de rendu */ set mini.miniBuff= _CRsurface channel w h; set mini.miniShell=M3createShell mini.miniSession; set mini.miniOb=M3createShell mini.miniSession; M3link mini.miniSession mini.miniOb mini.miniShell; M3loadString mini.miniSession "camera camera {\n0 0 0 0 0 0\n50 50 50 50\n10 10000 10000\n}\n" mini.miniShell; set mini.miniCam = M3getObj mini.miniSession "camera"; M3load mini.miniSession f mini.miniOb; M3recursFillMatObj mini.miniSession mini.miniOb; M3recursFillMatObj mini.miniSession shell; let set mini.miniTarget=maxradius mini.miniSession mini.miniOb mini.miniShell -> target in let getRadius mini.miniSession target mini.miniShell -> r in M3setObjVec mini.miniSession mini.miniCam [0 0 (3*-if r==nil then 1 else r)>>1]; M3setCamera mini.miniSession mini.miniCam [[w>>1 h>>1] [w>>1 h>>1] [10 10000 10000]]; set mini.miniTimer=_rfltimer _starttimer channel 1000 @Mini3dclock [mini w h 0]; ); mini );; fun showMini3d(mini)= _SHOWwindow mini.miniWin WINDOW_UNHIDDEN;; fun moveMini3d(mini,x,y)= _MVwindow mini.miniWin x y;; fun destroyMini3d(mini)= _deltimer mini.miniTimer; M3destroy mini.miniSession; _DSwindow mini.miniWin; _DSsurface mini.miniBuff; set mini=nil;; struct M3dView=[ Mfile :S, Mmini :Mini3d, Mx :I, My :I, Mw :I, Mh :I ]mkM3dView;; fun refreshMWin(win,m)= _BLTsurface win 0 0 m.Mmini.miniBuff 0 0 m.Mw m.Mh;; fun evalM3dTextures(l, mat) = if l==nil then nil else let l -> [line nxt] in let hd line -> s in if (!strcmp s "texture") then [(hd tl line) mat]::evalM3dTextures nxt nil else if (!strcmp s "material") then evalM3dTextures nxt (hd tl line) else evalM3dTextures nxt mat ;; fun endgetDText(f,param)= let param -> [[expl m3dview] mat] in M3fillTexture m3dview.Mmini.miniSession M3textureFromMaterial m3dview.Mmini.miniSession M3getMat m3dview.Mmini.miniSession mat; 0;; fun dlTextureM3d(s,param)= if s==nil then nil else let s -> [txt mat] in DLdownload txt nil nil mkfun2 @endgetDText [param mat];; fun initM3dView(view,expl,m)= /* evaluation de la taille de la zone de vue */ let [_GETtreePositionSize expl.ExplTree SIZEBAR_EPAIS]-> [[_ _ x y] epaisseur]in ( set view.Vposx=BMPVIEW_DECAL; set view.Vsizex=x-2*BMPVIEW_DECAL; set view.Vposy=y+epaisseur+BMPVIEW_DECAL; set view.Vsizey=expl.ExplBmpViewSizeH-epaisseur-2*BMPVIEW_DECAL ); if m.Mw!=view.Vsizex || m.Mh!=view.Vsizey then let m.Mmini -> oldmini3d in ( /* la taille de la view a ete modifiée */ /* creation de la mini3d */ set m.Mmini=initMini3d view.Vchannel _CBwinPaint _CRwindow view.Vchannel view.Vwin (set m.Mx=view.Vposx) (set m.My=view.Vposy) (set m.Mw=view.Vsizex) (set m.Mh=view.Vsizey) WN_CHILDINSIDE|WN_DOWN|WN_NOCAPTION|WN_HIDDEN nil @refreshMWin m m.Mfile m.Mw m.Mh; showMini3d m.Mmini; destroyMini3d oldmini3d; if expl.ExplCurrentNoeud.NType&NOEUD_LOCAL then M3recursFillMatObj m.Mmini.miniSession m.Mmini.miniOb else let evalM3dTextures strextr _getpack _checkpack m.Mfile nil-> ltext in apply_on_list ltext @dlTextureM3d [expl m] ) else if m.Mx!=view.Vposx || m.My!=view.Vposy then ( moveMini3d m.Mmini (set m.Mx=view.Vposx) (set m.My=view.Vposy); nil ) else nil; refreshMWin m.Mmini.miniWin m; 0;; fun dsM3dView(view,m)= destroyMini3d m.Mmini; 0 ;; fun newM3dView(view,f)= let mkM3dView[f nil nil nil nil nil] -> m in ( set view.VviewDs=mkfun2 @dsM3dView m; set view.VviewInit=mkfun3 @initM3dView m; m );; /****************************** la view pour le download **********************************/ struct DownloadView=[ DVtype:I, DVfile:S, DVsrc:ObjBitmap, DVsrcw:I, DVsrch:I, DVcontainer:ObjContainer, DVx:I, DVy:I, DVw:I, DVh:I ]mkDownloadView;; fun endgetDView(f,param)= let param -> [noeud expl type] in if (_checkpack f) == nil then ( _DLGMessageBox _channel nil (_loc this "DL_ERROR" nil) (_loc this "ERROR_FILE" f::nil) 0; nil ) else /* le fichier courant est identique à celui qu'on recoit */ if !strcmp expl.ExplCurrentFile f then ( ViewDs expl.ExplView; if (type&EXPLO_M3D) then newM3dView expl.ExplView expl.ExplCurrentFile else if (type&EXPLO_TEXTURE) then ( newTextureView expl.ExplView expl.ExplCurrentFile; nil ) else nil; ViewInit expl expl.ExplView; 0 ) else nil ;; fun cbClickOnDownload(roll,param,x,y,b,flags)= let param -> [expl f type noeud] in DLdownload f nil nil mkfun2 @endgetDView [noeud expl type]; 0 ;; fun initDownloadView(view,expl,d)= evalViewSizePos expl view d.DVsrcw d.DVsrch; if d.DVw!=view.Vsizex || d.DVh!=view.Vsizey then let d.DVcontainer -> oldcontainer in ( /* la taille de la zone a ete changée */ /* creation du container */ set d.DVcontainer=_CRcontainerFromObjWin view.Vchannel view.Vwin (set d.DVx=view.Vposx) (set d.DVy=view.Vposy) (set d.DVw=view.Vsizex) (set d.DVh=view.Vsizey) CO_CHILDINSIDE|CO_3DBORDER|CO_NOCAPTION|CO_HIDE nil nil; /* creation du bouton de download */ let _GETbitmapSize d.DVsrc -> [ws hs] in let d.DVh*3 -> h in let _SCPbitmap (_CRbitmap view.Vchannel d.DVw h) 0 0 d.DVw-1 h-1 d.DVsrc 0 0 ws-1 hs-1 nil-> bmptmp in let _CRalphaBitmap view.Vchannel bmptmp nil nil nil -> abmp in ( _CBcompRollOverClick _CRcompRollOver view.Vchannel d.DVcontainer nil [0 0] OBJ_ENABLE|OBJ_VISIBLE nil abmp @cbClickOnDownload [expl d.DVfile d.DVtype expl.ExplCurrentNoeud]; _DSbitmap bmptmp; ); /* on dessine le container */ _PAINTcontainer d.DVcontainer; /* on detruit le container precedent */ _DScontainer oldcontainer; /* on affiche le container */ _SHOWcontainer d.DVcontainer CONTAINER_UNHIDDEN; ) else if d.DVx!=view.Vposx || d.DVy!=view.Vposy then _MOVEcontainer d.DVcontainer (set d.DVx=view.Vposx) (set d.DVy=view.Vposy) else nil; 0;; fun dsDownloadView(view,d)= /* destruction du container et du bouton */ /* la map de download n'est pas detruite car on peut avoir à s'en resservir */ _DScontainer d.DVcontainer;; fun newDownloadView(view,f,type)= let _GETbitmapSize DownloadMap -> [w h] in let mkDownloadView[type f DownloadMap w h/3 nil nil nil nil nil] -> d in ( set view.VviewDs=mkfun2 @dsDownloadView d; set view.VviewInit=mkfun3 @initDownloadView d; d );; /***************************** fonctions reflexes sur l'arbre et la liste multicolonne **********/ /**************************************** Fonction qui efface la selection en cours *****************************************/ fun resetSelection(expl)= _ENbutton ExplApplyBtn 0; set expl.ExplCurrentFile=nil; ViewDs expl.ExplView;; /**************************************** Fonction construisant la liste de maps necessaire à la liste tab lors de la selection d'un repertoire pour les repertoires serveurs *****************************************/ fun addBmpListSrv(bmpconc,expl,lf,i)= if lf==nil then nil else let lf -> [f nxt] in ( if bmpconc == nil then [nil f i i] else let expl.ExplBmpListSize -> si in let _CRbitmap expl.ExplChannel si si -> bmp in let [_ADDbitmapList expl.ExplBmpList _CPbitmap16 bmp 0 0 bmpconc i*si 0 si si nil f i i] -> tmpdat in ( _DSbitmap bmp; tmpdat ) )::addBmpListSrv bmpconc expl nxt i+1 ;; /**************************************** Fonction construsant la liste de maps necessaire à la liste tab lors de la selection d'un repertoire pour les repertoires locaux *****************************************/ fun addBmpListLocal(expl,noeud,lf,i)= if lf==nil then nil else let lf -> [f nxt] in let loadBitmap expl.ExplChannel strcat getLocalPath noeud f ".vig" -> bmpvig in let [_ADDbitmapList expl.ExplBmpList bmpvig f i i ] -> a in ( _DSbitmap bmpvig; a::addBmpListLocal expl noeud nxt i+1 );; fun addBmpListUpload(expl,noeud,label,f,i,rang)= if f==nil then nil else let loadBitmap expl.ExplChannel f -> bmpvig in let [_ADDbitmapList expl.ExplBmpList bmpvig label i rang ] -> a in ( _DSbitmap bmpvig; a::nil );; /***************************************** Fonction d'ajout de la liste des maps des vignettes à la liste multicolonne de l'explorateur ******************************************/ fun addToListTab(l,expl)= if l==nil then 1 else let l -> [[index name ndx rang] nxt] in ( _ADDlistTabItem expl.ExplList ndx rang name; _SETlistTabBitmap expl.ExplList ndx index; addToListTab nxt expl );; /*************************************** Fonction de selection d'un fichier dans la listtab ****************************************/ proto RFLselect=fun [ObjListTab Explorator I] I;; fun selectFileInListTab(expl,f)= if f!=nil then let posf_in_list listNameFiles getDFiles expl.ExplCurrentNoeud @compFile [expl.ExplCurrentNoeud f] -> i in ( _SELlistTabItem expl.ExplList i; RFLselect nil expl i; set expl.ExplIniFile=nil ) else nil;; /**************************************** Fonction de fin de chargement du fichier de maps concatenées.Construit la liste des maps et selectionne le fichier selectionné s'il y a lieu *****************************************/ fun endgetConcFile(f,param)= let param -> [noeud expl] in let listNameFiles getDFiles noeud -> lf in if (noeud!=expl.ExplCurrentNoeud)||(lf==nil) then nil else let if (f==nil) then nil else loadBitmap expl.ExplChannel f -> bmpconc in ( /* chargement de la liste */ addToListTab (addBmpListSrv bmpconc expl lf 0) expl; _DSbitmap bmpconc; /* selection du fichier initial à selectioner */ selectFileInListTab expl expl.ExplIniFile; 0 );; /**************************************** Fonction de reception d'un vignette pour les fichiers uploadés *****************************************/ fun endgetUploadVigs(f,p)= let p -> [noeud expl i label] in if (noeud!=expl.ExplCurrentNoeud)||(f==nil) then nil else ( addToListTab addBmpListUpload expl noeud label f i _GETlistTabCount expl.ExplList expl; /* selection du fichier initial à selectioner */ if !strcmp getSrvPath noeud label expl.ExplIniFile then selectFileInListTab expl expl.ExplIniFile else nil; 0 );; /**************************************** Fonction recursive de download des vignettes des fichiers *****************************************/ fun downloadUploadVigs(l,expl,noeud,i)= if l==nil then 0 else let l -> [f nxt] in ( DLdownload strcat (getSrvPath noeud f) ".vig" nil nil mkfun2 @endgetUploadVigs [noeud expl i f]; downloadUploadVigs nxt expl noeud i+1 );; /**************************************** Fonction reflexe de selection d'un dossier dans l'arbre de l'explorateur *****************************************/ fun RFLopenDir(tree,expl,item)= if item!=nil then ( /* effacement de la selection et de la liste*/ resetSelection expl; /* on efface la liste */ _RSTlistTab expl.ExplList; let searchNoeud expl.ExplRoot @compItem item -> noeud in ( /* memorisation du noeud courant pour les pbs de chargement assynchrone */ set expl.ExplCurrentNoeud=noeud; /* construction de la liste des fichiers du repertoire selectionné */ if noeud.NType&NOEUD_LOCAL then ( addToListTab addBmpListLocal expl noeud (listNameFiles getDFiles noeud) 0 expl; nil ) else if noeud.NType&NOEUD_SERVER then ( let getDimg noeud -> n in if n==nil then ( endgetConcFile nil [noeud expl]; nil ) else DLdownload n nil nil mkfun2 @endgetConcFile [noeud expl] ) else if noeud.NType&NOEUD_UPLOAD then ( downloadUploadVigs (listNameFiles getDFiles noeud) expl noeud 0; 0 ) else nil ) ) else nil ;; /**************************************** Fonction de callback de verification de signatures *****************************************/ fun CheckSign(f,sign,size,expl)= /* on detruit la vue precedente */ ViewDs expl.ExplView; if !strcmp sign _fileSign _checkpack f then /* si les signatures correspondent */ if (TypeExplo&EXPLO_M3D) then newM3dView expl.ExplView expl.ExplCurrentFile else if (TypeExplo&EXPLO_TEXTURE) then ( newTextureView expl.ExplView expl.ExplCurrentFile; nil ) else nil else ( newDownloadView expl.ExplView expl.ExplCurrentFile TypeExplo; nil ); ViewInit expl expl.ExplView; 0 ;; /**************************************** Fonction reflexe de selection d'un fichier *****************************************/ fun RFLselect(list, expl, i) = /* evaluation du nouveau fichier et de la nouvelle vue */ if (i==-1) then resetSelection expl else ( _ENbutton ExplApplyBtn 1; let expl.ExplCurrentNoeud -> noeud in let nth_list getDFiles noeud i -> dfile in let if noeud.NType&NOEUD_LOCAL then getLocalPath noeud dfile.Dname else if noeud.NType&NOEUD_SERVER then getSrvPath noeud dfile.Dname else if noeud.NType&NOEUD_UPLOAD then getSrvPath noeud dfile.Dname else nil -> newpath in ( if strcmp expl.ExplCurrentFile newpath then ( set expl.ExplCurrentFile=newpath; if noeud.NType&NOEUD_LOCAL then CheckSign expl.ExplCurrentFile dfile.Dsign nil expl /* MODIF sert a rien : nil ?? */ else DLsign expl.ExplCurrentFile mkfun4 @CheckSign expl ) else nil; ); 0 ) ;; /**************************************** Fonction reflexe de double click dans la liste *****************************************/ proto selectFile=fun [ObjButton ExploratorManager] I;; fun RFLdblselect(list,expl,i,btn)= selectFile nil WinExpl;; /********************************************** fonction d'analyse du fichier de signatures des fichiers locaux pour verification de la validité de la vignette ***********************************************/ fun retrieveFileLocalSign(l)= if l==nil then nil else let l -> [line nxt] in [(nth_list line 0) (nth_list line 1)]::retrieveFileLocalSign nxt;; /**************************************** Fonction de creation d'un nouvel explorateur *****************************************/ fun newExplorator (ui, channel, father, y, w, h, epaisseur, hbview, sizebmp, ext, type, listname, check1, check2)= let w/2 -> w1 in let _CRwindow channel father 0 y w h WN_CHILDINSIDE|WN_NOCAPTION|WN_NOBORDER|WN_HIDDEN "" -> win in let _CRbitmapList channel 16 16 -> bmp_tree in let loadBitmap channel ClosedBitmap -> closedbmp in let loadBitmap channel OpenBitmap -> openbmp in let _ADDbitmapList bmp_tree closedbmp -> ind0 in let _ADDbitmapList bmp_tree openbmp -> ind1 in let _CRwindow channel win w1+epaisseur 0 w1-epaisseur h-55 WN_CHILDINSIDE|WN_NOCAPTION|WN_NOBORDER "" -> winlist in let mkExplorator[ui channel win _CRtree channel win 0 0 w1 h-hbview TV_DOWN|TV_HSCROLL|TV_BUTTON mkNoeudType[nil nil nil nil ind0 ind1 "" "" "" "" nil 0] nil nil nil winlist _CRlistTab channel winlist 0 0 w1-epaisseur h-55 LV_DOWN|LV_SINGLESEL|8 _CRbitmapList channel sizebmp sizebmp if check1 == nil then nil else _SETcheck (_CRcheck channel win w1+epaisseur h-51 w1-epaisseur 17 CH_RADIO check1) 1 if check2 == nil then nil else (_CRcheck channel win w1+epaisseur h-34 w1-epaisseur 17 CH_RADIO check2) sizebmp hbview ext type mkView[channel win nil nil nil nil nil nil] listname retrieveFileLocalSign strextr unzip _getpack _checkpack listname 0 ] -> expl in ( _DSbitmap closedbmp; _DSbitmap openbmp; _CBtreeSelect expl.ExplTree @RFLopenDir expl; _CBlistTabSelect expl.ExplList @RFLselect expl; _CBlistTabDClick expl.ExplList @RFLdblselect expl; _SETtreeBitmaps expl.ExplTree bmp_tree; _SETlistTabBitmaps expl.ExplList expl.ExplBmpList; expl );; /**************************************** Fonction de destruction d'un explorator *****************************************/ fun dsExplorator(expl)= /* destructions recursives des elements liés à la fenetre:*/ /* sizebar, tree,listTab */ _DSwindow expl.ExplMainWin; _DSbitmapList expl.ExplBmpList; set expl.ExplBmpList=nil; /* destruction recursive des noeuds lors du garbage */ set expl.ExplRoot=nil; 0;; /**************************************** Fonction de redimensionnement d'un explorateur *****************************************/ fun resizeExplorator(expl,w,h)= let SIZEBAR_EPAIS -> epaisseur in let if TypeExplo&EXPLO_NORM then [0 Y_TREE] else if TypeExplo&EXPLO_SELECT then [0 0] else nil -> [xpos ypos] in let w/2 -> w1 in ( _POSITIONwindow expl.ExplMainWin xpos ypos w h-Y_TREE; _POSITIONtree expl.ExplTree 0 0 w1 2*h/3; _POSITIONwindow expl.ExplListWin w1+epaisseur 0 w1-epaisseur h-55; _POSITIONlistTab expl.ExplList 0 0 w1-epaisseur h-55; _POSITIONcheck expl.ExplCheck1 w1+epaisseur h-51 w1-epaisseur 17; _POSITIONcheck expl.ExplCheck2 w1+epaisseur h-34 w1-epaisseur 17; let _GETwindowPositionSize expl.ExplMainWin -> [_ _ _ h] in let _GETtreeSizePosition expl.ExplTree -> [_ y _ _] in set expl.ExplBmpViewSizeH=h-y; ViewInit expl expl.ExplView; ) ;; /************************************** Fonction qui ferme tous les directory de l'arbre Renvoie 0 ***************************************/ fun closePathInExplorator(expl)= recurseCloseDir expl.ExplTree expl.ExplRoot; resetSelection expl; _RSTlistTab expl.ExplList; 0;; /********************************************* fonction de conversion d'un fichier en referentiel server en referentiel local **********************************************/ fun convertSrvPathLocalPath(noeud,path)= if noeud==nil then nil else let strfindi noeud.NServerRef path 0 -> find in if find!=nil then strcat noeud.NLabel substr path strlen noeud.NServerRef strlen path else convertSrvPathLocalPath noeud.NBro path;; /********************************************* Fonction qui selectione le chemin passé en parametre dans l'explorator **********************************************/ fun selectPathInExplorator(expl,s)= if s!=nil then let extractDirectories convertSrvPathLocalPath expl.ExplRoot.NSon s -> lpath in let recurseOpenDir expl.ExplTree expl.ExplRoot.NSon nil lpath sizelist lpath -> file in if file==nil then ( closePathInExplorator expl; nil ) else set expl.ExplIniFile=s else nil;; /********************************************* Fonction recursive d'analyse du fichier descriptif de l'arborescence au niveau du server **********************************************/ fun analyseExplFile(l,expl,Noeud)= if l==nil then 0 else let l -> [line nxt] in let hd line -> s in ( if !(strcmp s "elt") then ( if Noeud.NFiles==nil then set Noeud.NFiles=newFiles nil else nil; addFiles Noeud.NFiles nth_list line 1; 0 ) else if !(strcmp s "res") then ( set Noeud.NFiles=newFiles nth_list line 1; 0 ) else if !(strcmp s "}") then ( reverseDFiles Noeud.NFiles; set Noeud=Noeud.NFat; 0 ) else if !(strcmp s "dir") then ( let nth_list line 1 -> n in set Noeud=addNoeud Noeud expl n n Noeud.NLocalRef Noeud.NServerRef Noeud.NType NODE_SORT; 0 ) else 0; analyseExplFile nxt expl Noeud );; /**************************************** Fonction de chargement du contenu d'un explorateur au niveau des fichiers serveurs communs à tous les utilisateurs *****************************************/ fun loadServerFiles(f,p)= let p -> [expl noeud] in analyseExplFile strextr munzip _getpack _checkpack f expl noeud; 0;; /**************************************** Fonction de chargement du contenu d'un explorateur au niveau des fichiers serveurs uploadés *****************************************/ fun loadUploadFiles(f,p)= let p -> [expl noeud] in analyseExplFile strextr unzip _getpack _checkpack f expl noeud; 0;; /********** fonctions relatives au chargement de l'arborescence des fichiers locaux ******************/ /******************************************** Fonction de creation de la liste des fichiers signature à partir des noeuds *********************************************/ fun crListSubLocalSign(noeud,l)= if l==nil then nil else let l -> [dfile nxt] in [getLocalPath noeud dfile.Dname dfile.Dsign]::crListSubLocalSign noeud nxt;; fun crListLocalSign(noeud)= if noeud==nil then nil else conc crListSubLocalSign noeud getDFiles noeud conc crListLocalSign noeud.NBro crListLocalSign noeud.NSon;; /********************************************* Fonction renvoyant la liste filtrée par extension passée en parametres **********************************************/ fun filterExtension(l,ext)= if l==nil then nil else let l -> [f nxt] in let search_last_point f -> i in if (search_in_list ext @compExt substr f i+1 (strlen f)-i-1)!=nil then f::filterExtension nxt ext else filterExtension nxt ext;; /********************************************** Fonction de creation de la vignette d'un m3d ***********************************************/ fun crVigM3d(f,fres,bmpres,size,s)= let M3createShell s -> shellvig in let M3createShell s -> ob in ( M3link s ob shellvig; M3load s "dms/3d/cam1.m3d" shellvig; let M3getObj s "camera" -> camvig in let M3getCamera s camvig ->[_ _ h] in let size/2 -> sx in ( M3setCamera s camvig [[size size] [sx sx] h]; M3load s f ob; M3recursFillMatObj s ob; let M3getFirstSon s ob -> son in let M3calcPosRef s son shellvig -> [[x y z] _] in let (1+M3getRadius s son)*2->k in let [[x y z-k] [0 0 0]] -> [v a] in ( M3setObjVec s camvig v; M3setObjAng s camvig a; ); M3scanline s bmpres camvig 0 0 make_rgb 255 255 255; ); _storepack _FILEbitmap bmpres fres; M3delObj s shellvig; ); 0;; /********************************************** Fonction de creation de la vignette d'une texture ***********************************************/ fun crVigTexture(f,fres,bmp,size)= let loadBitmap _channel f -> bmpini in let _GETbitmapSize bmpini -> [w h] in ( _SCPbitmap bmp 0 0 size-1 size-1 bmpini 0 0 w-1 h-1 nil; _storepack _FILEbitmap bmp fres; _DSbitmap bmpini; ); 0;; /***************************************s******* Fonction qui compare le nom des fichiers ***********************************************/ fun compListSign(l,s)= let l -> [f _] in !strcmpi f s;; /********************************************** Fonction qui teste la validité d'une vignette par rapport au fichier source ***********************************************/ fun testValidityVignettes(expl,noeud,dfile,fvig)= let getLocalPath noeud dfile.Dname -> f in ( set dfile.Dsign=_fileSign _checkpack f; let search_in_list expl.ExplListSign @compListSign f -> lres in ( if lres==nil then set expl.ExplListSignChanged=1 else nil; let lres -> [f1 signini] in if (_checkpack fvig)==nil || strcmp dfile.Dsign signini then ( set expl.ExplListSignChanged=1; 1 ) else 0 ) );; /********************************************* Fonction de creation des vignettes **********************************************/ fun crVignettes(dfile,param)= let param -> [expl noeud s bmpres size] in let getLocalPath noeud dfile.Dname -> f in let strcat f ".vig" -> vig in if testValidityVignettes expl noeud dfile vig then ( exec if expl.ExplType&EXPLO_TEXTURE then @crVigTexture else if expl.ExplType&EXPLO_M3D then mkfun5 @crVigM3d s else nil with [f vig bmpres size] ) else 0 ;; fun addFilesFromList(f,p)= let p -> [noeud ref] in let (strlen ref)+1 -> len in addFiles noeud.NFiles substr f len (strlen f)-len; 0;; proto analyseLocalFiles=fun [Explorator NoeudType] I;; /******************************************** Fonction evaluant la liste des fichiers dans un repertoire local et creation des vignettes correspondantes *********************************************/ fun addLocalFilesInDirectory(expl,newnoeud,sub)= let filterExtension quicksort _listoffiles sub @suppDoublon expl.ExplExt -> lfiles in if lfiles!=nil then ( /* ajout des fichiers au noeud */ set newnoeud.NFiles=newFiles nil; apply_on_list lfiles @addFilesFromList [newnoeud sub]; reverseDFiles newnoeud.NFiles; /* creation des vignettes des fichiers */ let M3create _channel 1024 1024 1024 1024 1024*1024*4 -> s in if s!=nil then let _CRbitmap _channel expl.ExplBmpListSize expl.ExplBmpListSize -> bmpres in ( apply_on_list (getDFiles newnoeud) @crVignettes [expl newnoeud s bmpres expl.ExplBmpListSize]; M3destroy s; /* destruction de la map dans le gc sinon ca plante!!*/ ) else nil; 0 ) else nil; 0;; /********************************************** Fonction recursive d'ajout des repertoires et des fichiers locaux ***********************************************/ fun recurseAddDir(expl,l,Noeud)= if l==nil then 0 else let l -> [sub nxt] in let strlen if !strcmp Noeud.NPath "" then strcatn Noeud.NLocalRef::"/"::nil else strcatn Noeud.NLocalRef::"/"::Noeud.NPath::"/"::nil -> lenlocref in let substr sub lenlocref (strlen sub)-lenlocref -> n in let addNoeud Noeud expl n n Noeud.NLocalRef Noeud.NServerRef Noeud.NType NODE_SORT -> newnoeud in ( addLocalFilesInDirectory expl newnoeud sub; recurseAddDir expl nxt Noeud; analyseLocalFiles expl newnoeud; );; /********************************************** Fonction recursive analysant la structure des repertoires et fichiers presents en local ***********************************************/ fun analyseLocalFiles(expl,Noeud)= if Noeud==nil then 0 else recurseAddDir expl mirror quicksort _listofsubdir (getLocalPath Noeud nil) @suppDoublon Noeud;; /********************************************** Fonction recursive sur l'arbre des noeuds supprimant les repertoires vides de touts fichiers ***********************************************/ fun checkEmptyNoeud(expl,Noeud)= if Noeud==nil then nil else ( checkEmptyNoeud expl Noeud.NSon; checkEmptyNoeud expl Noeud.NBro; if Noeud.NSon==nil && (getDFiles Noeud)==nil then removeNoeud Noeud expl else nil ); 0;; /**************************************** Fonction de chargement du contenu d'un explorateur au niveau des fichiers locaux *****************************************/ fun loadLocalFiles(expl,noeud)= /* analyse des fichiers locaux */ addLocalFilesInDirectory expl noeud "public"; analyseLocalFiles expl noeud; /* destruction des repertoires vides */ checkEmptyNoeud expl noeud.NSon; if expl.ExplListSignChanged then ( _createpack zip strbuild crSaveFileLocalSign crListLocalSign noeud _getmodifypack expl.ExplListSignName; set expl.ExplListSignChanged=0; ) else nil; /* on a plus besoin de la liste des signatures jusqu'au prochain rafraichissement!!! ca risque de prendre de la place pour pas grand chose*/ set expl.ExplListSign=nil; 0;; /**************************************** Fonction de chargement du contenu d'un explorateur *****************************************/ fun loadExplorator(expl,refpath,srvfiles)= let srvfiles -> [f fu] in ( loadLocalFiles expl addNoeud expl.ExplRoot expl "Local" "" "public" "public" NOEUD_LOCAL NODE_FIRST; DLdownload fu nil nil mkfun2 @loadUploadFiles [expl addNoeud expl.ExplRoot expl "Upload" "" "public" "public" NOEUD_UPLOAD NODE_FIRST ]; DLdownload f nil nil mkfun2 @loadServerFiles [expl addNoeud expl.ExplRoot expl "Server" "" "Server" refpath NOEUD_SERVER NODE_FIRST ]; ); 0;; /**************************************** Fonction qui en fonction du type passé determine les elements visibles et non visibles ainsi que leur position de l'exploreur *****************************************/ fun selectedExplorateur(b,param)= let param -> [explm type matname] in ( set TypeExplo=type; /* determine quelle est le fenetre de boutons à afficher */ let if (type&EXPLO_M3D) then [explm.ExplMm3d.ExplMainWin explm.ExplMtext.ExplMainWin explm.ExplMbox.ExplMainWin (_loc this "SELADDM3D" nil)] else if (type&EXPLO_TEXTURE) then [explm.ExplMtext.ExplMainWin explm.ExplMm3d.ExplMainWin explm.ExplMbox.ExplMainWin strcatn (_loc this "SELADDTEXT" nil)::" "::matname::nil] else if (type&EXPLO_BOX) then [explm.ExplMbox.ExplMainWin explm.ExplMm3d.ExplMainWin explm.ExplMtext.ExplMainWin (_loc this "SELADDBOX" nil)] else nil -> [vis unvis1 unvis2 txt] in let _GETwindowPositionSize vis -> [_ _ w h] in let if (type&EXPLO_NORM) then ( _SETwindowName explm.ExplMwin _loc this "EXPLONAME" nil; _SHOWwindow explm.ExplMwinNorm WINDOW_UNHIDDEN; _SHOWwindow explm.ExplMwinSelect WINDOW_HIDDEN; [0 Y_TREE] ) else if (type&EXPLO_SELECT) then ( _SETwindowName explm.ExplMwin txt; _SHOWwindow explm.ExplMwinNorm WINDOW_HIDDEN; _SHOWwindow explm.ExplMwinSelect WINDOW_UNHIDDEN; [0 0] ) else nil -> [x y] in ( _POSITIONwindow vis x y w h; _SHOWwindow unvis1 WINDOW_HIDDEN; _SHOWwindow unvis2 WINDOW_HIDDEN; _SHOWwindow vis WINDOW_UNHIDDEN; ) );; fun recurseAddFile(expl,noeud,l,updatelist)= let l -> [s nxt] in ( if nxt==nil then ( /* le fichier */ if noeud.NFiles==nil then set noeud.NFiles=newFiles nil else nil; addFiles noeud.NFiles s; if updatelist then RFLopenDir expl.ExplTree expl expl.ExplCurrentNoeud.NItem else nil; s ) else if !strcmpi noeud.NLabel s then ( set noeud=if noeud.NSon==nil && (tl nxt)!=nil then let hd nxt -> nxts in addNoeud noeud expl nxts nxts noeud.NLocalRef noeud.NServerRef noeud.NType NODE_SORT else if (tl nxt)!=nil then noeud.NSon else noeud; recurseAddFile expl noeud nxt updatelist ) else if noeud.NBro==nil then ( recurseAddFile expl addNoeud noeud.NFat expl s s noeud.NLocalRef noeud.NServerRef noeud.NType NODE_SORT l updatelist ) else recurseAddFile expl noeud.NBro l updatelist );; proto closeExplorateur=fun [] I;; /* On a fini de TOUT UPLOADER sur le serveur */ fun EXPL_EndSelect (data) = closeExplorateur; let data -> [explm expl file] in exec explm.ExplMcbSelectFile with [ file TypeExplo&(EXPLO_M3D|EXPLO_TEXTURE|EXPLO_BOX) (_GETcheck expl.ExplCheck1) ]; 0 ;; /* On a fini de tout Uploader sur le serveur: les fichiers M3d, Les vignettes et les textures associées */ fun cbUploadTexture(r, param) = let param -> [[explm expl file] i]in ( mutate param <- [_ set i=i-1]; if r==(-1)||(r==0) then closeExplorateur else if r==1 && i==0 then ( EXPL_EndSelect [explm expl file] ) else nil ) ;; /* On upload ICI les différentes Textures des Objets M3d et des vignettes */ fun uploadTexture(t, param) = let t -> [texture mat] in ( DLupload texture _getpack _checkpack texture mkfun2 @cbUploadTexture param; let strcat texture ".vig" -> vig in DLupload vig _getpack _checkpack vig mkfun2 @cbUploadTexture param ); 0 ;; fun EXPL_IsLocalPath (path) = !strcmpi (substr path 0 6) "public" ;; fun EXPL_CheckLocalTextures (listtextures) = if listtextures == nil then nil else let listtextures -> [cur next] in let cur -> [path _] in if EXPL_IsLocalPath path then cur::(EXPL_CheckLocalTextures next) else EXPL_CheckLocalTextures next ;; /* une fois les vignettes Uploader pour les M3D il faut UPLOADER les différentes textures r : 1 ou 0 de DLUend */ fun cbUploadVig(r, param) = let param -> [explm expl file] in if r==(-1)||(r==0) then closeExplorateur else if r==1 then ( closeExplorateur; UsendMessage expl.Explui "addFileInExplorator" strbuild ((itoa expl.ExplType)::file::nil)::nil; if TypeExplo&EXPLO_M3D then let EXPL_CheckLocalTextures evalM3dTextures strextr _getpack _checkpack file nil-> ltext in /* fait une liste avec toutes les Textures à Uploader */ if ltext==nil then /* pas de texture */ cbUploadTexture 1 [param 1] else ( apply_on_list ltext @uploadTexture [param 2*(sizelist ltext)]; 0 ) else EXPL_EndSelect param ) else nil ;; /* Une fois la signature vérifiée et différente de celle du serveur , (donc les fichiers sur le serveur ne sont pas à jour) on Upload les fichiers r : 1 ou 0 de DLUend */ fun cbUploadLocalFile(r, param) = let param -> [explm expl file] in if r==(-1)||(r==0) then closeExplorateur else if r==1 then if TypeExplo&EXPLO_BOX then ( UsendMessage expl.Explui "addFileInExplorator" strbuild ((itoa expl.ExplType)::file::nil)::nil; EXPL_EndSelect param /* pas de vignette */ ) else let strcat file ".vig" -> vig in DLupload vig _getpack _checkpack vig mkfun2 @cbUploadVig param /* pour les M3D il faut Uploader des vignettes */ else nil ;; /**************************************** fonction reflexe lors du click sur apply *****************************************/ fun selectFile(b, explm) = let if TypeExplo&EXPLO_TEXTURE then explm.ExplMtext else if TypeExplo&EXPLO_M3D then explm.ExplMm3d else if TypeExplo&EXPLO_BOX then explm.ExplMbox else nil -> expl in let expl.ExplCurrentFile -> file in if expl.ExplCurrentNoeud.NType&NOEUD_LOCAL then /* si fichier sélectionné dans l'explorateur est sur LOCAL, il faut l'uploader */ /* upload vers le serveur du fichier courant sélectionné dans l'explorateur */ /* on vérifie d'abord la signature */ DLupload file _getpack _checkpack file mkfun2 @cbUploadLocalFile [explm expl file] else /* si fichier sélectionné dans l'explorateur mais sur Server ou Upload */ ( EXPL_EndSelect [explm expl file]; nil ); 0 ;; /**************************************** Fonction reflexe lors du click sur cancel *****************************************/ fun cancelFile(b, explm) = closeExplorateur ;; /**************************************** Fonction reflexe de redimmensionnement de la fenetre principale *****************************************/ fun cbresizeExploMngr(win,m,w,h)= resizeExplorator m.ExplMm3d w h; resizeExplorator m.ExplMtext w h; resizeExplorator m.ExplMbox w h; _POSITIONwindow WinExpl.ExplMwinNorm 0 0 w Y_TREE; _POSITIONwindow WinExpl.ExplMwinSelect 0 (h-Y_TREE) w Y_TREE; _POSITIONbutton ExplApplyBtn w-220 0 100 Y_TREE; _POSITIONbutton ExplCancelBtn w-110 0 100 Y_TREE; 0;; /**************************************** Fonction reflexe de sélection de la fenetre principale *****************************************/ fun cbfocusExploMngr(win,explm)= let if TypeExplo&EXPLO_TEXTURE then [explm.ExplMtext explm.ExplMtext.ExplCurrentFile] else if TypeExplo&EXPLO_M3D then [explm.ExplMm3d explm.ExplMm3d.ExplCurrentFile] else if TypeExplo&EXPLO_BOX then [explm.ExplMbox explm.ExplMbox.ExplCurrentFile] else nil -> [expl file] in selectFileInListTab expl file ;; /**************************************** Fonction de construction du manager d'exploration *****************************************/ fun newExploratorManager(channel,win,ui,w,h,bmpsize)= let _CRwindow channel win 50 50 W_EXPLO H_EXPLO WN_SIZEBOX|WN_HIDDEN "" -> win in let WN_CHILDINSIDE|WN_HIDDEN|WN_NOCAPTION|WN_NOBORDER-> flags in let mkExploratorManager[ ui channel win newExplorator ui channel win Y_TREE w (h-Y_TREE) SIZEBAR_EPAIS (h-Y_TREE)/3 bmpsize "m3d"::nil EXPLO_M3D FileLocalSignM3d (_loc this "M3D_ADDCENTERED" nil) (_loc this "M3D_ADDINFRONT" nil) newExplorator ui channel win Y_TREE w (h-Y_TREE) SIZEBAR_EPAIS (h-Y_TREE)/3 bmpsize "bmp"::"jpg"::"jpeg"::nil EXPLO_TEXTURE FileLocalSignText nil nil newExplorator ui channel win Y_TREE w (h-Y_TREE) SIZEBAR_EPAIS (h-Y_TREE)/3 bmpsize "box"::nil EXPLO_BOX FileLocalSignBox nil nil _CRwindow channel win 0 0 w Y_TREE flags "" _CRwindow channel win 0 (h-Y_TREE) w Y_TREE flags "" nil ] -> explm in ( _SETwindowMinSize _CBwinFocus _CBwinSize win @cbresizeExploMngr explm @cbfocusExploMngr explm w h; /* creation des boutons normaux */ _CBbutton _CRbutton channel explm.ExplMwinNorm 10 0 30 Y_TREE nil "m3d" @selectedExplorateur [explm EXPLO_NORM|EXPLO_M3D nil]; _CBbutton _CRbutton channel explm.ExplMwinNorm 50 0 30 Y_TREE nil "text" @selectedExplorateur [explm EXPLO_NORM|EXPLO_TEXTURE nil]; _CBbutton _CRbutton channel explm.ExplMwinNorm 10 0 30 Y_TREE nil "box" @selectedExplorateur [explm EXPLO_NORM|EXPLO_BOX nil]; /* creation des boutons select */ set ExplApplyBtn=_ENbutton _CBbutton _CRbutton channel explm.ExplMwinSelect w-220 0 100 Y_TREE nil _loc this "BTNAPPLY" nil @selectFile explm 0; set ExplCancelBtn=_CBbutton _CRbutton channel explm.ExplMwinSelect w-110 0 100 Y_TREE nil _loc this "BTNCANCEL" nil @cancelFile explm; explm );; /**************************************** Fonction de destruction du manager d'exploration *****************************************/ fun dsExploratorManager(m)= dsExplorator m.ExplMm3d; dsExplorator m.ExplMtext; dsExplorator m.ExplMbox; set m.ExplMm3d=nil; set m.ExplMtext=nil; set m.ExplMbox=nil; _DSwindow m.ExplMwinSelect; _DSwindow m.ExplMwinNorm; _DSwindow m.ExplMwin; 0;; /* fonction d'intialisation de la fenetre d'exploration */ fun initExplorateur(win,ui,srvm3d,srvtext,srvbox,bmpsize,refpath)= set DownloadMap = loadBitmap _channel DownloadBitmap; set WinExpl = newExploratorManager _channel win ui W_EXPLO H_EXPLO bmpsize; loadExplorator WinExpl.ExplMtext refpath srvtext; loadExplorator WinExpl.ExplMm3d refpath srvm3d; loadExplorator WinExpl.ExplMbox refpath srvbox; 0;; /* fonction de desinitialisation de la fenetre d'exploration */ fun unInitExplorateur()= dsExploratorManager WinExpl; set WinExpl=nil; _DSbitmap DownloadMap; 0;; /* fonction d'ouverture de l'explorateur */ fun openExplorateur(x,y,type,f,file,text)= set WinExpl.ExplMcbSelectFile=f; selectedExplorateur nil [WinExpl type text]; /* positionnement de la fenetre de l'explorateur */ let _GETwindowPositionSize WinExpl.ExplMwin -> [_ _ w h] in _POSITIONwindow WinExpl.ExplMwin x y w h; /* on montre la fenetre */ _SHOWwindow WinExpl.ExplMwin WINDOW_UNHIDDEN; /* selection du fichier dans l'explorateur */ selectPathInExplorator (if type&EXPLO_M3D then WinExpl.ExplMm3d else if type&EXPLO_TEXTURE then WinExpl.ExplMtext else if type&EXPLO_BOX then WinExpl.ExplMbox else nil) file; 0 ;; /* fonction de fermeture de l'explorateur */ fun closeExplorateur()= /* on cache la fenetre du manager */ _SHOWwindow WinExpl.ExplMwin WINDOW_HIDDEN; /* deselection du fichier */ closePathInExplorator WinExpl.ExplMm3d; closePathInExplorator WinExpl.ExplMtext; closePathInExplorator WinExpl.ExplMbox; 0;; /****************************************** Fonction de suppression d'un fichier dans l'explorateur *******************************************/ fun addFileInExplorator(ui,action,param)= let hd strextr param -> [type [file _]] in let atoi type -> typeI in let if typeI&EXPLO_TEXTURE then WinExpl.ExplMtext else if typeI&EXPLO_M3D then WinExpl.ExplMm3d else if typeI&EXPLO_BOX then WinExpl.ExplMbox else nil -> expl in let search_last_point file -> i in if (search_in_list expl.ExplExt @compExt substr file i+1 (strlen file)-i-1)==nil then nil else /* type compatible entre le fichier et l'explorateur selectionné */ recurseAddFile expl expl.ExplRoot.NSon extractDirectories convertSrvPathLocalPath expl.ExplRoot.NSon file !strcmp extractPath expl.ExplCurrentFile extractPath file; 0;;