<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package _EAnim.Editor.Dynamic.Macros;

import phUtil.Project_S;
import phUtil.PhWindow.Dialog.ImagePreview;
import phUtil.phInOut.File.PhFileName;
import phUtil.phInOut.File.PhFileName_S;
import phUtil.phText._TextTools.PhName;
import phUtil.phText._TextTools.PhTextToTab_S;

import java.awt.Component;
import java.awt.Container;
import java.awt.Font;
import java.io.File;
import java.util.regex.Pattern;

import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.JFileChooser;

import _EAnim.EAnimSys_S;
import _EAnim.Editor.Projet.Projet_S;
import _EAnim.FenWizard.FenOrgenizer.FenPieceOrgenizer;
import _EAnim.Prog.SimpleScriptEAnim.pgval;
import _EAnim.Prog.SimpleScriptEAnim.pgvalfile;
import _EAnim.Prog.SimpleScriptEAnim.pgvalfiletab;
import _EAnim.Prog.SimpleScriptEAnim.pgvaltab;
import _EAnim.Utils.valdef;

/**
 * Construit une variable fichier 'pgvalfile'.&lt;br&gt;
 * Fonction pour l'&amp;eacute;diteur. Elle est utilis&amp;eacute;e dans les barres-bouton ou les fen&amp;ecirc;tres de commande de E-anim.&lt;br&gt;
 * Si le parametre URL est renseign&amp;eacute; le fichier est t&amp;eacute;l&amp;eacute;charg&amp;eacute; puis install&amp;eacute; dans E-anim.
 * Note : le fichier ne sera t&amp;eacute;l&amp;eacute;charg&amp;eacute; qu'une seule foir.&lt;br&gt;
 * Le param&amp;egrave;tre 'timerLoadMax' indique le d&amp;eacute;lais d'attente, en secondes, pour le chargement. Ce d&amp;eacute;lais d&amp;eacute;pass&amp;eacute;,
 * le script continue. Si 'timerLoadMax' est omis, le d&amp;eacute;lais est de 5 minutes.&lt;br&gt;
 *&lt;br&gt;
 * &lt;b&gt;Protection pour les fichiers t&amp;eacute;l&amp;eacute;charg&amp;eacute;s :&lt;/b&gt;&lt;br&gt;
 * Seules les fichiers situ&amp;eacute; dans le site 'e-anim' dans un sous-dossier de 'e-anim.com/doc/sprites'
 * seront t&amp;eacute;l&amp;eacute;charg&amp;eacute;s avec cette fonction.&lt;br&gt;
 * &lt;b&gt;Proc&amp;eacute;dure de test : &lt;/b&gt;&lt;br&gt;
 * Un flag {@link _EAnim.EAnim#progTestDownload} permet de tester les fichiers avant de les placer dans ce site.&lt;br&gt;
 * &lt;font color=4000C0&gt;
 * Pour activer ce flag, ouvrez le cadre pr&amp;eacute;f&amp;eacute;rence -&gt; menu : 'Fichier/Preferences/Options...&amp;lt;Ctrl o&gt;/'&lt;br&gt;
 * Dans ce cadre, cochez : '(Pour experts) Programme : test download'&lt;br&gt;
 * &lt;/font&gt;
 * Afin qu'une adresse URL soit compatible avec le test, la partie qui sera remplac&amp;eacute;e par l'adresse 'e-anim' 
 * doit imp&amp;eacute;rativement &amp;ecirc;tre en parenth&amp;egrave;se.&lt;br&gt; 
 * &lt;font color=4000C0&gt;Exemple :  (http://addr_test.eu)/mysprite/file.txt'&lt;/font&gt;&lt;br&gt; 
	 * Cette syntaxe est compatible avec la mise-en-production (pour que le fichier soit accessible par tous les utilisateurs).&lt;br&gt;
	 * La partie entre parenth&amp;egrave;se sera automatiquement remplac&amp;eacute;e par l'URL de E-anim.&lt;br&gt;
	 * &lt;font color=4000C0&gt;
	 * Exemple : &lt;br&gt;
	 * 		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	 * 		&lt;b&gt;(http://addr_test.eu)&lt;/b&gt;/mysprite/file.txt&lt;br&gt;
	 * 			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	 * 			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	 * 			deviendra&lt;br&gt;
	 * 		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	 * 		&lt;b&gt;http://www.e-anim.com/doc/sprites/&lt;/b&gt;mysprite/file.txt&lt;br&gt;
	 * &lt;/font&gt;

 * &lt;br&gt;
 * &lt;b&gt;Protection pour le traitement d'&amp;eacute;criture de fichiers  :&lt;/b&gt;&lt;br&gt;
 * Toutes les fonctions d'&amp;eacute;criture de fichiers son prot&amp;eacute;g&amp;eacute;es.
 * Exemple de fonctions prot&amp;eacute;g&amp;eacute;es : copy, delete, write...
 * proc&amp;eacute;dure de protection :&lt;br&gt; 
 * E-anim impose une commande {@link _EAnim.Editor.Dynamic.Macros.ED_Function_filesImport filesImport()} un script {@link _EAnim.Editor.Dynamic.Macros.ED_Function_filesImport#load(String[] fileNamesP) (listing de fichiers)} pour ex&amp;eacute;cuter ces fonctions.&lt;br&gt;
 * IMPORTANT : ce script doit imp&amp;eacute;rativement se situer sur le site 'e-anim.com',
 * &amp;agrave; dans un sous-dossier de {@link #URL_SPRITE e-anim.com/sprites}. Chaque script
 * doit &amp;ecirc;tre v&amp;eacute;rifi&amp;eacute; avant d'&amp;ecirc;tre plac&amp;eacute; &amp;agrave; cette adresse.
 * (v&amp;eacute;rifier que la destination est bien un sous-dossier r&amp;eacute;serv&amp;eacute; &amp;agrave; cet utilisateur).&lt;br&gt;
 * &lt;i&gt;Note : &amp;agrave; automatiser en php.&lt;/i&gt;&lt;br&gt;
 * &lt;br&gt;
 * Rappel : pour effectuer les tests, les utilisateurs doivent d&amp;eacute;bloquer cette protection 
 * {@link _EAnim.EAnim#progTestDownload}.&lt;br&gt;
 * Pour cela, ouvres le cadre pr&amp;eacute;f&amp;eacute;rence -&gt; menu : 'Fichier/Preferences/Options...&amp;lt;Ctrl o&gt;/'&lt;br&gt;
 * Dans ce cadre, cochez : '(Pour experts) Programme : test download'&lt;br&gt;
 * Attention, tant que ce flag est activ&amp;eacute; E-anim ne v&amp;eacute;rifie plus les protections
 * de sand-box : &amp;agrave; manipuler avec circonspection.&lt;br&gt;
 * &lt;b&gt;Note : E-anim garantit tout de mÃªme la protection de votre ordinateur, car les copies ne peuvent jamais, et dans aucune
 * circonstance, &amp;ecirc;tre envoy&amp;eacute;e end ehors du dossier E-anim.&lt;/b&gt;  
 *  
 *   
 * &lt;br&gt;
 * Pour protection, e-anim interdit l'acc&amp;egrave;s aux ficheirs situ&amp;eacute;s en dehors du dossier E-anim et du dossier de travail.
 * Sont aussi interdits, les acc&amp;egrave;s aux fichiers 'java' ou 'class' ou 'exe'&lt;br&gt;
 * &lt;br&gt;
 * @see _EAnim.Editor.Dynamic.Macros.ED_Function 		Les fonctions pour l'&amp;eacute;diteur h&amp;eacute;ritent de : ED_Function
 * @see _EAnim.Editor.Dynamic.Macros.ED_Functions 		Stockage des fonctions pour l'&amp;eacute;diteur : ED_Functions&lt;br&gt;
 * @see _EAnim.Prog.SimpleScriptEAnim.pgvalfonc 		Dans un script, ex&amp;eacute;cuter un fonction : pgvalfonc.
 * @see _EAnim.Prog.SimpleScriptEAnim.pgval 			Type de valeur dans un programme : pgval
 * @see _EAnim.Editor.Dynamic.ED_BarreCommand 			Panneau de commande qui utilise ces fonctions : Barre-boutons
 * @see _EAnim.FensVolantes.GroupEditor.ED_FenCommand 	Panneau de commande qui utilise ces fonctions : Fen&amp;ecirc;tre de commande
 * @see _EAnim.Editor.Dynamic.ED_PieceClic_A 			Controles (Pieces) plac&amp;eacute;es dans un panneau-de-commande : ED_PieceClic_A
 * @see _EAnim.Editor.Dynamic.LinkToGroupOfAnimation.ED_GroupToPanelCommand  Echange entre le Groupe de l'animation et le panneau : ED_GroupOnPanel
 * @see _EAnim.Editor.Dynamic.Macros.ED_ 				Fonctions de commandes en java : ED_
 * @author Phildes
 *
 */
