From: SVN by r. <sv...@ca...> - 2008-11-09 21:16:57
|
Author: roy Date: 2008-11-09 22:16:45 +0100 (Sun, 09 Nov 2008) New Revision: 329 Modified: src/main/java/nl/improved/sqlclient/charva/SQLShellComponent.java Log: implement 'non native' paste and copy methods using mouse Modified: src/main/java/nl/improved/sqlclient/charva/SQLShellComponent.java =================================================================== --- src/main/java/nl/improved/sqlclient/charva/SQLShellComponent.java 2008-11-09 21:07:33 UTC (rev 328) +++ src/main/java/nl/improved/sqlclient/charva/SQLShellComponent.java 2008-11-09 21:16:45 UTC (rev 329) @@ -14,10 +14,13 @@ import charvax.swing.JTextArea; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; +import nl.improved.sqlclient.SQLProperties; +import nl.improved.sqlclient.SQLUtil; /** * @@ -26,6 +29,7 @@ public class SQLShellComponent extends JTextArea { private CharvaSQLShellWindow sqlshellWindow = new CharvaSQLShellWindow(this); + private Point startPos; public SQLShellComponent() { setEditable(false); @@ -37,24 +41,106 @@ sqlshellWindow.keyTyped(evt); } + void setSelection(int pStart, int pEnd) { + if (!"all".equals(SQLProperties.getProperty(SQLProperties.PropertyName.MOUSE_HANDLING))) { + return; + } + int start, end; + if (pEnd < pStart) { + end = pStart; + start = pEnd; + } else { + start = pStart; + end = pEnd; + } + end = Math.min(getText().length(), end); + sqlshellWindow.debug("SET SELECTION: "+ start +" -> "+ end); + sqlshellWindow.debug("SET TO CLIPBOARD: "+ getText().substring(start, end)); + Clipboard clipBoard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard(); + final String text = getText().substring(start, Math.min(getText().length(), end)); + Transferable tf = new Transferable() { + + public DataFlavor[] getTransferDataFlavors() { + return new DataFlavor[] {DataFlavor.stringFlavor}; + } + + public boolean isDataFlavorSupported(DataFlavor flavor) { + return DataFlavor.stringFlavor == flavor; + } + + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { + return text; + } + }; + clipBoard.setContents(tf, null); + } + @Override public void processMouseEvent(MouseEvent evt) { super.processMouseEvent(evt); - if (evt.getModifiers() == evt.MOUSE_PRESSED) { - if (evt.getButton() == MouseEvent.BUTTON2) { - Clipboard clipBoard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard(); - try { - String clipBoardContents = (String) clipBoard.getData(DataFlavor.stringFlavor); - //sqlshellWindow.debug(clipBoardContents); - sqlshellWindow.insertText(clipBoardContents); - sqlshellWindow.repaintScreen(); - } catch (UnsupportedFlavorException ex) { - Logger.getLogger(SQLShellComponent.class.getName()).log(Level.SEVERE, null, ex); - } catch (IOException ex) { - Logger.getLogger(SQLShellComponent.class.getName()).log(Level.SEVERE, null, ex); + if (evt.getModifiers() == MouseEvent.MOUSE_CLICKED) { + if (evt.getButton() == MouseEvent.BUTTON1) { + if (evt.getClickCount() == 2) { // double click.. select word under char + try { + int line = getLineStartOffset(evt.getY()-1); + String text = getText(); + int start, end; + for (start = line + evt.getX(); start > 0; start--) { + if (SQLUtil.isBreakCharacter(text.charAt(start))) { + break; + } + } + for (end = line + evt.getX(); end < text.length(); end++) { + if (SQLUtil.isBreakCharacter(text.charAt(end))) { + break; + } + } + setSelection(start, end); + } catch(Exception e) { } } - } + } else if (evt.getModifiers() == MouseEvent.MOUSE_PRESSED) { + sqlshellWindow.debug("PRESSED"); + if (evt.getButton() == MouseEvent.BUTTON1) { + if (startPos == null) { + startPos = new Point(evt.getX()-1, evt.getY()-1); + } else { + try { + Point endPos = new Point(evt.getX()-1, evt.getY()-1); + int start = getLineStartOffset(startPos.y) + startPos.x; + int end = getLineStartOffset(endPos.y) + endPos.x; + setSelection(start, end); + startPos = null; + } catch(Exception e) {} + } + } + if (evt.getButton() == MouseEvent.BUTTON2) { // paste from clipboard + String mouseHandling = SQLProperties.getProperty(SQLProperties.PropertyName.MOUSE_HANDLING); + if ("all".equals(mouseHandling) || "paste".equals(mouseHandling)) { + Clipboard clipBoard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard(); + try { + String clipBoardContents = (String) clipBoard.getData(DataFlavor.stringFlavor); + //sqlshellWindow.debug(clipBoardContents); + sqlshellWindow.insertText(clipBoardContents); + sqlshellWindow.repaintScreen(); + } catch (UnsupportedFlavorException ex) { + Logger.getLogger(SQLShellComponent.class.getName()).log(Level.SEVERE, null, ex); + } catch (IOException ex) { + Logger.getLogger(SQLShellComponent.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + } else if (evt.getModifiers() == MouseEvent.MOUSE_RELEASED) { + sqlshellWindow.debug("RELEASED: " + startPos); + Point endPos = new Point(evt.getX()-1, evt.getY()-1); + if (startPos != null) { + try { + int start = getLineStartOffset(startPos.y) + startPos.x; + int end = getLineStartOffset(endPos.y) + endPos.x; + setSelection(start, end); + startPos = null; + } catch(Exception e) { /* ignore */ } + } } } |