OSDN Git Service

na-get-lib,AppliStation-GUI,レポジトリリスト編集機能追加
[applistation/AppliStation.git] / AppliStation / UserPrefForm.cs
diff --git a/AppliStation/UserPrefForm.cs b/AppliStation/UserPrefForm.cs
new file mode 100644 (file)
index 0000000..c08a7e3
--- /dev/null
@@ -0,0 +1,177 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Drawing;\r
+using System.Windows.Forms;\r
+\r
+using NaGet.Packages;\r
+\r
+namespace AppliStation\r
+{\r
+       /// <summary>\r
+       /// ユーザ設定用フォーム\r
+       /// </summary>\r
+       public partial class UserPrefForm : Form\r
+       {\r
+               private List<RepositoryInfo> repos;\r
+               \r
+               private bool isRepositoriesChanged;\r
+               \r
+               public UserPrefForm()\r
+               {\r
+                       repos = new List<RepositoryInfo>();\r
+                       \r
+                       InitializeComponent();\r
+                       \r
+                       loadCurrentPref();\r
+               }\r
+               \r
+               /// <summary>\r
+               /// 現在の設定を読み込む\r
+               /// </summary>\r
+               public void loadCurrentPref()\r
+               {\r
+                       this.RepositoriesListSetting = NaGet.Utils.GetDeserializedObject<RepositoriesList>(NaGet.Env.RepositoriesListFile);\r
+               }\r
+               \r
+               public RepositoriesList RepositoriesListSetting {\r
+                       get {\r
+                               RepositoriesList repoList = new RepositoriesList();\r
+                               repoList.Repositories = repos.ToArray();\r
+                               return repoList;\r
+                       }\r
+                       set {\r
+                               repos.Clear();\r
+                               repos.AddRange(value.Repositories);\r
+                               isRepositoriesChanged = false;\r
+                               \r
+                               updateRepos();\r
+                       }\r
+               }\r
+               \r
+               private void updateRepos()\r
+               {\r
+                       repoListCheckedListBox.Items.Clear();\r
+                       \r
+                       foreach (RepositoryInfo repo in repos) {\r
+                               string label = repoListCheckedListBoxRenderer(repo);\r
+                               repoListCheckedListBox.Items.Add(label, repo.Enabled);\r
+                       }\r
+               }\r
+               \r
+               public string repoListCheckedListBoxRenderer(RepositoryInfo repo)\r
+               {\r
+                       return string.Format("{0}[{1}]", repo.Name, repo.Url.Href);\r
+               }\r
+               \r
+               \r
+               void RepoListCheckedListBoxSelectedIndexChanged(object sender, EventArgs e)\r
+               {\r
+                       int selectedIndex = repoListCheckedListBox.SelectedIndex;\r
+                       bool selected = (selectedIndex >= 0);\r
+                       \r
+                       removeRepoButton.Enabled        = selected;\r
+                       upRepoButton.Enabled            = selected && ((1 <= selectedIndex) && (selectedIndex < repos.Count));\r
+                       downRepoButton.Enabled          = selected && ((0 <= selectedIndex) && (selectedIndex < (repos.Count-1)));\r
+                       repoUrlLabel.Enabled            = selected;\r
+                       repoUrlTextBox.Enabled          = selected;\r
+                       if (selected) {\r
+                               repoUrlTextBox.Text = repos[repoListCheckedListBox.SelectedIndex].Url.Href;\r
+                               repoUrlTextBox.SelectAll();\r
+                       } else {\r
+                               repoUrlTextBox.Clear();\r
+                       }\r
+               }\r
+               \r
+               void AddRepoButtonClick(object sender, EventArgs e)\r
+               {\r
+                       RepositoryInfo repo = new RepositoryInfo();\r
+                       repo.Name = string.Format("新しいレポジトリ");\r
+                       repo.Url = new LocationEntry();\r
+                       repo.Enabled = true;\r
+                       \r
+                       repos.Add(repo);\r
+                       \r
+                       updateRepos();\r
+                       repoListCheckedListBox.SelectedIndex = repos.Count - 1;\r
+                       \r
+                       isRepositoriesChanged = true;\r
+               }\r
+               \r
+               void RepoListCheckedListBoxItemCheck(object sender, ItemCheckEventArgs e)\r
+               {\r
+                       repos[e.Index].Enabled = (e.NewValue == CheckState.Checked);\r
+                       \r
+                       isRepositoriesChanged = true;\r
+               }\r
+               \r
+               void RemoveRepoButtonClick(object sender, EventArgs e)\r
+               {\r
+                       int selectedIndex = repoListCheckedListBox.SelectedIndex;\r
+                       if ((0 <= selectedIndex) && (selectedIndex < repos.Count)) {\r
+                               string text = string.Format("本当にレポジトリ「{0}」を消去しますか?", repos[selectedIndex].Name);\r
+                               DialogResult result = MessageBox.Show(text, "レポジトリの削除", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);\r
+                               if (result == DialogResult.OK) {\r
+                                       repos.RemoveAt(selectedIndex);\r
+                                       repoListCheckedListBox.Items.RemoveAt(selectedIndex);\r
+                                       \r
+                                       isRepositoriesChanged = true;\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               void UpRepoButtonClick(object sender, EventArgs e)\r
+               {\r
+                       int selectedIndex = repoListCheckedListBox.SelectedIndex;\r
+                       if ((1 <= selectedIndex) && (selectedIndex < repos.Count)) {\r
+                               NaGet.Utils.ListSwap(repos, selectedIndex-1, selectedIndex);\r
+                               AppliStation.Util.GUIUtils.CheckedListBox_SwapItems(repoListCheckedListBox, selectedIndex-1, selectedIndex);\r
+                               repoListCheckedListBox.SelectedIndex --;\r
+                               \r
+                               isRepositoriesChanged = true;\r
+                       }\r
+               }\r
+               \r
+               void DownRepoButtonClick(object sender, EventArgs e)\r
+               {\r
+                       int selectedIndex = repoListCheckedListBox.SelectedIndex;\r
+                       if ((0 <= selectedIndex) && (selectedIndex < (repos.Count-1))) {\r
+                               NaGet.Utils.ListSwap(repos, selectedIndex, selectedIndex+1);\r
+                               AppliStation.Util.GUIUtils.CheckedListBox_SwapItems(repoListCheckedListBox, selectedIndex, selectedIndex+1);\r
+                               repoListCheckedListBox.SelectedIndex ++;\r
+                               \r
+                               isRepositoriesChanged = true;\r
+                       }\r
+               }\r
+               \r
+               void RepoUrlTextBoxLeave(object sender, EventArgs e)\r
+               {\r
+                       int selectedIndex = repoListCheckedListBox.SelectedIndex;\r
+                       if ((0 <= selectedIndex) && (selectedIndex < repos.Count)) {\r
+                               repos[selectedIndex].Url = new LocationEntry(repoUrlTextBox.Text);\r
+                               repoListCheckedListBox.Items[selectedIndex] = repoListCheckedListBoxRenderer(repos[selectedIndex]);\r
+                               \r
+                               isRepositoriesChanged = true;\r
+                       }\r
+               }\r
+               \r
+               public bool IsRepositoryListSettingChanged {\r
+                       get { return isRepositoriesChanged; }\r
+               }\r
+               \r
+               private void commitRepositorySetting()\r
+               {\r
+                       if (isRepositoriesChanged) {\r
+                               NaGet.Utils.PutSerializeObject<RepositoriesList>(NaGet.Env.RepositoriesListFile, this.RepositoriesListSetting);\r
+                       }\r
+               }\r
+               \r
+               void OkButtonClick(object sender, EventArgs e)\r
+               {\r
+                       commitRepositorySetting();\r
+               }\r
+               \r
+               void CancelButtonClick(object sender, EventArgs e)\r
+               {\r
+               }\r
+       }\r
+}\r