public class ED_Function_filesSelectorFiltred extends ED_Function {
	/**
	 * Flag de protection temporaire. &lt;br&gt;
	 * Interdit les suppressions et les copies temps que les probl&amp;ecirc;mes
	 * de protection ne sont pas r&amp;ecirc;gl&amp;eacute;s.&lt;br&gt;
	 */
	static boolean protectionError = true;
	
	/**
	 * Traduction de l'adresse de test '(http://addr_test.eu)/mysprite/file.txt' (c'est la partie entre parenth&amp;egrave;se.)&lt;br&gt;
	 * &lt;font color=4000C0&gt;
	 * Exemple : &lt;br&gt;
	 * 		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	 * 		&lt;b&gt;(http://addr_test.eu)&lt;/b&gt;/mysprite/file.txt&lt;br&gt;
	 * 			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	 * 			&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	 * 			deviendra&lt;br&gt;
	 * 		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	 * 		&lt;b&gt;http://www.e-anim.com/doc/sprites/&lt;/b&gt;mysprite/file.txt&lt;br&gt;
	 * &lt;/font&gt;
	 * Note : le flag {@link _EAnim.EAnim#progTestDownload} annule momentan&amp;eacute;ment
	 * la protection, et permet d'utiliser l'adresse entre parenth&amp;egrave;se.
	 */
	//static final private String URL_SPRITE   = "http://www.e-anim.com/doc/sprites/";
	
	
	static final public String[] doc = {
		"editor_file.filesSelectorFiltred(String titre, String dossier, String extensionOK, String prÃ©fixeOK, String prÃ©fixeBad)", 
		" ",
			"Ouvre le sÃ©lecteur de fichier, puis m&amp;eacute;morise le fichier s&amp;eacute;lectionn&amp;eacute;",
			"Exemple : fileSelected = filesSelectorFiltred(''S&amp;eacute;lectionner un fichiers sans_nom'',",
			"                                                                          ''$prog$doc/biblio'', ''jpg,gig'','''',''mini'');",
			" ",
			" ",
			" ",
			" ",
			" ",
			" ",
			" ",
			" ",
			" ",
			" ",
			" ",
			" ",
			" ",
			valdef.SCRIPT_MACRO_HELP+
			"textArea(" +
			"''" +
			"Ouverture du sÃ©lecteur de fichiers.&lt;l&gt;" +
			"Important : cette fonction ne charge pas le fichier,&lt;l&gt;" +
			"elle m&amp;eacute;morise l'adresse du fichier s&amp;eacute;lectionn&amp;eacute; dans un 'file'.&lt;l&gt;"+ 
			"ou de plusieurs fichiers dans un tableau-d'adresses.&lt;l&gt;"+
			" &lt;l&gt;"+
			"Param&amp;egrave;tres 0 :&lt;l&gt;"+
			"- titre : titre de la fen&amp;ecirc;tre du s&amp;eacute;lecteur.&lt;l&gt;"+
			" &lt;l&gt;"+
			"Param&amp;egrave;tres 1 :&lt;l&gt;"+
			"- dossier : fichier list&amp;eacute; dans le s&amp;eacute;lecteur,&lt;l&gt;"+
			"     Si absent, le s&amp;eacute;lecteur listera le dossier&lt;l&gt;"+			
			"     de travail : $doc$.&lt;l&gt;"+
			" &lt;l&gt;"+
			"Param&amp;egrave;tre 2 : (optionnel=null)&lt;l&gt;"+
			"- extensionOk :  filtre pour les extension de fichiers acceptÃ©s&lt;l&gt;"+
			"     Extension, sans les '.', sÃ©parÃ©es par une virgule&lt;l&gt;"+
			"          exemple : &lt;q&gt;jpg,png,gif&lt;q&gt;.&lt;l&gt;"+
			"     Si tout extension acceptÃ©es : null&lt;l&gt;"+
			"Param&amp;egrave;tre 3 : (optionnel=null)&lt;l&gt;"+
			"- prefixeOk:  filtre pour le ou les prÃ©fixes acceptÃ©s&lt;l&gt;"+
			"     prÃ©fixes sÃ©parÃ©es par une virgule&lt;l&gt;"+
			"          exemple : &lt;q&gt;mini,icon&lt;q&gt;.&lt;l&gt;"+
			"     Si tout prÃ©fixe acceptÃ©es : null&lt;l&gt;"+
			"Param&amp;egrave;tre 4 : (optionnel=null)&lt;l&gt;"+
			"- prefixeBad:  filtre pour le ou les prÃ©fixes exclus de la liste&lt;l&gt;"+
			"     prÃ©fixes sÃ©parÃ©es par une virgule&lt;l&gt;"+
			"          exemple : &lt;q&gt;mini,icon&lt;q&gt;.&lt;l&gt;"+
			"     Si aucun prÃ©fixe refusÃ© : null&lt;l&gt;"+
			" &lt;l&gt;"+
			"Retourne la liste des fichiers sÃ©lectionnÃ©s &lt;l&gt;"+
			"    '' " +
			",10,217, 400,165,10)"
			+valdef.SCRIPT_MACRO_HELP_END
	};
	static String errorMessageParethese = 
		"&lt;br&gt;'(url for test)/folder/file.txt'&lt;br&gt;" +
		"Adress '(url for test)' is used for test. &lt;br&gt;" +
		"For this test, set the flag 'programm : test doawnload'&lt;br&gt;" +
		"Select the menu : File/Preferences/Options...&lt;br&gt;" +
		"&lt;br&gt;"+
		"After the test you put this file in 'production' " +
		"(accessible for all end-user).&lt;br&gt;" +
		"For 'production', you must install this file in the site 'e-anim' (contact : e-anim@ornage.fr)."
		;
	static final String FOLDER_SPRITE_VAR = "$sprite$";
	static final int    FOLDER_SPRITE_VAR_LG = FOLDER_SPRITE_VAR.length();
	@Override
	public String[] getDocOfFunction() {return doc;}
	@Override
	public pgval execMacro( pgval[] params ) {
		if(!ED_.verifyParams(params, 2, this)) return pgval.VOID;
		String title  = params[0].getTxt();
		String folder = PhFileName_S.pathInSystemFormat( (params.length&gt;1)? params[1].getTxt(): "$doc$" );
		String extOk = (params.length&gt;2)? ((params[2]!=pgval.VOID)? params[2].getTxt():null): null;
		String prefixeOK = (params.length&gt;3)? ((params[3]!=pgval.VOID)? params[3].getTxt():null): null;
		String prefixeBad = (params.length&gt;4)? ((params[4]!=pgval.VOID)? params[4].getTxt():null): null;

			PhFileName[] fileNames = null;
			
			fileNames = select(folder, title, extOk, prefixeOK, prefixeBad, false);
					//selectFilesFiltred(folder, filter, exclude,  title);
			if(fileNames==null) return pgval.VOID;
			int nb = fileNames.length;
			PhFileName f;
			for (int i=0; i&lt;nb; i++){
				f = fileNames[i]; if (f==null) continue;
				PhFileName newFile = new PhFileName("$doc$", f.getName());
				f.copyFileIfNotExist(newFile);
				fileNames[i] = newFile;
			}
			return new pgvaltab(pgvalfiletab.toVector(fileNames));
	}
	static class FilterClass extends FileFilter{
		//String[] ext; 
		String ext; 
		String prefixeOk;
		String prefixeBad;
		boolean isFiles;
		FilterClass(String extOkP, String prefixeOkP, String prefixeBadP){
			if(extOkP!=null) {
				ext =extOkP.replaceAll("\\s+", "");
				if(ext.length()&lt;1 || (ext.length()==1 &amp;&amp; ext.charAt(0)=='*')) ext=null;
				else ext = ext.replace(',','|');
			}
			if(prefixeOkP!=null) {
				prefixeOk =prefixeOkP.replaceAll("\\s+", "");
				if(prefixeOk.length()&lt;1 || (prefixeOk.length()==1 &amp;&amp; prefixeOk.charAt(0)=='*')) prefixeOk=null;
				else prefixeOk = prefixeOk.replace(',','|');
			}
			if(prefixeBadP!=null) {
				prefixeBad =prefixeBadP.replaceAll("\\s+", "");
				if(prefixeBad.length()&lt;1 || (prefixeBad.length()==1 &amp;&amp; prefixeBad.charAt(0)=='*')) prefixeBad=null;
				else prefixeBad = prefixeBad.replace(',','|');
			}
		}
        // ".*\\.(jpg|png)$";				  possÃ¨de les extension jpg et png  
		// "^toto.*\\.(jpg|png)$"			  "toto" est placÃ© au dÃ©but + extension
		// ".*toto.*\\.(jpg|png)$";			  "toto" fait parti du nom  + extension
		// ".*[^/]toto[^/].*\\.(jpg|png)$";   "toto" est obligatoirement entourÃ© de caractÃ¨re + extension
		// ".*toto.*"						  "toto" fait parti du mot + extension
		// ".*toto.*tata.*"					  "toto" suivi de "tata"
		// "\\b(?![0-9])[a-zA-Z0-9_]*toto[a-zA-Z0-9_]*\\b"	nom de variable
		private boolean filtred(String nomFichier, String regex) {
	        // Compilation de l'expression avec insensibilitÃ© Ã&nbsp; la casse
	        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
	        return (pattern.matcher(nomFichier).matches());
		}
        @Override
        public boolean accept(File file) {
            // Autoriser les rÃ©pertoires pour permettre la navigation
            if (file.isDirectory()) {
                return false;
            }
            String nameFile = file.getName();
            if(ext!=null) {
            	//String filter = ".*\\.("+ext+")$";
        		Pattern pattern = Pattern.compile(".*\\.("+ext+")$", Pattern.CASE_INSENSITIVE);
        		if (!pattern.matcher(nameFile).matches()) return false; //{ok=true;break;}
            }
            if(prefixeOk!=null) { 
           		Pattern pattern = Pattern.compile( "^("+prefixeOk+").*", Pattern.CASE_INSENSITIVE);
           		if (!pattern.matcher(nameFile).matches())return false;
            }
            if(prefixeBad!=null) {
           		Pattern pattern = Pattern.compile( "^("+prefixeBad+").*", Pattern.CASE_INSENSITIVE);
           		if (pattern.matcher(nameFile).matches()) return false;
           	}
            return true;
        }

