//
//  IndividuInterfaceController.java
//  Structure
//
//  Created by Luc-Henri Barthélémy on Mon Oct 16 2006.
//  Copyright (c) 2001 __MyCompanyName__. All rights reserved.
//

package Structure.client;

import com.webobjects.foundation.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoapplication.*;
import com.webobjects.eointerface.*;
import com.webobjects.eointerface.swing.*;


import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.awt.*;

public class IndividuInterfaceController extends EOInterfaceController {
	
	public StructureInterfaceController interfaceSender;
	public EOController appInterfaceSender;
	public JTextField searchField;
	public JFrame mainWD;
	public JFrame listWD, doublonsWD;
	public EODisplayGroup mainDG, groupeDG, telDG, adresseDG, doublonsDG;
	public EODisplayGroup  civiliteDG, typeNoTelDG, typeTelDG, typeAdresseDG,paysDG, fournisDG,indirectGroupeDG,fonctionDG,typeGroupeDG;
	public SplitViewController splitController;
	public SplitViewController fonctionSplitController;
	public EOView fournisView, comptesView;
	public EOImageView photoView;
	
	public RibInterfaceController myRib;
	
	public CompteInterfaceController myCompte;
	
	//
	// combos dans les tables
	//
	
	// un peu chiant qd meme
	//
	// d etre oblige
	// de declarer- connecter tout ces outlets
	//
	
	public JComboBox typeAdrCombo;
	public TableColumn typeAdrColumn;  // LHB
	
	public JComboBox typeTelCombo;
	public TableColumn typeTelColumn;  // LHB
	
	public JComboBox typeNoTelCombo;
	public TableColumn typeNoTelColumn;  // LHB
	
	private String selectedTypeGroupeCode;
	private int selectedTypeGroupeIndex;
	
	
    public IndividuInterfaceController() {
        super();
    }

    public IndividuInterfaceController(EOEditingContext substitutionEditingContext) {
        super(substitutionEditingContext);
    }
	
    public IndividuInterfaceController(EOEditingContext substitutionEditingContext,StructureInterfaceController sender) {
        super(substitutionEditingContext);
		interfaceSender = sender;
    }
	
    public IndividuInterfaceController(EOEditingContext substitutionEditingContext,EOController sender) {
        super(substitutionEditingContext);
		appInterfaceSender = sender;
    }
	
	
	public void connectionWasEstablished()
	{
		System.out.println("connectionWasEstablished IndividuIC");
		
		//
		// une splitView dans une splitView (groupes et fonctions)
		//
		splitController.establishConnection(JSplitPane.VERTICAL_SPLIT,0.6);
		fonctionSplitController.establishConnection(JSplitPane.HORIZONTAL_SPLIT,0.6);
		//
		// fetch des dicos
		//
		civiliteDG.fetch();
		typeTelDG.fetch();
		typeNoTelDG.fetch();
		typeAdresseDG.fetch();
		typeGroupeDG.fetch();
		
		paysDG.setSortOrderings(new NSMutableArray(EOSortOrdering.sortOrderingWithKey("llPays",EOSortOrdering.CompareAscending)));
		paysDG.fetch();
		NSMutableArray mySort = new NSMutableArray(EOSortOrdering.sortOrderingWithKey("nomUsuel",EOSortOrdering.CompareAscending));
		mySort.addObject(EOSortOrdering.sortOrderingWithKey("prenom",EOSortOrdering.CompareAscending));
		mainDG.setSortOrderings(mySort);
		
		// LHB 2007
		initTableCellWithCombo(typeAdrColumn, typeAdrCombo);
		// LHB 2007
		initTableCellWithCombo(typeTelColumn,typeTelCombo);
		initTableCellWithCombo(typeNoTelColumn, typeNoTelCombo);
		
		//
		// inclusion du nib des Fournisseurs-RIBS
		// dans la TabView
		//
		myRib = new RibInterfaceController(editingContext(),this);
		fournisView.add(myRib.component());
		myRib.component().setVisible(true);
		myRib.establishConnection(fournisDG);
		
		// 
		// inclusion du nib des Comptes
		// dans la TabView
		//
		
		myCompte = new CompteInterfaceController(editingContext());
		comptesView.add(myCompte.component());
		myCompte.component().setVisible(true);
		myCompte.establishConnection();
		
		mainWD.setResizable(false);
		
		//
		// en cas gestion par association, on donne le DG de StructureUlr comme point de rattachement
		//
		
		
		//
		// Dans le nib on cree une EOAssociation entre
		// le DG des Fournisseurs
		// et la relation "fournisseurs"
		//
		
		//
		// on gere la synchronisation par setObjets()
		//
		
		//myRib.establishConnection();
		initECNotif();
		photoView.setScalingHints(Image.SCALE_FAST);
	}
	
