OSDN Git Service

Modified index.html.
[moreemacs/moreemacs.git] / jp.sourceforge.moreemacs / src / jp / sourceforge / moreemacs / handlers / YankRectangleExecution.java
1 package jp.sourceforge.moreemacs.handlers;
2
3 import java.util.List;
4
5 import jp.sourceforge.moreemacs.utils.CodePointIterator;
6 import jp.sourceforge.moreemacs.utils.ColumnUtils;
7 import jp.sourceforge.moreemacs.utils.DocumentCharSequence;
8 import jp.sourceforge.moreemacs.utils.DocumentTransaction;
9
10 import org.eclipse.jface.text.BadLocationException;
11 import org.eclipse.jface.text.IDocument;
12 import org.eclipse.jface.text.IRegion;
13 import org.eclipse.jface.text.TextUtilities;
14
15 public final class YankRectangleExecution extends TextEditorExecution {
16     @Override
17     public void execute() throws BadLocationException {
18         if(!textEditor.isEditable()) {
19             return;
20         }
21         
22         List<String> rectangle = RectangleStorage.getRectangle();
23         if(rectangle == null) {
24             return;
25         }
26         
27         int current = cursor.offset();
28         int row = doc.getLineOfOffset(current);
29         int column = ColumnUtils.getColumn(doc, current, getTabStop());
30         
31
32         int offset = cursor.offset();
33         DocumentTransaction transaction = new DocumentTransaction(doc); 
34         transaction.begin();
35         try {
36             ensureLines(doc, row + rectangle.size());
37             offset = yankRectangle(doc, row, column, rectangle);
38         } finally {
39             transaction.end();
40         }
41         cursor.move(offset);
42     }
43     
44     private void ensureLines(IDocument doc, int lines) throws BadLocationException {
45         int n = lines - doc.getNumberOfLines();
46         if(n <= 0) {
47             return;
48         }
49
50         StringBuilder builder = new StringBuilder();
51         String delim = TextUtilities.getDefaultLineDelimiter(doc);
52         for(int i = 0; i < n; i++) {
53             builder.append(delim);
54         }
55         doc.replace(doc.getLength(), 0, builder.toString());
56         
57     }
58
59     private int yankRectangle(IDocument doc,
60             int row, int column, List<String> rectangle)
61             throws BadLocationException {
62         int offset = cursor.offset();
63         for(int i = 0; i < rectangle.size(); i++) {
64             offset = yankString(doc, row+i, column, rectangle.get(i));
65         }
66         return offset;
67     }
68
69     private int yankString(IDocument doc, int row, int column, String str)
70     throws BadLocationException
71     {
72         IRegion line = doc.getLineInformation(row);
73         int col = 0;
74
75         CharSequence seq = new DocumentCharSequence(doc, line.getOffset(), line.getLength());
76         
77         for(CodePointIterator itr = new CodePointIterator(seq); itr.hasNext(); ) {
78             int offset = line.getOffset() + itr.index();
79             int codePoint = itr.next();
80             if(col >= column) {
81                 doc.replace(offset, 0, str);
82                 return offset+str.length();
83             }
84             col = ColumnUtils.getNextColumn(col, codePoint, getTabStop());
85         }
86         
87
88         StringBuilder builder = new StringBuilder();
89         for(int i = 0; i < column-col; i++) {
90             builder.append(" ");
91         }
92         builder.append(str);
93         doc.replace(line.getOffset()+line.getLength(), 0, builder.toString());
94         return line.getOffset()+line.getLength()+builder.length();
95     }
96 }