Changeset 10168


Ignore:
Timestamp:
10/20/05 12:21:18 (16 years ago)
Author:
piso
Message:

mouseCopyToInput()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/j/LispShellMode.java

    r10090 r10168  
    33 *
    44 * Copyright (C) 2002-2005 Peter Graves
    5  * $Id: LispShellMode.java,v 1.18 2005-10-12 14:49:41 piso Exp $
     5 * $Id: LispShellMode.java,v 1.19 2005-10-20 12:21:18 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2424import gnu.regexp.RE;
    2525import gnu.regexp.REMatch;
     26import java.awt.AWTEvent;
    2627import java.awt.event.KeyEvent;
     28import java.awt.event.MouseEvent;
     29import javax.swing.undo.CompoundEdit;
    2730
    2831public final class LispShellMode extends LispMode implements Constants, Mode
     
    7073        km.mapKey(KeyEvent.VK_M, CTRL_MASK | SHIFT_MASK, "lispSelectSyntax");
    7174        km.mapKey(KeyEvent.VK_D, CTRL_MASK | ALT_MASK, "describe");
     75        km.mapKey(VK_MOUSE_2, 0, "mouseCopyToInput");
    7276    }
    7377
     
    152156    {
    153157        final Editor editor = Editor.currentEditor();
    154 
    155158        final Buffer buffer = editor.getBuffer();
    156159        if (buffer.getMode() != mode) {
     
    240243        return sb.toString();
    241244    }
     245
     246    public static void mouseCopyToInput()
     247    {
     248        final Editor editor = Editor.currentEditor();
     249        final Buffer buffer = editor.getBuffer();
     250        if (!(buffer instanceof LispShell)) {
     251            Debug.bug();
     252            return;
     253        }
     254        final Display display = editor.getDisplay();
     255        final AWTEvent e = editor.getDispatcher().getLastEvent();
     256        if (e instanceof MouseEvent) {
     257            MouseEvent mouseEvent = (MouseEvent) e;
     258            Position pos = display.positionFromPoint(mouseEvent.getPoint());
     259            if (pos != null) {
     260                Line endLine = buffer.getEnd().getLine();
     261                if (pos.getLine() == endLine) {
     262                    SystemSelection.pastePrimarySelection();
     263                } else {
     264                    int offset = pos.getOffset();
     265                    String s = pos.getLine().getText();
     266                    final LispShell lisp = (LispShell) buffer;
     267                    RE promptRE = lisp.getPromptRE();
     268                    if (promptRE != null) {
     269                        REMatch match = promptRE.getMatch(s);
     270                        if (match != null) {
     271                            final int endIndex = match.getEndIndex();
     272                            s = s.substring(endIndex);
     273                            offset -= endIndex;
     274                        }
     275                    }
     276                    s = s.trim();
     277                    final int length = s.length();
     278                    if (length > 0) {
     279                        if (s.charAt(0) == '(' && s.charAt(length - 1) == ')')
     280                            ; // A list.
     281                        else if (s.indexOf(' ') < 0)
     282                            ; // An atom.
     283                        else {
     284                            // We want the whitespace-delimited string around
     285                            // the location of the mouse click.
     286                            if (offset >= 0) {
     287                                if (offset > length)
     288                                    offset = length - 1;
     289                                int start = offset;
     290                                int end = offset;
     291                                while (start > 0 && s.charAt(start - 1) != ' ')
     292                                    --start;
     293                                while (end < length && s.charAt(end) != ' ')
     294                                    ++end;
     295                                if (start < 0)
     296                                    start = 0;
     297                                if (end > length)
     298                                    end = length;
     299                                s = s.substring(start, end);
     300                            }
     301                        }
     302                        CompoundEdit compoundEdit = editor.beginCompoundEdit();
     303                        if (editor.getDotLine() != endLine)
     304                            editor.eob();
     305                        editor.paste(s);
     306                        editor.endCompoundEdit(compoundEdit);
     307                    }
     308                }
     309            }
     310        }
     311    }
    242312}
Note: See TracChangeset for help on using the changeset viewer.