	//
	//
	// mettre un combo binde sous IB
	// dans une table cell
	// on ne s occupe pas du renderer
	// pour le moment
	//
	
	public void initTableCellWithCombo(TableColumn myColumn, JComboBox myCombo)
	{
		// combos boxes dans IB
		DefaultCellEditor myEditor = new DefaultCellEditor(myCombo);
		myColumn.setCellEditor(myEditor);
		myEditor.setClickCountToStart(2);
		
	}
	
	
	public void searchWithString(String sender)
	{
		NSArray myResults;
		if(sender != null && sender.length() > 2)
		{
			myResults = STIndividuUlr.IndividusWithName(editingContext(),sender);
			mainDG.setObjectArray(myResults);
		}
	}
	
	public void search(Object sender)
	{
		NSArray myResults;
		String critere = searchField.getText();
		if(critere != null && critere.length() > 2)
		{
			myResults = STIndividuUlr.IndividusWithName(editingContext(),critere);
			mainDG.setObjectArray(myResults);
		}
	}
	
	public void searchByFonction()
	{
		NSArray myResults;
		String critere = searchField.getText();
		if(critere != null && critere.length() > 2)
		{
			myResults = STIndividuUlr.IndividusWithFonction(editingContext(),critere);
			mainDG.setObjectArray(myResults);
		}
	}
	
	
	public void showMainWD()
	{
		//
		// modal ou non
		// 02/04/2007
		//
		//if(interfaceSender.useModal() == true)
		//
		if((interfaceSender != null && interfaceSender.useModal() == true) || UserInfo.useModal() == true)
		{
			initChoixModal(mainWD,"Edition d'un Individu");
			//System.out.println("SplitStructureController mainWD useModal");
		}
		else
		{
			//mainWD.setLocationRelativeTo(component());
			mainWD.setVisible(true);
			//setAlwaysOnTop(mainWD);
			mainWD.toFront();
	}
	}
	
	//
	// en mode recherche on choisit un Item puis on revient au Tree
	//
	public void chooseFromSearch()
	{
		
		swapInterfaceSenderIfNeeded();
		
		STStructureUlr myObject = ((STRepartGroupeIndividu)groupeDG.selectedObject()).toStructurePere();

		if (myObject != null  && interfaceSender != null)
		{
			//mainTabView.setSelectedIndex(0);
			interfaceSender.treeController.selectObject(myObject);
			interfaceSender.component().setVisible(true);
		}
	}
	//
	// en mode recherche on choisit un Item puis on revient au Tree
	//
	public void chooseFromIndirect()
	{
		swapInterfaceSenderIfNeeded();

		
		STStructureUlr myObject = (STStructureUlr)indirectGroupeDG.selectedObject();
		
		if (myObject != null  && interfaceSender != null)
		{
			//mainTabView.setSelectedIndex(0);
			interfaceSender.treeController.selectObject(myObject);
			interfaceSender.component().setVisible(true);
		}
	}
	
	public void addIndividu()
	{
		mainDG.insert();
		//mainWD.setVisible(true);
	}
	
	public void editIndividu()
	{
		//mainDG.insert();
		//mainWD.setVisible(true);
		//System.out.println("Structures dont je suis administrateur d'agenda ! ");
		//System.out.println("Structures Managées : "+ STStructureUlr.StructuresWithAgendaManagedBy(editingContext(),((STIndividuUlr)mainDG.selectedObject()).persId()));
		showMainWD();
	}
	
	public void editComptes()
	{
		CompteInterfaceController myComptes = new CompteInterfaceController(editingContext());
        EOFrameController.runControllerInNewFrame(myComptes, "Gestion des Comptes");
	}
	
	
	public void deleteIndividu()
	{
		mainDG.deleteSelection();
	}
	
