OSDN Git Service

選択状態でタブキーを押すとアップインデント、シフトキーを押しながらタブキーを押すとダウンインデントするようにした
authorgdkhd812 <jbh03215@hotmail.com>
Sat, 27 Jul 2013 16:36:05 +0000 (01:36 +0900)
committergdkhd812 <jbh03215@hotmail.com>
Sat, 27 Jul 2013 16:36:05 +0000 (01:36 +0900)
Common/Controller.cs
Metro/FooEditEngnine/FooTextBox.cs
WPF/FooEditEngine/FooTextBox.cs
Windows/FooEditEngine/FooTextBox.cs

index 5d59bed..f142502 100644 (file)
@@ -112,16 +112,20 @@ namespace FooEditEngine
             {\r
                 if (this.View.LayoutLines.Count == 0 || this.View.Selections.Count == 0)\r
                     return null;\r
+                string str;\r
                 if (this.RectSelection)\r
-                    return GetTextFromRectangleSelectArea(this.View.Selections);\r
+                    str = GetTextFromRectangleSelectArea(this.View.Selections);\r
                 else\r
-                    return GetTextFromLineSelectArea(this.View.Selections);\r
+                    str = GetTextFromLineSelectArea(this.View.Selections);\r
+                return str.Replace(Document.NewLine.ToString(), Environment.NewLine);\r
             }\r
             set\r
             {\r
                 if (this.Document.FireUpdateEvent == false)\r
                     throw new InvalidOperationException("");\r
-                this.RepleaceSelectionArea(this.View.Selections, value);\r
+                if (value == null)\r
+                    return;\r
+                this.RepleaceSelectionArea(this.View.Selections, value.Replace(Environment.NewLine,Document.NewLine.ToString()));\r
             }\r
         }\r
 \r
@@ -799,6 +803,53 @@ namespace FooEditEngine
         }\r
 \r
         /// <summary>\r
+        /// 選択文字列のインデントを一つ増やす\r
+        /// </summary>\r
+        public void UpIndent()\r
+        {\r
+            if (this.RectSelection || this.SelectionLength == 0)\r
+                return;\r
+            int selectionStart = this.SelectionStart;\r
+            string text = this.InsertLineHead(GetTextFromLineSelectArea(this.View.Selections), "\t");\r
+            this.RepleaceSelectionArea(this.View.Selections,text);\r
+            this.Select(selectionStart, text.Length);\r
+        }\r
+\r
+        /// <summary>\r
+        /// 選択文字列のインデントを一つ減らす\r
+        /// </summary>\r
+        public void DownIndent()\r
+        {\r
+            if (this.RectSelection || this.SelectionLength == 0)\r
+                return;\r
+            int selectionStart = this.SelectionStart;\r
+            string text = this.RemoveLineHead(GetTextFromLineSelectArea(this.View.Selections), "\t");\r
+            this.RepleaceSelectionArea(this.View.Selections, text);\r
+            this.Select(selectionStart, text.Length);\r
+        }\r
+\r
+        string InsertLineHead(string s, string str)\r
+        {\r
+            string[] lines = s.Split(new string[] { Document.NewLine.ToString() }, StringSplitOptions.RemoveEmptyEntries);\r
+            StringBuilder output = new StringBuilder();\r
+            for (int i = 0; i < lines.Length; i++)\r
+                output.AppendLine(str + lines[i]);\r
+            return output.ToString();\r
+        }\r
+\r
+        public string RemoveLineHead(string s, string str)\r
+        {\r
+            string[] lines = s.Split(new string[] { Document.NewLine.ToString() }, StringSplitOptions.RemoveEmptyEntries);\r
+            StringBuilder output = new StringBuilder();\r
+            for (int i = 0; i < lines.Length; i++)\r
+                if (lines[i].StartsWith(str))\r
+                    output.AppendLine(lines[i].Substring(1));\r
+                else\r
+                    output.AppendLine(lines[i]);\r
+            return output.ToString();\r
+        }\r
+\r
+        /// <summary>\r
         /// キャレットを一文字移動させる\r
         /// </summary>\r
         /// <param name="isMoveNext">真なら1文字すすめ、そうでなければ戻す</param>\r
