package diploma;

import javax.swing.*;
//import javax.swing.text.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.sql.*; 
import java.util.*;
import java.io.*;
//import diploma.TabelSauCampFormatter;

public class TabelNou extends JFrame implements ActionListener, ItemListener,
	ListSelectionListener, MouseListener {
	protected StringBuffer comandaSql = new StringBuffer(), 
		comandaSqlEdPane = new StringBuffer();
	protected boolean cheiePrimara = false, auto_inc = false,	//nu pot fi 2 chei primare
		editManComSql = false;	//e editată manual comanda SQL ?
	protected String numeBazaDeDate;
	protected String[] sirTipuriCp = 
		{"--Alegeți tipul câmpului--", "char", "varchar", "tinyint", "smallint",
		"mediumint", "int", "bigint", "float", "double", "numeric", "date",
		"time", "datetime", "timestamp", "year", "tinyblob", "blob", "mediumblob",
		"longblob", "tinytext", "text", "mediumtext", "longtext", "enum", "set"};
	protected String[] formeDate = {"----Alegeți formatul----", "dd MMMMM yyyy",
		 "dd.MM.yy", "MM/dd/yy"};
    protected String[] formeTimp = {"----Alegeți formatul----", "hh:mm:ss",
    	"hh:mm:ss z"};
    protected String[] formeDateTimp = {"----Alegeți formatul----",
    	 "yyyy.MM.dd G 'at' hh:mm:ss z"};
    protected String[] formeNrReale = {"----Alegeți formatul----", "număr", 
    	"currency", "percent"};
    protected String[] formatChar = {""}; 
	protected JButton comSqlButton, anulTabButton, stergeCpButton, resetButton,
		inregCpButton, inregTabButton;
	protected JEditorPane comSqlEdPane;
	protected JList campList, indxNumeList;
	protected JFormattedTextField numeTabelFTxField, numeCampFTxField;
	protected JTextField lungCampTxField, implicTxField;
	protected JComboBox tipCpComboBox, formatCpComboBox;
	protected JCheckBox tempTabel, nenulCheckBox, implicCheckBox, nenegCheckBox, 
		zeroCheckBox, autoIncCheckBox, binaryCheckBox;
	protected JRadioButton chPrimRadButton, indUnRadButton, indNUnRadButton,
		chStrRadButton, ftextRadButton; 
	//pt a muta în față și în spate panel-ul cu enumerări
	protected JPanel  format_NrPanel, enumSetPanel, douaCarduriPanel;
	protected JPanel butCpPanel, butonPanel;		//necesar în TabelModificat când adăugăm butoane
	protected JLabel etNumeTabel, etNumeCp, etLungCp;
	protected JTabbedPane campSiIndexTabbedPane;
	protected DouaListeSiButoane enSet, indx;
	protected UmpleLista umpleEnSet, umpleIndx;
	protected Hashtable<String, Atribute> arrayCpAtribHash, arrayIdxAtribHash;
	InterfataGrafica interfataGrafica;	//interfața grafică părinte;
	
	class UmpleLista extends JPanel implements ActionListener {
		public JList destList;
		public JLabel infoLabel1, infoLabel2;
		public JTextField inputTxField;
		public JButton eliminButton;
		public JFrame ferParinte;	//fereastra părinte, creare sau modif. tabel
		
		public UmpleLista(JFrame ferPar, JList destList) {
			this.destList = destList;
			ferParinte = ferPar;
			setOpaque(true);
			setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
			infoLabel1 = new JLabel("Introduceți articolul");
			infoLabel2 = new JLabel("și apăsați <enter> :");
			inputTxField = new JTextField();
			inputTxField.setAlignmentX(0);
			inputTxField.setMaximumSize(new Dimension(135, 22));
			inputTxField.setPreferredSize(new Dimension(115, 22));
			inputTxField.addActionListener(this);
			inputTxField.setActionCommand("textfield");	
			infoLabel1.setLabelFor(inputTxField);
			infoLabel1.setDisplayedMnemonic(KeyEvent.VK_I);
			infoLabel1.setAlignmentX(0);
			infoLabel2.setAlignmentX(0);
			eliminButton = new JButton("Elimină");
			eliminButton.setAlignmentX(0);
			eliminButton.setMnemonic(KeyEvent.VK_N);
			eliminButton.setMargin(new Insets(6, 4, 6, 4));
			eliminButton.setEnabled(false);
			eliminButton.addActionListener(this);
			eliminButton.setActionCommand("button");
			add(infoLabel1);
			add(infoLabel2);
			add(inputTxField);
			add(Box.createVerticalStrut(20));
			add(eliminButton);
		}
		public void actionPerformed(ActionEvent e) {
			String comanda  = e.getActionCommand();
			if (comanda.equals("textfield")) {
			//	indxNumeList.setEnabled(false);
				String art = inputTxField.getText();
				if (campSiIndexTabbedPane.getSelectedIndex() == 0) {
					if (!((DefaultListModel) destList.getModel()).contains(art)) {
						((DefaultListModel) destList.getModel()).addElement(art);
						destList.setSelectedValue(art, true);//lista se derulează
					}
					inputTxField.selectAll();
				}
				else {
					if (((DefaultListModel) destList.getModel()).contains(art)){
						Toolkit.getDefaultToolkit().beep();
						JOptionPane.showMessageDialog(null, "Indexul cu numele "  
							+ inputTxField.getText() + " există deja, mai " + 
							"întâi el trebuie șters !");
						inputTxField.setText("");
						inputTxField.requestFocusInWindow();
						return;
					}
					if (art.equals("primary")) {
						chPrimRadButton.doClick();
					}
					inputTxField.selectAll();
					indxNumeList.clearSelection();
					indx.lista1.requestFocusInWindow();
					indx.lista1.setSelectedIndex(0);
				}
			}
			else if (comanda.equals("button")) {	//s-a apăsat but. Elimină
				int i = destList.getSelectedIndex();
				if (i < 0) return;
				String nmInd = (String) destList.getSelectedValue();
				if (campSiIndexTabbedPane.getSelectedIndex() == 0) {
					((DefaultListModel)destList.getModel()).removeElementAt(i);
					if (i > 0) {
						destList.setSelectedIndex(--i);
					}
					else destList.setSelectedIndex(i);
					destList.ensureIndexIsVisible(i);
				}
				else {	//se elimină un index 
					if (ferParinte instanceof TabelModificat) {
						int answ = JOptionPane.showConfirmDialog(null, "Sunteți"
						+ " sigur că vreți să \nștergeți indexul " + 
						nmInd + " ?", "Alegeți", JOptionPane.YES_NO_OPTION);
						if (answ == JOptionPane.NO_OPTION)
							return;
						else 
							((TabelModificat)ferParinte).ultimaActiune = 
								TabelModificat.INDEX_STERS;
					}
					((DefaultListModel)destList.getModel()).removeElementAt(i);
					destList.clearSelection();
					((DefaultListModel) indx.lista2.getModel()).removeAllElements();
					if (nmInd.equals("primary")) {
						cheiePrimara = false;
						if (! (ferParinte instanceof TabelModificat))
							chPrimRadButton.setEnabled(true);
					}
					inputTxField.setText("");
					inputTxField.requestFocusInWindow();
					Atribute atr = arrayIdxAtribHash.get(nmInd);
					if (! (ferParinte instanceof TabelModificat)) {
						//ștergem din comandaSql
						String comIdx = atr.afisAtrib (false);
						String comIdxHtml;
						int index = comandaSql.indexOf(comIdx);
	
						if (comandaSql.substring(index - 2, index - 1).equals(",")) {
							comIdx = ", " + comIdx;
							index -= 2;
						}
						else if (comandaSql.substring(index + comIdx.length() + 1,
							index + comIdx.length() + 2).equals(",")) {
							comIdx += ", ";
						}
						
						comandaSql = comandaSql.delete(index, index + comIdx.length());
						//ștergem din comandaSqlEdPane :
						String nume = "<font color=\"red\">" + atr.getProperty(
							"numeIndex") + "</font>";
						comIdxHtml = comIdx.replaceFirst(atr.getProperty("numeIndex"), 
							nume);
						index = comandaSqlEdPane.indexOf(comIdxHtml);
						comandaSqlEdPane.delete(index, 
							index + comIdxHtml.length());			
					}
					else {
						adCpSauIdxLaCom (atr, false);	
					}
					comSqlEdPane.setText(comandaSqlEdPane.toString());
					//ștergem din hashtable :
					arrayIdxAtribHash.remove(nmInd);
				}
			}
		}
	}
	
	class DouaListeSiButoane extends JPanel implements ActionListener {
		public JList lista1, lista2;
		public JButton buton1, buton2;
		public DouaListeSiButoane() {
			setLayout(new FlowLayout(FlowLayout.LEFT, 15, 0));
			AscultaLaListe ascultatorLaListe = new AscultaLaListe();
			lista1 = new JList(new DefaultListModel());	//adaugă elemente
			lista1.setLayoutOrientation(JList.VERTICAL);
			lista1.setVisibleRowCount(-1);
			lista1.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);	
			lista1.getModel().addListDataListener(ascultatorLaListe);
			JScrollPane lista1ScrPane = new JScrollPane(lista1);
			lista1ScrPane.setPreferredSize(new Dimension(120, 130));
			buton1 = new JButton("<html>Selec-<br>tează</html>");
			buton1.setAlignmentX(0.5f);
			buton1.setMargin(new Insets(6, 4, 6, 4));
			buton1.setEnabled(false);
			buton1.setMnemonic(KeyEvent.VK_S);
			buton1.addActionListener(this);
			buton2 = new JButton("<html><center>Deselec-<br>tează</center></html>");
			buton2.setAlignmentX(0.5f);
			buton2.setEnabled(false);
			buton2.setMargin(new Insets(6, 4, 6, 4));
			buton2.setMnemonic(KeyEvent.VK_D);
			buton2.addActionListener(this);
			JPanel butPanel = new JPanel();
			butPanel.setOpaque(true);
			butPanel.setLayout(new BoxLayout(butPanel, BoxLayout.Y_AXIS));
			butPanel.add(buton1);
			butPanel.add(Box.createVerticalStrut(20)) ;
			butPanel.add(buton2);
			lista2 = new JList(new DefaultListModel());
			lista2.getModel().addListDataListener(ascultatorLaListe);
			lista2.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);	
			JScrollPane lista2ScrPane = new JScrollPane(lista2);
			lista2ScrPane.setPreferredSize(new Dimension(120, 130));
			add(lista1ScrPane);
			add(butPanel);
			add(lista2ScrPane);
		}
		public void actionPerformed(ActionEvent e) {
			JButton sursaEv = (JButton) e.getSource();
			if (sursaEv.equals(buton1)) {
				DefaultListModel dlm1 = (DefaultListModel) lista1.getModel();
				DefaultListModel dlm2 = (DefaultListModel) lista2.getModel();
				if (campSiIndexTabbedPane.getSelectedIndex() == 1) {
					String nmCpCuPref = "", lungPrefInd = "";
					String nmCp = (String)lista1.getSelectedValue();
					Atribute atCp = arrayCpAtribHash.get(nmCp);
					String tipCp = atCp.getProperty("tipCamp");
					if (!tipCp.equals("char") && !tipCp.equals("varchar") &&  
						tipCp.indexOf("text") < 0 &&
						ftextRadButton.isSelected()) {// nu e char, varchar sau text
						JOptionPane.showMessageDialog(null, "Indexul fulltext " + 
							"poate fi aplicat doar tipurilor char, varchar și " + 
							"text cu derivatele sale !");
						return;
					}	//pt tipurile char, se poate specifica prefixul de indexare
					else if (tipCp.equals("char") || tipCp.equals("varchar") || 
						tipCp.indexOf("text") >= 0 || tipCp.indexOf("blob") >= 0) {
						lungPrefInd = (String)JOptionPane.showInputDialog(numeTabelFTxField,
						"Pentru tipurile char și varchar, puteți preciza "
						+"lungimea\nprefixului de indexare. Pentru blob și text"
						+" acest\nlucru e obligatoriu. Introduceți lungimea:\n",
						"Prefixul de indexare", JOptionPane.QUESTION_MESSAGE,
						null, null, null);
						try {
							int lgCp;
							int lgDia = 0;
							if(lungPrefInd != null)
								lgDia = Integer.parseInt(lungPrefInd);
							if (tipCp.equals("char") || tipCp.equals("varchar")) {
								lgCp  = Integer.parseInt(atCp.getProperty("lungCamp"));
								if (lgDia > 0 && lgDia < lgCp)
									lungPrefInd = "("+String.valueOf(lgDia)+")";
								else lungPrefInd = "";	
							}	//blob sau text:
							else {
								if (lgDia > 0) {
									lungPrefInd = tipCp.indexOf("tiny") == 0 ? 
										(lgDia < 256 ? "("+String.valueOf(lgDia)+")"
										: "(255)") : (lgDia < 500 ? 
										"("+String.valueOf(lgDia)+")" : "(500)");
								}
								else {
									lungPrefInd = tipCp.indexOf("tiny") == 0 ?
										"(255)" : "(500)";
								}
							}
						}
						catch(NumberFormatException exc) {
							lungPrefInd = tipCp.indexOf("char") >= 0 ? "" :
								((tipCp.indexOf("tiny") == 0) ? "(255)" : "(500)");
						}
					}
					nmCpCuPref = nmCp + lungPrefInd;	
					//adăugăm în lista 2
					if (lista1.getSelectedIndex() > -1) {
						for (int i = 0; i < dlm2.getSize(); i++) {
							String nume = (String)dlm2.getElementAt(i);
							if (nume.indexOf("(") < 0 && nume.equals(nmCp))
								return;
							else if (nume.indexOf("(") > 0 && 
							(nume.substring(0, nume.indexOf("("))).equals(nmCp))
								return;
						}
					} 
					dlm2.addElement(nmCpCuPref);
				}
				else {
					if (((String)tipCpComboBox.getSelectedItem()).equals("enum") 
						&& dlm2.isEmpty() && lista1.getSelectedIndex() > -1) 
							dlm2.addElement((String)lista1.getSelectedValue());
					else if (
						((String)tipCpComboBox.getSelectedItem()).equals("set")){
						Object[] elemSetSelectate = lista1.getSelectedValues();
						for (int i = 0; i < elemSetSelectate.length; i++) {
							if (! dlm2.contains((elemSetSelectate[i].toString())))
								dlm2.addElement(elemSetSelectate[i]);
						}
					}	
				}
			}
			else if (sursaEv.equals(buton2)) {
				DefaultListModel dlm = (DefaultListModel)lista2.getModel(); 
				int size = dlm.getSize();
				for (int i = 0; i < size; i++ )
					if (lista2.isSelectedIndex(i)) {
						dlm.removeElementAt(i);
						i--;	//s-a eliminat un elem
					}
			}
		}
	}

	class AscultaLaListe implements ListDataListener {
		public void contentsChanged(ListDataEvent e) {}	//nimic
		public void intervalAdded(ListDataEvent e) {
			DefaultListModel dlm = (DefaultListModel)e.getSource();
			if (dlm.equals((DefaultListModel)enSet.lista1.getModel())) {
				if (! enSet.buton1.isEnabled())
					enSet.buton1.setEnabled(true);
				if (! umpleEnSet.eliminButton.isEnabled())
					umpleEnSet.eliminButton.setEnabled(true);
			}
			else if (dlm.equals((DefaultListModel)enSet.lista2.getModel())) {
				if (! enSet.buton2.isEnabled())
					enSet.buton2.setEnabled(true);
			}
			else if (dlm.equals((DefaultListModel)campList.getModel())) {
				if (! stergeCpButton.isEnabled())
					stergeCpButton.setEnabled(true);
			}
			else if (dlm.equals((DefaultListModel)indxNumeList.getModel())) {
				if (! umpleIndx.eliminButton.isEnabled())
					umpleIndx.eliminButton.setEnabled(true);
			}
			else if (dlm.equals((DefaultListModel)indx.lista1.getModel())) {
				if (! indx.buton1.isEnabled())
					indx.buton1.setEnabled(true);
			}
			else if (dlm.equals((DefaultListModel)indx.lista2.getModel())) {
				if (! indx.buton2.isEnabled())
					indx.buton2.setEnabled(true);
			}
		}
		public void intervalRemoved(ListDataEvent e) {
			DefaultListModel dlm = (DefaultListModel)e.getSource();
			if (dlm.equals((DefaultListModel)enSet.lista1.getModel())) {
				if (enSet.buton1.isEnabled() && dlm.isEmpty())
					enSet.buton1.setEnabled(false);
				if (umpleEnSet.eliminButton.isEnabled() && dlm.isEmpty())
					umpleEnSet.eliminButton.setEnabled(false);
			}
			else if (dlm.equals((DefaultListModel)enSet.lista2.getModel())) {
				if (enSet.buton2.isEnabled() && dlm.isEmpty())
					enSet.buton2.setEnabled(false);
			}
			else if (dlm.equals((DefaultListModel)campList.getModel())) {
				if (stergeCpButton.isEnabled() && dlm.isEmpty())
					stergeCpButton.setEnabled(false);
			}
			else if (dlm.equals((DefaultListModel)indxNumeList.getModel())) {
				if (umpleIndx.eliminButton.isEnabled() && dlm.isEmpty())
					umpleIndx.eliminButton.setEnabled(false);
			}
			else if (dlm.equals((DefaultListModel)indx.lista1.getModel())) {
				if (indx.buton1.isEnabled() && dlm.isEmpty())
					indx.buton1.setEnabled(false);
			}
			else if (dlm.equals((DefaultListModel)indx.lista2.getModel())) {
				if (indx.buton2.isEnabled() && dlm.isEmpty())
					indx.buton2.setEnabled(false);
			}
		}
	}
	
	class AscultaLaFormatCamp implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if (tipCpComboBox.getSelectedIndex() == 1)	//char
				nenulCheckBox.requestFocusInWindow();
		}
	}
	
	class AscultaInregTabel implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if (editManComSql) {	//comanda e editată manual
				comandaSql = new StringBuffer(comSqlEdPane.getText());
			}
			if (auto_inc) {		//avem câmp auto incrementat
				Vector<String> toateCpIndexate = new Vector<String>();
				idxCeTrebStersi (null, toateCpIndexate);
				boolean autoIncEIndexat = false;
				for (String numeCpCurent : toateCpIndexate) {
					Atribute cpCurent = arrayCpAtribHash.get(numeCpCurent);
					String autoIncProp = cpCurent.getProperty("auto_increment");
					if (autoIncProp.equals("auto_increment")) {
						autoIncEIndexat = true;
						break;
					}
				}
				if (! autoIncEIndexat) {
					Toolkit.getDefaultToolkit().beep();
					JOptionPane.showMessageDialog(null, "Câmpul declarat ca fiind"
				 	+ " auto_increment\ntrebuie obligatoriu să fie indexat !",
					"Atenție ! Eroare !", JOptionPane.ERROR_MESSAGE);
					return;
				}
			}
	//Vedem dacă numele din com. SQL e ac. cu numele din cu numeTabelFTxField:
			int index = comandaSql.indexOf("table ");
			index += "table ".length();
			String numeTabInit = comandaSql.substring(index, 
				comandaSql.indexOf("("));
			numeTabInit = numeTabInit.trim();
			String numeTabFinal = numeTabelFTxField.getText();
			if (! numeTabInit.equals(numeTabFinal)) {
				Toolkit.getDefaultToolkit().beep();
				int answ = JOptionPane.showConfirmDialog(null,"Doriți schimbarea"
					+ " numelui tabelului din " + numeTabInit + " în " + 
					numeTabFinal + " ?", "Alt nume pentru tabel ?",
					JOptionPane.YES_NO_OPTION);
				if (answ == JOptionPane.YES_OPTION) {
					comandaSql = new StringBuffer(
						comandaSql.toString().replaceFirst(numeTabInit, 
						numeTabFinal));
					comandaSqlEdPane = new StringBuffer(
						comandaSqlEdPane.toString().replaceFirst(numeTabInit, 
						numeTabFinal));
					comSqlEdPane.setText(comandaSqlEdPane.toString());
				}
				else numeTabelFTxField.setText(numeTabInit);
			}
			//executăm comanda CREATE TABLE:
			try {
				Statement s_ment = interfataGrafica.conex.createStatement();
				s_ment.executeUpdate(comandaSql.toString() + 
					"Type=MyISAM");
				interfataGrafica.dlm.addElement(numeTabelFTxField.getText());
				interfataGrafica.intGrafList.setSelectedValue(
					numeTabelFTxField.getText(), true);
				if (interfataGrafica.infoLabel.getText().endsWith(
					"nu există nici un tabel"))
					interfataGrafica.infoLabel.setText("Baza de date activă este "
						+ numeBazaDeDate);
			}
			catch (SQLException exc) {
				JOptionPane.showMessageDialog(null, "Nu s-a putut executa "
			 	+ " comanda MySQL CREATE TABLE\n" + exc.getMessage(),
				"Atenție ! Eroare !", JOptionPane.ERROR_MESSAGE);
				return;
			}
			if (tempTabel.isSelected())	//nu copiem pe disc un tabel temporar
				return;
			//un Hashtable pt tabel
			TabelMysqlObj tabelObj = new TabelMysqlObj(numeBazaDeDate, 
				numeTabelFTxField.getText(), arrayCpAtribHash, 
				arrayIdxAtribHash);
			try {
				File bddDir = new File(numeBazaDeDate);
				if (! bddDir.exists() || ! bddDir.isDirectory()) {
					bddDir.mkdir();	//creează directorul bază de date
				}
				File tabFis = new File(numeBazaDeDate,  
					numeTabelFTxField.getText() + ".txt");
				if (tabFis.exists() && tabFis.isFile()) {
					Toolkit.getDefaultToolkit().beep();
					JOptionPane.showMessageDialog(null, "În baza de date există "
				 	+ "deja un fișier\ncu numele " + numeTabelFTxField.getText() 
				 	+ ".txt !", "Atenție ! Eroare !", JOptionPane.ERROR_MESSAGE);
					numeTabelFTxField.selectAll();
					numeTabelFTxField.requestFocusInWindow();
					return;
				}
				ObjectOutputStream objOutStr = new ObjectOutputStream(
					new FileOutputStream(tabFis));
				objOutStr.writeObject(tabelObj);
				try {
					if (objOutStr != null) objOutStr.close();
				}
				catch(IOException except) {}
			}
			catch(IOException exc) {
				Toolkit.getDefaultToolkit().beep();
					JOptionPane.showMessageDialog(null, "Nu s-au putut salva pe "
				 	+ "disc\ninformațiile despre tabel !",
					"Avertisment", JOptionPane.WARNING_MESSAGE);
			}
			dispose();	//închidem fereastra
		}
	}