	public void addAdresse( )
	{	
		//
		// Ajout
		// tres tres moche
		// pb modele EOF
		// le to many structure vers repartpersonneadresse ne se fait pas par la cle
		// primaire du pere mais par le persId
		// je suis contraint d affecter une cle (persId) au fils
		// dans le code de l interface
		//
		adresseDG.insert();
		
		((STRepartPersonneAdresse)adresseDG.selectedObject()).setPersId(((STIndividuUlr)mainDG.selectedObject()).persId());
	}
	
	
	public void addTelPersonne( )
	{	
		telDG.insert();
		((STPersonneTelephone)telDG.selectedObject()).setPersId(((STIndividuUlr)mainDG.selectedObject()).persId());
	}
	
	public void deleteAdresse( )
	{	
		adresseDG.deleteSelection();
	}
	
	public void deleteTelPersonne( )
	{	
		telDG.deleteSelection();
	}
	
	public void deleteGroupe( )
	{	
		groupeDG.deleteSelection();
	}
	
	
	public void editSelectedStructure()
	{
		swapInterfaceSenderIfNeeded();
		
		if(groupeDG.selectedObject() != null && interfaceSender != null)
		{
			String myCode = ((STRepartGroupeIndividu)groupeDG.selectedObject()).toStructurePere().cStructure();
			
			//
			// ici je dois jouer avec les deux EC
			// donc on doit le recuperer ds l autre EC
			//
			
			STStructureUlr myObject = STStructureUlr.StructureWithCode(((SplitStructureInterfaceController)interfaceSender).editingContext(), myCode);
			
			if (myObject != null)
			{
				EOFrameController myLoadMessage;
				//System.out.println("IndividuIC editSelectedStructure");
				myLoadMessage = MessagesInterfaceController.initMessage("Edition d'une structure","Veuillez Patienter : Chargement de la structure en cours ... ("+myObject.nbMembres() + " membres)",myObject.llStructure());
				myLoadMessage.makeVisible();
				//myLoadMessage = MessagesInterfaceController.initMessage("Edition d'une structure","Veuillez Patienter : Chargement de la structure en cours ... ");
				interfaceSender.displayGroup().setObjectArray(new NSArray(myObject));
				myLoadMessage.makeInvisible();
				((SplitStructureInterfaceController)interfaceSender).showEditWD();
				//EOEditingContext.setDefaultParentObjectStore(null);
			}
		}
	}
	
	public void swapInterfaceSenderIfNeeded()
	{
		//
		// initialement ce module a ete developpe
		// pour etre appele a partir d une interface structure
		//
		//
		// on peut charger le module Individu directement a partir d une appli
		// il faut gere le retour aux structures
		//		
		
		//
		// l appli appelante est conservee pour pouvoir selectionner une structure
		//
		
		//
		// je teste la dispo du displayGroup car le module a pu etre dispose
		//
		
		if (interfaceSender == null || interfaceSender.displayGroup() == null)
		{
			interfaceSender = new SplitStructureInterfaceController(editingContext(),appInterfaceSender);
			//interfaceSender.establishConnection();
			disposableRegistry().addObject(interfaceSender);
			EOFrameController.runControllerInNewFrame(interfaceSender, "Gestion des Structures");
		}
	}
	
	public void editIndirectStructure()
	{

		swapInterfaceSenderIfNeeded();
		
		if(indirectGroupeDG.selectedObject() != null && interfaceSender != null)
		{
			String myCode = ((STStructureUlr)indirectGroupeDG.selectedObject()).cStructure();
			
			//
			// ici je dois jouer avec les deux EC
			// donc on doit le recuperer ds l autre EC
			//
			
			STStructureUlr myObject = STStructureUlr.StructureWithCode(((SplitStructureInterfaceController)interfaceSender).editingContext(), myCode);
			
			if (myObject != null)
			{
				EOFrameController myLoadMessage;
				//System.out.println("IndividuIC editSelectedStructure");
				myLoadMessage = MessagesInterfaceController.initMessage("Edition d'une structure","Veuillez Patienter : Chargement de la structure en cours ... ("+myObject.nbMembres() + " membres)",myObject.llStructure());
				//myLoadMessage = MessagesInterfaceController.initMessage("Edition d'une structure","Veuillez Patienter : Chargement de la structure en cours ... ");
				interfaceSender.displayGroup().setObjectArray(new NSArray(myObject));
				myLoadMessage.makeInvisible();
				((SplitStructureInterfaceController)interfaceSender).showEditWD();
				//EOEditingContext.setDefaultParentObjectStore(null);
			}
		}
	}
	
	
	public void selectIndividuForEdit (Number persId)
	{
		STIndividuUlr myResult = STIndividuUlr.IndividuWithPersId(editingContext(),persId);
		//System.out.println("dans selectIndividuForEdit");
		//if(mainDG == null)
		//establishConnection();
		//System.out.println(">>>>>>>>>>> Results  : "+ myResult);
		//System.out.println(">>>>>>>>>>> DG  : "+ mainDG.toString());
		if(myResult != null)
		{
			//System.out.println(">>>>>>>>>>> DG  : "+ mainDG.toString());
			mainDG.setObjectArray(new NSArray(myResult));
			mainDG.redisplay();
			mainDG.updateDisplayedObjects();
		}
		//showMainWD();
		//component().window().toBack();
	}
	
