Package fenetres

Source Code of fenetres.FenetreGenerale

package fenetres;

import modules.*;
import annotation.Menu;
import interfaces.*;
import plugins.jTreeFolder.NodeWithFile;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.lang.reflect.Method;
import java.util.List;

/**
* Cette Classe rassemble les differentes composantes de l'application (Plugins, menus et actions)
* Elle agit comme un controleur.
* @author Amine HALLILI amine.hallili@gmail.com
*
*/
public class FenetreGenerale extends JFrame implements ActionListener {
 
  /**
   *
   */
  private static final long serialVersionUID = 1L;
 
  private JMenuBar                   menuBarre;
  private JMenu                      fichier,plugins,classes;
  private JMenuItem                  save,importer,classe1,runPlugins;
  private JPanel                     panelCentral,pCentre;
  //private JFileChooser             parc;
  private Dimension               d;
  private JScrollPane                scrollExplorer,scrollCentre;// element gauche(Jtree) et droit(repertoire) de la fenetre
  private Rectangle                  de;
  private List<Class<?>>            l;  // contient la list des classes (Plugins) chargées
  private List<IPlugin>         iPlugins;// contient la liste de tous les plugins
  private List<PluginInterface>      pi; // contient la liste des plugins de traitement de fichier
  private List<RepertoireInterface>  lri;// contient la liste des plugins de type Repertoire.
  private RepertoireInterface        ri; // contient un plugin pardéfaut de creation de repertoire valide
  private TreeInterface              ti; // contient un plugin pardéfaut de creatoin d'arborescence valide
  private JTree                      tree; // explorateur recuperer par un plugin
  private final File            f = new File("../Plugin/bin");
  private Timer             t;
 
