| 1018 | aurelien | 1 | package org.tela_botanica.client.vues.image;
 | 
        
           |  |  | 2 |   | 
        
           | 2615 | aurelien | 3 | import org.tela_botanica.client.i18n.Msg;
 | 
        
           | 1018 | aurelien | 4 | import org.tela_botanica.client.interfaces.Rafraichissable;
 | 
        
           | 2062 | aurelien | 5 | import org.tela_botanica.client.util.MotsClesUtilitaire;
 | 
        
           | 1018 | aurelien | 6 |   | 
        
           |  |  | 7 | import com.google.gwt.user.client.Window;
 | 
        
           |  |  | 8 | import com.gwtext.client.core.EventObject;
 | 
        
           |  |  | 9 | import com.gwtext.client.data.Node;
 | 
        
           |  |  | 10 | import com.gwtext.client.data.NodeTraversalCallback;
 | 
        
           |  |  | 11 | import com.gwtext.client.data.Tree;
 | 
        
           | 1837 | aurelien | 12 | import com.gwtext.client.dd.DragData;
 | 
        
           |  |  | 13 | import com.gwtext.client.dd.DragDrop;
 | 
        
           | 1018 | aurelien | 14 | import com.gwtext.client.widgets.Button;
 | 
        
           |  |  | 15 | import com.gwtext.client.widgets.Component;
 | 
        
           | 1837 | aurelien | 16 | import com.gwtext.client.widgets.Container;
 | 
        
           | 1018 | aurelien | 17 | import com.gwtext.client.widgets.Panel;
 | 
        
           | 1118 | aurelien | 18 | import com.gwtext.client.widgets.Toolbar;
 | 
        
           |  |  | 19 | import com.gwtext.client.widgets.ToolbarButton;
 | 
        
           | 1018 | aurelien | 20 | import com.gwtext.client.widgets.event.ButtonListenerAdapter;
 | 
        
           |  |  | 21 | import com.gwtext.client.widgets.event.WindowListenerAdapter;
 | 
        
           |  |  | 22 | import com.gwtext.client.widgets.form.TextField;
 | 
        
           | 1837 | aurelien | 23 | import com.gwtext.client.widgets.layout.FitLayout;
 | 
        
           | 1018 | aurelien | 24 | import com.gwtext.client.widgets.layout.HorizontalLayout;
 | 
        
           | 1837 | aurelien | 25 | import com.gwtext.client.widgets.layout.RowLayout;
 | 
        
           |  |  | 26 | import com.gwtext.client.widgets.layout.RowLayoutData;
 | 
        
           | 1118 | aurelien | 27 | import com.gwtext.client.widgets.tree.MultiSelectionModel;
 | 
        
           | 1018 | aurelien | 28 | import com.gwtext.client.widgets.tree.TreeEditor;
 | 
        
           |  |  | 29 | import com.gwtext.client.widgets.tree.TreeNode;
 | 
        
           |  |  | 30 | import com.gwtext.client.widgets.tree.TreePanel;
 | 
        
           |  |  | 31 | import com.gwtext.client.widgets.tree.event.TreeNodeListenerAdapter;
 | 
        
           |  |  | 32 | import com.gwtext.client.widgets.tree.event.TreePanelListenerAdapter;
 | 
        
           |  |  | 33 |   | 
        
           |  |  | 34 | /**
 | 
        
           |  |  | 35 |  * Arbre des mots clés, qui est une vue rafraichissable, qui contient des mots
 | 
        
           |  |  | 36 |  * clés cochables et réorganisables à volonté
 | 
        
           |  |  | 37 |  *
 | 
        
           |  |  | 38 |  * @author aurelien
 | 
        
           |  |  | 39 |  *
 | 
        
           |  |  | 40 |  */
 | 
        
           |  |  | 41 | public abstract class FenetreGestionMotsCles extends com.gwtext.client.widgets.Window implements Rafraichissable {
 | 
        
           |  |  | 42 |   | 
        
           |  |  | 43 | 	/**
 | 
        
           |  |  | 44 | 	 * Le treepanel qui affiche l'arbre
 | 
        
           |  |  | 45 | 	 */
 | 
        
           |  |  | 46 | 	private TreePanel arbreMotsCles = null;
 | 
        
           |  |  | 47 | 	/**
 | 
        
           |  |  | 48 | 	 * L'éditeur qui permet de modifier les mots clés dans l'arbre
 | 
        
           |  |  | 49 | 	 */
 | 
        
           |  |  | 50 | 	private TreeEditor te = null;
 | 
        
           |  |  | 51 | 	/**
 | 
        
           |  |  | 52 | 	 * Le textfield associé à l'éditeur
 | 
        
           |  |  | 53 | 	 */
 | 
        
           |  |  | 54 | 	private TextField tfEdit = null;
 | 
        
           |  |  | 55 | 	/**
 | 
        
           |  |  | 56 | 	 * Bouton de validation
 | 
        
           |  |  | 57 | 	 */
 | 
        
           |  |  | 58 | 	private Button valider = null;
 | 
        
           |  |  | 59 |   | 
        
           |  |  | 60 | 	/**
 | 
        
           |  |  | 61 | 	 * Bouton d'annulation
 | 
        
           |  |  | 62 | 	 */
 | 
        
           |  |  | 63 | 	private Button annuler = null;
 | 
        
           |  |  | 64 |   | 
        
           |  |  | 65 | 	/**
 | 
        
           | 1118 | aurelien | 66 | 	 * Bouton d'ajout de tag
 | 
        
           |  |  | 67 | 	 */
 | 
        
           |  |  | 68 | 	private ToolbarButton ajouterTag = null;
 | 
        
           |  |  | 69 |   | 
        
           |  |  | 70 | 	/**
 | 
        
           |  |  | 71 | 	 * Bouton de suppression de tag
 | 
        
           |  |  | 72 | 	 */
 | 
        
           |  |  | 73 | 	private ToolbarButton supprimerTag = null;
 | 
        
           |  |  | 74 |   | 
        
           |  |  | 75 | 	/**
 | 
        
           |  |  | 76 | 	 * Bouton de renommage de tag
 | 
        
           |  |  | 77 | 	 */
 | 
        
           |  |  | 78 | 	private ToolbarButton renommerTag = null;
 | 
        
           |  |  | 79 |   | 
        
           |  |  | 80 | 	/**
 | 
        
           | 1018 | aurelien | 81 | 	 * Une string permettant connaitre les mots clés cochés en cours séparés par
 | 
        
           |  |  | 82 | 	 * des virgules
 | 
        
           |  |  | 83 | 	 */
 | 
        
           |  |  | 84 | 	private String motsClesEnCours = "";
 | 
        
           |  |  | 85 |   | 
        
           |  |  | 86 | 	private String[] tableauMotsClesEnCours = new String[0];
 | 
        
           |  |  | 87 | 	/**
 | 
        
           |  |  | 88 | 	 * Tableau contenant les mots clés qui n'ont pas encore été jaouté à l'arbre
 | 
        
           |  |  | 89 | 	 * (sert au lazy rendering quand on reçoit des mots clés avant que le rendu
 | 
        
           |  |  | 90 | 	 * du conteneur n'ai été effectué)
 | 
        
           |  |  | 91 | 	 */
 | 
        
           |  |  | 92 | 	private String[] motsClesEnAttente = new String[0];
 | 
        
           |  |  | 93 | 	/**
 | 
        
           |  |  | 94 | 	 * Booléen d'évènement qui sert à savoir si on est en train d'ajouter un
 | 
        
           |  |  | 95 | 	 * noeud
 | 
        
           |  |  | 96 | 	 */
 | 
        
           |  |  | 97 | 	private boolean ajoutNoeud = false;
 | 
        
           |  |  | 98 | 	/**
 | 
        
           |  |  | 99 | 	 * Booléen d'évènement qui sert à savoir si on est en train de modifier un
 | 
        
           |  |  | 100 | 	 * noeud
 | 
        
           |  |  | 101 | 	 */
 | 
        
           |  |  | 102 | 	private boolean modifNoeud = false;
 | 
        
           |  |  | 103 | 	/**
 | 
        
           |  |  | 104 | 	 * Booléen d'instanciation du conteneur
 | 
        
           |  |  | 105 | 	 */
 | 
        
           |  |  | 106 | 	private boolean arbreCharge = false;
 | 
        
           |  |  | 107 | 	/**
 | 
        
           |  |  | 108 | 	 * Booléen d'évènement qui sert à savoir si les mots clés ont bien été reçu
 | 
        
           |  |  | 109 | 	 */
 | 
        
           |  |  | 110 | 	private boolean motsCleInitialises;
 | 
        
           | 1837 | aurelien | 111 |   | 
        
           |  |  | 112 | 	/**
 | 
        
           |  |  | 113 | 	 * panneau intermédiaire contenant l'arbre
 | 
        
           |  |  | 114 | 	 */
 | 
        
           |  |  | 115 | 	private Panel panelIntermediaire;
 | 
        
           | 2062 | aurelien | 116 | 	private String cheminTemporaireAjout;
 | 
        
           | 1018 | aurelien | 117 |   | 
        
           |  |  | 118 | 	/**
 | 
        
           |  |  | 119 | 	 * Constructeur avec paramètre
 | 
        
           |  |  | 120 | 	 *
 | 
        
           |  |  | 121 | 	 * @param im
 | 
        
           |  |  | 122 | 	 *            le médiateur à associer
 | 
        
           |  |  | 123 | 	 */
 | 
        
           |  |  | 124 | 	public FenetreGestionMotsCles() {
 | 
        
           |  |  | 125 |   | 
        
           |  |  | 126 | 		// on crée le panel
 | 
        
           |  |  | 127 | 		setTitle("Mots clés");
 | 
        
           | 1837 | aurelien | 128 | 		this.setLayoutData(new RowLayout());
 | 
        
           | 1018 | aurelien | 129 |   | 
        
           |  |  | 130 | 		// on crée le conteneur de l'arbre
 | 
        
           |  |  | 131 | 		arbreMotsCles = new TreePanel();
 | 
        
           |  |  | 132 | 		// on permet le drag and drop dans l'arbre
 | 
        
           |  |  | 133 | 		arbreMotsCles.setEnableDD(true);
 | 
        
           |  |  | 134 | 		arbreMotsCles.setId("x-view-tree-keyword-imgs");
 | 
        
           |  |  | 135 |   | 
        
           | 1118 | aurelien | 136 | 		arbreMotsCles.setSelectionModel(new MultiSelectionModel());
 | 
        
           |  |  | 137 |   | 
        
           | 1018 | aurelien | 138 | 		// on crée une racine pour l'arbre
 | 
        
           |  |  | 139 | 		TreeNode root = new TreeNode("Tags");
 | 
        
           |  |  | 140 | 		root.setId("racine");
 | 
        
           | 2615 | aurelien | 141 | 		String[] usObject = {Msg.get("mots-cles-maj"), "racine" };
 | 
        
           | 1018 | aurelien | 142 | 		root.setExpandable(true);
 | 
        
           |  |  | 143 | 		arbreMotsCles.setRootNode(root);
 | 
        
           |  |  | 144 | 		arbreMotsCles.setRootVisible(true);
 | 
        
           |  |  | 145 | 		arbreMotsCles.setBorder(false);
 | 
        
           |  |  | 146 | 		arbreMotsCles.setWidth(500);
 | 
        
           |  |  | 147 |   | 
        
           |  |  | 148 | 		root.setUserObject(usObject);
 | 
        
           |  |  | 149 |   | 
        
           |  |  | 150 | 		arbreMotsCles.getRootNode().addListener(new TreeNodeListenerAdapter() {
 | 
        
           |  |  | 151 |   | 
        
           | 1292 | aurelien | 152 | 			@Override
 | 
        
           | 1018 | aurelien | 153 | 			public void onClick(Node node, EventObject e) {
 | 
        
           |  |  | 154 | 				if(!arbreCharge) {
 | 
        
           |  |  | 155 | 					expand();
 | 
        
           |  |  | 156 | 				}
 | 
        
           |  |  | 157 | 			}
 | 
        
           |  |  | 158 |   | 
        
           | 1292 | aurelien | 159 | 			@Override
 | 
        
           | 1018 | aurelien | 160 | 			public void onExpand(Node node) {
 | 
        
           |  |  | 161 | 				if(!arbreCharge) {
 | 
        
           |  |  | 162 | 					obtenirArbreMotsCles();
 | 
        
           |  |  | 163 | 					arbreCharge = true;
 | 
        
           |  |  | 164 | 				}
 | 
        
           |  |  | 165 | 			}
 | 
        
           |  |  | 166 |   | 
        
           |  |  | 167 | 		});
 | 
        
           |  |  | 168 |   | 
        
           |  |  | 169 | 		// on crée l'éditeur pour l'arbre
 | 
        
           |  |  | 170 | 		tfEdit = new TextField();
 | 
        
           |  |  | 171 | 		tfEdit.setAutoWidth(true);
 | 
        
           |  |  | 172 | 		te = new TreeEditor(arbreMotsCles, tfEdit);
 | 
        
           | 2615 | aurelien | 173 | 		valider = new Button(Msg.get("appliquer"));
 | 
        
           |  |  | 174 | 		annuler = new Button(Msg.get("annuler"));
 | 
        
           | 1018 | aurelien | 175 | 		arbreMotsCles.add(te);
 | 
        
           |  |  | 176 |   | 
        
           | 1837 | aurelien | 177 | 		panelIntermediaire = new Panel();
 | 
        
           |  |  | 178 | 		panelIntermediaire.setLayout(new FitLayout());
 | 
        
           |  |  | 179 | 		panelIntermediaire.setAutoScroll(true);
 | 
        
           |  |  | 180 | 		panelIntermediaire.setWidth("100%");
 | 
        
           |  |  | 181 | 		arbreMotsCles.setWidth("100%");
 | 
        
           |  |  | 182 | 		arbreMotsCles.setHeight("100%");
 | 
        
           | 1018 | aurelien | 183 |   | 
        
           |  |  | 184 | 		Panel panelBoutons = new Panel();
 | 
        
           | 1118 | aurelien | 185 | 		panelBoutons.setLayout(new HorizontalLayout(130));
 | 
        
           | 1018 | aurelien | 186 | 		panelBoutons.setWidth("100%");
 | 
        
           |  |  | 187 |   | 
        
           |  |  | 188 | 		// on met en forme le layout
 | 
        
           |  |  | 189 | 		panelIntermediaire.add(arbreMotsCles);
 | 
        
           |  |  | 190 | 		panelBoutons.add(annuler);
 | 
        
           |  |  | 191 | 		panelBoutons.add(valider);
 | 
        
           |  |  | 192 |   | 
        
           | 1837 | aurelien | 193 | 		this.add(panelIntermediaire, new RowLayoutData());
 | 
        
           |  |  | 194 | 		this.add(panelBoutons, new RowLayoutData(30));
 | 
        
           |  |  | 195 | 		arbreMotsCles.setHeight("100%");
 | 
        
           |  |  | 196 | 		arbreMotsCles.setAutoScroll(true);
 | 
        
           | 1018 | aurelien | 197 |   | 
        
           | 1118 | aurelien | 198 | 		Toolbar barreBouton = new Toolbar();
 | 
        
           | 2615 | aurelien | 199 | 		ajouterTag = new ToolbarButton(Msg.get("nouveau-tag"));
 | 
        
           | 1118 | aurelien | 200 | 		ajouterTag.setIcon("mot_cle_ajouter.png");
 | 
        
           | 2615 | aurelien | 201 | 		renommerTag = new ToolbarButton(Msg.get("renommer"));
 | 
        
           | 1118 | aurelien | 202 | 		renommerTag.setIcon("mot_cle_editer.png");
 | 
        
           |  |  | 203 | 		renommerTag.disable();
 | 
        
           | 2615 | aurelien | 204 | 		supprimerTag = new ToolbarButton(Msg.get("supprimer"));
 | 
        
           | 1118 | aurelien | 205 | 		supprimerTag.setIcon("mot_cle_supprimer.png");
 | 
        
           |  |  | 206 | 		supprimerTag.disable();
 | 
        
           |  |  | 207 | 		barreBouton.addButton(ajouterTag);
 | 
        
           |  |  | 208 | 		barreBouton.addSeparator();
 | 
        
           |  |  | 209 | 		barreBouton.addButton(renommerTag);
 | 
        
           |  |  | 210 | 		barreBouton.addSeparator();
 | 
        
           |  |  | 211 | 		barreBouton.addButton(supprimerTag);
 | 
        
           |  |  | 212 | 		this.setTopToolbar(barreBouton);
 | 
        
           |  |  | 213 |   | 
        
           | 1018 | aurelien | 214 | 		setCloseAction(com.gwtext.client.widgets.Window.HIDE);
 | 
        
           |  |  | 215 | 		// on ajoute les listeners
 | 
        
           |  |  | 216 | 		ajouterListeners();
 | 
        
           |  |  | 217 |   | 
        
           |  |  | 218 | 	}
 | 
        
           |  |  | 219 |   | 
        
           |  |  | 220 |   | 
        
           |  |  | 221 | 	/**
 | 
        
           |  |  | 222 | 	 * Acesseur pour l'arbre des mots clés
 | 
        
           |  |  | 223 | 	 *
 | 
        
           |  |  | 224 | 	 * @return le panel contenant l'arbre
 | 
        
           |  |  | 225 | 	 */
 | 
        
           |  |  | 226 | 	public TreePanel getArbreMotsCles() {
 | 
        
           |  |  | 227 | 		return arbreMotsCles;
 | 
        
           |  |  | 228 | 	}
 | 
        
           |  |  | 229 |   | 
        
           |  |  | 230 | 	/**
 | 
        
           |  |  | 231 | 	 * Accesseur pour l'éditeur
 | 
        
           |  |  | 232 | 	 *
 | 
        
           |  |  | 233 | 	 * @return l'éditeur associé à l'arbre
 | 
        
           |  |  | 234 | 	 */
 | 
        
           |  |  | 235 | 	public TreeEditor getTe() {
 | 
        
           |  |  | 236 | 		return te;
 | 
        
           |  |  | 237 | 	}
 | 
        
           |  |  | 238 |   | 
        
           |  |  | 239 | 	/**
 | 
        
           |  |  | 240 | 	 * Acesseur pour le TextField associé à l'éditeur
 | 
        
           |  |  | 241 | 	 *
 | 
        
           |  |  | 242 | 	 * @return le champ texte associé à l'éditeur
 | 
        
           |  |  | 243 | 	 */
 | 
        
           |  |  | 244 | 	public TextField getTfEdit() {
 | 
        
           |  |  | 245 | 		return tfEdit;
 | 
        
           |  |  | 246 | 	}
 | 
        
           |  |  | 247 |   | 
        
           |  |  | 248 | 	protected abstract void surAffichageMenuContextuel(TreeNode node, EventObject e, TreeEditor te);
 | 
        
           |  |  | 249 | 	protected abstract void surAjoutMotCle(TreeNode node, Tree arbre);
 | 
        
           |  |  | 250 | 	protected abstract void surSuppressionMotCle(TreeNode node, Tree arbre);
 | 
        
           |  |  | 251 | 	protected abstract void surDeplacementMotCle(TreeNode node, Tree arbre);
 | 
        
           |  |  | 252 | 	protected abstract void surChangementTexte(TreeNode node, Tree arbre);
 | 
        
           |  |  | 253 | 	protected abstract void surClicValider(String chaineMotsCles, Tree arbre);
 | 
        
           |  |  | 254 | 	protected abstract void demanderArbreMotsCles(Rafraichissable r);
 | 
        
           | 2166 | aurelien | 255 | 	protected abstract void surRetourWebService(Tree arbre);
 | 
        
           | 1018 | aurelien | 256 |   | 
        
           |  |  | 257 | 	/**
 | 
        
           |  |  | 258 | 	 * Ajoute les listeners nécessaires pour la gestion des évènements
 | 
        
           |  |  | 259 | 	 */
 | 
        
           |  |  | 260 | 	private void ajouterListeners() {
 | 
        
           | 1837 | aurelien | 261 |   | 
        
           |  |  | 262 | 		this.addListener(new WindowListenerAdapter() {
 | 
        
           |  |  | 263 | 			@Override
 | 
        
           |  |  | 264 | 			public void onResize(com.gwtext.client.widgets.Window source, int width,
 | 
        
           |  |  | 265 | 					int height) {
 | 
        
           |  |  | 266 | 					panelIntermediaire.setHeight(getHeight() - 80);
 | 
        
           |  |  | 267 | 			}
 | 
        
           |  |  | 268 | 		});
 | 
        
           | 1018 | aurelien | 269 |   | 
        
           |  |  | 270 | 		arbreMotsCles.addListener(new TreePanelListenerAdapter() {
 | 
        
           | 1837 | aurelien | 271 | 			@Override
 | 
        
           |  |  | 272 | 			public void onAfterLayout(Container self) {
 | 
        
           |  |  | 273 | 				panelIntermediaire.setHeight(getHeight() - 80);
 | 
        
           |  |  | 274 | 			}
 | 
        
           | 1018 | aurelien | 275 |   | 
        
           | 1292 | aurelien | 276 | 			@Override
 | 
        
           | 1018 | aurelien | 277 | 			public void onExpandNode(TreeNode node) {
 | 
        
           |  |  | 278 | 				cocherMotsCles(tableauMotsClesEnCours);
 | 
        
           |  |  | 279 | 			}
 | 
        
           |  |  | 280 |   | 
        
           |  |  | 281 | 			// gestion du clic sur un noeud
 | 
        
           | 1292 | aurelien | 282 | 			@Override
 | 
        
           | 1018 | aurelien | 283 | 			public void onClick(TreeNode node, EventObject e) {
 | 
        
           |  |  | 284 |   | 
        
           |  |  | 285 | 				e.stopEvent();
 | 
        
           |  |  | 286 | 				gererClicNoeud(node);
 | 
        
           | 1118 | aurelien | 287 | 				if(!node.equals(arbreMotsCles.getRootNode())) {
 | 
        
           |  |  | 288 | 					supprimerTag.enable();
 | 
        
           |  |  | 289 | 					renommerTag.enable();
 | 
        
           |  |  | 290 | 				}
 | 
        
           | 1018 | aurelien | 291 | 			}
 | 
        
           |  |  | 292 |   | 
        
           |  |  | 293 | 			// gestion du clic droit sur un noeud
 | 
        
           | 1292 | aurelien | 294 | 			@Override
 | 
        
           | 1018 | aurelien | 295 | 			public void onContextMenu(TreeNode node, EventObject e) {
 | 
        
           |  |  | 296 |   | 
        
           |  |  | 297 | 				e.stopEvent();
 | 
        
           |  |  | 298 | 				surAffichageMenuContextuel(node, e, getTe());
 | 
        
           | 1118 | aurelien | 299 | 				if(!node.equals(arbreMotsCles.getRootNode())) {
 | 
        
           |  |  | 300 | 					supprimerTag.enable();
 | 
        
           |  |  | 301 | 					renommerTag.enable();
 | 
        
           | 1018 | aurelien | 302 | 				}
 | 
        
           |  |  | 303 | 			}
 | 
        
           |  |  | 304 |   | 
        
           |  |  | 305 | 			// gestion de la modification du texte d'un noeud
 | 
        
           | 1292 | aurelien | 306 | 			@Override
 | 
        
           | 1018 | aurelien | 307 | 			public void onTextChange(TreeNode node, String text, String oldText) {
 | 
        
           | 2062 | aurelien | 308 |   | 
        
           |  |  | 309 | 				if(!MotsClesUtilitaire.estUnMotCleAutorise(text)) {
 | 
        
           |  |  | 310 | 					te.startEdit(node);
 | 
        
           |  |  | 311 | 					Window.alert("Un mot clé ne peut pas être vide ou contenir les caractères suivants : "+MotsClesUtilitaire.getChaineCaracteresInterdits());
 | 
        
           |  |  | 312 | 					return;
 | 
        
           |  |  | 313 | 				}
 | 
        
           | 2194 | mathias | 314 |   | 
        
           |  |  | 315 | 				if(!MotsClesUtilitaire.estUnePositionAutorisee(node, node.getParentNode(), text)) {
 | 
        
           |  |  | 316 | 					te.startEdit(node);
 | 
        
           |  |  | 317 | 					Window.alert("Un mot clé de même nom existe déjà à cette position");
 | 
        
           |  |  | 318 | 					return;
 | 
        
           |  |  | 319 | 				}
 | 
        
           | 1018 | aurelien | 320 |   | 
        
           | 1118 | aurelien | 321 | 				if(node.equals(arbreMotsCles.getRootNode())) {
 | 
        
           |  |  | 322 | 					return;
 | 
        
           |  |  | 323 | 				}
 | 
        
           |  |  | 324 |   | 
        
           | 1018 | aurelien | 325 | 				// on récupère les informations associées au noeud
 | 
        
           |  |  | 326 | 				TreeNode nd = node;
 | 
        
           |  |  | 327 | 				String[] usObject = new String[2];
 | 
        
           |  |  | 328 | 				usObject[0] = text;
 | 
        
           |  |  | 329 | 				usObject[1] = ((String[]) nd.getUserObject())[1];
 | 
        
           |  |  | 330 | 				nd.setUserObject(usObject);
 | 
        
           |  |  | 331 |   | 
        
           |  |  | 332 | 				// si c'est un nouveau noeud
 | 
        
           |  |  | 333 | 				if (ajoutNoeud) {
 | 
        
           |  |  | 334 | 					// on considère l'ajout achevé
 | 
        
           |  |  | 335 | 					ajoutNoeud = false;
 | 
        
           |  |  | 336 | 					// et on notifie le médiateur de l'ajout et on lui passe
 | 
        
           |  |  | 337 | 					// l'arbre
 | 
        
           |  |  | 338 | 					surAjoutMotCle(nd, getArbreMotsCles().getTree());
 | 
        
           | 2148 | aurelien | 339 | 					arbreMotsCles.disable();
 | 
        
           | 1018 | aurelien | 340 | 				}
 | 
        
           |  |  | 341 | 				// si c'est noeud déjà existant
 | 
        
           |  |  | 342 | 				else {
 | 
        
           |  |  | 343 | 					// on considère la modification achevée
 | 
        
           |  |  | 344 | 					modifNoeud = false;
 | 
        
           |  |  | 345 |   | 
        
           |  |  | 346 | 					if(!text.equals(oldText)) {
 | 
        
           |  |  | 347 | 						// et on notifie le médiateur de la modification et on lui
 | 
        
           |  |  | 348 | 						// passe l'arbre
 | 
        
           |  |  | 349 | 						surChangementTexte(nd, getArbreMotsCles().getTree());
 | 
        
           | 2148 | aurelien | 350 | 						arbreMotsCles.disable();
 | 
        
           | 1018 | aurelien | 351 | 					}
 | 
        
           |  |  | 352 | 				}
 | 
        
           |  |  | 353 | 			}
 | 
        
           | 2194 | mathias | 354 |   | 
        
           |  |  | 355 | 			@Override
 | 
        
           |  |  | 356 | 			public boolean doBeforeMoveNode(Tree tree, TreeNode node,
 | 
        
           |  |  | 357 | 					TreeNode oldParent, TreeNode newParent, int index) {
 | 
        
           |  |  | 358 | 				boolean ok = true;
 | 
        
           |  |  | 359 | 				if(!MotsClesUtilitaire.estUnePositionAutorisee(node, newParent, node.getText())) {
 | 
        
           |  |  | 360 | 					ok = false;
 | 
        
           |  |  | 361 | 					Window.alert("Un mot clé de même nom existe déjà à cette position");
 | 
        
           |  |  | 362 | 				}
 | 
        
           |  |  | 363 | 				return ok;
 | 
        
           |  |  | 364 | 			}
 | 
        
           |  |  | 365 |   | 
        
           |  |  | 366 | 			@Override
 | 
        
           |  |  | 367 | 			public boolean onNodeDragOver(TreePanel treePanel, TreeNode target,
 | 
        
           |  |  | 368 | 					DragData dragData, String point, DragDrop source,
 | 
        
           |  |  | 369 | 					TreeNode dropNode) {
 | 
        
           |  |  | 370 | 				return MotsClesUtilitaire.estUnePositionAutorisee(dropNode, target, dropNode.getText());
 | 
        
           |  |  | 371 | 			}
 | 
        
           | 1018 | aurelien | 372 |   | 
        
           |  |  | 373 | 			// gestion du déplacement d'un noeud
 | 
        
           | 1292 | aurelien | 374 | 			@Override
 | 
        
           | 1018 | aurelien | 375 | 			public void onMoveNode(Tree tree, TreeNode node,
 | 
        
           |  |  | 376 | 					TreeNode oldParent, TreeNode newParent, int index) {
 | 
        
           |  |  | 377 | 				// on notifie le médiateur et on lui passe l'arbre
 | 
        
           |  |  | 378 | 				surDeplacementMotCle(node, getArbreMotsCles().getTree());
 | 
        
           |  |  | 379 | 			}
 | 
        
           |  |  | 380 |   | 
        
           |  |  | 381 | 		});
 | 
        
           |  |  | 382 |   | 
        
           |  |  | 383 | 		// gestion de la validation
 | 
        
           |  |  | 384 | 		valider.addListener(new ButtonListenerAdapter() {
 | 
        
           |  |  | 385 |   | 
        
           |  |  | 386 | 			// lors du clic
 | 
        
           | 1292 | aurelien | 387 | 			@Override
 | 
        
           | 1018 | aurelien | 388 | 			public void onClick(Button button, EventObject e) {
 | 
        
           |  |  | 389 |   | 
        
           |  |  | 390 | 				// on vide les mots clés en cours
 | 
        
           |  |  | 391 | 				motsClesEnCours = "";
 | 
        
           |  |  | 392 | 				// pour chaque noeud à partir de la racine
 | 
        
           |  |  | 393 | 				getArbreMotsCles().getRootNode().cascade(
 | 
        
           |  |  | 394 | 						new NodeTraversalCallback() {
 | 
        
           |  |  | 395 |   | 
        
           |  |  | 396 | 							// on éxécute une fonction
 | 
        
           | 1292 | aurelien | 397 | 							@Override
 | 
        
           | 1018 | aurelien | 398 | 							public boolean execute(Node node) {
 | 
        
           |  |  | 399 |   | 
        
           |  |  | 400 | 								// on récupère le mot clé associé au noeud et
 | 
        
           |  |  | 401 | 								// ses infos
 | 
        
           |  |  | 402 | 								TreeNode tn = getArbreMotsCles().getNodeById(
 | 
        
           |  |  | 403 | 										node.getId());
 | 
        
           |  |  | 404 |   | 
        
           |  |  | 405 | 								String[] usObject = (String[]) tn
 | 
        
           |  |  | 406 | 										.getUserObject();
 | 
        
           |  |  | 407 | 								/*getIMediateur().mettreAjourMotsClesId(
 | 
        
           |  |  | 408 | 										usObject[0], usObject[1]);*/
 | 
        
           |  |  | 409 |   | 
        
           |  |  | 410 | 								if (tn.getUI().isChecked()) {
 | 
        
           |  |  | 411 | 									// et les concatène à la string des mots
 | 
        
           |  |  | 412 | 									// clés en cours
 | 
        
           |  |  | 413 | 									motsClesEnCours += usObject[1] + ",";
 | 
        
           |  |  | 414 | 								}
 | 
        
           |  |  | 415 |   | 
        
           |  |  | 416 | 								return true;
 | 
        
           |  |  | 417 | 							}
 | 
        
           |  |  | 418 |   | 
        
           |  |  | 419 | 						});
 | 
        
           |  |  | 420 |   | 
        
           |  |  | 421 | 				// enfin on notifie le médiateur et on lui passe l'arbre et la
 | 
        
           |  |  | 422 | 				// liste des mots clés ainsi obtenue
 | 
        
           |  |  | 423 | 				surClicValider(motsClesEnCours, arbreMotsCles.getTree());
 | 
        
           |  |  | 424 | 			}
 | 
        
           |  |  | 425 | 		});
 | 
        
           |  |  | 426 |   | 
        
           |  |  | 427 | 		annuler.addListener(new ButtonListenerAdapter() {
 | 
        
           | 1292 | aurelien | 428 | 			@Override
 | 
        
           | 1018 | aurelien | 429 | 			public void onClick(Button button, EventObject e) {
 | 
        
           | 1118 | aurelien | 430 | 				hide();
 | 
        
           | 1018 | aurelien | 431 | 			}
 | 
        
           |  |  | 432 | 		});
 | 
        
           | 1118 | aurelien | 433 |   | 
        
           |  |  | 434 | 		renommerTag.addListener(new ButtonListenerAdapter() {
 | 
        
           | 1292 | aurelien | 435 | 			@Override
 | 
        
           | 1118 | aurelien | 436 | 			public void onClick(Button button, EventObject e) {
 | 
        
           |  |  | 437 | 				TreeNode[] noeuds = ((MultiSelectionModel)arbreMotsCles.getSelectionModel()).getSelectedNodes();
 | 
        
           |  |  | 438 | 				TreeNode noeudRenommage;
 | 
        
           |  |  | 439 | 				if(noeuds.length > 0) {
 | 
        
           |  |  | 440 | 					noeudRenommage = noeuds[noeuds.length - 1];
 | 
        
           |  |  | 441 | 				} else {
 | 
        
           |  |  | 442 | 					noeudRenommage = arbreMotsCles.getRootNode();
 | 
        
           |  |  | 443 | 				}
 | 
        
           |  |  | 444 | 				renommerNoeud(noeudRenommage);
 | 
        
           |  |  | 445 | 			}
 | 
        
           |  |  | 446 | 		});
 | 
        
           |  |  | 447 |   | 
        
           |  |  | 448 | 		ajouterTag.addListener(new ButtonListenerAdapter() {
 | 
        
           |  |  | 449 | 			@Override
 | 
        
           |  |  | 450 | 			public void onClick(Button button, EventObject e) {
 | 
        
           |  |  | 451 |   | 
        
           |  |  | 452 | 				TreeNode[] noeuds = ((MultiSelectionModel)arbreMotsCles.getSelectionModel()).getSelectedNodes();
 | 
        
           |  |  | 453 | 				TreeNode noeudAjout;
 | 
        
           |  |  | 454 | 				if(noeuds.length > 0) {
 | 
        
           |  |  | 455 | 					noeudAjout = noeuds[noeuds.length - 1];
 | 
        
           |  |  | 456 | 				} else {
 | 
        
           |  |  | 457 | 					noeudAjout = arbreMotsCles.getRootNode();
 | 
        
           |  |  | 458 | 				}
 | 
        
           |  |  | 459 |   | 
        
           |  |  | 460 | 				ajouterNoeud(noeudAjout);
 | 
        
           |  |  | 461 | 			}
 | 
        
           |  |  | 462 | 		});
 | 
        
           |  |  | 463 |   | 
        
           |  |  | 464 | 		supprimerTag.addListener(new ButtonListenerAdapter() {
 | 
        
           |  |  | 465 | 			@Override
 | 
        
           |  |  | 466 | 			public void onClick(Button button, EventObject e) {
 | 
        
           |  |  | 467 |   | 
        
           |  |  | 468 | 				TreeNode[] noeuds = ((MultiSelectionModel)arbreMotsCles.getSelectionModel()).getSelectedNodes();
 | 
        
           |  |  | 469 | 				for (int i = 0; i < noeuds.length; i++) {
 | 
        
           |  |  | 470 | 					supprimerNoeud(noeuds[i]);
 | 
        
           |  |  | 471 | 				}
 | 
        
           |  |  | 472 | 			}
 | 
        
           |  |  | 473 | 		});
 | 
        
           | 1018 | aurelien | 474 | 	}
 | 
        
           |  |  | 475 |   | 
        
           |  |  | 476 | 	/**
 | 
        
           |  |  | 477 | 	 * Envoie une demande au médiateur pour obtenir l'arbre des mots clés
 | 
        
           |  |  | 478 | 	 */
 | 
        
           |  |  | 479 | 	public void obtenirArbreMotsCles() {
 | 
        
           |  |  | 480 | 		demanderArbreMotsCles(this);
 | 
        
           |  |  | 481 | 	}
 | 
        
           |  |  | 482 |   | 
        
           |  |  | 483 | 	/**
 | 
        
           |  |  | 484 | 	 * Supprime un noeud de l'arbre
 | 
        
           |  |  | 485 | 	 *
 | 
        
           |  |  | 486 | 	 * @param n
 | 
        
           |  |  | 487 | 	 *            le noeud à supprimer
 | 
        
           |  |  | 488 | 	 */
 | 
        
           |  |  | 489 | 	public void supprimerNoeud(TreeNode n) {
 | 
        
           |  |  | 490 | 		// si ça n'est pas la racine (qu'on ne peut pas supprimer)
 | 
        
           |  |  | 491 | 		if (!n.getId().equals(getArbreMotsCles().getRootNode().getId())) {
 | 
        
           | 1118 | aurelien | 492 | 			if(Window.confirm("Êtes vous sur de vouloir supprimer le mot clé "+n.getText()+" ?")) {
 | 
        
           |  |  | 493 | 				// on détache le noeud et on le détruit
 | 
        
           |  |  | 494 | 				n.getParentNode().removeChild(n);
 | 
        
           |  |  | 495 | 				n.destroy();
 | 
        
           |  |  | 496 | 				// puis on en notifie le médiateur en lui passant le noeud supprimé
 | 
        
           |  |  | 497 | 				// et l'arbre
 | 
        
           |  |  | 498 | 				surSuppressionMotCle(n, arbreMotsCles.getTree());
 | 
        
           |  |  | 499 | 			}
 | 
        
           | 1018 | aurelien | 500 | 		} else {
 | 
        
           |  |  | 501 | 			// si l'utilisateur tente de supprimer la racine, on l'avertit de
 | 
        
           |  |  | 502 | 			// son erreur
 | 
        
           |  |  | 503 | 			Window.alert("Impossible de supprimer la racine de l'arbre");
 | 
        
           |  |  | 504 | 		}
 | 
        
           |  |  | 505 | 	}
 | 
        
           |  |  | 506 |   | 
        
           |  |  | 507 | 	/**
 | 
        
           |  |  | 508 | 	 * Ajoute un noeud dans l'arbre au parent donné
 | 
        
           |  |  | 509 | 	 *
 | 
        
           |  |  | 510 | 	 * @param parent
 | 
        
           |  |  | 511 | 	 *            le futur parent du noeud à ajouter
 | 
        
           |  |  | 512 | 	 */
 | 
        
           |  |  | 513 | 	public void ajouterNoeud(TreeNode parent) {
 | 
        
           | 2062 | aurelien | 514 | 		ajoutNoeud = true;
 | 
        
           |  |  | 515 | 		TreeNode nd = MotsClesUtilitaire.ajouterNoeud(parent, true);
 | 
        
           | 1018 | aurelien | 516 | 		// on le concatène au parent et on étend ses enfants
 | 
        
           |  |  | 517 | 		parent.appendChild(nd);
 | 
        
           |  |  | 518 | 		parent.expand();
 | 
        
           | 2062 | aurelien | 519 | 		cheminTemporaireAjout = nd.getId();
 | 
        
           | 1018 | aurelien | 520 | 		te.startEdit(nd);
 | 
        
           |  |  | 521 | 	}
 | 
        
           |  |  | 522 |   | 
        
           |  |  | 523 | 	/**
 | 
        
           | 1118 | aurelien | 524 | 	 * Renomme le noeud passé en paramètre
 | 
        
           |  |  | 525 | 	 */
 | 
        
           |  |  | 526 | 	public void renommerNoeud(TreeNode n) {
 | 
        
           |  |  | 527 | 		// TODO Auto-generated method stub
 | 
        
           |  |  | 528 | 		te.startEdit(n);
 | 
        
           |  |  | 529 | 	}
 | 
        
           |  |  | 530 |   | 
        
           |  |  | 531 | 	/**
 | 
        
           | 1018 | aurelien | 532 | 	 * Coche le noeud s'il est décoché, le décoche sinon
 | 
        
           |  |  | 533 | 	 *
 | 
        
           |  |  | 534 | 	 * @param node
 | 
        
           |  |  | 535 | 	 */
 | 
        
           |  |  | 536 | 	public void gererClicNoeud(TreeNode node) {
 | 
        
           |  |  | 537 | 		if (node.getUI().isChecked()) {
 | 
        
           |  |  | 538 | 			node.getUI().toggleCheck(false);
 | 
        
           |  |  | 539 | 		} else {
 | 
        
           |  |  | 540 | 			node.getUI().toggleCheck(true);
 | 
        
           |  |  | 541 | 		}
 | 
        
           |  |  | 542 | 	}
 | 
        
           |  |  | 543 |   | 
        
           |  |  | 544 | 	/**
 | 
        
           |  |  | 545 | 	 * Parcourt l'arbre et coche les noeud qui font partie de la liste des mots
 | 
        
           |  |  | 546 | 	 * clés à cocher
 | 
        
           |  |  | 547 | 	 *
 | 
        
           |  |  | 548 | 	 * @param motsClesIds
 | 
        
           |  |  | 549 | 	 *            un tableau contenant les identifiants des mots clés à cocher
 | 
        
           |  |  | 550 | 	 */
 | 
        
           |  |  | 551 | 	public void cocherMotsCles(final String[] motsClesIds) {
 | 
        
           |  |  | 552 | 		if (getArbreMotsCles() != null
 | 
        
           |  |  | 553 | 				&& getArbreMotsCles().getRootNode() != null) {
 | 
        
           |  |  | 554 | 			// à partir de la racine
 | 
        
           |  |  | 555 | 			getArbreMotsCles().getRootNode().cascade(
 | 
        
           | 2160 | aurelien | 556 | 				new NodeTraversalCallback() {
 | 
        
           | 1018 | aurelien | 557 |   | 
        
           | 2160 | aurelien | 558 | 					// pour chaque noeud
 | 
        
           |  |  | 559 | 					@Override
 | 
        
           |  |  | 560 | 					public boolean execute(Node node) {
 | 
        
           | 1018 | aurelien | 561 |   | 
        
           | 2160 | aurelien | 562 | 						String usObject[] = (String[]) node
 | 
        
           |  |  | 563 | 								.getUserObject();
 | 
        
           |  |  | 564 | 						String nodeId = usObject[1];
 | 
        
           |  |  | 565 |   | 
        
           |  |  | 566 | 						TreeNode tn = getArbreMotsCles().getNodeById(node.getId());
 | 
        
           |  |  | 567 | 						if(tn != null) {
 | 
        
           |  |  | 568 | 							tn.getUI().toggleCheck(false);
 | 
        
           | 1018 | aurelien | 569 | 							// on parcourt le tableau des mots clés
 | 
        
           |  |  | 570 | 							for (int i = 0; i < motsClesIds.length; i++) {
 | 
        
           |  |  | 571 | 								// si le mot clé fait partie des id à cocher on
 | 
        
           |  |  | 572 | 								// le coche
 | 
        
           |  |  | 573 |   | 
        
           |  |  | 574 | 								if (nodeId.equals(motsClesIds[i])) {
 | 
        
           | 2160 | aurelien | 575 | 									tn.getUI().toggleCheck(true);
 | 
        
           |  |  | 576 | 									tn.ensureVisible();
 | 
        
           | 1018 | aurelien | 577 | 									return true;
 | 
        
           |  |  | 578 | 								}
 | 
        
           |  |  | 579 | 							}
 | 
        
           |  |  | 580 | 							// et on passe au suivant
 | 
        
           |  |  | 581 | 						}
 | 
        
           | 2160 | aurelien | 582 |   | 
        
           |  |  | 583 | 						return true;
 | 
        
           |  |  | 584 | 					}
 | 
        
           | 1018 | aurelien | 585 |   | 
        
           | 2160 | aurelien | 586 | 				});
 | 
        
           | 1018 | aurelien | 587 | 		}
 | 
        
           |  |  | 588 | 	}
 | 
        
           |  |  | 589 |   | 
        
           |  |  | 590 | 	/**
 | 
        
           |  |  | 591 | 	 * Méthode héritée de l'interface rafraichissable
 | 
        
           |  |  | 592 | 	 *
 | 
        
           |  |  | 593 | 	 * @param nouvelleDonnees
 | 
        
           |  |  | 594 | 	 *            les nouvelles données pour l'objet
 | 
        
           |  |  | 595 | 	 * @param repandreRafraichissement
 | 
        
           |  |  | 596 | 	 *            booleen qui dit si on doit répandre l'évenement
 | 
        
           |  |  | 597 | 	 */
 | 
        
           | 1292 | aurelien | 598 | 	@Override
 | 
        
           | 1018 | aurelien | 599 | 	public void rafraichir(Object nouvelleDonnees,
 | 
        
           |  |  | 600 | 			boolean repandreRafraichissement) {
 | 
        
           |  |  | 601 |   | 
        
           |  |  | 602 | 		if(nouvelleDonnees instanceof Tree) {
 | 
        
           |  |  | 603 |   | 
        
           |  |  | 604 | 			Tree nouvelArbre = (Tree)nouvelleDonnees ;
 | 
        
           |  |  | 605 |   | 
        
           |  |  | 606 | 			// on prend sa racine et on l'attache à l'arbre des mots clés
 | 
        
           |  |  | 607 | 			Node[] rootChild = getArbreMotsCles().getRootNode().getChildNodes();
 | 
        
           |  |  | 608 | 			for (int i = 0; i < rootChild.length; i++) {
 | 
        
           |  |  | 609 |   | 
        
           |  |  | 610 | 				rootChild[i].remove();
 | 
        
           |  |  | 611 | 			}
 | 
        
           |  |  | 612 |   | 
        
           |  |  | 613 | 			copierFilsNoeud(nouvelArbre.getRootNode(),getArbreMotsCles().getRootNode());
 | 
        
           |  |  | 614 |   | 
        
           |  |  | 615 | 			// si l'arbre n'était pas encore considéré comme instancié
 | 
        
           |  |  | 616 | 			if (!arbreCharge) {
 | 
        
           |  |  | 617 | 				// on signale que oui
 | 
        
           |  |  | 618 | 				arbreCharge = true;
 | 
        
           |  |  | 619 | 			}
 | 
        
           |  |  | 620 | 		}
 | 
        
           |  |  | 621 |   | 
        
           |  |  | 622 | 		// Si on reçoit un tableau de String (cas ou l'on séléectionne une
 | 
        
           |  |  | 623 | 		// nouvelle image)
 | 
        
           |  |  | 624 | 		if (nouvelleDonnees instanceof String[]) {
 | 
        
           |  |  | 625 |   | 
        
           | 2062 | aurelien | 626 | 			// le tableau de String contient les id des mots clés associés à
 | 
        
           |  |  | 627 | 			// l'image
 | 
        
           |  |  | 628 | 			// on coche les mots clés contenu dans le tableau
 | 
        
           |  |  | 629 | 			tableauMotsClesEnCours = (String[]) nouvelleDonnees;
 | 
        
           |  |  | 630 | 			if(this.isVisible()) {
 | 
        
           |  |  | 631 | 				cocherMotsCles(tableauMotsClesEnCours);
 | 
        
           |  |  | 632 | 			} else {
 | 
        
           |  |  | 633 | 				addListener(new WindowListenerAdapter() {
 | 
        
           |  |  | 634 |   | 
        
           |  |  | 635 | 					@Override
 | 
        
           |  |  | 636 | 					public void onShow(Component component) {
 | 
        
           |  |  | 637 | 						cocherMotsCles(tableauMotsClesEnCours);
 | 
        
           |  |  | 638 | 					}
 | 
        
           |  |  | 639 | 				});
 | 
        
           |  |  | 640 | 			}
 | 
        
           | 1018 | aurelien | 641 | 		}
 | 
        
           | 2062 | aurelien | 642 |   | 
        
           |  |  | 643 | 		// reception d'un nouvel identifiant de mot clé
 | 
        
           |  |  | 644 | 		if(nouvelleDonnees instanceof Integer) {
 | 
        
           |  |  | 645 | 			if(cheminTemporaireAjout != null) {
 | 
        
           |  |  | 646 | 				String id = ((Integer)(nouvelleDonnees)).toString();
 | 
        
           |  |  | 647 | 				TreeNode noeudEnAjout = arbreMotsCles.getNodeById(cheminTemporaireAjout);
 | 
        
           |  |  | 648 | 				String[] userObj = {noeudEnAjout.getText(), id};
 | 
        
           |  |  | 649 | 				noeudEnAjout.setUserObject(userObj);
 | 
        
           |  |  | 650 | 				cheminTemporaireAjout = null;
 | 
        
           |  |  | 651 | 			}
 | 
        
           |  |  | 652 | 		}
 | 
        
           | 2166 | aurelien | 653 | 		surRetourWebService(arbreMotsCles.getTree());
 | 
        
           | 2062 | aurelien | 654 | 		arbreMotsCles.enable();
 | 
        
           | 1018 | aurelien | 655 | 	}
 | 
        
           |  |  | 656 |   | 
        
           |  |  | 657 | 	/**
 | 
        
           |  |  | 658 | 	 * Fonction récursive qui prend deux noeuds d'arbre en paramètre et crée un
 | 
        
           |  |  | 659 | 	 * copie du sous arbre du premier noeud, qu'elle concatène au deuxième
 | 
        
           |  |  | 660 | 	 *
 | 
        
           |  |  | 661 | 	 * @param ndPereOriginal
 | 
        
           |  |  | 662 | 	 *            le père des noeuds de l'arbre original
 | 
        
           |  |  | 663 | 	 * @param ndPereCopie
 | 
        
           |  |  | 664 | 	 *            le père qui va recevoir les copies
 | 
        
           |  |  | 665 | 	 */
 | 
        
           |  |  | 666 | 	private void copierFilsNoeud(Node ndPereOriginal, TreeNode ndPereCopie) {
 | 
        
           |  |  | 667 | 		if (ndPereCopie != null && ndPereOriginal != null) {
 | 
        
           |  |  | 668 | 			Node[] ndNodeFils = ndPereOriginal.getChildNodes();
 | 
        
           |  |  | 669 |   | 
        
           |  |  | 670 | 			for (int i = 0; i < ndNodeFils.length; i++) {
 | 
        
           |  |  | 671 |   | 
        
           |  |  | 672 | 				String[] usObj = (String[]) ndNodeFils[i].getUserObject();
 | 
        
           |  |  | 673 | 				TreeNode child = new TreeNode(usObj[0]);
 | 
        
           |  |  | 674 | 				child.setId(usObj[1]);
 | 
        
           |  |  | 675 | 				child.setChecked(false);
 | 
        
           |  |  | 676 | 				child.setUserObject(usObj);
 | 
        
           |  |  | 677 | 				ndPereCopie.appendChild(child);
 | 
        
           |  |  | 678 |   | 
        
           |  |  | 679 | 				if (!ndNodeFils[i].isLeaf()) {
 | 
        
           |  |  | 680 | 					copierFilsNoeud(ndNodeFils[i], child);
 | 
        
           |  |  | 681 | 				}
 | 
        
           |  |  | 682 |   | 
        
           |  |  | 683 | 			}
 | 
        
           |  |  | 684 | 		}
 | 
        
           |  |  | 685 | 	}
 | 
        
           |  |  | 686 |   | 
        
           |  |  | 687 |   | 
        
           |  |  | 688 | 	public void activerBoutonValider(boolean activer) {
 | 
        
           |  |  | 689 | 		valider.setVisible(activer);
 | 
        
           |  |  | 690 | 	}
 | 
        
           |  |  | 691 | }
 | 
        
           |  |  | 692 |   |