        @Override
        public String getDescription() {
            return "Exclure les fichiers .tmp et .log";
        }			
	}
	static public void setFont(Container chooser, Font ftP){
		Component[] cs = chooser.getComponents();
		int nb = cs.length;
		Component c;
		for (int i=0; i&lt;nb; i++){
			c = cs[i]; if (c==null) continue;
			
			c.setFont(ftP);
			if(c instanceof Container){
				setFont((Container)c, ftP);
			}
		}
	}
	PhFileName[] filesNames;
	public PhFileName[] select(String folderP, String titleP, String extOkP, String prefixeOkP, String prefixeBadP, boolean flagImagePreview){
		FilterClass filterP = new FilterClass(extOkP, prefixeOkP, prefixeBadP);
		filesNames = null;
		if(folderP==null) folderP= Project_S.getDocumentFolder();

		JFileChooser chooser = new JFileChooser();// crÃ©ation dun nouveau
													// filechosser
		setFont(chooser, new Font("Arial", 0, 11));
		chooser.setApproveButtonText(EAnimSys_S.getMessage( "FEN_FILE_CHOOSER_CHOICE" )); // intitulÃ© du
																
		//FileSystemView.getFileSystemView().getSystemIcon(f) 
		chooser.setDialogTitle(titleP);
		chooser.setMultiSelectionEnabled(true);
		chooser.setCurrentDirectory(new File(folderP));
		if (flagImagePreview) chooser.setAccessory(new ImagePreview(chooser));
	    if(filterP!=null) chooser.setFileFilter(filterP);
		// chooser.showOpenDialog(null); //affiche la boite de dialogue
	    try{
	    	if (chooser.showOpenDialog(Projet_S.getFenMain()) == JFileChooser.APPROVE_OPTION){
	    		affFilesSelected(chooser.getSelectedFiles());
	    	}
	    }catch(java.lang.IllegalStateException ise){
	    	if (chooser.showOpenDialog(Projet_S.getFenMain()) == JFileChooser.APPROVE_OPTION){
	    		affFilesSelected(chooser.getSelectedFiles());
	    	}	    	
	    }
		return filesNames;
		// //ystem.out.println(chooser.getSelectedFiles().getAbsolutePath());
		// //si un fichier est selectionnÃ©, rÃ©cupÃ©rer le fichier puis sont path
		// et l'afficher dans le champs de texte
    }
	private void affFilesSelected(File[] files){
		int nb = files.length;
		filesNames = new PhFileName[nb];
		for (int i=0; i &lt;nb; i++){
			if(files[i].isDirectory()){
				filesNames[i] = new PhFileName(files[i].getAbsolutePath(),"");
			}else{
				filesNames[i] = new PhFileName(files[i].getParent(), files[i].getName());
			}
			System.out.println("PhFileChooser:affFilesSelected() ********** "+files[i].getAbsolutePath());
		}
	}
}
	/*
	static public PhFileName[] selectFilesFiltred(String dirP, String extP, String prefixeP,  String titleP){
			String a;
			FilterClass filterNo = new FilterClass(extP, prefixeP);
			JFileChooser fileChooser = new JFileChooser(dirP);
			fileChooser.setFileFilter(filterNo);

	        // Afficher le sÃ©lecteur de fichiers
	        int returnValue = fileChooser.showOpenDialog(null);
	        if (returnValue == JFileChooser.APPROVE_OPTION) {
	            File selectedFile = fileChooser.getSelectedFile();
	            System.out.println("Fichier sÃ©lectionnÃ© : " + selectedFile.getAbsolutePath());
	        }
	        return null; // TODO
	    }	
	}
	*/</pre></body></html>