	//
	// pour que certain objets d interface ne soient pas modifiables
	//
	
	public boolean alwaysDisabled ()
	{
		return false;
	}
	
	// affichage des doublons
	//
	// 04/04/2007
	// modal or not modal ?
	//
	public void checkDoublons()
	{
		NSArray results;
		
		if(mainDG.selectedObject() != null)
		{
			results = STIndividuUlr.IndividusWithNameAndFirstName(editingContext(),((STIndividuUlr)mainDG.selectedObject()).nomUsuel(),((STIndividuUlr)mainDG.selectedObject()).prenom());
			if(results != null && results.count() > 0)
			{
				//System.out.println("Doublons  : "+ results.toString());
				
				// tous les individus sauf celui-ci !
				
				NSSet mySet = (new NSSet(results));
				mySet = mySet.setBySubtractingSet(new NSSet(mainDG.selectedObject()));

				//doublonsDG.setObjectArray(results);
				doublonsDG.setObjectArray(mySet.allObjects());
				if((interfaceSender != null && interfaceSender.useModal() == true) || UserInfo.useModal() == true)
				{
					initChoixModal(doublonsWD,"Recherche des homonymes");
					//System.out.println("SplitStructureController mainWD useModal");
				}
				else
				{
					//mainWD.setLocationRelativeTo(component());
					doublonsWD.setVisible(true);
				}
			}
			
		}

		
	}
	
	public Boolean administrationAllowed()
	{
		//
		// pour le moment on ne sait pas gerer les droits 
		// sur les nouveaux individus
		//
		if(UserInfo.isGrhumCreator() || UserInfo.isFouCre())
			return Boolean.TRUE;
		else
			return Boolean.FALSE;
		
	}
	
	public Boolean consIndividuAllowed()
	{
		//
		// pour le moment on ne sait pas gerer les droits 
		// sur les nouveaux individus
		//
		//if(UserInfo.isGrhumCreator() || UserInfo.isFouCre())
		if(administrationAllowed() == Boolean.TRUE || UserInfo.isFouCons() || UserInfo.Agent() != null)
		{
			UserInfo.setUsePhoto(true);
			return Boolean.TRUE;
		}
		else
		{
			//System.out.println("Pas le droit de voir les individus !!");
			UserInfo.setUsePhoto(false);
			return Boolean.FALSE;
		}
	}
	
	
	
	public boolean checkDoublonsAllowed ()
	{
		if(mainDG.selectedObject() != null && ((STIndividuUlr)mainDG.selectedObject()).nomUsuel() != null && ((STIndividuUlr)mainDG.selectedObject()).prenom()!=null)
			return true;
		else
			return false;
	}
	
	
	
	public void displayGroupDidChangeSelection(EODisplayGroup group)
	{
		//System.out.println("IndividuIC displayGroupDidChangeSelection" + group.toString());
		
		_notify_associations(group);
		if(group == mainDG)
		{
			//System.out.println("IndividuDG displayGroupDidChangeSelection");
			// on peut administrer les individus - fournisseurs ?
			if ((administrationAllowed() ==  Boolean.TRUE || UserInfo.isFouCons()) && myRib != null)
				//if ((UserInfo.isFouCons()) && myRib != null)
			{
				//System.out.println("Fournisseurs : "+ fournisDG.allObjects().toString());
				myRib.setObjects(fournisDG.allObjects());
			}
			//System.out.println("IndividuDG displayGroupDidChangeSelection");
			if (myCompte != null)
			{
				//System.out.println("Fournisseurs : "+ fournisDG.allObjects().toString());
				if(((STIndividuUlr)mainDG.selectedObject()) != null && ((STIndividuUlr)mainDG.selectedObject()).isAdministrationComptesAllowed() == Boolean.TRUE)
					myCompte.setObjects(new NSArray(mainDG.selectedObject()));
				else
					myCompte.setObjects(new NSArray());
			}
			/**
				if(((STRepartPersonneAdresse)adresseDG.selectedObject()) != null)
			 System.out.println("Adresse >>>> "+ ((STRepartPersonneAdresse)adresseDG.selectedObject()).toAdresse().toString());
			 **/
		}		
	}
	
