Package com.GestDB.swing

Source Code of com.GestDB.swing.gestEditor$Undoer

/*
* 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;
}
TOP

Related Classes of com.GestDB.swing.gestEditor$Undoer

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