/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Copyright (C) 2011-2012 Marchand Eric <ricoh51@free.fr>
This file is part of Freegressi.
Freegressi is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Freegressi is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Freegressi. If not, see <http://www.gnu.org/licenses/>.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
package freegressi.tableur;
import beans.JLabelRouge;
import beans.JTextFieldSouligne;
import freegressi.parser.Verificateur;
import freegressi.utils.Utils;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
/**
*
* @author marchand
*/
public class JDialogVarExp extends JDialog implements ActionListener {
private JButton jbOk, jbAnnuler;
private boolean ok = false;
private JLabelRouge jlErreur = new JLabelRouge(Sym.AUCUNE_ERREUR);
private static int NOMBRE_COLONNES_JTFS = 20;
private JTextFieldSouligne jtfsActif;
private List<LigneNomUniteTemp> listeLignes = new ArrayList<LigneNomUniteTemp>();
private ArrayList<String> listeNoms = new ArrayList<String>();
private ArrayList<String> listeUnites = new ArrayList<String>();
private JPanel jpLignes = new JPanel();
/** */
private AjouterLignesAction ajouterLignesAction = new AjouterLignesAction(null,
new javax.swing.ImageIcon(getClass().getResource("/freegressi/img/insertrows_26x26.png")),
"Ajouter une ou plusieurs lignes vierges", 0);
/** */
private SupprimerLigneAction supprimerLigneAction = new SupprimerLigneAction(null,
new javax.swing.ImageIcon(getClass().getResource("/freegressi/img/deleterows_26x26.png")),
"Supprimer une ligne", 0);
private GrecsAction grecsAction = new GrecsAction(null,
new javax.swing.ImageIcon(getClass().getResource("/freegressi/img/insertsymbol_26x26.png")),
"Insérer un caractère grec", 0);
public JDialogVarExp(JFrame parent) {
super(parent, true);
creerUI();
setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
setTitle("Définir les variables expérimentales");
//jlErreur.setText("E\nE");
pack();
setLocationRelativeTo(null);
listeLignes.get(0).getJtfNom().requestFocus();
checkErreurs();
}
private void creerUI() {
jbOk = new JButton("Ok", new javax.swing.ImageIcon(getClass().getResource("/freegressi/img/Crystal_Clear_app_clean-24.png")));
jbOk.addActionListener(this);
jbAnnuler = new JButton("Annuler", new javax.swing.ImageIcon(getClass().getResource("/freegressi/img/Crystal_Clear_action_button_cancel-24.png")));
jbAnnuler.addActionListener(this);
JToolBar jToolbar = new JToolBar();
jToolbar.setFloatable(false); // toolbar fixe
// JButton jbAjouterLignes = new JButton(ajouterLignesAction);
// jToolbar.add(jbAjouterLignes);
// JButton jbSupprimerLigne = new JButton(supprimerLigneAction);
// jToolbar.add(jbSupprimerLigne);
JButton jButtonGrecs = new JButton(grecsAction);
jToolbar.add(jButtonGrecs);
// Ajout de la toolbar, le BorderLayout est le layout par défaut
add(jToolbar, BorderLayout.PAGE_START);
JPanel jpBoutons = new JPanel();
FlowLayout layout2 = new FlowLayout();
jpBoutons.setLayout(layout2);
layout2.setAlignment(FlowLayout.RIGHT);
jpBoutons.add(jbAnnuler);
jpBoutons.add(jbOk);
add(jpBoutons, BorderLayout.PAGE_END);
creerLignes();
}
private void creerLignes() {
// JPanel jp = new JPanel();
jpLignes.setLayout(new BoxLayout(jpLignes, BoxLayout.Y_AXIS));
jpLignes.add(new LigneNomUniteTemp(true));
for (int i = 0; i < 10; i++) {
LigneNomUniteTemp lnu = new LigneNomUniteTemp(false);
jpLignes.add(lnu);
listeLignes.add(lnu);
}
jpLignes.add(jlErreur);
add(jpLignes, BorderLayout.CENTER);
}
public ArrayList<String> getListeNoms() {
// normalement listeNoms est à jour
return listeNoms;
}
public ArrayList<String> getListeUnites() {
return listeUnites;
}
/**
* Teste si un nom de variable existe déjà
* @param nom le nom de la variable à tester
* @return true si le nom existe déjà
*/
private boolean nomExiste(String nom) {
for (String str : listeNoms) {
if (str.equals(nom)) {
return true;
}
}
return false;
}
/**
* Ajoute un nom de variable à la liste
* @param nom le nom de la variable
* @return true si le nom est bien ajouté
*/
private boolean ajouteNom(String nom) {
if (!nomExiste(nom.trim())) {
listeNoms.add(nom.trim());
return true;
}
return false;
}
/**
* Vérifie s'il y a des erreurs, et (des)active le bouton Ok
* Remplit le label erreur
* @return true si aucune erreur n'est détectée
*/
private void checkErreurs() {
boolean aucuneErreur = true;
String nom;
listeNoms.clear();
listeUnites.clear();
for (LigneNomUniteTemp lnu : listeLignes) { // pour chaque ligne
nom = lnu.getJtfNom().getText().trim();
if (nom.equals("")) {
continue;
}
// le jtfsnom ne doit pas être actif
if (lnu.getJtfNom().getEtat() == JTextFieldSouligne.ACTIF) {
jlErreur.setText(Sym.ERREUR_NOM);
aucuneErreur = false;
break;
}
// le jtfsunite non plus
if (lnu.getJtfUnite().getEtat() == JTextFieldSouligne.ACTIF) {
jlErreur.setText(Sym.ERREUR_UNITE);
aucuneErreur = false;
break;
}
// le nom doit être différent des précédents
if (!ajouteNom(nom)) {
jlErreur.setText(Sym.ERREUR_NOM_UNIQUE);
aucuneErreur = false;
break;
} else {
listeUnites.add(lnu.getJtfUnite().getText().trim());
}
}
// il doit y avoir au moins un nom
if (aucuneErreur && listeNoms.isEmpty()) {
jlErreur.setText(Sym.ERREUR_AUCUN_NOM);
aucuneErreur = false;
}
if (aucuneErreur) {
jlErreur.setText(Sym.AUCUNE_ERREUR);
}
jbOk.setEnabled(aucuneErreur);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(jbOk)) {
ok = true;
}
setVisible(false);
}
/**
*
* @return true si le dialog s'est terminé avec Ok false sinon
*/
public boolean isOk() {
return ok;
}
/**
* La classe qui permet d'insérer un caractère grec
*/
class GrecsAction extends AbstractAction {
public GrecsAction(String text, ImageIcon icon, String desc, Integer mnemonic) {
super(text, icon);
putValue(SHORT_DESCRIPTION, desc);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
Utils.insertGreekCaracter(jtfsActif);
checkErreurs();
}
}
/**
* La classe qui permet d'ajouter une nouvelle ligne
*/
class AjouterLignesAction extends AbstractAction {
public AjouterLignesAction(String text, ImageIcon icon, String desc, Integer mnemonic) {
super(text, icon);
putValue(SHORT_DESCRIPTION, desc);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
// JDialogAjouterLignes jdal = new JDialogAjouterLignes(null, tableur.getRowCount());
// jdal.setVisible(true);
// if (jdal.isOk()){
//
//
// }
// jdal.dispose();
}
}
/**
* La classe qui permet de supprimer des lignes
*/
class SupprimerLigneAction extends AbstractAction {
public SupprimerLigneAction(String text, ImageIcon icon, String desc, Integer mnemonic) {
super(text, icon);
putValue(SHORT_DESCRIPTION, desc);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
for (LigneNomUniteTemp lnu : listeLignes) {
if (lnu.getJtfNom().equals(jtfsActif)
|| lnu.getJtfUnite().equals(jtfsActif)) {
// A FINIR
}
}
}
}
public void jtfuKeyReleased(java.awt.event.KeyEvent evt) {
JTextFieldSouligne jtfsu = (JTextFieldSouligne) evt.getSource();
int n = Verificateur.parseUnite(jtfsu.getText());
if (n == -1) { // pas d'erreur dans l'unité
jtfsu.effaceTout();
} else { // erreur il faut souligner
jtfsu.souligne(n, n + 1);
}
checkErreurs();
}
public void jtfnKeyReleased(java.awt.event.KeyEvent evt) {
JTextFieldSouligne jtfsn = (JTextFieldSouligne) evt.getSource();
// Créer un noeud avec le nom de la variable
Noeud noeud = Verificateur.parseNomDeVariable(jtfsn.getText());
// Si le noeud est null, ok pas d'erreur
if (noeud == null || noeud.getType() != Sym.ERROR) {
jtfsn.effaceTout();
} else {
// si le noeud esr une erreur, afficher l'erreur
if (noeud.getType() == Sym.ERROR) {
jtfsn.souligne(noeud.getColonne(), noeud.getColonne() + 1);
}
}
checkErreurs();
}
private class LigneNomUniteTemp extends JPanel {
private JTextFieldSouligne jtfNom = new JTextFieldSouligne();
private JTextFieldSouligne jtfUnite = new JTextFieldSouligne();
public LigneNomUniteTemp(boolean titre) {
jtfNom.setColumns(NOMBRE_COLONNES_JTFS);
jtfUnite.setColumns(NOMBRE_COLONNES_JTFS);
this.setLayout(new BorderLayout(0, 0));
this.add(jtfNom, BorderLayout.WEST);
this.add(jtfUnite, BorderLayout.CENTER);
if (titre) {
jtfNom.setText("Noms");
jtfNom.setEditable(false);
jtfNom.setHorizontalAlignment(JTextField.CENTER);
jtfUnite.setText("Unités");
jtfUnite.setEditable(false);
jtfUnite.setHorizontalAlignment(JTextField.CENTER);
} else {
jtfNom.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyReleased(java.awt.event.KeyEvent evt) {
jtfnKeyReleased(evt);
}
});
jtfNom.addFocusListener(new java.awt.event.FocusAdapter() {
@Override
public void focusGained(java.awt.event.FocusEvent evt) {
jtfsActif = jtfNom;
}
});
jtfUnite.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyReleased(java.awt.event.KeyEvent evt) {
jtfuKeyReleased(evt);
}
});
jtfUnite.addFocusListener(new java.awt.event.FocusAdapter() {
@Override
public void focusGained(java.awt.event.FocusEvent evt) {
jtfsActif = jtfUnite;
}
});
}
}
public JTextFieldSouligne getJtfNom() {
return jtfNom;
}
public JTextFieldSouligne getJtfUnite() {
return jtfUnite;
}
}
}