OSDN Git Service

AppliStation-GUI,最初の右クリック時に「インストール先のフォルダー」がパッケージ選択せずとも出るようになっていたのを修正
[applistation/AppliStation.git] / na-get-lib / NaGet.Packages / PackageList.cs
1 using System;\r
2 using System.IO;\r
3 using System.Collections.Generic;\r
4 using System.Xml.Serialization;\r
5 \r
6 namespace NaGet.Packages\r
7 {\r
8         /// <summary>\r
9         /// パッケージのリストの情報を示すクラス\r
10         /// </summary>\r
11         [XmlRoot("PackageList", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")]\r
12         public class PackageList<TPackage> where TPackage : Package\r
13         {\r
14                 /// <summary>\r
15                 /// パッケージリスト自体の識別名\r
16                 /// </summary>\r
17                 public string Name;\r
18 \r
19                 /// <summary>\r
20                 /// パッケージの配列のリスト\r
21                 /// </summary>\r
22                 private List<TPackage> packageArrayList;\r
23 \r
24                 /// <summary>\r
25                 /// コンストラクタ\r
26                 /// </summary>\r
27                 public PackageList()\r
28                 {\r
29                         packageArrayList = new List<TPackage>();\r
30                 }\r
31 \r
32                 /// <summary>\r
33                 /// 本リストが格納しているパッケージのリスト\r
34                 /// </summary>\r
35                 [XmlElement("Package", Namespace="http://diffshare.tv/xmlns/2007/na-get/PackageList/")]\r
36                 public TPackage[] Packages\r
37                 {\r
38                         get\r
39                         {\r
40                                 return packageArrayList.ToArray();\r
41                         }\r
42                         set\r
43                         {\r
44                                 SetPackages(value);\r
45                         }\r
46                 }\r
47                 \r
48                 #region パッケージの追加/削除とイテレーション\r
49                 \r
50                 /// <summary>\r
51                 /// パッケージの中身を書き換える。\r
52                 /// </summary>\r
53                 /// <param name="pkgs"></param>\r
54                 public void SetPackages(IEnumerable<TPackage> pkgs)\r
55                 {\r
56                         packageArrayList.Clear();\r
57                         if (pkgs != null) {\r
58                                 packageArrayList.AddRange(pkgs);\r
59                         }\r
60                 }\r
61                 \r
62                 /// <summary>\r
63                 /// 本リストが格納しているパッケージのイテレータを返す\r
64                 /// </summary>\r
65                 /// <returns>パッケージのイテレータ</returns>\r
66                 public IEnumerator<TPackage> GetEnumerator()\r
67                 {\r
68                         return packageArrayList.GetEnumerator();\r
69                 }\r
70 \r
71                 /// <summary>\r
72                 /// パッケージをリストに追加する\r
73                 /// </summary>\r
74                 /// <param name="package">追加するパッケージ</param>\r
75                 public void AddPackages(IEnumerable<TPackage> package)\r
76                 {\r
77                         packageArrayList.AddRange(package);\r
78                 }\r
79                 \r
80                 /// <summary>\r
81                 /// パッケージをリストにマージ(追加)する\r
82                 /// </summary>\r
83                 /// <param name="package">追加するパッケージ</param>\r
84                 public void AddPackages(PackageList<TPackage> pkgList)\r
85                 {\r
86                         packageArrayList.AddRange(pkgList.packageArrayList);\r
87                 }\r
88                 \r
89                 /// <summary>\r
90                 /// パッケージをリストに追加する\r
91                 /// </summary>\r
92                 /// <param name="package">追加するパッケージ</param>\r
93                 public void AddPackage(TPackage package)\r
94                 {\r
95                         packageArrayList.Add(package);\r
96                 }\r
97                 \r
98                 /// <summary>\r
99                 /// パッケージをリストから削除\r
100                 /// </summary>\r
101                 /// <param name="package">削除するパッケージ</param>\r
102                 public void RemovePackage(TPackage package)\r
103                 {\r
104                         packageArrayList.Remove(package);\r
105                 }\r
106                 \r
107                 #endregion\r
108                 \r
109                 #region パッケージ検索\r
110                 \r
111                 #region 検索用Predicate\r
112                 \r
113                 /// <summary>\r
114                 /// パッケージを検索をする際のPredicateを返す \r
115                 /// </summary>\r
116                 /// <param name="key">検索キー</param>\r
117                 protected internal static Predicate<TPackage> GetPredicateForSearch(string key)\r
118                 {\r
119                         string lowerKey = key.ToLower();\r
120                         return delegate(TPackage package) {\r
121                                 return package.Name.ToLower().IndexOf(lowerKey) >= 0 ||\r
122                                         package.Summary.ToLower().IndexOf(lowerKey) >= 0 ||\r
123                                         ((package.Tags ?? string.Empty).ToLower().IndexOf(lowerKey) >= 0);\r
124                         };\r
125                 }\r
126                 \r
127                 /// <summary>\r
128                 /// パッケージ名で検索をする際のPredicateを返す \r
129                 /// </summary>\r
130                 /// <param name="name">\r
131                 /// パッケージ名\r
132                 /// </param>\r
133                 /// <returns>\r
134                 /// Predicate\r
135                 /// </returns>\r
136                 protected internal static Predicate<TPackage> GetPredicateForPackageName(string name)\r
137                 {\r
138                         return delegate(TPackage package) {\r
139                                 return package.Name == name;\r
140                         };\r
141                 }\r
142                 \r
143                 /// <summary>\r
144                 /// エントリで検索をする際のPredicateを返す \r
145                 /// </summary>\r
146                 /// <param name="entry">\r
147                 /// エントリ\r
148                 /// </param>\r
149                 /// <returns>\r
150                 /// Predicate\r
151                 /// </returns>\r
152                 protected internal static Predicate<TPackage> GetPredicateForEntry(Entry entry)\r
153                 {\r
154                         return entry.Match;\r
155                 }\r
156                 \r
157                 #endregion\r
158                                 \r
159                 /// <summary>\r
160                 /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。\r
161                 /// </summary>\r
162                 /// <param name="predicate">検索条件のPredicate</param>\r
163                 /// <returns>マッチしたパッケージのイテレータ</returns>\r
164                 protected internal IEnumerable<TPackage> Search(Predicate<TPackage> predicate)\r
165                 {\r
166                         return packageArrayList.FindAll(predicate);\r
167                 }\r
168                 \r
169                 /// <summary>\r
170                 /// パッケージを検索して、それにマッチしたパッケージをイテレータとして返す。\r
171                 /// </summary>\r
172                 /// <param name="key">検索キー</param>\r
173                 /// <returns>マッチしたパッケージのイテレータ</returns>\r
174                 public IEnumerable<TPackage> Search(string key)\r
175                 {\r
176                         if (string.IsNullOrEmpty(key)) {\r
177                                 return packageArrayList.AsReadOnly();\r
178                         } else {\r
179                                 return Search(GetPredicateForSearch(key));\r
180                         }\r
181                 }\r
182                 \r
183                 /// <summary>\r
184                 /// 指定した名前に対応するパッケージを返す\r
185                 /// </summary>\r
186                 /// <param name="name">検索にかけるパッケージ名</param>\r
187                 public TPackage GetPackageForName(string name)\r
188                 {\r
189                         return packageArrayList.Find(GetPredicateForPackageName(name));\r
190                 }\r
191                 \r
192                 /// <summary>\r
193                 /// 指定した名前に対応するパッケージを返す\r
194                 /// </summary>\r
195                 /// <param name="name">検索にかけるパッケージ名</param>\r
196                 public IEnumerable<TPackage> GetPackagesForName(string name)\r
197                 {\r
198                         return packageArrayList.FindAll(GetPredicateForPackageName(name));\r
199                 }\r
200                 \r
201                 /// <summary>\r
202                 /// 名前・バージョンが対応するパッケージを返す\r
203                 /// </summary>\r
204                 /// <param name="name">検索にかけるパッケージ名</param>\r
205                 /// <param name="version">検索にかけるパッケージのバージョン</param>\r
206                 public TPackage GetPackageForPackage(string name, string version)\r
207                 {\r
208                         return GetPackageForEntry(new Entry(name, null, version));\r
209                 }\r
210                 \r
211                 /// <summary>\r
212                 /// パッケージ参照エントリが対応するパッケージを返す\r
213                 /// </summary>\r
214                 /// <param name="name">検索にかけるパッケージ参照エントリ</param>\r
215                 public TPackage GetPackageForEntry(Entry entry)\r
216                 {\r
217                         return packageArrayList.Find(GetPredicateForEntry(entry));\r
218                 }\r
219                 \r
220                 /// <summary>\r
221                 /// パッケージ参照エントリが対応するパッケージをすべて返す\r
222                 /// </summary>\r
223                 /// <param name="name">検索にかけるパッケージ参照エントリ</param>\r
224                 public IEnumerable<TPackage> GetPackagesForEntry(Entry entry)\r
225                 {\r
226                         return packageArrayList.FindAll(GetPredicateForEntry(entry));\r
227                 }\r
228                 \r
229                 #endregion\r
230                 \r
231                 /// <summary>\r
232                 /// パッケージリストの各PackageListNameを設定する\r
233                 /// </summary>\r
234                 /// <param name="pkgList">設定するパッケージが入っているパッケージリスト</param>\r
235                 public void FixPackageListName()\r
236                 {\r
237                         foreach (TPackage pkg in packageArrayList) {\r
238                                 pkg.PackageListName = this.Name;\r
239                         }\r
240                 }\r
241         }\r
242 }\r