public TabelNou(InterfataGrafica interfataGrafica) {
		super("Creare tabel nou");
		this.numeBazaDeDate = interfataGrafica.numeBdString;
		this.interfataGrafica = interfataGrafica;
		AscultaLaListe ascultatorLaListe = new AscultaLaListe();
		arrayIdxAtribHash = new Hashtable<String, Atribute>();
		arrayCpAtribHash = new Hashtable<String, Atribute>();
		//Primul panel, cu numele tabelului
		JPanel tabPanel = new JPanel();	
		tabPanel.setLayout(new BoxLayout(tabPanel, BoxLayout.X_AXIS));
		tabPanel.setOpaque(true);
		etNumeTabel = new JLabel("Nume tabel: ", JLabel.LEFT);
		numeTabelFTxField = new JFormattedTextField(new TabelSauCampFormatter());
		numeTabelFTxField.setFocusLostBehavior(
			JFormattedTextField.COMMIT_OR_REVERT);		
		numeTabelFTxField.setColumns(20);
		numeTabelFTxField.setMaximumSize(new Dimension(80, 22));
		numeTabelFTxField.setPreferredSize(new Dimension(60, 22));
		numeTabelFTxField.setToolTipText(
			"Maxim 64 caractere, primul literă, fără '?', ' ', \n'*', '/', '\\',"
			+ "'.' sau '('");
		etNumeTabel.setLabelFor(numeTabelFTxField);
		etNumeTabel.setDisplayedMnemonic(KeyEvent.VK_B);
		tempTabel = new JCheckBox("Tabel temporar");
		tempTabel.setMnemonic(KeyEvent.VK_P);
		tempTabel.setToolTipText(
			"Tabelul e șters la închiderea sesiunii de lucru");
		tabPanel.add(etNumeTabel);
		tabPanel.add(numeTabelFTxField);
		tabPanel.add(Box.createHorizontalGlue());
		tabPanel.add(tempTabel);
		tabPanel.setBorder(BorderFactory.createCompoundBorder(
			BorderFactory.createCompoundBorder(
				BorderFactory.createEmptyBorder(3, 5, 5, 3),
				BorderFactory.createTitledBorder("Tabel")),
			BorderFactory.createEmptyBorder(3, 6, 6, 6))); 
		//Al doilea panel, cuprinzand comanda mysql
		JPanel sqlPanel = new JPanel();
		sqlPanel.setLayout(new BoxLayout(sqlPanel, BoxLayout.X_AXIS));
		sqlPanel.setOpaque(true);
		comSqlEdPane = new JEditorPane();
		//comSqlEdPane.setEditorKit(javax.swing.text.html.HTMLEditorKit);
		comSqlEdPane.setContentType("text/html");
		comSqlEdPane.setEditable(false);
		JScrollPane comSqlScPane = new JScrollPane(comSqlEdPane, 
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		comSqlScPane.setPreferredSize(new Dimension(450, 60));
		comSqlScPane.setMaximumSize(new Dimension(550, 80));
		comSqlButton = new JButton("Editează comanda");
		comSqlButton.setMnemonic(KeyEvent.VK_E);
		comSqlButton.addActionListener(this);
		sqlPanel.add(comSqlScPane);
		sqlPanel.add(Box.createHorizontalStrut(10));
		sqlPanel.add(Box.createHorizontalGlue());
		sqlPanel.add(comSqlButton);
		sqlPanel.setBorder(BorderFactory.createCompoundBorder(
			BorderFactory.createCompoundBorder(
				BorderFactory.createEmptyBorder(8, 5, 5, 3),
				BorderFactory.createTitledBorder("Comandă MYSQL")), 
			BorderFactory.createEmptyBorder(3, 6, 6, 6))); 
		//Al treilea panel, cu lista câmpurilor tabelului
		JPanel listCampPanel = new JPanel();
		listCampPanel.setLayout(new BoxLayout(listCampPanel, BoxLayout.X_AXIS));
		listCampPanel.setOpaque(true);
		campList = new JList(new DefaultListModel());
		campList.setVisibleRowCount(-1);
		campList.setToolTipText("Lista cu câmpurile tabelului");
		campList.getModel().addListDataListener(ascultatorLaListe);
		JScrollPane listCampScPane = new JScrollPane(campList,
			JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
			JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		listCampScPane.setPreferredSize(new Dimension(500, 180));
		listCampScPane.setMaximumSize(new Dimension(600, 200));
		stergeCpButton = new JButton("Șterge câmp");
		stergeCpButton.setMnemonic(KeyEvent.VK_G);
		stergeCpButton.addActionListener(this);
		stergeCpButton.setEnabled(false);
		listCampPanel.add(listCampScPane);
		listCampPanel.add(Box.createHorizontalStrut(10));
		listCampPanel.add(Box.createHorizontalGlue());
		listCampPanel.add(stergeCpButton);
		listCampPanel.setBorder(BorderFactory.createCompoundBorder(
			BorderFactory.createCompoundBorder(
				BorderFactory.createEmptyBorder(3, 5, 5, 3),
				BorderFactory.createTitledBorder("Lista cu câmpurile tabelului")), 
			BorderFactory.createEmptyBorder(0, 6, 6, 6))); 
		//Crează panelul cu atributele câmpului editat, ce va fi și primul Tab
		//din TabbedPane
		JPanel editCampPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 
			10));
		editCampPanel.setOpaque(true);
				//Panel cu numele și tipul câmpului
		JPanel numeSiTipPanel = new JPanel();
		numeSiTipPanel.setLayout(new BoxLayout(numeSiTipPanel, 
			BoxLayout.Y_AXIS));
		numeSiTipPanel.setOpaque(true);
		JPanel numeCpPanel = new JPanel();
		numeCpPanel.setOpaque(true);
		numeCpPanel.setAlignmentX(0);
		etNumeCp = new JLabel("Nume: ", JLabel.LEFT);
		numeCampFTxField = new JFormattedTextField(new TabelSauCampFormatter());
		numeCampFTxField.setFocusLostBehavior(
			JFormattedTextField.COMMIT_OR_REVERT);		
		numeCampFTxField.setMaximumSize(new Dimension(180, 22));
		numeCampFTxField.setPreferredSize(new Dimension(120, 22));
		numeCampFTxField.setToolTipText(
			"Maxim 64 caractere, primul literă, fără '?', ' ', \n'*', '/', '\\',"
			+ "'.' sau '('");
		etNumeCp.setLabelFor(numeCampFTxField);
		etNumeCp.setDisplayedMnemonic(KeyEvent.VK_U);
		numeCpPanel.add(etNumeCp);
		numeCpPanel.add(numeCampFTxField);
		tipCpComboBox = new JComboBox(sirTipuriCp);
		tipCpComboBox.setEditable(false);
		tipCpComboBox.setAlignmentX(0);
		tipCpComboBox.addItemListener(this);
		Font simpluFont = tipCpComboBox.getFont().deriveFont(Font.PLAIN, 12);
		tipCpComboBox.setFont(simpluFont);	//în combobox va fi font plain
		numeSiTipPanel.add(numeCpPanel);
		numeSiTipPanel.add(Box.createVerticalStrut(10));
		numeSiTipPanel.add(tipCpComboBox);
		numeSiTipPanel.setBorder(BorderFactory.createCompoundBorder(
			BorderFactory.createTitledBorder("Nume și tip câmp"), 
			BorderFactory.createEmptyBorder(6, 6, 6, 6))); 
				//Panel cu formatul câmpului
		JPanel formatCpPanel = new JPanel();
		formatCpPanel.setOpaque(true);
		formatCpPanel.setLayout(new BoxLayout(formatCpPanel, BoxLayout.Y_AXIS));
		JPanel lungCpPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
		lungCpPanel.setAlignmentX(0);
		etLungCp = new JLabel("Lungime câmp: ", JLabel.LEFT);
		lungCampTxField = new JTextField();
		lungCampTxField.setMaximumSize(new Dimension(70, 22));
		lungCampTxField.setPreferredSize(new Dimension(60, 22));
		etLungCp.setLabelFor(lungCampTxField);
		etLungCp.setDisplayedMnemonic(KeyEvent.VK_L);
		lungCpPanel.add(etLungCp);
		lungCpPanel.add(lungCampTxField);
		formatCpComboBox = new JComboBox(formatChar);
		formatCpComboBox.setAlignmentX(0);
		formatCpComboBox.setEditable(false);
		formatCpComboBox.addActionListener(new AscultaLaFormatCamp());
		formatCpComboBox.setPreferredSize(new Dimension(165, 22));
		formatCpComboBox.setMaximumSize(new Dimension(180, 22));
		simpluFont = formatCpComboBox.getFont().deriveFont(Font.PLAIN, 12);
		formatCpComboBox.setFont(simpluFont);	//în combobox va fi font plain
		nenulCheckBox = new JCheckBox("Nenul (trebuie completat)");
		nenulCheckBox.setMnemonic(KeyEvent.VK_N);
		nenulCheckBox.setAlignmentX(0);
		nenulCheckBox.setToolTipText(
			"La introducerea datelor, acest câmp nu poate fi lăsat necompletat");
		JPanel implicCpPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
		implicCpPanel.setOpaque(false);
		implicCheckBox = new JCheckBox("Implicit");
		implicCheckBox.setMnemonic(KeyEvent.VK_I);
		implicCheckBox.addItemListener(this);
		implicCheckBox.setToolTipText("La introducerea datelor, asigură " 
			+ "o valoare implicită în cazul necompletării");
		implicTxField = new JTextField();
		implicTxField.setMaximumSize(new Dimension(120, 22));
		implicTxField.setPreferredSize(new Dimension(100, 22));
		implicTxField.setEnabled(false);
		implicCpPanel.add(implicCheckBox);
		implicCpPanel.add(implicTxField);
		implicCpPanel.setAlignmentX(0);
		formatCpPanel.add(lungCpPanel);
		formatCpPanel.add(formatCpComboBox);
		formatCpPanel.add(nenulCheckBox);
		formatCpPanel.add(implicCpPanel);
		formatCpPanel.setBorder(BorderFactory.createCompoundBorder(
			BorderFactory.createTitledBorder("Format câmp"),
			BorderFactory.createEmptyBorder(6, 6, 6, 6))); 
				//Panel cu campuri de tip numere
		JPanel cpNrPanel = new JPanel();
		cpNrPanel.setOpaque(true);
		cpNrPanel.setLayout(new BoxLayout(cpNrPanel, BoxLayout.Y_AXIS));
		nenegCheckBox = new JCheckBox("Nenegativ");
		nenegCheckBox.setMnemonic(KeyEvent.VK_V);
		nenegCheckBox.setToolTipText("Pentru numere întregi pozitive");
		zeroCheckBox = new JCheckBox("Prefixat cu zero");
		zeroCheckBox.setMnemonic(KeyEvent.VK_X);
		zeroCheckBox.setToolTipText(
			"La afișare va avea zerouri în față, până la lungimea câmpului");
		autoIncCheckBox = new JCheckBox("Autoincrementare");
		autoIncCheckBox.setMnemonic(KeyEvent.VK_O);
		autoIncCheckBox.addItemListener(this);	//pt. checkbox implicit
		autoIncCheckBox.setToolTipText(
			"Un singur câmp autoincrementare în tabel");
		binaryCheckBox = new JCheckBox("Binary");
		binaryCheckBox.setMnemonic(KeyEvent.VK_Y);
		//binaryCheckBox.addItemListener(this);	
		binaryCheckBox.setToolTipText(
			"Diferențiere între litere mari și litere mici");
		cpNrPanel.add(nenegCheckBox);
		cpNrPanel.add(zeroCheckBox);
		cpNrPanel.add(autoIncCheckBox);
		cpNrPanel.add(binaryCheckBox);
		cpNrPanel.setBorder(BorderFactory.createCompoundBorder(
			BorderFactory.createTitledBorder("Numere"), 
			BorderFactory.createEmptyBorder(6, 6, 6, 6)));
				//panel ce să cuprindă format și numere pt a acoperi enumSetPanel 
		format_NrPanel = new JPanel();
		format_NrPanel.setOpaque(true);
		format_NrPanel.setLayout(new BoxLayout(format_NrPanel, 
			BoxLayout.X_AXIS));
		format_NrPanel.add(formatCpPanel);
		format_NrPanel.add(Box.createHorizontalStrut(15));
		format_NrPanel.add(cpNrPanel);
		format_NrPanel.add(Box.createHorizontalGlue());
				//Panel cu listele pt. tipurile enum și set
		enumSetPanel = new JPanel();
		enumSetPanel.setOpaque(true);
		enumSetPanel.setLayout(new BoxLayout(enumSetPanel, BoxLayout.X_AXIS));
		enSet = new DouaListeSiButoane();
		enSet.lista1.setToolTipText("Lista cu elementele mulțimii");
		enSet.lista2.setToolTipText("Lista cu elementele implicite ale mulțimii");
		umpleEnSet = new UmpleLista(this, enSet.lista1);
		enumSetPanel.add(umpleEnSet);
		enumSetPanel.add(Box.createHorizontalStrut(15));
		enumSetPanel.add(enSet);
		enumSetPanel.setBorder(BorderFactory.createCompoundBorder(
			BorderFactory.createTitledBorder("Enumerări și mulțimi"), 
			BorderFactory.createEmptyBorder(6, 6, 6, 6)));	
	//Panel cu gestionarul CardLayout ce cuprinde format_NrPanel și enumSetPanel
		douaCarduriPanel = new JPanel();
		douaCarduriPanel.setOpaque(true);
		CardLayout flipCardLayout = new CardLayout();
		douaCarduriPanel.setLayout(flipCardLayout);
		douaCarduriPanel.add("FormatNrPanel", format_NrPanel);
		douaCarduriPanel.add("EnSetPanel", enumSetPanel);
		editCampPanel.add(numeSiTipPanel);
		editCampPanel.add(douaCarduriPanel);
		
				
		//Panel cu indecșii câmpurilor
		JPanel cpIndexPanel = new JPanel();
		cpIndexPanel.setOpaque(true);
		cpIndexPanel.setLayout(new BoxLayout(cpIndexPanel, BoxLayout.Y_AXIS));
		chPrimRadButton = new JRadioButton("Cheie primară");
		chPrimRadButton.setMnemonic(KeyEvent.VK_H);
		chPrimRadButton.addItemListener(this);
		indUnRadButton = new JRadioButton("Index unic", true);
		indUnRadButton.setMnemonic(KeyEvent.VK_U);
		indNUnRadButton = new JRadioButton("Index neunic");
		indNUnRadButton.setMnemonic(KeyEvent.VK_X);
		chStrRadButton = new JRadioButton("Cheie străină");
		chStrRadButton.setMnemonic(KeyEvent.VK_S);
		chStrRadButton.setEnabled(false);
		ftextRadButton = new JRadioButton("Fulltext");
		ftextRadButton.setMnemonic(KeyEvent.VK_L);
		ButtonGroup indButGroup = new ButtonGroup();
		indButGroup.add(ftextRadButton);
		indButGroup.add(indUnRadButton);
		indButGroup.add(indNUnRadButton);
		indButGroup.add(chPrimRadButton);
		indButGroup.add(chStrRadButton);
		cpIndexPanel.add(indUnRadButton);
		cpIndexPanel.add(indNUnRadButton);
		cpIndexPanel.add(chPrimRadButton);
		cpIndexPanel.add(chStrRadButton);
		cpIndexPanel.add(ftextRadButton);
		cpIndexPanel.setBorder(BorderFactory.createCompoundBorder(
			BorderFactory.createTitledBorder("Indecși"), 
			BorderFactory.createEmptyBorder(6, 6, 6, 6))); 
		
		//Panel cu toate inf. despre  indecși, al doilea Tab din TabbedPane
		JPanel indxFinPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 15, 
			15));
		indxFinPanel.setOpaque(true);
		
		//creăm lista cu numele indecșilor :		
		indxNumeList = new JList(new DefaultListModel());	//adaugă elemente
		indxNumeList.setLayoutOrientation(JList.VERTICAL);
		indxNumeList.setVisibleRowCount(-1);
		indxNumeList.setToolTipText("Lista cu indecșii tabelului");
		indxNumeList.getModel().addListDataListener(ascultatorLaListe);
		//indxNumeList.addListSelectionListener(this);
		
		indxNumeList.addMouseListener(this); 
		indxNumeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);	
		JScrollPane indxNumeScrPane = new JScrollPane(indxNumeList);
		indxNumeScrPane.setPreferredSize(new Dimension(100, 130));
		umpleIndx = new UmpleLista(this, indxNumeList);
		umpleIndx.infoLabel1.setText("Introduceți indexul");
		indx = new DouaListeSiButoane();
		indx.lista1.setToolTipText("Lista cu câmpurile tabelului");
		indx.lista1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		indx.lista2.setToolTipText("Lista cu câmpurile indexului curent");
		indxFinPanel.add(umpleIndx);
		indxFinPanel.add(indxNumeScrPane);
		indxFinPanel.add(cpIndexPanel);
		indxFinPanel.add(indx);
 
			//Creăm TabbedPane pt câmpul editat și indecși
		campSiIndexTabbedPane = new JTabbedPane();
		campSiIndexTabbedPane.addTab("Câmp", null, editCampPanel,
			"Editare câmp curent");
		campSiIndexTabbedPane.addTab("Indecși", null, indxFinPanel,
			"Stabilire indecși");
		
	
 		//Panel cu butoanele de editare câmp 
		butCpPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 80, 10));
		butCpPanel.setOpaque(true);
		inregCpButton = new JButton("Înregistrează");
		inregCpButton.setMnemonic(KeyEvent.VK_Z);
		inregCpButton.addActionListener(this);
		resetButton = new JButton("Resetare");
		resetButton.setMnemonic(KeyEvent.VK_R);
		resetButton.addActionListener(this);
		butCpPanel.add(resetButton);
		butCpPanel.add(inregCpButton);
		
		
		//Panel cu atributele câmpului, indecșii și butoanele de editare
		JPanel campPanel = new JPanel();
		campPanel.setOpaque(true);
		campPanel.setLayout(new BoxLayout(campPanel, BoxLayout.Y_AXIS));
		campPanel.add(campSiIndexTabbedPane);
		campPanel.add(butCpPanel);
		campPanel.setBorder(BorderFactory.createEmptyBorder(3, 10, 0, 10)); 
		
		//Crează panelul cu butoanele finale ale tabelului
		butonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 80, 10));
		inregTabButton = new JButton("Creare tabel");
		inregTabButton.setMnemonic(KeyEvent.VK_C);
		inregTabButton.addActionListener(new AscultaInregTabel());
		anulTabButton = new JButton("Anulare");
		anulTabButton.setMnemonic(KeyEvent.VK_A);
		anulTabButton.addActionListener(this);
		butonPanel.add(anulTabButton);
		butonPanel.add(inregTabButton);
		//Adaugă toate panel-e la unul singur
		JPanel reuniunePanel = new JPanel();
		reuniunePanel.setOpaque(true);
		reuniunePanel.setLayout(new BoxLayout(reuniunePanel, BoxLayout.Y_AXIS));
		reuniunePanel.add(sqlPanel);
		reuniunePanel.add(tabPanel);
		reuniunePanel.add(campPanel);
		reuniunePanel.add(listCampPanel);
		reuniunePanel.add(butonPanel);
		setContentPane(reuniunePanel);

		
		//Construim ordinea în care se transmite focus-ul
		this.setFocusTraversalPolicy(new FocusTraversalPolicy() {
			private Component[] compFormNrArray = {numeTabelFTxField, tempTabel, 
				numeCampFTxField, tipCpComboBox, lungCampTxField, 
				formatCpComboBox, nenulCheckBox, implicCheckBox, implicTxField, 
				nenegCheckBox, zeroCheckBox, autoIncCheckBox, binaryCheckBox, 
				resetButton, inregCpButton, campList, stergeCpButton, 
				anulTabButton, inregTabButton, comSqlButton};
			private Component[] compEnSetArray = {numeTabelFTxField, tempTabel, 
				numeCampFTxField, tipCpComboBox, umpleEnSet.inputTxField, 
				umpleEnSet.eliminButton, enSet.lista1, enSet.buton1, 
				enSet.buton2, enSet.lista2, resetButton, inregCpButton, campList, 
				stergeCpButton, anulTabButton, inregTabButton, comSqlButton};
			private Component[] compIndexArray = {numeTabelFTxField, tempTabel,
				umpleIndx.inputTxField, umpleIndx.eliminButton, indxNumeList,
				indUnRadButton, indNUnRadButton, chPrimRadButton, chStrRadButton, 
				ftextRadButton, indx.lista1, indx.buton1, indx.buton2, 
				indx.lista2, resetButton, inregCpButton, campList, 
				stergeCpButton, anulTabButton, inregTabButton, comSqlButton}; 
			public Component getComponentAfter(Container cont, Component comp) {
				int index = tipCpComboBox.getSelectedIndex();
				Component[] compon;
				if (campSiIndexTabbedPane.getSelectedIndex() == 1)
					compon = compIndexArray;
				else if (index > 23 && campSiIndexTabbedPane.getSelectedIndex() == 0) 	//avem enum sau set
					compon = compEnSetArray;
				else compon = compFormNrArray;
				int i = compon.length;
				for (int j = 0; j < i; j++) {
					if (comp.equals(compon[j])) {
						while (	! compon[(j + 1) % i].isEnabled() || 
							! compon[(j + 1) % i].isVisible())
							j++;
						return compon[(j + 1) % i];
					}
				}
				return null;	
			}
			public Component getComponentBefore(Container cont, Component comp){
				int index = tipCpComboBox.getSelectedIndex();
				Component[] compon;
				if (campSiIndexTabbedPane.getSelectedIndex() == 1)
					compon = compIndexArray;
				else if (index > 23 && campSiIndexTabbedPane.getSelectedIndex() 
					== 0) 	//avem enum sau set
					compon = compEnSetArray;
				else compon = compFormNrArray;
				int i = compon.length;
				for (int j = i - 1; j >= 0; j--) {
					if (comp.equals(compon[j])) {
						while (	! compon[(j + i - 1) % i].isEnabled() || 
							! compon[(j + 1) % i].isVisible())
							j--;
						return compon[(j + i - 1) % i];
					}
				}
				return null;		
			}
			public Component getDefaultComponent(Container cont) {
            	if (campSiIndexTabbedPane.getSelectedIndex() == 0)
            		return numeTabelFTxField;
            	else return umpleIndx.inputTxField;
        	}
        	public Component getLastComponent(Container cont) {
            	return comSqlButton;
        	}
	        public Component getFirstComponent(Container cont) {
            	if (campSiIndexTabbedPane.getSelectedIndex() == 0)
            		return numeTabelFTxField;
            	else return umpleIndx.inputTxField;
	        }
		});
	 }
	public void mouseEntered(MouseEvent e) {
		if (e.getSource() == indxNumeList) {
			indxNumeList.addListSelectionListener(this);
		}
	}
	public void mouseExited(MouseEvent e) { 
		if (e.getSource() == indxNumeList) {
			indxNumeList.removeListSelectionListener(this);
		}
	}
	public void mouseClicked(MouseEvent e) {} 
	public void mousePressed(MouseEvent e) {} 
	public void mouseReleased(MouseEvent e) {} 
