/*
* gestEditor.java
*
* Created on 2004
* Created by Arsenio Molinero
* Copyright (C) 2004, 2005 Arsenio Molinero
*
* GestDB - a Java multi database client
*
* This file is part of GestDB.
*
* GestDB 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 2 of the License, or
* (at your option) any later version.
*
* GestDB 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 GestDB; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.GestDB.swing;
import com.GestDB.sql.*;
import com.GestDB.*;
import java.awt.*;
import java.awt.event.ContainerEvent;
import java.awt.event.FocusEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.TreeMap;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JEditorPane;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.event.CaretEvent;
import com.utils.utilidades;
import java.awt.event.*;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.swing.text.Segment;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;
import javax.swing.undo.UndoableEdit;
/** Se encarga de gestionar los editores de sql, permitiendo tener varios y sacar la SQL
* o poner la SQL s�lo en el que esta visible
* @author seni
*/
public class gestEditor {
private java.util.HashMap editores = new java.util.HashMap();
private java.util.Vector vUndoManagers = new java.util.Vector();
private javax.swing.JTabbedPane tabbed = null;
private SqlEditorKit kit = new SqlEditorKit();
private SQLPannel sqlpannel = null;
private Object tokens[] = null;
private JPopupMenu jpo = new JPopupMenu();
private JList jl = new JList();
private JScrollPane jsp = new JScrollPane();
private Vector tablas = null;
private String tablaActualCampos = "";
private Vector campos = new Vector();
private String letraAnterior = "";
/** crea una nueva instancia de gestEditor
*/
public gestEditor(javax.swing.JTabbedPane tabbed, final SQLPannel sqlpannel) {
this.tabbed = tabbed;
this.sqlpannel = sqlpannel;
this.tabbed.addContainerListener(new ContainerListener() {
public void componentAdded(ContainerEvent e) {
// throw new UnsupportedOperationException("Not supported yet.");
}
public void componentRemoved(ContainerEvent e) {
editores.remove(((CloseButtonTabbedPane)e.getSource()).sLastTitleRemoved);
vUndoManagers.remove(((CloseButtonTabbedPane)e.getSource()).nLastPositionRemoved);
sqlpannel.padre.saveAll(sqlpannel.padre);
}
});
TreeMap tmTokens = new TreeMap();
for(int i=0;i<Token.tipos.length;i++)
{
tmTokens.put(Token.tipos[i].toString(),Token.tipos[i]);
}
for(int i=0;i<Token.claves.length;i++)
{
tmTokens.put(Token.claves[i].toString(),Token.claves[i]);
}
DefaultComboBoxModel cbm = (DefaultComboBoxModel)sqlpannel.getTablas();
tablas = new Vector(cbm.getSize());
for(int i=0, j = cbm.getSize(); i < j; i++)
{
tmTokens.put(cbm.getElementAt(i).toString(),cbm.getElementAt(i).toString());
tablas.addElement(cbm.getElementAt(i));
}
tokens = tmTokens.keySet().toArray();
jsp.setViewportView(jl);
jsp.setPreferredSize(new Dimension(150,150));
jl.addMouseListener(new MouseListener(){
public void mouseReleased(MouseEvent e){ ; }
public void mousePressed(MouseEvent e) { ; }
public void mouseExited(MouseEvent e) { ; }
public void mouseEntered(MouseEvent e) { ; }
public void mouseClicked(MouseEvent e)
{
JList jl = (JList)e.getSource();
if(jl.getSelectedValue() != null)
addProposal(jl.getSelectedValue().toString());
}
});
/*
jl.setCellRenderer(new ListCellRenderer() {
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
JLabel jla = new JLabel();
if(value instanceof Token)
{
jla.setText(value.toString());
jla.setForeground(((Token)value).getColor());
///// ponemos el icono
}
else
{
jla.setText((String)value);
}
if(isSelected)
jla.setBackground(list.getSelectionBackground());
else
jla.setBackground(list.getBackground());
if(cellHasFocus)
jla.setBorder(new BevelBorder(BevelBorder.LOWERED));
return jla;
}
});
*/
jpo.add(jsp);
}
public void addEditor() {
JEditorPane query = new JEditorPane();
query.setMargin(new Insets(3,kit.anchoNumeracion,3,3));
JScrollPane jScrollPane1 = new JScrollPane();
query.setEditorKitForContentType("text/sql", kit);
query.setContentType("text/sql");
query.setBackground(Color.white);
query.setFont(new Font("Verdana", 0, 12));
query.setEditable(true);
query.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
queryKeyReleased(evt,false);
}
public void keyPressed(java.awt.event.KeyEvent evt) {
if((evt.getModifiers() & evt.ALT_MASK) !=0 && jpo.isVisible()) // si esta la tecla alt pulsada comprobamos si es flechga arriba, abajo, pagina avajo, arriba para llamar con las repeticiones
{
if((evt.getKeyCode() == evt.VK_UP || evt.getKeyCode() == evt.VK_KP_UP)) // mueve la selecci�n para arriba en el selector
{
queryKeyReleased(evt,true);
}
else if((evt.getKeyCode() == evt.VK_DOWN || evt.getKeyCode() == evt.VK_KP_DOWN)) // mueve la selecci�n para abajo en el selector
{
queryKeyReleased(evt,true);
}
else if(evt.getKeyCode() == evt.VK_PAGE_UP) // mueve la selecci�n siete posiciones para arriba en el selector
{
queryKeyReleased(evt,true);
}
else if(evt.getKeyCode() == evt.VK_PAGE_DOWN ) // mueve la selecci�n siete posiciones para abajo en el selector
{
queryKeyReleased(evt,true);
}
}
}
});
query.addFocusListener(new java.awt.event.FocusListener() {
public void focusGained(FocusEvent e) {
pintaPosicion(0,(JEditorPane)e.getSource());
}
public void focusLost(FocusEvent e) {
}
});
query.addCaretListener(new javax.swing.event.CaretListener() {
public void caretUpdate(CaretEvent e) {
pintaPosicion(0,(JEditorPane)e.getSource());
}
});
query.addMouseMotionListener(new java.awt.event.MouseMotionAdapter()
{
public void mouseMoved(java.awt.event.MouseEvent evt)
{
posx = evt.getX();
posy = evt.getY();
}
});
query.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent evt) {
if((evt.getModifiers() & evt.BUTTON3_MASK) != 0 && sqlpannel.popmEditor.isShowing() == false)
{
sqlpannel.popmEditor.show(evt.getComponent(),evt.getX(),evt.getY());
}
}
public void mousePressed(MouseEvent e) {
// throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseReleased(MouseEvent e) {
// throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseEntered(MouseEvent e) {
// throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseExited(MouseEvent e) {
// throw new UnsupportedOperationException("Not supported yet.");
}
});
// prepara la parte de deshacer y rehacer
UndoManager undomgr = new UndoManager();
vUndoManagers.addElement(undomgr);
query.getDocument().addUndoableEditListener(new Undoer()); // asocia gestor de deshacer a documento del editor
jScrollPane1.setAutoscrolls(true);
jScrollPane1.setViewportView(query);
// comprobamos si tenemos m�s pesta�as que se llamen "query" + numero para ver cual es el numero mayor y sacar el siguiente
int mxEditor = editores.size();
for(int i=0; i < tabbed.getTabCount(); i++)
{
if(tabbed.getTitleAt(i).startsWith("query "))
{
try {
mxEditor = Math.max(mxEditor, Integer.parseInt(tabbed.getTitleAt(i).trim().substring(6)));
} catch(Exception e)
{
;
}
}
}
String Nombre = "query " + (mxEditor + 1);
tabbed.addTab(Nombre + " ",jScrollPane1);
editores.put(Nombre,query);
}
public void addEditor(String stitulo, String squery) {
if(editores.containsKey(stitulo) == false)
{
JEditorPane query = new JEditorPane();
query.setMargin(new Insets(3,kit.anchoNumeracion,3,3));
JScrollPane jScrollPane1 = new JScrollPane();
query.setEditorKitForContentType("text/sql", kit);
query.setContentType("text/sql");
query.setBackground(Color.white);
query.setFont(new Font("Verdana", 0, 12));
query.setEditable(true);
query.setText(squery);
query.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
queryKeyReleased(evt, false);
}
public void keyPressed(java.awt.event.KeyEvent evt) {
if((evt.getModifiers() & evt.ALT_MASK) !=0 && jpo.isVisible()) // si esta la tecla alt pulsada comprobamos si es flechga arriba, abajo, pagina avajo, arriba para llamar con las repeticiones
{
if((evt.getKeyCode() == evt.VK_UP || evt.getKeyCode() == evt.VK_KP_UP)) // mueve la selecci�n para arriba en el selector
{
queryKeyReleased(evt,true);
}
else if((evt.getKeyCode() == evt.VK_DOWN || evt.getKeyCode() == evt.VK_KP_DOWN)) // mueve la selecci�n para abajo en el selector
{
queryKeyReleased(evt,true);
}
else if(evt.getKeyCode() == evt.VK_PAGE_UP) // mueve la selecci�n siete posiciones para arriba en el selector
{
queryKeyReleased(evt,true);
}
else if(evt.getKeyCode() == evt.VK_PAGE_DOWN ) // mueve la selecci�n siete posiciones para abajo en el selector
{
queryKeyReleased(evt,true);
}
}
}
});
query.addFocusListener(new java.awt.event.FocusListener() {
public void focusGained(FocusEvent e) {
pintaPosicion(0,(JEditorPane)e.getSource());
}
public void focusLost(FocusEvent e) {
}
});
query.addCaretListener(new javax.swing.event.CaretListener() {
public void caretUpdate(CaretEvent e) {
pintaPosicion(0,(JEditorPane)e.getSource());
}
});
query.addMouseMotionListener(new java.awt.event.MouseMotionAdapter()
{
public void mouseMoved(java.awt.event.MouseEvent evt)
{
posx = evt.getX();
posy = evt.getY();
}
});
// prepara la parte de deshacer y rehacer
UndoManager undomgr = new UndoManager();
vUndoManagers.addElement(undomgr);
query.getDocument().addUndoableEditListener(new Undoer()); // asocia gestor de deshacer a documento del editor
jScrollPane1.setAutoscrolls(true);
jScrollPane1.setViewportView(query);
tabbed.addTab(stitulo + " ",jScrollPane1);
editores.put(stitulo,query);
}
else
{
JEditorPane query = (JEditorPane)editores.get(stitulo);
query.setText(squery);
}
}
private void queryKeyReleased(java.awt.event.KeyEvent evt, boolean esPressed) {
// Si es F5 o F9 ejecuta la query
if ( evt.getKeyCode() == evt.VK_F5 || evt.getKeyCode() == evt.VK_F9 || (evt.getKeyCode() == KeyEvent.VK_ENTER && evt.isControlDown()) )
{
// saca la query para bloquear
if(sqlpannel != null)
{
if(this.getQuery().indexOf(";") != -1) sqlpannel.jbEjecutarTodo();
else sqlpannel.EjecutarQuery();
}
}
else if((evt.getModifiers() & evt.ALT_MASK) !=0) // si se pulsa alt comprobamos si hay que cambiar de pesta�a o seleccionar un elemento del popup
{
if(evt.getKeyCode() == evt.VK_LEFT)
{
if(tabbed.getSelectedIndex() > 0)
{
tabbed.setSelectedIndex(tabbed.getSelectedIndex()-1);
PonCursor pc = new PonCursor();
pc.start();
}
}
else if(evt.getKeyCode() == evt.VK_RIGHT)
{
int indice = tabbed.getSelectedIndex();
if(indice < (tabbed.getTabCount()-1))
{
tabbed.setSelectedIndex(indice+1);
PonCursor pc = new PonCursor();
pc.start();
}
}
else if(evt.getKeyCode() >= evt.VK_1 && evt.getKeyCode() <= evt.VK_9 && ((evt.getModifiers() & evt.SHIFT_MASK) !=0))
{
// se va a la pesta�a que corresponda con el n�mero tecleado
int indice = evt.getKeyCode() - evt.VK_1; // lo igualo al indice evt.VK_1 es el 39.
if(indice < (tabbed.getTabCount()))
{
tabbed.setSelectedIndex(indice);
PonCursor pc = new PonCursor();
pc.start();
}
}
else if((evt.getKeyCode() == evt.VK_UP || evt.getKeyCode() == evt.VK_KP_UP) && jpo.isVisible() && esPressed) // mueve la selecci�n para arriba en el selector
{
// tenemos que mover hacia arriba la selecci�n del list
if(jl.getSelectedIndex() == -1)
jl.setSelectedIndex(0);
else if(jl.getSelectedIndex() != 0)
jl.setSelectedIndex(jl.getSelectedIndex()-1);
jl.ensureIndexIsVisible(jl.getSelectedIndex());
}
else if((evt.getKeyCode() == evt.VK_DOWN || evt.getKeyCode() == evt.VK_KP_DOWN) && jpo.isVisible() && esPressed) // mueve la selecci�n para abajo en el selector
{
// tenemos que mover hacia abajo la selecci�n del list
if(jl.getSelectedIndex() == -1)
jl.setSelectedIndex(0);
else if(jl.getSelectedIndex() < (jl.getModel().getSize()-1))
jl.setSelectedIndex(jl.getSelectedIndex()+1);
jl.ensureIndexIsVisible(jl.getSelectedIndex());
}
else if(evt.getKeyCode() == evt.VK_PAGE_UP && jpo.isVisible() && esPressed) // mueve la selecci�n siete posiciones para arriba en el selector
{
// tenemos que mover hacia arriba la selecci�n del list
if(jl.getSelectedIndex() < 7)
jl.setSelectedIndex(0);
else
jl.setSelectedIndex(jl.getSelectedIndex()-7);
jl.ensureIndexIsVisible(jl.getSelectedIndex());
}
else if(evt.getKeyCode() == evt.VK_PAGE_DOWN && jpo.isVisible() && esPressed) // mueve la selecci�n siete posiciones para abajo en el selector
{
// tenemos que mover hacia abajo la selecci�n del list
if(jl.getSelectedIndex() > (jl.getModel().getSize()-8))
jl.setSelectedIndex(jl.getModel().getSize()-1);
else
jl.setSelectedIndex(jl.getSelectedIndex()+7);
jl.ensureIndexIsVisible(jl.getSelectedIndex());
}
else if(evt.getKeyCode() == evt.VK_ENTER && jpo.isVisible() && esPressed)
{
if(jl.getSelectedValue() != null)
addProposal(jl.getSelectedValue().toString());
}
else if(evt.getKeyCode() == evt.VK_DELETE && !jpo.isVisible()) // si se pulsa alt y suprimir cargamos las proposiciones
{
if(evt.getSource() instanceof JEditorPane)
MuestraProposiciones((JEditorPane)evt.getSource(),true);
}
else if(jpo.isVisible())
{
// es cualquier otra tecla, tenemos que posicionar el curso en la primera coincidencia
char letras[] = new char[1];
letras[0] = evt.getKeyChar();
String letra = new String(letras);
letra = letra.toLowerCase();
DefaultComboBoxModel cbm = (DefaultComboBoxModel)jl.getModel();
int posini = 0;
if(letraAnterior.length() > 0 &&
letraAnterior.charAt(0) == letra.charAt(0) &&
jl.getSelectedIndex() != -1 &&
jl.getSelectedIndex() < (cbm.getSize()-2) &&
cbm.getElementAt(jl.getSelectedIndex()+1).toString().toLowerCase().charAt(0) == letra.charAt(0))
posini = jl.getSelectedIndex()+1;
for(int i=posini, j = cbm.getSize(); i < j; i++)
{
if(cbm.getElementAt(i).toString().toLowerCase().charAt(0) == letra.charAt(0))
{
jl.setSelectedIndex(i);
jl.ensureIndexIsVisible(i);
break;
}
}
letraAnterior = letra;
}
}
else if(evt.getKeyCode() == evt.VK_F1)
{
com.GestDB.swing.Alerta al = new com.GestDB.swing.Alerta(new javax.swing.JDialog(),
Gestor.GetLiteral("conexion_help","Ayuda"), true,
Gestor.GetLiteral("gesteditor.help",""), com.GestDB.swing.Alerta.OK);
al.setVisible(true);
}
else if(evt.getKeyCode() == evt.VK_ESCAPE)
{
jpo.setVisible(false);
}
else if((evt.getModifiers() & evt.CTRL_MASK) !=0) // si se pulsa control comprobamos si es deshacer o rehacer
{
if(evt.getKeyCode() == evt.VK_Z) // deshacer
{
if(editores.size() > 0)
{
try{
((UndoManager)vUndoManagers.elementAt(tabbed.getSelectedIndex())).undo();
}catch(CannotUndoException ex){
//_cannot undo
}
updateUndo(); //_actualiza estado de botones
}
}
else if(evt.getKeyCode() == evt.VK_Y) // rehacer
{
if(editores.size() > 0)
{
try{
((UndoManager)vUndoManagers.elementAt(tabbed.getSelectedIndex())).redo();
}catch(CannotRedoException ex){
//_cannot redo
}
updateUndo(); //_actualiza estado de botones
}
}
}
else
{
if(evt.getSource() instanceof JEditorPane && jpo.isVisible())
MuestraProposiciones((JEditorPane)evt.getSource(),false);
}
}
private void MuestraProposiciones(JEditorPane editor, boolean verTodo)
{
// es cualquier otra cosa. Voy a presentar una lista con posibles palabras
// tengo que comprobar si ha escrito algo y si es as� presento s�lo las coincidencias
String palabra = getPalabraActual(0,editor);
if(verTodo)
{
Vector vtokens = new Vector(tokens.length);
for(int i=0; i < tokens.length; i++)
vtokens.addElement(tokens[i]);
if(vtokens.size() > 0)
{
jl.setModel(new DefaultComboBoxModel(vtokens));
Point punto = editor.getCaret().getMagicCaretPosition();
Point punto2 = editor.getLocationOnScreen();
// tenemos que ponelo por encima del texto, eso se hace calculando el alto del popup
if(jpo != null && punto2 != null && punto != null)
{
jpo.setLocation(punto2.x + punto.x+12,(punto2.y + punto.y)-jpo.getHeight());
jpo.setVisible(true);
}
}
else
jpo.setVisible(false);
}
else if(palabra != null && palabra.length() > 0)
{
// filtramos
Vector vtokens = new Vector(tokens.length);
palabra = palabra.toUpperCase();
// si en la palabra tenemos un punto tenemos que comprobar si lo de delante es el nombre de una tabla valida
// de serlo tenemos que traernos sus campos para rellenar el combo
if(palabra.indexOf('.') != -1)
{
// tenemos parte izquierda del punto y parte derecha
String izquierda = palabra.substring(0,palabra.indexOf('.'));
if(palabra.indexOf('.') == palabra.length()-1)
palabra = "";
else
palabra = palabra.substring(palabra.indexOf('.')+1);
// nos aseguramos que izquierda tenga contenido y que exista la tabla
if(izquierda.trim().length() != 0 && tablas.contains(izquierda.trim()))
{
// miramos si es la misma tabla que la anterior, de serlo no hace falta cargar los campos
if(tablaActualCampos.equals(izquierda))
{
for(int i=0; i < campos.size(); i++)
{
if(campos.elementAt(i).toString().startsWith(palabra.toUpperCase()))
vtokens.addElement(campos.elementAt(i));
}
}
else
{
tablaActualCampos = izquierda;
try
{
campos = sqlpannel.getCampos(izquierda);
if(palabra.trim().length() == 0)
vtokens = campos;
else
{
for(int i=0; i < campos.size(); i++)
{
if(campos.elementAt(i).toString().startsWith(palabra.toUpperCase()))
vtokens.addElement(campos.elementAt(i));
}
}
} catch (Exception ex)
{
ex.printStackTrace();
}
}
}
else // si izquierda no tiene contenido directamente cargamos como si nada.
{
palabra = izquierda + "." + palabra;
for(int i=0; i < tokens.length; i++)
{
if(tokens[i].toString().startsWith(palabra.toUpperCase()))
vtokens.addElement(tokens[i]);
}
}
}
else
{
for(int i=0; i < tokens.length; i++)
{
if(tokens[i].toString().startsWith(palabra.toUpperCase()))
vtokens.addElement(tokens[i]);
}
}
if(vtokens.size() > 0)
{
vtokens.trimToSize();
jl.setModel(new DefaultComboBoxModel(vtokens));
Point punto = editor.getCaret().getMagicCaretPosition();
JEditorPane query = (JEditorPane)editores.get(tabbed.getTitleAt(tabbed.getSelectedIndex()).trim());
Point punto2 = query.getLocationOnScreen();
// tenemos que ponelo por encima del texto, eso se hace calculando el alto del popup
if(jpo != null && punto2 != null && punto != null)
{
jpo.setLocation(punto2.x + punto.x+12,(punto2.y + punto.y)-jpo.getHeight());
jpo.setVisible(true);
}
}
else
jpo.setVisible(false);
}
else
jpo.setVisible(false);
}
protected void pintaPosicion(int linea,JEditorPane editor)
{
int caret = editor.getCaretPosition();
int nele = editor.getDocument().getDefaultRootElement().getElementCount();
int nlinea = linea;
int ncolumna = 0;
// si no viene la l�nea me recorro todos los elementos hasta que encuentra cual es el del caret.
for(int i=0;i < nele;i++)
if(editor.getDocument().getDefaultRootElement().getElement(i).getStartOffset() <= caret &&
editor.getDocument().getDefaultRootElement().getElement(i).getEndOffset() >= caret)
{
nlinea = i+1;
break;
}
// la columna es igual al caret - el caret de la linea
ncolumna = (caret - editor.getDocument().getDefaultRootElement().getElement(nlinea-1).getStartOffset())+1;
if(sqlpannel != null)
sqlpannel.setPosition(utilidades.AddLeftCadena(String.valueOf(nlinea),4,"0") + ":" +
utilidades.AddLeftCadena(String.valueOf(ncolumna),4,"0"));
}
protected String getPalabraActual(int linea,JEditorPane editor)
{
int caret = editor.getCaretPosition();
Document doc = editor.getDocument();
Element root = doc.getDefaultRootElement();
Element elemento = null;
Segment stexto = new Segment();
int nele = root.getElementCount();
int nlinea = linea;
int ncolumna = 0;
// si no viene la l�nea me recorro todos los elementos hasta que encuentra cual es el del caret.
for(int i=0;i < nele;i++)
if(root.getElement(i).getStartOffset() <= caret &&
root.getElement(i).getEndOffset() >= caret)
{
nlinea = i+1;
// break;
}
// la columna es igual al caret - el caret de la linea
elemento = root.getElement(nlinea-1);
ncolumna = caret - elemento.getStartOffset();
// coge todo el texto de la fila
try
{
doc.getText(elemento.getStartOffset(), elemento.getEndOffset() - elemento.getStartOffset(), stexto); //coge todo el texto
String cadena = stexto.toString();
// en cadena tenemos toda la l�nea, buscamos un sep�rador por delante y otro por detras desde la posici�n del cursor
int posini = 0;
char caracter = '\0';
int tam = cadena.length();
if(ncolumna >= tam)
ncolumna = Math.max(tam-1,0);
// vamos con la posicion inicial
for(int i = ncolumna-1;i >= 0;i--)
{
caracter = cadena.charAt(i);
if(caracter == 13 || caracter == 10 || caracter == ' ' || caracter == '('
|| caracter == ')' || caracter == '=' || caracter == '*' // || caracter == '.' el punto no lo considero separador, pues tenemos que poder mostrar los campos de la tabla
|| caracter == '<' || caracter == '>'|| caracter == '%' || caracter == ','
|| caracter == '\t' || caracter == ';'|| caracter == '\'' || caracter == '"'
|| caracter == '/' || caracter == '#'|| caracter == '|' || caracter == ':'
|| caracter == '&')
{
posini = i+1;
if(posini > ncolumna)
posini = ncolumna;
break;
}
}
return cadena.substring(posini,ncolumna);
} catch (BadLocationException ex)
{
ex.printStackTrace();
}
return null;
}
public boolean delEditor() {
if(editores.size() > 0)
{
String Nombre = tabbed.getTitleAt(tabbed.getSelectedIndex()).trim();
tabbed.remove(tabbed.getSelectedIndex());
editores.remove(Nombre);
return true;
}
return false;
}
public String getEditorTitle() {
if(editores.size() > 0)
return tabbed.getTitleAt(tabbed.getSelectedIndex()).trim();
else
return "";
}
public String getEditorTabsXML() {
if(editores.size() > 0)
{
String tabs = "";
Object objetos[] = editores.keySet().toArray();
for(int i=0;i<objetos.length;i++)
{
tabs += "<tab><title>" + objetos[i] + "</title><query>" + ((JEditorPane)editores.get(objetos[i])).getText() + "</query></tab>";
}
return tabs;
}
else
return "";
}
public boolean renEditor(String titulo) {
if(editores.size() > 0 && titulo != null && titulo.trim().length() > 0)
{
editores.put(titulo,editores.get(tabbed.getTitleAt(tabbed.getSelectedIndex()).trim()));
editores.remove(tabbed.getTitleAt(tabbed.getSelectedIndex()).trim());
tabbed.setTitleAt(tabbed.getSelectedIndex(),titulo + " ");
return true;
}
return false;
}
public boolean cut() {
// tiene que mirar cual de los editores tiene el foco.
if(editores.size() > 0)
{
String Nombre = tabbed.getTitleAt(tabbed.getSelectedIndex()).trim();
JEditorPane jquery = (JEditorPane)editores.get(Nombre);
jquery.cut();
return true;
}
return false;
}
public boolean copy() {
// tiene que mirar cual de los editores tiene el foco.
if(editores.size() > 0)
{
String Nombre = tabbed.getTitleAt(tabbed.getSelectedIndex()).trim();
JEditorPane jquery = (JEditorPane)editores.get(Nombre);
jquery.copy();
return true;
}
return false;
}
public boolean paste() {
// tiene que mirar cual de los editores tiene el foco.
if(editores.size() > 0)
{
String Nombre = tabbed.getTitleAt(tabbed.getSelectedIndex()).trim();
JEditorPane jquery = (JEditorPane)editores.get(Nombre);
jquery.paste();
return true;
}
return false;
}
public boolean undo() {
// tiene que mirar cual de los editores tiene el foco.
if(editores.size() > 0)
{
try{
((UndoManager)vUndoManagers.elementAt(tabbed.getSelectedIndex())).undo();
}catch(CannotUndoException ex){
//_cannot undo
}
updateUndo(); //_actualiza estado de botones
return true;
}
return false;
}
public boolean redo() {
// tiene que mirar cual de los editores tiene el foco.
if(editores.size() > 0)
{
try{
((UndoManager)vUndoManagers.elementAt(tabbed.getSelectedIndex())).redo();
}catch(CannotUndoException ex){
//_cannot redo
}
updateUndo(); //_actualiza estado de botones
return true;
}
return false;
}
public boolean setQuery(String query) {
// tiene que mirar cual de los editores tiene el foco.
if(query != null && query.trim().length() > 0 && editores.size() > 0)
{
String Nombre = tabbed.getTitleAt(tabbed.getSelectedIndex()).trim();
JEditorPane jquery = (JEditorPane)editores.get(Nombre);
jquery.setText(query);
return true;
}
return false;
}
public String getQuery() {
// tiene que mirar cual de los editores tiene el foco.
if(editores.size() > 0)
{
String Nombre = tabbed.getTitleAt(tabbed.getSelectedIndex()).trim();
JEditorPane query = (JEditorPane)editores.get(Nombre);
String laquery = query.getText();
// si tenemos seleccionado texto cogemos s�lo el texto seleccionado
if((query.getSelectionStart() != 0 || query.getSelectionEnd() != 0) && query.getSelectionStart() != query.getSelectionEnd())
laquery = query.getSelectedText();
String laquery2 = "";
String stemp = null;
// tiene que comprobar si hay comentarios para eliminarlos
// quita los comentarios que empiezan pos "#" o por doble gui�n "--"
int posIni = 0, posFin = 0;
while((posFin = laquery.indexOf('\n',posIni)) != -1)
{
stemp = laquery.substring(posIni,posFin+1);
if(((stemp.length() > 1 && stemp.substring(0,2).equals("--") == false) || stemp.length() < 2) && stemp.charAt(0) != '#')
laquery2 += stemp;
posIni = posFin + 1;
}
if(posIni < laquery.length())
{
stemp = laquery.substring(posIni,laquery.length());
if(((stemp.length() > 1 && stemp.substring(0,2).equals("--") == false) || stemp.length() < 2) && stemp.charAt(0) != '#')
laquery2 += stemp;
}
return laquery2;
}
return "";
}
public Component getEditorComponent() {
// tiene que mirar cual de los editores tiene el foco.
if(editores.size() > 0)
{
String Nombre = tabbed.getTitleAt(tabbed.getSelectedIndex()).trim();
JEditorPane query = (JEditorPane)editores.get(Nombre);
return query;
}
return null;
}
// a�ade la propuesta seleccionada al editor activo
public void addProposal(String propuesta)
{
if(propuesta != null && propuesta.length() > 0)
{
if(editores.size() > 0)
{
String Nombre = tabbed.getTitleAt(tabbed.getSelectedIndex()).trim();
insertProposal((JEditorPane)editores.get(Nombre), propuesta);
}
}
}
// inserta el texto donde toca, para ello tiene que averiguar cual es la palabra que se esta escribiendo para reemplazarla
private void insertProposal(JEditorPane editor, String propuesta)
{
int linea = 0;
int caret = editor.getCaretPosition();
Document doc = editor.getDocument();
Element root = doc.getDefaultRootElement();
Element elemento = null;
Segment stexto = new Segment();
int nele = root.getElementCount();
int nlinea = linea;
int ncolumna = 0;
// si no viene la l�nea me recorro todos los elementos hasta que encuentra cual es el del caret.
for(int i=0;i < nele;i++)
if(root.getElement(i).getStartOffset() <= caret &&
root.getElement(i).getEndOffset() >= caret)
{
nlinea = i+1;
// break;
}
// la columna es igual al caret - el caret de la linea
elemento = root.getElement(nlinea-1);
ncolumna = caret - elemento.getStartOffset();
// coge todo el texto de la fila
try
{
doc.getText(elemento.getStartOffset(), elemento.getEndOffset() - elemento.getStartOffset(), stexto); //coge todo el texto
String cadena = stexto.toString();
// en cadena tenemos toda la l�nea, buscamos un sep�rador por delante y otro por detras desde la posici�n del cursor
int posini = 0;
char caracter = '\0';
int tam = cadena.length();
if(ncolumna >= tam)
ncolumna = Math.max(tam-1,0);
// vamos con la posicion inicial
for(int i = ncolumna-1;i >= 0;i--)
{
caracter = cadena.charAt(i);
if(caracter == 13 || caracter == 10 || caracter == ' ' || caracter == '('
|| caracter == ')' || caracter == '=' || caracter == '*' || caracter == '.'
|| caracter == '<' || caracter == '>'|| caracter == '%' || caracter == ','
|| caracter == '\t' || caracter == ';'|| caracter == '\'' || caracter == '"'
|| caracter == '/' || caracter == '#'|| caracter == '|' || caracter == ':'
|| caracter == '&')
{
posini = i+1;
if(posini > ncolumna)
posini = ncolumna;
break;
}
}
// eliminamos la palabra
if(ncolumna > posini)
doc.remove(caret-(ncolumna-posini),ncolumna-posini);
doc.insertString(caret-(ncolumna-posini),propuesta,elemento.getAttributes());
editor.setCaretPosition((caret-(ncolumna-posini)) + propuesta.length());
editor.requestFocus();
} catch (BadLocationException ex)
{
ex.printStackTrace();
}
}
public class PonCursor extends Thread
{
public PonCursor()
{
}
public void run()
{
try {
sleep(100);
((javax.swing.JScrollPane)tabbed.getSelectedComponent()).getViewport().getView().requestFocus();
} catch(Exception e)
{
;
}
}
}
public void updateUndo()
{
//////// No se que hacer aqui, ya lo pensare, pues si pongo botones, tendr�a que actualizar el estado de los botones cada vez que cambie de pesta�a
if(((UndoManager)vUndoManagers.elementAt(tabbed.getSelectedIndex())).canUndo())
{
/////////////
}
if(((UndoManager)vUndoManagers.elementAt(tabbed.getSelectedIndex())).canRedo())
{
/////////////
}
}
public class Undoer implements UndoableEditListener {
public Undoer(){
try{
((UndoManager)vUndoManagers.elementAt(tabbed.getSelectedIndex())).die();
// undomgr.die();
updateUndo(); //_actualiza estado de botones
}catch(Exception e){}
}
public void undoableEditHappened(UndoableEditEvent e) {
try{
UndoableEdit edit = e.getEdit();
((UndoManager)vUndoManagers.elementAt(tabbed.getSelectedIndex())).addEdit(edit);
// undomgr.addEdit(edit);
updateUndo(); //_actualiza estado de botones
}catch(Exception ex){}
}
}
private int posx = 0;
private int posy = 0;
}