	public void didSaveChanges(NSNotification theNotification)
	{
		//refreshGroupes();
		System.out.println("didSaveChanges Individu IC Avant !");
		try
		{
				
			if(mainDG.selectedObject() != null)
			{
				//
				// on resynchronise le nib des Fournisseurs
				// (si on en a rajouté un ça doit se voir)
				//
				if(myRib != null)
					myRib.setObjects(fournisDG.allObjects());
			}
		}
		catch (Exception exception) {
			System.out.println("PB  didSaveChanges Individu IC " + exception.toString());
		}
		System.out.println("didSaveChanges Individu IC Apres !");
		
	}
	
	//
	// trap de l erreur sur le save
	//
	protected void saveFailed(Exception exception,
							  boolean showErrorDialog,
							  String saveOperationTitle)
	{
		System.out.println("Merdouille au save ? " + exception.toString());
		exception.printStackTrace();
		//EODialogs.runErrorDialog("Impossible d'enregistrer les données",exception.getMessage());
		//MessagesInterfaceController.initModalMessage("Gestion des Individus","Impossible d'enregistrer les données",exception.getMessage());
		MessagesInterfaceController.initModalMessage("Gestion des Individus","Impossible d'enregistrer les données","Veuillez consulter les détails de l'exception :",exception.getMessage());
		//
		// du cout pas obligatoire
		//
		//super.saveFailed( exception, false, saveOperationTitle);
		// fenetre d edition au premier plan
		mainWD.setVisible(true);
	}

	// sert au refresh des groupes de l individu
	// pour invalider l individu courant
	// en cas de filtre
	//
	protected void _invalidateObject(EOGenericRecord eoObject)
	{
		
		EOGlobalID gid = null;
		//
		// on invalide l objet courant
		//
		if(eoObject != null)
			gid = editingContext().globalIDForObject(eoObject);
		if (gid != null)
			editingContext().invalidateObjectsWithGlobalIDs(new NSMutableArray(gid));
	}
	
	//
	// Ce truc sert a rafraichir les champs
	//
	protected void _notify_associations (EODisplayGroup  
										 a_display_group) {
		java.util.Enumeration en = a_display_group.observingAssociations ().objectEnumerator();
		while (en.hasMoreElements ()) {
			EOAssociation myAss = (EOAssociation)en.nextElement();
			myAss.subjectChanged ();
		}
		//a_display_group.redisplay();
		a_display_group.updateDisplayedObjects();
	}
	
	
	//
	// sert au refresh des groupes de l individu
	// on a besion d invalider les RepartStructures recursifs
	// des groupes peres
	//
	protected	void _invalidateObjects(NSArray objects )
	{
		NSMutableArray childrenGID;
		//NSArray children;
		int count;
		
		//
		// creation d une array des GID pour les objets a invalider
		//
		count = objects.count();
		childrenGID = new NSMutableArray();
		
		while (count-- > 0)
		{
			childrenGID.addObject(editingContext().globalIDForObject((EOGenericRecord)objects.objectAtIndex(count)));
			//NSLog.out.appendln("invalidation objet " + ((EOGenericRecord)UserInfo.objectsToInvalidate().objectAtIndex(count)).toString());
		}
		
		editingContext().invalidateObjectsWithGlobalIDs(childrenGID);		
	}
	
	//
	// on ne peut invalider les objets
	// que si il n'y a pas de modifs en cours
	//
		public boolean refreshAllowed()
	{
		//System.out.println("refreshAllowed");
		if(editingContext().hasChanges() || (mainDG.selectedObject() == null))
			return false;
		else
			return true;
	}

	
	public void initECNotif()
	{
		//System.out.println("NSNotificationCenter ");
		//
		// le pb de cette notif est qu elle est en place
		// des qu on a charge l interface
		// meme si on travaille sur une autre
		//
		Class args[] = { NSNotification.class };
		NSNotificationCenter.defaultCenter().addObserver(this, new NSSelector("didSaveChanges", args),EOEditingContext.EditingContextDidSaveChangesNotification, null);	
		//objectsToInvalidate = new NSMutableArray();
	}
	
