OSDN Git Service

V.1.01
[kybernetes/Kybernetes.git] / KyberNetes / view / CmdHistory.cs
diff --git a/KyberNetes/view/CmdHistory.cs b/KyberNetes/view/CmdHistory.cs
new file mode 100644 (file)
index 0000000..582714a
--- /dev/null
@@ -0,0 +1,94 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace com.andoutomo.kybernetes.view\r
+{\r
+    /// <summary>\r
+    /// コマンドヒストリを保持します。\r
+    /// </summary>\r
+    internal class CmdHistory\r
+    {\r
+        private string[] commandHist;\r
+        private int currentPosition;\r
+        const int MAXHIST = 10; \r
+\r
+        internal CmdHistory()\r
+        {\r
+            commandHist = new string[MAXHIST];\r
+            currentPosition = 0;\r
+        }\r
+        /// <summary>\r
+        /// 直前に実行されたコマンドをを提示します。\r
+        /// 同時にカレント位置を動かし、さらにその前のコマンドを提示する準備を行います。\r
+        /// </summary>\r
+        /// <returns></returns>\r
+        internal string prevCommand()\r
+        {\r
+            //終点まで来ている場合は最後のコマンドを表示。カレント位置も動かさない。\r
+            if (currentPosition == MAXHIST)\r
+            {\r
+                return commandHist[MAXHIST-1];\r
+            }\r
+            //次に提示するコマンドがある場合は、カレント位置を動かす。\r
+            if (!string.IsNullOrEmpty(commandHist[currentPosition]))\r
+            {\r
+                currentPosition++;\r
+            }\r
+            //ヒストリ配列からコマンドを取得してreturn\r
+            if (currentPosition > 0)\r
+            {\r
+                return commandHist[currentPosition - 1];\r
+            }\r
+            //この段階でcurrentPosition=0(ヒストリがない)場合は、空文字を返す。\r
+            else\r
+            {\r
+                return string.Empty;\r
+            }\r
+        }\r
+        /// <summary>\r
+        /// カレント位置の次に実行されたコマンドを提示します。\r
+        /// </summary>\r
+        /// <returns></returns>\r
+        internal string nextCommand()\r
+        {\r
+            currentPosition--;\r
+            if (currentPosition <= 0)\r
+            {\r
+                currentPosition = 0;\r
+                return string.Empty;\r
+            }\r
+            return commandHist[currentPosition-1];\r
+        }\r
+        /// <summary>\r
+        /// コマンド受け入れを行います。\r
+        /// コマンドはスタックされ、10件以上の場合は10番目が破棄されます。\r
+        /// また、同一のコマンドを連続入力した場合はスタックを行いません。\r
+        /// </summary>\r
+        /// <param name="command"></param>\r
+        internal void stackCmd(string command)\r
+        {\r
+            if (command != commandHist[0])\r
+            {\r
+                //スタックを行う\r
+                for (int i = MAXHIST-1; i > 0; i--)\r
+                {\r
+                    commandHist[i] = commandHist[i - 1];\r
+                }\r
+\r
+                //新たなコマンドを追加する\r
+                commandHist[0] = command;\r
+            }\r
+            //ポジションをリセット\r
+            resetPosition();\r
+        }\r
+        /// <summary>\r
+        /// ヒストリで参照するポジションをリセットします。\r
+        /// </summary>\r
+        internal void resetPosition()\r
+        {\r
+            currentPosition = 0;\r
+        }\r
+    }\r
+}\r