import java.util.*; import java.awt.*; import java.awt.event.*; /** * La classe ApplicationFrame implante la Frame principale * d'une application d'affichage d'un {@link ApplicationCanvas ApplicationCanvas} * munie d'un {@link Afficheur Afficheur}. * * @author Nicolas Janey * @author nicolas.janey@univ-fcomte.fr * @version 1.0, 12/01/06 */ public class ApplicationFrame extends Frame implements WindowListener, ActionListener, ItemListener { /** * {@link ApplicationCanvas ApplicationCanvas} affiche dans la Frame. */ private ApplicationCanvas ac; /** * Barre de menus de la Frame. */ private MenuBar mb = new MenuBar(); /** * Menu de la barre de menus de la Frame. */ private Menu m1 = new Menu("Fichier"); /** * Menu de la barre de menus de la Frame. */ private Menu m2 = new Menu("Affichage"); /** * Item de menu du menu de la barre de menus de la Frame. */ private MenuItem mq = new MenuItem("Quitter"); /** * Vector {@link Afficheur Afficheur} de la Frame. */ private Vector vaff; /** * Vector d'items de menu de la Frame. */ private Vector vcmi; /** * La tache de fond de la Frame. */ private ThreadTacheDeFond ttdf; /** * Item de menu de controle de l'animation de la Frame. */ private CheckboxMenuItem anim = new CheckboxMenuItem("Animation",false); /** * Constructeur pour une ApplicationFrame * non munie d'un {@link Afficheur Afficheur}. * */ public ApplicationFrame(String s) { super(); ac = new ApplicationCanvas(null); setTitle(s); addWindowListener(this); setMenuBar(mb); mb.add(m1); m1.add(mq); mq.addActionListener(this); mb.add(m2); m2.add(anim); anim.setEnabled(false); anim.addItemListener(this); add(ac); vcmi = new Vector(); vaff = new Vector(); } /** * Constructeur pour une ApplicationFrame * munie d'un {@link Afficheur Afficheur}. * * @param afficheur l'objet {@link Afficheur Afficheur} d'initialisation. * */ public ApplicationFrame(String s,Afficheur afficheur) { super(); ac = new ApplicationCanvas(afficheur); setTitle(s); addWindowListener(this); setMenuBar(mb); mb.add(m1); m1.add(mq); mq.addActionListener(this); mb.add(m2); m2.add(anim); anim.setEnabled(false); anim.addItemListener(this); add(ac); vcmi = new Vector(); vaff = new Vector(); } /** * Ajoute un afficheur a une ApplicationFrame * et ajuste le menu "Affichage" en consequence. * * @param s la chaine de caracteres associee a l'{@link Afficheur Afficheur} * dans le menu "Affichage". * @param afficheur l'objet {@link Afficheur Afficheur}. * */ public void add(String s,Afficheur afficheur) { ac.set(afficheur); CheckboxMenuItem cmi = new CheckboxMenuItem(s); cmi.addItemListener(this); cmi.setState(true); if ( vcmi.size() == 0 ) m2.addSeparator(); m2.add(cmi); vaff.add(afficheur); vcmi.add(cmi); ajusteStates(cmi); } /** * Ajuste l'etat des CheckboxMenuItem de la Frame. * * @param cmi la CheckboxMenuItem mise a actif. * Les autres sont mis a faux. * */ private void ajusteStates(CheckboxMenuItem cmi) { cmi.setState(true); for ( int i = 0 ; i < vcmi.size() ; i++ ) { CheckboxMenuItem cbmi =(CheckboxMenuItem) vcmi.elementAt(i); if ( cmi != cbmi ) cbmi.setState(false); } } /** * Ajuste l'{@link Afficheur Afficheur} correspondant au choix * d'un CheckboxMenuItem de la Frame. * * @param cmi la CheckboxMenuItem selectionnee. * */ private void ajusteAfficheur(CheckboxMenuItem cmi) { for ( int i = 0 ; i < vcmi.size() ; i++ ) { CheckboxMenuItem cbmi =(CheckboxMenuItem) vcmi.elementAt(i); if ( cmi == cbmi ) { Afficheur aff =(Afficheur) vaff.elementAt(i); ac.set(aff); } } } /** * Affecte le {@link ThreadTacheDeFond ThreadTacheDeFond} de gestion * de tache de fond. * * @param ttdf le {@link ThreadTacheDeFond ThreadTacheDeFond} affecte. * */ public void setAnimator(ThreadTacheDeFond ttdf) { this.ttdf = ttdf; anim.setEnabled(true); } /** * Active/desactive l'animation geree par le {@link ThreadTacheDeFond ThreadTacheDeFond} * de gestion de tache de fond. * * @param animated le booleen reglant le nouvel etat. * */ public void setAnimated(boolean animated) { if ( ttdf != null ) ttdf.setAnimated(animated); } /** * "Termine" le programme. * * */ public void quitter() { System.exit(0); } /** * Retourne le {@link ApplicationCanvas ApplicationCanvas} associe a this. * * @return le {@link ApplicationCanvas ApplicationCanvas} associe a this. * */ public ApplicationCanvas getCanvas() { return(ac); } public void actionPerformed(ActionEvent e) { if ( e.getSource() == mq ) { quitter(); } } public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowClosing(WindowEvent e) { quitter(); } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { } public void itemStateChanged(ItemEvent e) { CheckboxMenuItem cmi =(CheckboxMenuItem) e.getSource(); if ( cmi == anim ) { setAnimated(anim.getState()); return; } ajusteStates(cmi); ajusteAfficheur(cmi); } }