@@ -1655,20 +1655,36 @@ public LineMoveAction(String name, int moveAmt) {
1655
1655
1656
1656
@ Override
1657
1657
public void actionPerformedImpl (ActionEvent e , RTextArea textArea ) {
1658
+
1658
1659
if (!textArea .isEditable () || !textArea .isEnabled ()) {
1659
1660
UIManager .getLookAndFeel ().provideErrorFeedback (textArea );
1660
1661
return ;
1661
1662
}
1663
+
1662
1664
try {
1663
- int caret = textArea .getCaretPosition ();
1665
+
1666
+ int dot = textArea .getCaretPosition ();
1667
+ int mark = textArea .getCaret ().getMark ();
1664
1668
Document doc = textArea .getDocument ();
1665
1669
Element root = doc .getDefaultRootElement ();
1666
- int line = root .getElementIndex (caret );
1667
- if (moveAmt ==-1 && line >0 ) {
1668
- moveLineUp (textArea , line );
1670
+ int startLine = root .getElementIndex (Math .min (dot , mark ));
1671
+ int endLine = root .getElementIndex (Math .max (dot , mark ));
1672
+
1673
+ // If we're moving more than one line, only move the last line
1674
+ // if they've selected more than one char in it.
1675
+ int moveCount = endLine - startLine + 1 ;
1676
+ if (moveCount > 1 ) {
1677
+ Element elem = root .getElement (endLine );
1678
+ if (dot == elem .getStartOffset () || mark == elem .getStartOffset ()) {
1679
+ moveCount --;
1680
+ }
1669
1681
}
1670
- else if (moveAmt ==1 && line <root .getElementCount ()-1 ) {
1671
- moveLineDown (textArea , line );
1682
+
1683
+ if (moveAmt ==-1 && startLine >0 ) {
1684
+ moveLineUp (textArea , startLine , moveCount );
1685
+ }
1686
+ else if (moveAmt ==1 && endLine < root .getElementCount ()-1 ) {
1687
+ moveLineDown (textArea , startLine , moveCount );
1672
1688
}
1673
1689
else {
1674
1690
UIManager .getLookAndFeel ().provideErrorFeedback (textArea );
@@ -1687,50 +1703,101 @@ public final String getMacroID() {
1687
1703
return getName ();
1688
1704
}
1689
1705
1690
- private void moveLineDown (RTextArea textArea , int line )
1706
+ private void moveLineDown (RTextArea textArea , int line , int lineCount )
1691
1707
throws BadLocationException {
1708
+ System .out .println ("--- " + line + ", " + lineCount + ", " + textArea .getLineCount ());
1709
+ // If we'd be moving lines past the end of the document, stop.
1710
+ // We could perhaps just decide to move the lines to the end of the
1711
+ // file, but this just keeps things simple.
1712
+ // if (textArea.getLineCount() - line < lineCount) {
1713
+ // UIManager.getLookAndFeel().provideErrorFeedback(textArea);
1714
+ // return;
1715
+ // }
1716
+
1692
1717
Document doc = textArea .getDocument ();
1693
1718
Element root = doc .getDefaultRootElement ();
1694
1719
Element elem = root .getElement (line );
1695
1720
int start = elem .getStartOffset ();
1721
+
1722
+ int endLine = line + lineCount - 1 ;
1723
+ elem = root .getElement (endLine );
1696
1724
int end = elem .getEndOffset ();
1697
- int caret = textArea .getCaretPosition ();
1698
- int caretOffset = caret - start ;
1699
- String text = doc .getText (start , end -start );
1700
- doc .remove (start , end -start );
1701
- Element elem2 = root .getElement (line ); // not "line+1" - removed.
1702
- //int start2 = elem2.getStartOffset();
1703
- int end2 = elem2 .getEndOffset ();
1704
- doc .insertString (end2 , text , null );
1705
- elem = root .getElement (line +1 );
1706
- textArea .setCaretPosition (elem .getStartOffset ()+caretOffset );
1707
- }
1708
-
1709
- private void moveLineUp (RTextArea textArea , int line )
1725
+
1726
+ textArea .beginAtomicEdit ();
1727
+ try {
1728
+
1729
+ String text = doc .getText (start , end - start );
1730
+ doc .remove (start , end - start );
1731
+
1732
+ int insertLine = Math .min (line + 1 , textArea .getLineCount ());
1733
+ System .out .println ("insertLine == " + insertLine );
1734
+ boolean newlineInserted = false ;
1735
+ if (insertLine == textArea .getLineCount ()) {
1736
+ textArea .append ("\n " );
1737
+ newlineInserted = true ;
1738
+ }
1739
+ System .out .println ("... " + newlineInserted );
1740
+
1741
+ int insertOffs = textArea .getLineStartOffset (insertLine );
1742
+ doc .insertString (insertOffs , text , null );
1743
+ textArea .setSelectionStart (insertOffs );
1744
+ textArea .setSelectionEnd (insertOffs + text .length () - 1 );
1745
+
1746
+ if (newlineInserted ) {
1747
+ doc .remove (doc .getLength () - 1 , 1 );
1748
+ }
1749
+
1750
+ } finally {
1751
+ textArea .endAtomicEdit ();
1752
+ }
1753
+
1754
+ }
1755
+
1756
+ private void moveLineUp (RTextArea textArea , int line , int moveCount )
1710
1757
throws BadLocationException {
1758
+
1711
1759
Document doc = textArea .getDocument ();
1712
1760
Element root = doc .getDefaultRootElement ();
1713
- int lineCount = root .getElementCount ();
1714
1761
Element elem = root .getElement (line );
1715
1762
int start = elem .getStartOffset ();
1716
- int end = line ==lineCount -1 ? elem .getEndOffset ()-1 :
1717
- elem .getEndOffset ();
1718
- int caret = textArea .getCaretPosition ();
1719
- int caretOffset = caret - start ;
1720
- String text = doc .getText (start , end -start );
1721
- if (line ==lineCount -1 ) {
1722
- start --; // Remove previous line's ending \n
1723
- }
1724
- doc .remove (start , end -start );
1725
- Element elem2 = root .getElement (line -1 );
1726
- int start2 = elem2 .getStartOffset ();
1727
- //int end2 = elem2.getEndOffset();
1728
- if (line ==lineCount -1 ) {
1729
- text += '\n' ;
1730
- }
1731
- doc .insertString (start2 , text , null );
1732
- //caretOffset = Math.min(start2+caretOffset, end2-1);
1733
- textArea .setCaretPosition (start2 +caretOffset );
1763
+
1764
+ int endLine = line + moveCount - 1 ;
1765
+ elem = root .getElement (endLine );
1766
+ int end = elem .getEndOffset ();
1767
+ int lineCount = textArea .getLineCount ();
1768
+ boolean movingLastLine = false ;
1769
+ if (endLine == lineCount - 1 ) {
1770
+ movingLastLine = true ;
1771
+ end --;
1772
+ }
1773
+
1774
+ int insertLine = Math .max (line - 1 , 0 );
1775
+
1776
+ textArea .beginAtomicEdit ();
1777
+ try {
1778
+
1779
+ System .out .println ("*** " + start + ", " + (end - start ));
1780
+ String text = doc .getText (start , end - start );
1781
+ if (movingLastLine ) {
1782
+ text += '\n' ;
1783
+ }
1784
+ System .out .println ("*** *** '" + text + "'" );
1785
+ doc .remove (start , end - start );
1786
+ System .out .println ("*** *** *** good" );
1787
+
1788
+ int insertOffs = textArea .getLineStartOffset (insertLine );
1789
+ doc .insertString (insertOffs , text , null );
1790
+ textArea .setSelectionStart (insertOffs );
1791
+ int selEnd = insertOffs + text .length () - 1 ;
1792
+ textArea .setSelectionEnd (selEnd );
1793
+ if (movingLastLine ) { // Remove the artifically-added newline
1794
+ doc .remove (doc .getLength () - 1 , 1 );
1795
+ }
1796
+
1797
+ } finally {
1798
+ textArea .endAtomicEdit ();
1799
+ }
1800
+
1734
1801
}
1735
1802
1736
1803
}
0 commit comments