  /**
   * Constructeur de la fenetre générale permettant l'initialisation de l'application
   * et le chargement des plugin
   * <br>ainsi qu'écouter le dossier plugin pour mettre l'application à jour
   */
  public FenetreGenerale()
  {   
    super("Explorateur JAVA 1.0");
   
    // Progress Bar : Progrès du chargement de l'application
          LoadProgress lp = new LoadProgress(100);
          lp.setVisible(true);
          lp.progress(0,"initialisation des composantes !");
    //***********************************************************
   
   
    d = Toolkit.getDefaultToolkit().getScreenSize();
    this.setBounds((d.width/2)-500, (d.height/2)-350, 1000, 700);
    de = this.getBounds();
    de.width = 180;
   
    panelCentral    = new JPanel();
    pCentre     = new JPanel();
    scrollExplorer  = new JScrollPane();
    scrollCentre    = new JScrollPane();
   
    pCentre.setLayout(new BorderLayout());
    panelCentral.setLayout(new BorderLayout());
    scrollCentre.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));// ajoute une marge
   
    scrollExplorer.setPreferredSize(de.getSize());
    scrollCentre.setPreferredSize(new Dimension(700,de.height));
   
    menuBarre = new JMenuBar();
      fichier   = new JMenu("fichier");
        save       = new JMenuItem("sauvegarder");
        save.addActionListener(this);
        importer   = new JMenuItem("importer");
        importer.addActionListener(this);
        runPlugins = new JMenuItem("lancer");
        runPlugins.addActionListener(this);
      fichier.add(save);
      fichier.add(importer);
      fichier.add(runPlugins);
   
      plugins   = new JMenu("plugins");
     
      classes   = new JMenu("classes");
        classe1 = new JMenuItem("classe (default)");
      classes.add(classe1);
     
    // progresser la barre
    lp.progress(10,"chargement des classes depuis :"+f.getAbsolutePath());
    //***********************************************************
     
    // chargement des classes 
    if (!f.exists()) {
      System.err.println(f+" does not exist");
      System.exit(1);
    }
   
    Repository<Object> rep = new Repository<Object>(f, Object.class);
    l = rep.load();
    System.out.println(l.size()+" classe(s) loaded");
    //*********************************************************************
     
    // progresser la barre
    lp.progress(20,"chargement des plugins");
    //***********************************************************
     
     
    // Sauvegarde des plugins 
     
    iPlugins = Traitement.chargerAllPlugins(l);
    for(IPlugin c : iPlugins)
      buildMenu(c);
   
    pi = Traitement.chargerPlugins(l);
   
   
    ri = Traitement.chargerRepertoire(l);
    if(ri == null)
      pCentre.add(new JLabel("Aucun plugin de type Repertoire !"),BorderLayout.CENTER);
    else
    {
      lri = Traitement.chargerRepertoirePlugins(l);
      createRepertoireList(pCentre, lri);
    }
     
    // progresser la barre
    lp.progress(40,"création de l'arbre");
    //*********************************************************** 
     
    ti = Traitement.chargerExplorateur(l);

    if(ti == null)
      scrollExplorer.getViewport().add(new JLabel("Aucun plugin de type Explorateur !"));
    else
    {
      tree = ti.getTree()
      scrollExplorer.getViewport().add(tree);
      addListenerToTree(tree);
    }
    //*********************************************************************** 
   
    // progresser la barre
    lp.progress(60,"initialisation des menus");
    //***********************************************************
     
    menuBarre.add(fichier);
    menuBarre.add(plugins);
    menuBarre.add(classes);
   
    scrollCentre.getViewport().add(pCentre);
   
    panelCentral.add(scrollExplorer,BorderLayout.WEST);
    panelCentral.add(scrollCentre,BorderLayout.CENTER);
   
    this.setContentPane(panelCentral);
    this.setJMenuBar(menuBarre);
   
    addWindowListenerWithOptions(this);
   
    // progresser la barre
    lp.progress(80,"chargement de la dernière sauvegarde");
    //*********************************************************** 
   
    if(new File("Explorateur.properties").exists() && new File("tree.mem").exists())
    if(JOptionPane.showConfirmDialog(null, "Voulez vous charger la dernière sauvegarde ?") == 0)
    {
      if(new File("Explorateur.properties").exists())
        Traitement.chargerFenetre(this);
       
      if(new File("tree.mem").exists())
      {
        tree = null;
        if(ti != null)
        {
          scrollExplorer.getViewport().removeAll();
          tree = ti.loadTree();
          scrollExplorer.getViewport().add(tree);
          scrollExplorer.getViewport().validate();
          addListenerToTree(tree);
        }
      }
     
      if(ri != null)
        ri.loadOpenedFile();
       
    }
   
    loadNewPlugins(f);
   
    // progresser la barre
    lp.progress(100,"fin de chargement !");
    //***********************************************************
    this.setVisible(true);
 
  }
 
 


  /**
   * crée le menu associé au plugin "c" passé en parametre
   * elle se base sur l'annotaton pour creer le menu sinon elle utilise le nom de la fonction annotée
   * si non elle utilise le nom de la classe
   * @param c IPlugin un plugin
   */
  void buildMenu(final IPlugin c)  { 
   
    Method[] m = c.getClass().getDeclaredMethods();
    JMenuItem item=null;
    boolean test = false;
     
    for(int j=0; j<m.length ; j++)
    {
      Menu menu = m[j].getAnnotation(Menu.class);
      if(menu != null)
      {
        test = true;
        if(menu.libelle() == null)
        {
          item = new JMenuItem(m[j].getName());
        }
        else
        {
          item = new JMenuItem(menu.libelle());
        }
      }
    }
    if(!test)
    {
      String name = c.getClass().getName();
      int index = c.getClass().getName().lastIndexOf(".");
      item = new JMenuItem(name.substring(index+1, name.length()));
    }
    plugins.add(item)
    item.addActionListener(new ActionListener() {
     
      @Override
      public void actionPerformed(ActionEvent e) {
       
        final JPanel pDetail = new JPanel();
        pDetail.setLayout(new BorderLayout(2,2));
        pDetail.add(c.getFrameDetail(),BorderLayout.CENTER);
     
        if(!c.isDefault())
        {
          JButton defaut = new JButton("mettre par defaut");
          defaut.setPreferredSize(new Dimension(40,20));
          pDetail.add(defaut,BorderLayout.NORTH);
          defaut.addActionListener(new ActionListener() {
           
            @Override
            public void actionPerformed(ActionEvent arg0) {
             
              setiPlugins(Traitement.setDefaut(c, iPlugins));
              setPi(Traitement.setDefaut(c, getPi()));
              for(PluginInterface iii :getPi())
                if(iii.getClass().getName().equals(c.getClass().getName()))
                  iii.setDefault(true);
               
              pCentre.add(ri.getFrame(ri.getlastOpenedDir(),getPi()),BorderLayout.CENTER);
              pCentre.validate();
              ((JButton)arg0.getSource()).setVisible(false);
             
              pDetail.removeAll();
              pDetail.add(c.getFrameDetail(),BorderLayout.CENTER);
            }
          });
       
        JOptionPane.showMessageDialog(null, pDetail);
      }
    })
  }

 
  /**
   * pour creer la liste de differents type d'affichage
   * @param p JPanel le panel qui affiche le repertoire
   * @param l liste des plugins de type repertoire trouvés dans le dossier Plugin/bin
   */
  public void createRepertoireList(final JPanel p, final List<RepertoireInterface> lcr)
  {
    JComboBox list = new JComboBox();
    p.removeAll();
   
    final JPanel jp   = new JPanel();
    JPanel j    = new JPanel();
    JLabel jl   = new JLabel("Type d'affichage : ");
   
    j.setPreferredSize(new Dimension(220,25));
    jp.setPreferredSize(new Dimension(300,25));
    j.setLayout(new GridLayout());
    j.add(jl);
    j.add(list);
    jp.setLayout(new BorderLayout());
    jp.add(j, BorderLayout.EAST);
    p.add(jp, BorderLayout.NORTH);
    p.validate()
   
   
   
    for(RepertoireInterface i :lcr)
      list.addItem(i.getTypeAffichage());
   
   
    list.addActionListener(new ActionListener() {
     
      @Override
      public void actionPerformed(ActionEvent item) {
        for(RepertoireInterface i :lcr)
        {
         
          JComboBox cb = (JComboBox)item.getSource();
          if(i.getTypeAffichage().equals((String)cb.getSelectedItem()))
          {
            p.removeAll();
            // on memorise le dernier dossier ouvert
            File lastDir = getRi().getlastOpenedDir();
            // on change le type d'affichage
            setRi(i);
           
            // on applique le nouveau type d'affichage à l'application
            p.add(jp, BorderLayout.NORTH);
            p.add(getRi().getFrame(lastDir, getPi()),BorderLayout.CENTER);
           
            p.validate()
           
          }
        }
      }
    });   
  }
 
 
 
  /**
   * permet la sauvegarde ou l'importation de l'application
   */
  public void actionPerformed(ActionEvent arg0) {   
    if(arg0.getSource().equals(this.save) )
    {
      Traitement.sauvegarderFenetre(this);
      if(ri != null)
        ri.saveOpenedFiles();
      if(ti != null)
        ti.saveTree();
    }
   
    if(arg0.getSource().equals(this.importer) )
    {
      scrollExplorer.getViewport().remove(tree);
      tree = ti.loadTree();
      scrollExplorer.getViewport().add(tree);
      scrollExplorer.getViewport().validate();
      if(new File("Explorateur.properties").exists());
        Traitement.chargerFenetre(this);
      if(ri != null)
        ri.loadOpenedFile();
   
  }


  /**
   * Ecoute les changements du dossier plugin
   * met à jour l'application
   * @param f File fichier à écouter
   */
  private void loadNewPlugins (final File f)
    {
    t = new Timer(500, new ActionListener() {
     
      @Override
      public void actionPerformed(ActionEvent e) {
   
        Repository<Object> rep = new Repository<Object>(f, Object.class);
        l = rep.load();
        List<IPlugin> nouvPlugins = Traitement.chargerAllPlugins(l);
        if(nouvPlugins.size() != getiPlugins().size())
        {
          setiPlugins(nouvPlugins);
          final JFrame pop = new JFrame("Mise à jour plugin");
          JPanel p = new JPanel();
          JLabel l   = new JLabel("    Des plugins ont été ajoutés ou supprimés. Chargement en cours ... !");
          JButton b  = new JButton("Fermer");
          b.setPreferredSize(new Dimension(80,20));
          b.addActionListener(new ActionListener() {
           
            @Override
            public void actionPerformed(ActionEvent arg0) {
              pop.dispose();
            }
          });
          p.setBorder(BorderFactory.createLineBorder(Color.black));
          pop.setBounds(getX()+getWidth()-405, getY()+getHeight()-65, 400, 60);
          pop.setUndecorated(true);
         
          p.setBackground(Color.yellow);
          p.add(l);
          p.add(b);
          pop.setFocusable(true);
          pop.setAlwaysOnTop(true);
         
          pop.setContentPane(p);
          pop.setVisible(true);
         
          // verification du repertoire
          if(ri == null)
          {
            System.out.println("verification de repertoire ...");
            ri=Traitement.chargerRepertoire(getL());
            if(ri != null)
            {
              setLri(Traitement.chargerRepertoirePlugins(getL()));
              createRepertoireList(pCentre, getLri());
              scrollCentre.getViewport().add(ri.getFrame(null, Traitement.chargerPlugins(getL())));
              addListenerToTree(tree);
            }
          }
          else
          {
            if(Traitement.chargerRepertoire(getL()) == null)
            {
              scrollCentre.getViewport().add(new JLabel("Aucun plugin de type Repertoire !"));
              ri = null;
              setLri(null);
            }
          }
          //******************************************************************************************
         
          // verification de l'explorateur
          if(ti == null)
          {
           
            if(Traitement.chargerExplorateur(getL()) != null)
            {
              ti = Traitement.chargerExplorateur(getL());
              tree = ti.getTree();
              scrollExplorer.getViewport().add(tree);
              addListenerToTree(tree);
            }
            else
              scrollExplorer.getViewport().add(new JLabel("Aucun plugin de type Explorateur !"));
          }
          else
          {
            if(Traitement.chargerExplorateur(getL()) == null)
            {
              scrollExplorer.getViewport().add(new JLabel("Aucun plugin de type Explorateur !"));
              ti =null;
            }
          }
          //*******************************************************************************************
         
          // creation des menus des nouveaux plugins
          getPlugins().removeAll();
          for(IPlugin c : Traitement.chargerAllPlugins(getL()))
            buildMenu(c);
          getPlugins().doClick();         
        }
      }
       
     
    });
   
    t.start();
   
 

  /**
   * met un windowListener pour ajouter l'option de sauvegarde lors de la fermeture
   * @param fen fenetre générale
   */
  void addWindowListenerWithOptions(FenetreGenerale fen)
  {
    fen.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent we){
         
          int rep = JOptionPane.showConfirmDialog(null, "Voulez vous sauvegarder","Quitter",JOptionPane.YES_NO_OPTION);
          if(rep == 0 || rep == 1)
          {
            if(rep == 0)
            {
              Traitement.sauvegarderFenetre((FenetreGenerale)we.getSource());
              if(ti != null)
                ti.saveTree();
              if(ri != null)
                ri.saveOpenedFiles();
            }
            t.stop();
            dispose();
            System.exit(0);
          }
        }
        });
  }
 
 
 
  /**
   * ajoute un mouseListener sur le JTree en fonction de la presence du repertoire
   * @param t JTree
   */
  void addListenerToTree(JTree t)
  {
    if(ri == null)
      scrollCentre.getViewport().add(new JLabel("Aucun plugin de type Repertoire !"));
    else
    {
      t.addMouseListener(new MouseListener() {
       
        @Override
        public void mouseReleased(MouseEvent arg0) {}
       
        @Override
        public void mousePressed(MouseEvent arg0) {}
       
        @Override
        public void mouseExited(MouseEvent arg0) {}
       
        @Override
        public void mouseEntered(MouseEvent arg0) {}
       
        @Override
        public void mouseClicked(MouseEvent arg0) {
          if(ti.getLastPath() !=null)
          {
            // creation du repertoire avec le dernier dossier selectionné dans le jtree
            scrollCentre.getViewport().removeAll();
            pCentre.removeAll();
            createRepertoireList(pCentre, getLri());
            pCentre.add(ri.getFrame(( (NodeWithFile)(ti.getLastPath().getPath().getLastPathComponent())).getFile(), getPi()),BorderLayout.CENTER);
            scrollCentre.getViewport().add(pCentre);
            pCentre.validate();
            scrollCentre.getViewport().validate();
           
          }
        }
      });
    }
  }
 

 
  // Getters and Setters
  public JMenuBar getMenuBarre() {
    return menuBarre;
  }


  public void setMenuBarre(JMenuBar menuBarre) {
    this.menuBarre = menuBarre;
  }


  public JMenu getFichier() {
    return fichier;
  }


  public void setFichier(JMenu fichier) {
    this.fichier = fichier;
  }


  public JMenu getPlugins() {
    return plugins;
  }


  public void setPlugins(JMenu plugins) {
    this.plugins = plugins;
  }


  public JMenu getClasses() {
    return classes;
  }


  public void setClasses(JMenu classes) {
    this.classes = classes;
  }


  public JMenuItem getSave() {
    return save;
  }


  public void setSave(JMenuItem save) {
    this.save = save;
  }


  public JMenuItem getImporter() {
    return importer;
  }


  public void setImporter(JMenuItem importer) {
    this.importer = importer;
  }


  public JMenuItem getClasse1() {
    return classe1;
  }


  public void setClasse1(JMenuItem classe1) {
    this.classe1 = classe1;
  }


  public JMenuItem getRunPlugins() {
    return runPlugins;
  }


  public void setRunPlugins(JMenuItem runPlugins) {
    this.runPlugins = runPlugins;
  }


  public JPanel getPanelCentral() {
    return panelCentral;
  }


  public void setPanelCentral(JPanel panelCentral) {
    this.panelCentral = panelCentral;
  }


  public Dimension getD() {
    return d;
  }


  public void setD(Dimension d) {
    this.d = d;
  }


  public JScrollPane getScrollExplorer() {
    return scrollExplorer;
  }


  public void setScrollExplorer(JScrollPane scrollExplorer) {
    this.scrollExplorer = scrollExplorer;
  }


  public JScrollPane getScrollCentre() {
    return scrollCentre;
  }


  public void setScrollCentre(JScrollPane scrollCentre) {
    this.scrollCentre = scrollCentre;
  }


  public Rectangle getDe() {
    return de;
  }


  public void setDe(Rectangle de) {
    this.de = de;
  }


  public List<Class<?>> getL() {
    return l;
  }


  public void setL(List<Class<?>> l) {
    this.l = l;
  }


  public List<PluginInterface> getPi() {
    return pi;
  }


  public void setPi(List<PluginInterface> pi) {
    this.pi = pi;
  }


  public RepertoireInterface getRi() {
    return ri;
  }


  public void setRi(RepertoireInterface ri) {
    this.ri = ri;
  }
 
 
  public List<RepertoireInterface> getLri() {
    return lri;
  }


  public void setLri(List<RepertoireInterface> lri) {
    this.lri = lri;
  }


  public TreeInterface getTi() {
    return ti;
  }


  public void setTi(TreeInterface ti) {
    this.ti = ti;
  }


  public JTree getTree() {
    return tree;
  }


  public void setTree(JTree tree) {
    this.tree = tree;
  }


  public static long getSerialversionuid() {
    return serialVersionUID;
  }


  public JPanel getpCentre() {
    return pCentre;
  }


  public void setpCentre(JPanel pCentre) {
    this.pCentre = pCentre;
  }


  public List<IPlugin> getiPlugins() {
    return iPlugins;
  }


  public void setiPlugins(List<IPlugin> iPlugins) {
    this.iPlugins = iPlugins;
  }
 
  // *******************************************************************
}
 
TOP

Related Classes of fenetres.FenetreGenerale

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.