//Adaugă câmpul sau indexul curent la comandaSQL	

	protected void adCpSauIdxLaCom(Atribute atr, boolean eCamp) {
		boolean primaColoana = false;
		if (comandaSql.toString().equals("")) {
			comandaSql.append("create ");
			comandaSql.append((tempTabel.isSelected() ? "temporary " : ""));
			comandaSql.append("table ");
			comandaSql.append(numeTabelFTxField.getText());
			comandaSql.append("()");
			comandaSqlEdPane.append("<html><body text=\"blue\">");
			comandaSqlEdPane.append("create ");
			comandaSqlEdPane.append((tempTabel.isSelected() ? 
				"temporary " : ""));
			comandaSqlEdPane.append("table <font color=\"red\">");
			comandaSqlEdPane.append(numeTabelFTxField.getText());
			comandaSqlEdPane.append("</font>()</body></html>");
			primaColoana = true;
		}
		String insCp = atr.afisAtrib(eCamp);
		int index = comandaSql.lastIndexOf(")");
		comandaSql = new StringBuffer(comandaSql.substring(0, index));
		comandaSql.append((primaColoana ? "" : ", "));
		comandaSql.append(insCp).append(")");
		index = comandaSqlEdPane.lastIndexOf(")");
		comandaSqlEdPane = new StringBuffer(comandaSqlEdPane.substring(0, 
			index));
		comandaSqlEdPane.append((primaColoana ? "" : ", "));
		String nume = "<font color=\"red\">" + (eCamp ? 
			atr.getProperty("numeCamp") : atr.getProperty("numeIndex"))
			+ "</font>";
		insCp = insCp.replaceFirst((eCamp ? 
			atr.getProperty("numeCamp") : atr.getProperty("numeIndex")), 
			nume);
		comandaSqlEdPane.append(insCp).append(") </body> </html>");
	}