	//
	// on cree des dialogues modaux ds le meme nib
	//
	public void initChoixModal(JFrame myPanel,String title)
	{
		JDialog myDialog = new JDialog((Frame)null,title,true);
		myDialog.setContentPane(myPanel.getContentPane());
		myDialog.pack();
		//panelSetLoc(myDialog,component());
		//mainWD.setVisible(true);
		//if(mainWD.isVisible())
		panelSetLoc(myDialog,mainWD);
		//else
		//panelSetLoc(myDialog,component());
		
		myDialog.setVisible(true);
		
	}
	
	
	//
	// on positionne le panel des individus
	// a gauche de la fenetre base
	// et un peu plus haut
	//
	public void panelSetLoc(JDialog myFrame, Component base)
	{
		Point loc;
		//
		// parfois la fenetre principale
		// n est pas le component
		//
		// si base n est pas visible (StructureEditor par ex)
		// on se base sur le component()
		//
		
		try
		{
			if(base.isVisible())
				loc = base.getLocationOnScreen();
			else
				loc = component().getLocationOnScreen();
		}
		catch (Exception exception) {
			System.out.println("Impossible de localiser la fenetre de reference" + exception.toString());
			myFrame.setLocationRelativeTo((Component)null);
			return;		

		}
		
		int j = (int)((loc.getX())-base.getSize().getWidth()/1.5);
		//int k = (int)((mainTabView.getSize().getHeight()  + loc.getY()/2D));
		int k = (int)( loc.getY());
		if(j < 0)
			j = 0;
		if(k < 0)
			k = 0;
		myFrame.setLocation(j, k);
	}
	
	//
	// on ouvre un deuxieme panel moins decale
	//
	public void panelSetLoc2(JDialog myFrame, Component base)
	{
		Point loc;
		//System.out.println("component + "+ base.toString());
		//base.setVisible(true);
		try
		{
			if(base.isVisible())
				loc = base.getLocationOnScreen();
			else
				loc = component().getLocationOnScreen();
		}
		catch (Exception exception) {
			System.out.println("Impossible de localiser la fenetre de reference" + exception.toString());
			myFrame.setLocationRelativeTo((Component)null);
			return;		
		}
		int j = (int)((base.getSize().getWidth()/2  + loc.getX()));
		//int k = (int)((mainTabView.getSize().getHeight()  + loc.getY()/2D));
		int k = (int)( loc.getY());
		if(j < 0)
			j = 0;
		if(k < 0)
			k = 0;
		myFrame.setLocation(j, k);
	}
	
	
	public void addGroupe()
	{
		groupeDG.insert();
		((STRepartGroupeIndividu)groupeDG.selectedObject()).setPersId(((STIndividuUlr)mainDG.selectedObject()).persId());
		STIndividuPersonne mySTPersonne = STIndividuPersonne.IndividuWithPersId(editingContext(),((STIndividuUlr)mainDG.selectedObject()).persId());
		((STRepartGroupeIndividu)groupeDG.selectedObject()).setToIndividu(mySTPersonne);
		choixGroupe();
	}
	

	public void choixGroupe()
	{
		ChoixStructureInterfaceController myTreeIC;
		//
		// le fils cad l individu selectionne doit etre un STIndividuPersonne
		// on la trouve
		// a simplifier avec heritage
		//
		// pourquoi pas auto ?
		
		//EOFrameController myLoadMessage;
		//myLoadMessage = MessagesInterfaceController.initMessage("Parcours des groupes ","Veuillez Patienter : Chargement des groupes en cours ... ",treeController.selectedVStructure().llStructure());
		myTreeIC = new ChoixStructureInterfaceController(editingContext(),(STRepartGroupeIndividu)groupeDG.selectedObject(),this);
		// ces ChoixNomenclaturaIC doivent etre disposes en cas de fermeture de cet objet
		disposableRegistry().addObject(myTreeIC);
 		//myLoadMessage.makeVisible();
		if(UserInfo.useModal() == false)
		{
			//EOFrameController.runControllerInNewFrame(myTreeIC, "Selection d'un groupe" );
			//panelSetLocNotModal(myTreeIC.component(),listWD);
			EOFrameController myFrame = new EOFrameController();
			myFrame.setComponent(myTreeIC.component());
			myTreeIC.establishConnection();
			((JFrame)myFrame.window()).setResizable(true);
			//((JFrame)myFrame.window()).setLocationRelativeTo(listWD);
			panelSetLocNotModal(((JFrame)myFrame.window()),listWD);
			myFrame.activateWindow();
		}
		else
		{
			//EOModalDialogController.runControllerInNewModalDialog(myTreeIC, "Selection d'un groupe");
			EOModalDialogController myFrame = new EOModalDialogController();
			myFrame.setComponent(myTreeIC.component());
			myTreeIC.establishConnection();
			((JDialog)myFrame.window()).setResizable(true);
			//((JDialog)myFrame.window()).setLocationRelativeTo(listWD);
			panelSetLoc2(((JDialog)myFrame.window()),listWD);
			myFrame.activateWindow();
		}
	}
	
