1 #title = "*2"
  2 #tooltip = "行の2重化"
  3 #include "lib\sgc4jsee.jsee"
  4 
  5 /**
  6  * @fileOverview
  7  * 行の2重化を行います。中途半端な複数行選択にも対応します。<br />
  8  * 既存の行の2重化と異なり、最下行を含む行選択時には最下行も含めた2重化を行います。
  9  * 
 10  * @author gecca from 雪月花 (http://setsugecca.org/)
 11  * @version 1.00 for EmEditor v10.0
 12  */
 13 
 14 (function() {
 15 	var redraw = Redraw;
 16 	Redraw = false;
 17 	
 18 	var ini = JseeUtil.getSnipIniObj("行の2重化");
 19 	var selectOriginalLines = (ini.selectOriginalLines == "true");
 20 	
 21 	// 未選択状態の場合
 22 	if(!document.selection.Text) {
 23 		// キャレット位置を保持
 24 		var activeX = document.selection.GetActivePointX(eePosLogical);
 25 		var activeY = document.selection.GetActivePointY(eePosLogical);
 26 		
 27 		// 行の2重化
 28 		document.selection.DuplicateLine();
 29 		
 30 		if(selectOriginalLines) {
 31 			// キャレット位置を復元
 32 			document.selection.SetActivePoint(eePosLogical, activeX, activeY);
 33 		}
 34 		
 35 	// 選択状態の場合
 36 	} else {
 37 		// 単一行選択かどうか
 38 		var isOneLineSelected = !/[\r\n]/.test(document.selection.Text);
 39 		
 40 		// 補完前の選択位置を保持
 41 		var activeX = document.selection.GetActivePointX(eePosLogical);
 42 		var activeY = document.selection.GetActivePointY(eePosLogical);
 43 		var anchorX = document.selection.GetAnchorPointX(eePosLogical);
 44 		var anchorY = document.selection.GetAnchorPointY(eePosLogical);
 45 		
 46 		// 選択状態を補完
 47 		JseeUtil.selectLines();
 48 		
 49 		// 最下行を含む選択かどうか
 50 		var isLastLineSelected = document.selection.GetBottomPointX(eePosLogical) != 1;
 51 		
 52 		// 補完後の選択位置を保持
 53 		var activeYAfter = document.selection.GetActivePointY(eePosLogical);
 54 		var anchorYAfter = document.selection.GetAnchorPointY(eePosLogical);
 55 		
 56 		// 行の2重化
 57 		// 最下行でない場合は、既存の行の2重化
 58 		if(!isLastLineSelected) {
 59 			document.selection.DuplicateLine();
 60 		// 最下行の場合は、専用の処理
 61 		} else {
 62 			var text = document.selection.Text;
 63 			document.selection.Collapse();
 64 			document.selection.Text = JseeUtil.getBr() + text;
 65 		}
 66 		
 67 		// 再選択
 68 		// 単一行選択の場合、または複数行選択で最下行を含まない場合、単純に選択範囲を復元
 69 		if(selectOriginalLines) {
 70 			Redraw = redraw;
 71 			document.selection.SetActivePoint(eePosLogical, activeX, activeY);
 72 			document.selection.SetAnchorPoint(eePosLogical, anchorX, anchorY);
 73 		} else {
 74 			var addedLinesCnt = Math.abs(activeYAfter - anchorYAfter);
 75 			// 複数行選択で最下行を含む場合、上下の差が1つ足りなくなるので、それを補う
 76 			if(isLastLineSelected) {
 77 				addedLinesCnt++;
 78 			}
 79 			Redraw = redraw;
 80 			document.selection.SetActivePoint(eePosLogical, activeX, activeY + addedLinesCnt);
 81 			document.selection.SetAnchorPoint(eePosLogical, anchorX, anchorY + addedLinesCnt);
 82 		}
 83 	}
 84 })();
 85