//returnează indecșii ce au cp numeCpSters indexat, iar în vect. argument 
//toate câmpurile ce au fost indexate :
	public String idxCeTrebStersi(String numeCpSters, Vector<String> cpIdx) {	
		if (cpIdx != null) cpIdx.removeAllElements();
		else cpIdx = new Vector<String>(); 
		String idxTrebStersi = ""; 
		Object[] arrIdx = ((DefaultListModel) indxNumeList.getModel()).toArray();
		int nr = 0;	//câți indecși sunt ce indexează câmpul în cauză
		for (int i = 0; i < arrIdx.length; i++) {
			Atribute atr = arrayIdxAtribHash.get(arrIdx[i].toString());
			String cpString = atr.getProperty("listaCpIndexate");
			cpString = cpString.substring(1, cpString.length() - 1);//eliminăm ( și )
			String[] cpIdxCrt = cpString.split(", ");
			for (int k = 0; k < cpIdxCrt.length; k++) {
				String nume = ""; 	//numele câmpului, fără lungime
				if (cpIdxCrt[k].indexOf("(") > 0) {	//câmp cu lungime
					nume = cpIdxCrt[k].substring(0, cpIdxCrt[k].indexOf("("));
				}
				else nume = cpIdxCrt[k];
				if (! cpIdx.contains(nume))
					cpIdx.add(nume);
				if (numeCpSters != null && nume.equals(numeCpSters)){
					idxTrebStersi = idxTrebStersi + (nr != 0 ? 
						",  " + arrIdx[i].toString() : arrIdx[i].toString());
					nr++;
				}
			}
		}
		return idxTrebStersi;
	}
	
	protected void resetAtrib() {		//resetează atributele câmpului
		numeCampFTxField.setValue("");
		tipCpComboBox.setSelectedIndex(0);
		lungCampTxField.setText("");
		formatCpComboBox.setSelectedIndex(0);
		nenulCheckBox.setSelected(false);
		implicCheckBox.setSelected(false);
		implicTxField.setText("");
		nenegCheckBox.setSelected(false);
		zeroCheckBox.setSelected(false);
		autoIncCheckBox.setSelected(false);
		binaryCheckBox.setSelected(false);
		umpleEnSet.inputTxField.setText("");
		umpleIndx.inputTxField.setText("");
		indUnRadButton.setSelected(true);
		((DefaultListModel)enSet.lista1.getModel()).removeAllElements();
		((DefaultListModel)enSet.lista2.getModel()).removeAllElements();
		((DefaultListModel)indx.lista2.getModel()).removeAllElements();
		indx.lista1.clearSelection();
		//indxNumeList.setEnabled(true);
		indxNumeList.clearSelection();
	} 
	
	public void valueChanged(ListSelectionEvent e) {
		String numeIdx = (String)indxNumeList.getSelectedValue();
		if (e.getSource() == indxNumeList) {
			umpleIndx.inputTxField.setText(numeIdx);
			//populăm lista2 cu câmpurile indexului respectiv :
			DefaultListModel dlm = (DefaultListModel)indx.lista2.getModel();
			dlm.removeAllElements();
			String cpIndexate = 
				(arrayIdxAtribHash.get(numeIdx)).getProperty("listaCpIndexate");
			//înlăturăm [ și ] din string :
			cpIndexate = cpIndexate.substring(1, cpIndexate.length() - 1);
			String[] arrCpInd = cpIndexate.split(", ");	//obținem un șir
			for (int i = 0; i < arrCpInd.length; i++)
				dlm.addElement(((String)(arrCpInd[i])));
				
			//selectăm radio button coresp. tipului indexului
			Atribute atr = 	arrayIdxAtribHash.get(numeIdx);
			String tipIdx = atr.getProperty("tipIndex");
			if (tipIdx.equals("unique"))
				indUnRadButton.setSelected(true);
			else if (tipIdx.equals("index"))
				indNUnRadButton.setSelected(true);
			else if (tipIdx.equals("primary"))
				chPrimRadButton.setSelected(true);
			else if (tipIdx.equals("foreign key"))
				chStrRadButton.setSelected(true);
			else if (tipIdx.equals("fulltext"))
				ftextRadButton.setSelected(true);
		}
	}
	
	public void actionPerformed(ActionEvent e) {
		JButton sursaEv = (JButton) e.getSource();
		if (sursaEv.equals(comSqlButton)) {		//s-a apăsat but. de editare SQL
			Toolkit.getDefaultToolkit().beep();
			int answ = JOptionPane.showConfirmDialog(this, 
				"Dacă decideți să editați comanda MYSQL, pierdeți suportul" +
				" oferit de interfața grafică.\nEditați comanda?", "Întrebare",
				JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
			if (answ == JOptionPane.YES_OPTION) {
				editManComSql = true;
				//numeTabelFTxField.setValue("");
				//tempTabel.setSelected(false);
				resetAtrib();	//curăță atrib. cp curent : fct resetAtrib
				Component[] comp1 = {etNumeTabel, numeTabelFTxField, tempTabel,
				etNumeCp, numeCampFTxField, tipCpComboBox, etLungCp, 
				lungCampTxField, formatCpComboBox, nenulCheckBox, implicCheckBox,
				nenegCheckBox, zeroCheckBox, autoIncCheckBox, resetButton, 
				inregCpButton, campList, stergeCpButton, comSqlButton};
				Component[] comp2 = {etNumeTabel, numeTabelFTxField, tempTabel,
				umpleIndx.infoLabel1, umpleIndx.infoLabel2,
				umpleIndx.inputTxField, umpleIndx.eliminButton, indxNumeList, 
				chPrimRadButton, indUnRadButton, indNUnRadButton, chStrRadButton,
				ftextRadButton, indx.lista1, indx.lista2, indx.buton1, 
				indx.buton2, resetButton, inregCpButton, campList, 
				stergeCpButton, comSqlButton};
				Component[] comp;
				if (campSiIndexTabbedPane.getSelectedIndex() == 0)
					comp = comp1;
				else comp = comp2;
				for (int i = 0; i < comp.length; i++)
					comp[i].setEnabled(false);
				
				if (this instanceof TabelModificat) {
					((TabelModificat)this).cpNouButton.setEnabled(false); 
					((TabelModificat)this).modifCpButton.setEnabled(false); 
					((TabelModificat)this).redenTabButton.setEnabled(false); 
					((TabelModificat)this).stergeTabButton.setEnabled(false);
				}
				campSiIndexTabbedPane.setEnabled(false);
				comSqlEdPane.setEditable(true);
				comSqlEdPane.setContentType("text/plain");
				comSqlEdPane.setText(comandaSql.toString());
				comSqlEdPane.requestFocusInWindow();
			}
		}
		else if (sursaEv.equals(anulTabButton)) {	//s-a apăsat but. Anulare
			dispose();
		}
		else if (sursaEv.equals(resetButton)) {	//s-a apăsat but. Reset
			resetAtrib();
			numeCampFTxField.requestFocusInWindow();
		}
		else if (sursaEv.equals(stergeCpButton)) {	//s-a apăsat but. Ștergere
			String str = (String) campList.getSelectedValue();
			int indInsFont = str.indexOf(' ');
			String nume = str.substring(0, indInsFont);
			
			if (this instanceof TabelModificat) {
				int answ = JOptionPane.showConfirmDialog(this, "Sunteți"
					+ " sigur că vreți să \nștergeți câmpul " + 
					nume + " ?", "Alegeți", JOptionPane.YES_NO_OPTION);
				if (answ == JOptionPane.YES_OPTION) 
					((TabelModificat)this).ultimaActiune = 
						TabelModificat.CAMP_STERS;
				else return;
			}
			
			//nu putem șterge un câmp indexat :
			Vector<String> cpIdx = new Vector<String>();	//ca argument la fcț de mai jos
			String idxTrebStersi;
			if ((this instanceof TabelModificat))
				idxTrebStersi = 
					((TabelModificat)this).listIdxNumaiCuAcestCp(nume);
			else
				idxTrebStersi = idxCeTrebStersi(nume, cpIdx);
			if (! idxTrebStersi.equals("")) {
				Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(this, "<html>Câmpul nu poate fi șters" +
				" pentru că este indexat. <br>Pentru a putea fi șters, mai întâi " +
				"trebuie eliminați următorii indecși : " + idxTrebStersi);
				campSiIndexTabbedPane.setSelectedIndex(1);
				umpleIndx.eliminButton.requestFocusInWindow();
				return;
			}
			else {	//câmpul poate fi șters, el nu e indexat (unic pt TabelModificat)
				int i = campList.getSelectedIndex();
				if (i >= 0) {
					if (((DefaultListModel)indx.lista1.getModel()).contains(nume))
						((DefaultListModel)indx.lista1.getModel()).removeElement(nume);
					if (str.indexOf("auto_increment") > 0)
						auto_inc = false;	//e șters câmpul autoincrementat
					((DefaultListModel)campList.getModel()).removeElementAt(i);
					
					if ((this instanceof TabelModificat)) {
						((TabelModificat)this).stergeCpDinListaDeCpAIdx(
							arrayCpAtribHash.get(nume), true); 
						campList.clearSelection();
						adCpSauIdxLaCom(arrayCpAtribHash.get(nume), true);
					}	//Trebuie șters și din comandaSQL
					else {
						String sterg;		//pt. EditorPane
						String com;		//pt comandaSql
						if (i > 0) {	//nu e primul element
						 	campList.setSelectedIndex(--i);
						}
						else {	//e primul câmp în listă
							campList.setSelectedIndex(i);
						}
						sterg = "<font color=\"red\">" + nume 
					 		+ "</font>" + str.substring(indInsFont); 
					 	com = str;					
						int index = comandaSql.indexOf(com);
						if (comandaSql.substring(index - 2, index - 1).equals(",")) {
							com = ", " + com;
					 		sterg = ", " + sterg;
							index -= 2;
						}
						else if (comandaSql.substring(index + com.length(),
							index + com.length() + 1).equals(",")) {
							com += ", ";
					 		sterg += ", ";
						}
						
						comandaSql = comandaSql.delete(index, index + com.length());
						index = comandaSqlEdPane.indexOf(sterg);
						comandaSqlEdPane = comandaSqlEdPane.delete(index, 
							index + sterg.length());
					}
					arrayCpAtribHash.remove(nume);
					comSqlEdPane.setText(comandaSqlEdPane.toString());
					//campList.ensureIndexIsVisible(i);
				}
			}
		}
		//urmează butonul cu câmp nou :
		else if (sursaEv.equals(inregCpButton)	//pt. primul Tab 
			&& campSiIndexTabbedPane.getSelectedIndex() == 0) {
			if (numeTabelFTxField.getText().equals("")) {
				Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(this, "Trebuie completat " + 
					"câmpul cu numele tabelului !");
				numeTabelFTxField.requestFocusInWindow();
				return;
			}
			else if (numeCampFTxField.getText().equals("")) {
				Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(this, "Pentru a înregistra noul " + 
					"câmp trebuie să îi precizați numele !");
				numeCampFTxField.requestFocusInWindow();
				return;
			}
			else if (((String)tipCpComboBox.getSelectedItem()).equals("char")
					&& lungCampTxField.getText().equals("")) {
				Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(this, "Pentru tipul char " + 
					"trebuie specificată lungimea câmpului !");
				lungCampTxField.requestFocusInWindow();
				return;
			}
			else if (tipCpComboBox.getSelectedIndex() == 0) {
				Toolkit.getDefaultToolkit().beep();
				tipCpComboBox.requestFocusInWindow();
				return;
			}
//la creare tabel nu pot fi 2 cp. cu ac. nume; pt. TabelModificat, numele cp.
//modificat poate rămâne același, dar nu poate fi schimbat în numele altui cp.			
			else if (((DefaultListModel)indx.lista1.getModel()).contains(
				numeCampFTxField.getText()) && ( ! (this instanceof 
				TabelModificat) || (this instanceof TabelModificat && !
				((TabelModificat)this).campSelectat.getProperty(
					"numeCamp").equals(numeCampFTxField.getText())))) {
				Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(this, "În tabel există deja " + 
					"un câmp cu numele " + numeCampFTxField.getText() + " !");
				numeCampFTxField.requestFocusInWindow();
				return;
			}
			else if (tipCpComboBox.getSelectedIndex() > 23 &&	//enum sau set
				((DefaultListModel)enSet.lista1.getModel()).isEmpty()) {
				Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(this, "În tabel mulțimea " +
					"dată de enum sau set trebuie să conțină elemente  !");
				umpleEnSet.inputTxField.requestFocusInWindow();
				return;
			}
			
			else {
				if (! ((DefaultListModel)indx.lista1.getModel()).contains(
					numeCampFTxField.getText())) {
					((DefaultListModel)indx.lista1.getModel()).addElement(
						numeCampFTxField.getText());	//adăugăm numele la 
				}										//lista pt. indecși

				//construim atributele câmpului
				Atribute campAtrib = new Atribute(true);
				int indexTipCp = tipCpComboBox.getSelectedIndex();
				campAtrib.setProperty("numeCamp", numeCampFTxField.getText());
				campAtrib.setProperty("tipCamp", 
					(String) tipCpComboBox.getSelectedItem());
				if (indexTipCp < 24) {
					if (! lungCampTxField.getText().equals(""))
						campAtrib.setProperty("lungCamp", lungCampTxField.getText());
					else {
						if (((String)(tipCpComboBox.getSelectedItem())).equals("varchar"))
							campAtrib.setProperty("lungCamp", Integer.toString(70));
					}
					if (tipCpComboBox.getSelectedIndex() > 7 &&	//nr reale, date, time, datetime
						tipCpComboBox.getSelectedIndex() < 14 &&
						formatCpComboBox.getSelectedIndex() != 0) 
						campAtrib.setProperty("formatCamp",
							 (String)(formatCpComboBox.getSelectedItem()));
					if	(tipCpComboBox.getSelectedIndex() == 1 &&	//e char
						!formatCpComboBox.getSelectedItem().toString().equals("")) 	
						campAtrib.setProperty("formatCamp",
							 (String)(formatCpComboBox.getSelectedItem()));
					
					if (nenegCheckBox.isSelected())
						campAtrib.setProperty("unsigned", "unsigned");
					if (zeroCheckBox.isSelected())
						campAtrib.setProperty("zerofill", "zerofill");
					if (autoIncCheckBox.isSelected())
						campAtrib.setProperty("auto_increment", "auto_increment");
					if (nenulCheckBox.isSelected())
						campAtrib.setProperty("not null", "not null");
					if (implicCheckBox.isSelected()) {
						if (indexTipCp > 2 && indexTipCp < 11)	//sunt numere
							campAtrib.setProperty("default", 
								"default " + implicTxField.getText());
						else campAtrib.setProperty("default", 
							"default " + "\'" + implicTxField.getText() + "\'");
					}
					if (binaryCheckBox.isSelected())
						campAtrib.setProperty("binary", "binary");
				}	//enum sau set	
				else {
					String multime = "(";
					DefaultListModel dlm = (DefaultListModel) enSet.lista1.getModel();
					int size = dlm.getSize();
					if (size > 0) {
						Object[] elem = dlm.toArray();
						for (int i = 0; i < elem.length; i++) {
							multime += "\'" + elem[i].toString() + "\'";
							multime += i < elem.length - 1 ? ", " : ")";
						}
					}
					campAtrib.setProperty("tipCamp",
					((String)tipCpComboBox.getSelectedItem()) + multime);
					
					dlm = (DefaultListModel) enSet.lista2.getModel();
					size = dlm.getSize();
//M-am înșelat eu : enum și set nu permit clauza default.
//Am păstrat-o pentru simplitate și pt. un suport viitor eventual pt. default	
	
	/*				if (size > 0) {
						multime = "";
						multime += size == 1 ? "default " : "default(";
						Object[] elem = dlm.toArray();
						for (int i = 0; i < elem.length; i++) {
							multime += "\'" + elem[i].toString() + "\'";
							multime += i < elem.length - 1 ? ", " : "";
						}
						multime += size > 1 ? ")" : "";
						campAtrib.setProperty("default", multime);
					}		*/
					
				}
				
				if (autoIncCheckBox.isSelected()) {//o coloană autoinc. în tabel
						auto_inc = true;
						autoIncCheckBox.setEnabled(false);
				}
				adCpSauIdxLaCom(campAtrib, true);
				comSqlEdPane.setText(comandaSqlEdPane.toString());
				DefaultListModel dlm = (DefaultListModel)campList.getModel();
				String cpCurent = campAtrib.afisAtrib(true);
				dlm.addElement(cpCurent);
				campList.setSelectedValue(cpCurent, true);
			
				arrayCpAtribHash.put(campAtrib.getProperty("numeCamp"), campAtrib);
				
			}
			resetAtrib();
			numeCampFTxField.requestFocusInWindow();
		}
				//al doilea Tab :
		else if (sursaEv.equals(inregCpButton) 
			&& campSiIndexTabbedPane.getSelectedIndex() == 1) {
			if (umpleIndx.inputTxField.getText().equals("")) {
				Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(this, "Trebuie completat " + 
					"câmpul cu numele indexului !");
				umpleIndx.inputTxField.requestFocusInWindow();
				return;
			}
			else if (((DefaultListModel)indx.lista2.getModel()).isEmpty()) {
				Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(this, "Lista cu câmpurile " + 
					"indexate nu poate fi vidă !");
				indx.buton1.requestFocusInWindow();
				return;
			}
			else if (((DefaultListModel)indxNumeList.getModel()).contains(
				umpleIndx.inputTxField.getText())) {	
				Toolkit.getDefaultToolkit().beep();
				JOptionPane.showMessageDialog(this, "Tabelul conține deja un " + 
					"index cu numele " +  umpleIndx.inputTxField.getText() + "!");
				umpleIndx.inputTxField.selectAll();
				umpleIndx.inputTxField.requestFocusInWindow();
				return;
			}
			else {
				if (! ((DefaultListModel)indxNumeList.getModel()).contains(
					umpleIndx.inputTxField.getText())) {
						((DefaultListModel)indxNumeList.getModel()).addElement(
						umpleIndx.inputTxField.getText());
						umpleIndx.destList.setSelectedValue(
							umpleIndx.inputTxField.getText(), true);//lista se derulează
					}
						
				Atribute indexAtrib = new Atribute(false);	
				indexAtrib.setProperty("numeIndex", umpleIndx.inputTxField.getText());
				if (indUnRadButton.isSelected())
					indexAtrib.setProperty("tipIndex", "unique");
				if (indNUnRadButton.isSelected())
					indexAtrib.setProperty("tipIndex", "index");
				if (chPrimRadButton.isSelected())
					indexAtrib.setProperty("tipIndex","primary key");
				if (chStrRadButton.isSelected())
					indexAtrib.setProperty("tipIndex", "foreign key");
				if (ftextRadButton.isSelected())
					indexAtrib.setProperty("tipIndex", "fulltext");
				String st = ((DefaultListModel) indx.lista2.getModel()).toString();
				indexAtrib.setProperty("listaCpIndexate", "(" + 
					st.substring(1, st.length() - 1) + ")");
				adCpSauIdxLaCom(indexAtrib, false);	
				comSqlEdPane.setText(comandaSqlEdPane.toString());

				arrayIdxAtribHash.put(indexAtrib.getProperty("numeIndex"),
					indexAtrib);
				resetAtrib();
				if(! (this instanceof TabelModificat)) {
					if (cheiePrimara) chPrimRadButton.setEnabled(false);
					else chPrimRadButton.setEnabled(true);
				}
				umpleIndx.inputTxField.requestFocusInWindow();

			}
		}
	}
	public void itemStateChanged(ItemEvent e) {
		if (e.getItemSelectable().equals(implicCheckBox)) {
			if (e.getStateChange() == e.SELECTED) {
				implicTxField.setEnabled(true);	//activat câmpul default
				nenulCheckBox.setSelected(true);
				implicTxField.requestFocusInWindow();
				if (autoIncCheckBox.isEnabled())
					autoIncCheckBox.setEnabled(false);	//autoincrem. e dezactivată
			} 
			else {
				if (! auto_inc && 
					((String)tipCpComboBox.getSelectedItem()).indexOf("int") >= 0)
					autoIncCheckBox.setEnabled(true);	//autoincrem. e activată
				implicTxField.setText("");
				implicTxField.setEnabled(false); //dezactivat altfel
				nenulCheckBox.setSelected(false);
			}	
		}
		else if (e.getItemSelectable().equals(autoIncCheckBox)) { 
			if (e.getStateChange() == e.SELECTED) {
			 	if (nenegCheckBox.isEnabled()) 
			 		nenegCheckBox.setSelected(true);
			 	if (nenulCheckBox.isEnabled()) 
			 		nenulCheckBox.setSelected(true);
				implicCheckBox.setEnabled(false);
			}
			else {
				implicCheckBox.setEnabled(true);	
				nenegCheckBox.setSelected(false);
				nenulCheckBox.setSelected(false);
			}
		}
		else if (e.getItemSelectable().equals(chPrimRadButton)) {
			if (e.getStateChange() == e.SELECTED) {
				umpleIndx.inputTxField.setEditable(false);
				umpleIndx.inputTxField.setText("primary");
				cheiePrimara = true;
			}
			else {
				umpleIndx.inputTxField.setEditable(true);
				umpleIndx.inputTxField.setText("");
			}
		}
			//urmează selecțiile din combobox cu tipul câmpului
//Obs : era preferat să folosesc numele tipurilor, dar cu index e mai compact
		else if (e.getItemSelectable().equals(tipCpComboBox)) {
			Component[] comp = {etLungCp, lungCampTxField, formatCpComboBox, 
			 	nenulCheckBox, implicCheckBox, implicTxField, nenegCheckBox, 
			  	zeroCheckBox, autoIncCheckBox};
			int selIndx = tipCpComboBox.getSelectedIndex();
			if (selIndx == 1) {	//dacă e char, putem edita formatul câmpului
				formatCpComboBox.setModel(new DefaultComboBoxModel(formatChar));
				formatCpComboBox.setEditable(true);
				formatCpComboBox.setToolTipText("Folosiți simbolurile " +
					"definite în clasa MaskFormatter");
				//formatCpComboBox.getEditor().getEditorComponent().					
			}
			else {
				formatCpComboBox.setEditable(false);
				formatCpComboBox.setToolTipText("Selectați din lista de mai jos");
			}
			if (selIndx == 1 || selIndx == 2 || (selIndx > 19 && selIndx < 24))
				binaryCheckBox.setEnabled(true);
			else {
				binaryCheckBox.setEnabled(false);
				binaryCheckBox.setSelected(false);
			}
			if (((String)tipCpComboBox.getSelectedItem()).indexOf("int") >= 0 
				 && ! auto_inc) {
				autoIncCheckBox.setEnabled(true);	
			}
			else autoIncCheckBox.setEnabled(false);
			if ( selIndx > -1 && selIndx < 24) {	//avem altceva decât enum , set
				((CardLayout)douaCarduriPanel.getLayout()).show(douaCarduriPanel,
						"FormatNrPanel");		//se schimbă cardul
				autoIncCheckBox.setSelected(false);//când se schimbă tipul se curăță 
				implicCheckBox.setSelected(false);//căsuțele
				implicTxField.setText("");
				nenegCheckBox.setSelected(false);
				nenulCheckBox.setSelected(false);
				zeroCheckBox.setSelected(false);
				lungCampTxField.setText("");
			}
			else if (selIndx == 24 || selIndx == 25){		//avem enum sau set
					((CardLayout)douaCarduriPanel.getLayout()).show(douaCarduriPanel,
						"EnSetPanel");		//se schimbă cardul
				if (selIndx == 24) 		//enum
					enSet.lista1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION );
				else {
					enSet.lista1.setSelectionMode(
						ListSelectionModel.SINGLE_INTERVAL_SELECTION );	
					enSet.lista2.setSelectionMode(
						ListSelectionModel.SINGLE_INTERVAL_SELECTION );	
				}
			}
	//Urmează : dependent de șirul tipurilor, dacă se schimbă, și 15 treb. 
	//modificat. E vorba de tipurile blob și text :		
			if ( selIndx > 15 && selIndx < 24) {
				for (int i = 0; i < comp.length; i++)
					comp[i].setEnabled(false);
			}	//Urmează : tipurile char și varchar
			else if (selIndx == 1 || selIndx == 2){
				lungCampTxField.setInputVerifier(new LungCpInputVerifier(
					((String)tipCpComboBox.getSelectedItem())));
				for (int i = 0; i < comp.length - 1; i++) {	//fără autoInc
					if (i > 4) comp[i].setEnabled(false);
					else comp[i].setEnabled(true);	//căsuțele de numere dezactivate
					if (selIndx == 2) 
						formatCpComboBox.setEnabled(false);
				}
			}
			else if (selIndx > 2 && selIndx < 11){		//tipurile int și real
				for (int i = 0; i < comp.length - 1; i++)// comp.length - 1:fără autoinc.
					comp[i].setEnabled(true);
				implicTxField.setEnabled(false);
				//formatCpComboBox.setEditable(false);
				if (selIndx < 8) 		//nr întregi
					formatCpComboBox.setEnabled(false);
				else {					//nr reale
					formatCpComboBox.setEnabled(true);
					formatCpComboBox.setModel(new DefaultComboBoxModel(
						formeNrReale));
				}
				lungCampTxField.setInputVerifier(new LungCpInputVerifier(
					((String)tipCpComboBox.getSelectedItem())));
			}
			else if (selIndx > 10 && selIndx < 16) {	//tipurile date calendar
				//formatCpComboBox.setEditable(false);
				nenegCheckBox.setEnabled(false);
				zeroCheckBox.setEnabled(false);
				nenulCheckBox.setEnabled(true);
				implicCheckBox.setEnabled(true);
				if (selIndx < 14) {
					lungCampTxField.setEnabled(false);
					formatCpComboBox.setEnabled(true);
					switch (selIndx) {
						case 11 : formatCpComboBox.setModel(new 
							DefaultComboBoxModel(formeDate));
							break;
						case 12 : formatCpComboBox.setModel(new 
							DefaultComboBoxModel(formeTimp));
							break;
						case 13 : formatCpComboBox.setModel(new 
							DefaultComboBoxModel(formeDateTimp));
							break;
					}
				}
				else {				//timestamp sau year
						etLungCp.setEnabled(true);
						lungCampTxField.setEnabled(true);
						lungCampTxField.setInputVerifier(new LungCpInputVerifier(
							((String)tipCpComboBox.getSelectedItem())));
						formatCpComboBox.setEnabled(false);
				}
			}
		}
	}
}