	public void addFonctionDsGroupePere()
	{
		fonctionDG.insert();
		choixFonctionDsGroupePere();
	}
	
	public void deleteFonctionDsGroupePere()
	{
		//individuAssociation.insertNewObjectAtIndex(0);
		if(fonctionDG.selectedObject()!=null)
			fonctionDG.deleteSelection();
	}
	
	
	public void choixFonctionDsGroupePere()
	{
		
		ChoixNomenclaturaIC myChoix;
		
		//
		// How to pour le modal
		//
		// permet de positionner la frame
		//
		
		/** modal 		**/
		/**
		EOModalDialogController myFrame = new EOModalDialogController();
		 
		 myChoix = new ChoixNomenclaturaIC(editingContext(),"Fonction",individuAssociation, myFrame);
		 myFrame.setComponent(myChoix.component());
		 myChoix.connectionWasEstablished();
		 ((JDialog)myFrame.window()).setResizable(true);
		 ((JDialog)myFrame.window()).setLocationRelativeTo(fonctionsPanel);
		 //panelSetLoc2(myFrame.window(),fonctionsPanel);
		 myFrame.activateWindow();
		 **/
		/** non modal **/
		// petit essai entre nous
		//((STRepartAssociation)groupeAssociation.selectedObject()).setSTRepartStructure((STRptStructure)repartGroupeDG.selectedObject());
		
		// LHB_P5 12_2006
		// pourrait etre moins con : a revoir
		//
		
		if(UserInfo.useModal()== false)
		{
			EOFrameController myFrame = new EOFrameController();
			myChoix = new ChoixNomenclaturaIC(editingContext(),"Fonction",fonctionDG, myFrame);
			myFrame.setComponent(myChoix.component());
			myChoix.connectionWasEstablished();
			((JFrame)myFrame.window()).setResizable(true);
			//((JFrame)myFrame.window()).setLocationRelativeTo(listWD);
			panelSetLocNotModal(((JFrame)myFrame.window()),listWD);
			myFrame.activateWindow();
		}
		else
		{
			EOModalDialogController myFrame = new EOModalDialogController();
			
			myChoix = new ChoixNomenclaturaIC(editingContext(),"Fonction",fonctionDG, myFrame);
			myFrame.setComponent(myChoix.component());
			myChoix.connectionWasEstablished();
			((JDialog)myFrame.window()).setResizable(true);
			//((JDialog)myFrame.window()).setLocationRelativeTo(listWD);
			panelSetLoc2(((JDialog)myFrame.window()),listWD);
			myFrame.activateWindow();
		}
		
		// ces ChoixNomenclaturaIC doivent etre disposes en cas de fermeture de cet objet
		disposableRegistry().addObject(myChoix);
		
		//panelSetLoc2(myFrame.window(),fonctionsPanel);
		/*** le plus simple
			myChoix = new ChoixNomenclaturaIC(editingContext(),"Fonction",individuAssociation);
        EOFrameController.runControllerInNewFrame(myChoix, "Choix d'une fonction");
		**/
	}
	