@@ -924,13 +975,11 @@ namespace FooEditEngine
 \r
             if (this.RectSelection == false)\r
             {\r
-                string str = value.Replace(Environment.NewLine, Document.NewLine.ToString());\r
-\r
                 Selection sel = Selection.Create(this.AnchorIndex, 0);\r
                 if (Selections.Count > 0)\r
                     sel = Util.NormalizeIMaker<Selection>(this.View.Selections.First());\r
 \r
-                this.Document.Replace(sel.start, sel.length, str);\r
+                this.Document.Replace(sel.start, sel.length, value);\r
                 return;\r
             }\r
 \r
@@ -949,7 +998,7 @@ namespace FooEditEngine
 \r
                 this.Document.FireUpdateEvent = false;\r
 \r
-                string[] line = value.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);\r
+                string[] line = value.Split(new string[] { Document.NewLine.ToString() }, StringSplitOptions.RemoveEmptyEntries);\r
 \r
                 TextPoint Current = this.View.GetLayoutLineFromIndex(this.SelectionStart);\r
 \r
@@ -1022,7 +1071,7 @@ namespace FooEditEngine
         {\r
             Selection sel = Util.NormalizeIMaker<Selection>(Selections.First());\r
 \r
-            string str = this.Document.ToString(sel.start, sel.length).Replace(Document.NewLine.ToString(), Environment.NewLine);\r
+            string str = this.Document.ToString(sel.start, sel.length);\r
 \r
             return str;\r
         }\r
@@ -1036,7 +1085,7 @@ namespace FooEditEngine
                 {\r
                     Selection sel = Util.NormalizeIMaker<Selection>(Selections[i]);\r
 \r
-                    string str = this.Document.ToString(sel.start, sel.length).Replace(Document.NewLine.ToString(), Environment.NewLine);\r
+                    string str = this.Document.ToString(sel.start, sel.length);\r
                     if (str.IndexOf(Environment.NewLine) == -1)\r
                         temp.AppendLine(str);\r
                     else\r
index 71f0e69..4e5fdb7 100644 (file)
@@ -466,9 +466,14 @@ namespace FooEditEngine.Metro
                     isMovedCaret = true;\r
                     break;\r
                 case VirtualKey.Tab:\r
-                    if (!isControlPressed && !isShiftPressed)\r
+                    if (!isControlPressed)\r
                     {\r
-                        this._Controller.DoInputChar('\t');\r
+                        if (this._Controller.SelectionLength == 0)\r
+                            this._Controller.DoInputChar('\t');\r
+                        else if (isShiftPressed)\r
+                            this._Controller.DownIndent();\r
+                        else\r
+                            this._Controller.UpIndent();\r
                         this.Refresh();\r
                         e.Handled = true;\r
                     }\r
index c5b9382..af6ab2b 100644 (file)
@@ -721,7 +721,12 @@ namespace FooEditEngine.WPF
                     break;\r
                 case Key.Tab:\r
                     int oldLength = this.Document.Length;\r
-                    this._Controller.DoInputChar('\t');\r
+                    if (this.SelectionLength == 0)\r
+                        this._Controller.DoInputChar('\t');\r
+                    else if(this.IsPressedModifierKey(modiferKeys,ModifierKeys.Shift))\r
+                        this._Controller.DownIndent();\r
+                    else\r
+                        this._Controller.UpIndent();\r
                     this.Refresh();\r
                     e.Handled = true;\r
                     break;\r
index c113143..b19acf5 100644 (file)
@@ -1220,6 +1220,15 @@ namespace FooEditEngine.Windows
                         this.Controller.JumpCaret(this.View.CaretPostion.row, this.View.LayoutLines[this.View.CaretPostion.row].Length - 1);\r
                     this.Refresh();\r
                     break;\r
+                case Keys.Tab:\r
+                    if (this.Controller.SelectionLength == 0)\r
+                        this.Controller.DoInputChar('\t');\r
+                    else if (e.Shift)\r
+                        this.Controller.DownIndent();\r
+                    else\r
+                        this.Controller.UpIndent();\r
+                    this.Refresh();\r
+                    break;\r
             }\r
         }\r
 \r
@@ -1243,6 +1252,8 @@ namespace FooEditEngine.Windows
                     this.Controller.DoEnterAction();\r
                     this.Refresh();\r
                     break;\r
+                case '\t':\r
+                    break;  //OnKeyDownで処理しているので不要\r
                 default:\r
                     if (IsInputChar(e.KeyChar) == false)\r
                         break;\r