//Creăm un InputVerifier pt. lungime câmp
class LungCpInputVerifier extends InputVerifier {
	private String tipCp;
	JTextField lgCp;
	LungCpInputVerifier(String tipCp) {
		super();
		this.tipCp = tipCp;
	}
	public boolean verify(JComponent input) {
		lgCp = (JTextField) input;
		int lg, zec;	//lung tot. a nr și nr. de zecimale
		if (lgCp.getText().equals("") && ! tipCp.equals("char")) return true;	//cp. cu lungime poate fi necompletat
		else if (tipCp.equals("float") || tipCp.equals("double") ||
			tipCp.equals("numeric")) {
			String str = lgCp.getText();
			int i = str.indexOf(',');
			if (i > 0) {
				String intreg = str.substring(0, i);
				String zecimal = str.substring(i + 1).trim();
				try {
					lg = Integer.parseInt(intreg);
					zec = Integer.parseInt(zecimal);
				}
				catch (NumberFormatException e) {
					return false;
				} 
			}
			else {
				try { 
					lg = Integer.parseInt(str);
					zec = 0;
				}
				catch (NumberFormatException e) {
					return false;
				}
				lgCp.setText(str + ", 0"); 
			}
			if (tipCp.equals("float")) return (lg > 0 && lg < 40 && lg > zec);
			else if (tipCp.equals("double")) return (lg > 0 && 
				lg < 310 && lg > zec);
			else return (lg > 0 && lg < 256 && zec > -1 && zec <
				31 &&  zec <= lg - 2);
		}
		else {
			try {
				lg = Integer.parseInt(lgCp.getText());
			}
			catch (NumberFormatException e) {
				return false;
			} 
			if (tipCp.equals("tinyint")) {
				return (lg < 4 && lg > 0);
			}
			else if (tipCp.equals("smallint")) {
				return (lg < 6 && lg > 0);
			}
			else if (tipCp.equals("mediumint")) {
				return (lg < 9 && lg > 0);
			}
			else if (tipCp.equals("int")) {
				return (lg < 11 && lg > 0);
			}
			else if (tipCp.equals("bigint")) {
				return (lg < 21 && lg > 0);
			}
			else if (tipCp.equals("char") || tipCp.equals("varchar")) {
				return (lg < 256 && lg > 0);
			}
			else if (tipCp.equals("timestamp")) {
				return (lg < 15 && lg > 0 && lg % 2 == 0);
			}
			else if (tipCp.equals("year"))
				return (lg == 2 || lg == 4);
		else return true;
		}
	}
	public boolean shouldYieldFocus(JComponent input) {
		return verify(input);
	}
}