	//
	// on positionne le panel
	// a droite de la fenetre base
	// et un peu plus haut
	//
	public void panelSetLocNotModal(Component myFrame, Component base)
	{
		Point loc;
		//
		// parfois la fenetre principale
		// n est pas le component
		//
		// si base n est pas visible (StructureEditor par ex)
		// on se base sur le component()
		//
		//base.setVisible(true);
		
		// LHB 04/04/2007
		
		//
		// ds le cas de SplitStructureEditorController
		// on a lance le mainWD ds un dialog
		// ce dialog est ds mainModal
		//
		
		
		if(base.isVisible())
		{
			//System.out.println("base.isVisible");
			loc = base.getLocationOnScreen();
		}
		else
		{
			//
			// surtout utilise ds StructureEditorIC
			//
			loc = component().getLocationOnScreen();
		}
		
		//loc = base.getLocation();
		
		int j = (int)((base.getSize().getWidth()/1.5  + loc.getX()));
		//int k = (int)((mainTabView.getSize().getHeight()  + loc.getY()/2D));
		int k = (int)( loc.getY());
		if(j < 0)
			j = 0;
		if(k < 0)
			k = 0;
		myFrame.setLocation(j, k);
	}
	
	/**
	public boolean refreshedPhoto()
	{
		NSLog.debug.appendln("refreshedPhoto Individu !! ");
		photoView.setVisible(true);
		photoView.validate();
		return true;
	}
	**/
	

/**
	public NSArray displayGroupDisplayArrayForObjects (EODisplayGroup group, NSArray objects)
	{
		
		if(group == groupeDG)
			NSLog.out.appendln("Display array groupes directs!");
		if(group == indirectGroupeDG)
			NSLog.out.appendln("Display array groupes indirects!");
		
		if((group == groupeDG || group == indirectGroupeDG) && selectedTypeGroupeCode != null)
		{
			//NSMutableArray myArray = new NSMutableArray("*Service*");
			//NSMutableArray myArray = new NSMutableArray("*" + selectedTypeGroupeCode + "*");
			//myArray.addObject("*" + selectedTypeGroupeCode + "*");
			//NSLog.out.appendln("Filtre sur : "+ selectedTypeGroupeCode);
			//myArray.addObject("S");
			
			NSLog.out.appendln("Display array groupes!");
			EOQualifier myQual = EOQualifier.qualifierWithQualifierFormat("toStructurePere.tosRptTypeGrp.typeGroupe.tgrpLibelle like %@ ",new NSArray("*Service*"));
			objects =  EOQualifier.filteredArrayWithQualifier(objects,myQual);
			System.out.println("qualifier = "+myQual.toString());
			//return EOQualifier.filteredArrayWithQualifier(objects,EOQualifier.qualifierWithQualifierFormat( "toStructurePere.tosRptTypeGrp.tgrpCode = " + "'*" + selectedTypeGroupeCode + "*'",null));
			System.out.println("Objects = "+objects);
			
			return objects;
		}
		else
			return objects;
	}
	**/
	
	public void setSelectedTypeGroupe (int myTypeGroupeIndex)
	{
		NSLog.out.appendln("setSelectedTypeGroupe index " + myTypeGroupeIndex);
		selectedTypeGroupeIndex = myTypeGroupeIndex;
		selectedTypeGroupeCode = (String)typeGroupeDG.valueForObjectAtIndex(myTypeGroupeIndex,"tgrpLibelle");
		//selectedTypeGroupe = (STTypeGroupe)typeGroupeDG.selectedObject();
		NSLog.out.appendln("setSelectedTypeGroupe tgrpLibelle" + selectedTypeGroupeCode);
		
	}
	
	public int selectedTypeGroupe()
	{
		NSLog.out.appendln("selectedTypeGroupe ");
		return selectedTypeGroupeIndex;
	}
	
	
	
	public void refreshGroupes()
	{
		//
		// on envoie une fetchspec en dur pour rafraichir la relation
		//
		
		//System.out.println("refreshGroupes");
		
		if(mainDG.selectedObject() != null)
		{
		_invalidateObject((EOGenericRecord)mainDG.selectedObject());
		
		//
		// les groupes indirects contiennent aussi les directs
		//
		_invalidateObjects(indirectGroupeDG.allObjects());
	
		_notify_associations(groupeDG);
		_notify_associations(indirectGroupeDG);
		
		groupeDG.redisplay();
		groupeDG.updateDisplayedObjects();
		
		indirectGroupeDG.redisplay();
		indirectGroupeDG.updateDisplayedObjects();
		}
		
	}
	
	public void dispose ()
	{
		//NSLog.out.appendln("desallocation de IndividuIC ");
		NSNotificationCenter.defaultCenter().removeObserver(this);
		//NSLog.out.appendln("supression de l'observer IndividuIC de didSaveChange");
		if(component().getTopLevelAncestor() != null)
			component().getTopLevelAncestor().setVisible(false);
		super.dispose();
	}
	
	}
