OSDN Git Service

チケット #38687 tar.gz 形式が 7-ZIP32.DLL がインストールされている環境下で正しく展開されない
[applistation/AppliStation.git] / AppliStation / InstallationConfirmForm.cs
index 5fc8f4b..f6afea9 100644 (file)
@@ -1,4 +1,5 @@
-using System;\r
+using System;\r
+using System.Collections.Generic;\r
 using System.Drawing;\r
 using System.Windows.Forms;\r
 using NaGet.Packages;\r
@@ -11,17 +12,37 @@ namespace AppliStation
        /// </summary>\r
        public partial class InstallationConfirmForm : Form\r
        {\r
-               private Installation[] installations;\r
+               private Installation[] selectedInstallations = null;\r
+               \r
+               private Installation[] updateInstallations = null;\r
+               \r
+               private Installation[] requiredInstallations = null;\r
                \r
                private PackageListsManager pkgListMan;\r
                \r
-               /// <summary>\r
-               /// \83p\83b\83P\81[\83W\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\82Ì\8fW\8d\87\r
-               /// </summary>\r
-               public Installation[] Installations {\r
-                       get { return installations; }\r
+               private ushort instslistviewitemcheckedguardcounter = 0;\r
+\r
+               public IEnumerable<Installation> Installations {\r
+                       get {\r
+                               return NaGet.Utils.MergeEnumerable<Installation>(requiredInstallations, selectedInstallations);\r
+                       }\r
                        set {\r
-                               installations = value;\r
+                               List<Installation> selectedInstList = new List<Installation>();\r
+                               List<Installation> updateInstList = new List<Installation>();\r
+                               \r
+                               requiredInstallations = null;\r
+                               foreach (Installation inst in value) {\r
+                                       Package instPkg = pkgListMan.InstalledPkgList.GetPackageForName(inst.InstalledPackage.Name) ??\r
+                                               pkgListMan.SystemInstalledPkgList.GetPackageForName(inst.InstalledPackage.Name);\r
+                                       \r
+                                       if (instPkg != null) {\r
+                                               updateInstList.Add(inst);\r
+                                       } else {\r
+                                               selectedInstList.Add(inst);\r
+                                       }\r
+                               }\r
+                               selectedInstallations = selectedInstList.ToArray();\r
+                               updateInstallations = updateInstList.ToArray();\r
                                \r
                                updateInstsListView();\r
                        }\r
@@ -43,110 +64,382 @@ namespace AppliStation
                        //\r
                        InitializeComponent();\r
                        \r
-                       // \8aÇ\97\9d\8eÒ\8c \8cÀ\82Å\93®\82¢\82Ä\82¢\82é\82È\82ç\82Îrunas\82ª\95K\97v\82É\82Í\82È\82ç\82È\82¢\82Ì\82Å\95\\8e¦\82µ\82È\82¢\r
+                       // 管理者権限で動いているならばrunasが必要にはならないので表示しない\r
                        if (NaGet.Utils.IsAdministrators()) {\r
                                runasCheckBox.Checked = false;\r
                                runasCheckBox.Visible = false;\r
                        }\r
+                       \r
+                       // ListViewの効果\r
+                       AppliStation.Util.NativeMethods.ListView_EnableVistaExplorerTheme(instsListView);\r
+                       AppliStation.Util.NativeMethods.ListView_SetDoubleBuffer(instsListView, true);\r
                }\r
                \r
+               #region インストールリスト表示処理部\r
+               \r
+               #region インストールリストの反映\r
+               \r
+               /// <summary>\r
+               /// インストールリストを更新したなどで、リストの表示を更新する\r
+               /// </summary>\r
                private void updateInstsListView()\r
                {\r
-                       instsListView.Items.Clear();\r
+                       instsListView.BeginUpdate();\r
                        \r
-                       if (installations != null) {\r
-                               foreach (Installation inst in installations) {\r
-                                       Package pkg = inst.InstalledPackage;\r
-                                       \r
-                                       Package curPkg = null;\r
-                                       if (pkgListMan != null) {       \r
-                                               curPkg = pkgListMan.InstalledPkgList.GetPackageForName(pkg.Name);\r
-                                               if (curPkg == null) curPkg = pkgListMan.SystemInstalledPkgList.GetPackageForName(pkg.Name);\r
-                                       }\r
-                                       string curVersion = (curPkg == null)? "-" : curPkg.Version;\r
-                                       \r
-                                       ListViewItem item = new ListViewItem(new string[]{pkg.Name, pkg.Version, curVersion});\r
-                                       item.Tag = inst;\r
-                                       item.ToolTipText = pkg.Summary;\r
-                                       item.Checked = true;\r
-                                       \r
-                                       instsListView.Items.Add(item);\r
+                       if (instsListView.Items.Count > 0) {\r
+                               instsListView.Items.Clear();\r
+                       }\r
+                       \r
+                       addInstsListItemPerGroup(requiredInstallations, instsListView.Groups["requires"], true);\r
+                       addInstsListItemPerGroup(selectedInstallations, instsListView.Groups["install"], false);\r
+                       addInstsListItemPerGroup(updateInstallations, instsListView.Groups["update"], false);\r
+                       \r
+                       updateCheckBoxStatuses();\r
+                       updateSilentInstallAsPossibleCheckBox();\r
+                       \r
+                       instsListView.EndUpdate();\r
+               }\r
+\r
+               /// <summary>\r
+               /// 指定したグループのリストの表示を更新する。\r
+               /// </summary>\r
+               /// <param name="insts">インストールリスト</param>\r
+               /// <param name="group">対象のグループ</param>\r
+               /// <param name="firstAppend">先頭に追加するか</param>\r
+               private void addInstsListItemPerGroup(IEnumerable<Installation> insts, ListViewGroup group, bool firstAppend)\r
+               {\r
+                       // まず所属グループのアイテムをすべて削除する\r
+                       if (insts == null) return;\r
+                       \r
+                       instsListView.BeginUpdate();\r
+                       \r
+                       List<ListViewItem> itemsToAdd = new List<ListViewItem>();\r
+                       foreach (Installation inst in insts) {\r
+                               Package pkg = inst.InstalledPackage;\r
+                               \r
+                               string[] itemData = new string[instsListView.Columns.Count];\r
+                               itemData[nameColumnHeader.Index] = pkg.Name;\r
+                               \r
+                               inst.Silent = true; // silent install as possible!\r
+                               \r
+                               Package curPkg = null;\r
+                               if (pkgListMan != null) {\r
+                                       curPkg = pkgListMan.InstalledPkgList.GetPackageForName(pkg.Name) ??\r
+                                               pkgListMan.SystemInstalledPkgList.GetPackageForName(pkg.Name);\r
                                }\r
+                               itemData[versionColumnHeader.Index]        = pkg.Version;\r
+                               itemData[currentVersionColumnHeader.Index] = (curPkg != null)? curPkg.Version : "-";\r
+                               // itemData[silentInstColumnHeader.Index] の設定は instViewUpdateSilentInstallView で\r
+                               itemData[pkgListNameColumnHeader.Index]    = pkg.PackageListName;\r
+                               \r
+                               ListViewItem item = new ListViewItem(itemData);\r
+                               item.Tag = inst;\r
+                               item.ToolTipText = pkg.Summary;\r
+                               item.Checked = true;\r
+                               item.Group = group;\r
+                               instViewUpdateSilentInstallView(item);\r
+                               \r
+                               itemsToAdd.Add(item);\r
                        }\r
                        \r
-                       InstsListViewItemChecked(instsListView, null);\r
-                       instsListView.Refresh();\r
+                       if (firstAppend) {\r
+                               for (int i = 0; i < itemsToAdd.Count; i++) {\r
+                                       instsListView.Items.Insert(i, itemsToAdd[i]);\r
+                               }\r
+                       } else {\r
+                               instsListView.Items.AddRange(itemsToAdd.ToArray());\r
+                       }\r
+                       \r
+                       instsListView.EndUpdate();\r
                }\r
+\r
+               #endregion\r
                \r
-               void InstsListViewItemChecked(object sender, ItemCheckedEventArgs e)\r
+               /// <summary>\r
+               /// アイテムのサイレントインストール部分の表示の更新を行う。\r
+               /// </summary>\r
+               /// <param name="item">対象のインストーラーのリストアイテム</param>\r
+               private void instViewUpdateSilentInstallView(ListViewItem item)\r
                {\r
+                       Installation inst = (Installation) item.Tag;\r
+                       item.SubItems[silentInstColumnHeader.Index].Text =\r
+                               (inst.SupportsSilentOnly)? "サイレントインストールのみサポート" :\r
+                               (inst.Silent)? "サイレントインストール" :\r
+                               (inst.IsSupportsSilent)? "手動でインストール" :\r
+                               "サイレントインストールできませんので、手動でインストールします";\r
+               }\r
+               \r
+               #region instsListViewのオーナードドロー関連\r
+               \r
+               void InstsListViewDrawSubItem(object sender, DrawListViewSubItemEventArgs e)\r
+               {\r
+                       if (e.Header == silentInstColumnHeader) {\r
+                               Installation inst = ((Installation) e.Item.Tag);\r
+                               \r
+                               //e.DrawBackground();\r
+                               e.Graphics.Clip.Intersect(e.Bounds);\r
+                               \r
+                               if (inst.Silent) {\r
+                                       AppliStation.Util.GUIUtils.Graphics_DrawCenterImage(\r
+                                               e.Graphics,\r
+                                               instListViewSilentInstallImageList.Images[0],\r
+                                               e.Bounds, null);\r
+                               } else if (inst.IsSupportsSilent) {\r
+                                       AppliStation.Util.GUIUtils.Graphics_DrawCenterImage(\r
+                                               e.Graphics,\r
+                                               instListViewSilentInstallImageList.Images[0],\r
+                                               e.Bounds,\r
+                                               AppliStation.Util.GUIUtils.GetImageAttributeToGrayOut(0.5f));\r
+                               }\r
+                       } else {\r
+                               e.DrawDefault = true;\r
+                       }\r
+               }\r
+               \r
+               void InstsListViewDrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)\r
+               {\r
+                       if (e.Header == silentInstColumnHeader) {\r
+                               e.DrawBackground();\r
+                               e.Graphics.Clip.Intersect(e.Bounds);\r
+                               AppliStation.Util.GUIUtils.Graphics_DrawCenterImage(\r
+                                       e.Graphics,\r
+                                       instListViewSilentInstallImageList.Images[0],\r
+                                       e.Bounds, null);\r
+                       } else {\r
+                               e.DrawDefault = true;\r
+                       }\r
+               }\r
+               \r
+               #endregion\r
+               \r
+               #endregion\r
+               \r
+               private void updateCheckBoxStatuses()\r
+               {\r
+                       System.Windows.Forms.ListView.ListViewItemCollection items = instsListView.Items;\r
                        System.Windows.Forms.ListView.CheckedListViewItemCollection checkeds = instsListView.CheckedItems;\r
                        \r
-                       okButton.Enabled = checkeds != null && checkeds.Count > 0;\r
+                       instslistviewitemcheckedguardcounter ++;\r
+                       \r
+                       // すべて選択/非選択\r
+                       selectAllCheckBox.CheckState =\r
+                               (checkeds == null || checkeds.Count == 0)? CheckState.Unchecked :\r
+                               (checkeds.Count == items.Count)? CheckState.Checked :\r
+                               CheckState.Indeterminate;\r
+                       \r
+                       // runas情報\r
+                       runasCheckBox.Checked = GetShouldUseRunas();\r
+                       updateUseRunas();\r
+                       \r
+                       // インストール可能か\r
+                       okButton.Enabled = (checkeds != null) && (checkeds.Count > 0);\r
+                       \r
+                       checkUnselectedDependencies();\r
+                       \r
+                       instslistviewitemcheckedguardcounter --;\r
                }\r
                \r
-               AppliStation.Util.ListViewItemSortComparer packageListViewSortComparer;\r
-\r
-               void InstsListViewColumnClick(object sender, ColumnClickEventArgs e)\r
+               void InstsListViewItemChecked(object sender, ItemCheckedEventArgs e)\r
+               {\r
+                       if (instslistviewitemcheckedguardcounter == 0) {\r
+                               updateCheckBoxStatuses();\r
+                       }\r
+               }\r
+               \r
+               void InstsListViewContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)\r
                {\r
-                       SortOrder order = SortOrder.None;\r
+                       System.Windows.Forms.ListView.CheckedIndexCollection  chkIdxes = instsListView.CheckedIndices;\r
+                       System.Windows.Forms.ListView.SelectedIndexCollection selIdxes = instsListView.SelectedIndices;\r
                        \r
-                       if (packageListViewSortComparer == null) {\r
-                               order = SortOrder.Ascending;\r
-                               packageListViewSortComparer = new AppliStation.Util.ListViewItemSortComparer(e.Column, order);\r
-                               instsListView.ListViewItemSorter = packageListViewSortComparer;\r
-                       } else {\r
-                               if (packageListViewSortComparer.Column == e.Column) {\r
-                                       order = (packageListViewSortComparer.Order == SortOrder.Ascending)? SortOrder.Descending : SortOrder.Ascending;\r
+                       silentInstallStripMenuItem.Visible = selIdxes.Count > 0;\r
+                       if (selIdxes.Count > 0) {\r
+                               Installation inst0th = ((Installation) instsListView.Items[selIdxes[0]].Tag);\r
+                               bool bChecked = inst0th.Silent;\r
+                               bool bEnabled = (inst0th.IsSupportsSilent && (!inst0th.SupportsSilentOnly));\r
+                               silentInstallStripMenuItem.Checked = bChecked;\r
+                               silentInstallStripMenuItem.Enabled = bEnabled;\r
+                               \r
+                               for (int i = 1; i < selIdxes.Count; i++) {\r
+                                       Installation inst = ((Installation) instsListView.Items[selIdxes[i]].Tag);\r
                                        \r
-                                       packageListViewSortComparer.Order = order;\r
-                               } else {\r
-                                       order = packageListViewSortComparer.Order;\r
-                                       packageListViewSortComparer.Column = e.Column;\r
+                                       if ( (bChecked != inst.Silent) ||\r
+                                           (bEnabled != (inst.IsSupportsSilent && (!inst.SupportsSilentOnly))) ) {\r
+                                               silentInstallStripMenuItem.CheckState = CheckState.Indeterminate;\r
+                                               silentInstallStripMenuItem.Enabled = false;\r
+                                               break;\r
+                                       }\r
                                }\r
-                               \r
-                               instsListView.Sort();\r
+                       } else {\r
+                               e.Cancel = true;\r
                        }\r
-                       AppliStation.Util.NativeMethods.ColumnHeader_SetSortState(instsListView, e.Column, order);\r
-                       \r
-                       // \83\\81[\83g\91Î\8fÛ\97ñ\82Ì\90F\95t\82¯\r
-                       try {\r
-                               // SendMessage(hWnd, LVM_SETSELECTEDCOLUMN, column, NULL);\r
-                               AppliStation.Util.NativeMethods.SendMessage(instsListView.Handle, 0x1000+140, (uint) e.Column, 0);\r
-                       } catch (Exception) {   \r
+               }\r
+               \r
+               void SilentInstallStripMenuItemClick(object sender, EventArgs e)\r
+               {\r
+                       instsListView.BeginUpdate();\r
+                       bool silent = ! silentInstallStripMenuItem.Checked;\r
+                       foreach (ListViewItem item in instsListView.SelectedItems) {\r
+                               ((Installation) item.Tag).Silent = silent;\r
+                               instViewUpdateSilentInstallView(item);\r
                        }\r
+                       updateSilentInstallAsPossibleCheckBox();\r
+                       instsListView.EndUpdate();\r
                }\r
                \r
-                               \r
-               void InstsListViewContextMenuStripOpening(object sender, System.ComponentModel.CancelEventArgs e)\r
+               void SelectAllCheckBoxCheckedChanged(object sender, EventArgs e)\r
                {\r
-                       System.Windows.Forms.ListView.CheckedIndexCollection coll = instsListView.CheckedIndices;\r
-                       selectAllPackagesStripMenuItem.Enabled = coll.Count < instsListView.Items.Count;\r
-                       unselectAllPackagesStripMenuItem.Enabled = coll.Count > 0;\r
+                       instsListView.BeginUpdate();\r
+                       \r
+                       instslistviewitemcheckedguardcounter ++;\r
+                       \r
+                       if (selectAllCheckBox.CheckState == CheckState.Checked) {\r
+                               foreach (ListViewItem item in instsListView.Items) {\r
+                                       item.Checked = true;\r
+                               }\r
+                       }\r
+                       if (selectAllCheckBox.CheckState == CheckState.Unchecked) {\r
+                               foreach (ListViewItem item in instsListView.Items) {\r
+                                       item.Checked = false;\r
+                               }\r
+                       }\r
+                       \r
+                       instslistviewitemcheckedguardcounter --;\r
+                       \r
+                       updateCheckBoxStatuses();\r
+                       \r
+                       instsListView.EndUpdate();\r
                }\r
-                               \r
-               void SelectAllInstsStripMenuItemClick(object sender, EventArgs e)\r
+               \r
+               void updateSilentInstallAsPossibleCheckBox()\r
                {\r
+                       bool isAllSilentAsPossible = true;\r
+                       bool isAllNotSilentAsPossible = true;\r
+                       bool canChangeSilent = false;\r
+                       \r
                        foreach (ListViewItem item in instsListView.Items) {\r
-                               item.Checked = true;\r
+                               Installation inst = item.Tag as Installation;\r
+                               if (inst != null) {\r
+                                       if (inst.Silent) {\r
+                                               if (! inst.SupportsSilentOnly) {\r
+                                                       isAllNotSilentAsPossible = false;\r
+                                                       canChangeSilent = true;\r
+                                               }\r
+                                       } else {\r
+                                               if (inst.IsSupportsSilent) {\r
+                                                       isAllSilentAsPossible = false;\r
+                                                       canChangeSilent = true;\r
+                                               }\r
+                                       }\r
+                               }\r
                        }\r
-                       instsListView.Refresh();\r
+                       \r
+                       silentInstallAsPossibleCheckBox.Enabled = canChangeSilent;\r
+                       silentInstallAsPossibleCheckBox.CheckState =\r
+                               (isAllSilentAsPossible)? CheckState.Checked :\r
+                               (isAllNotSilentAsPossible)? CheckState.Unchecked :\r
+                               CheckState.Indeterminate;\r
                }\r
                \r
-               void UnselectAllInstsStripMenuItemClick(object sender, EventArgs e)\r
+               void SilentInstallAsPossibleCheckBoxCheckedChanged(object sender, EventArgs e)\r
                {\r
-                       foreach (ListViewItem item in instsListView.CheckedItems) {\r
-                               item.Checked = false;\r
+                       instsListView.BeginUpdate();\r
+                       if (silentInstallAsPossibleCheckBox.CheckState == CheckState.Checked) {\r
+                               foreach (ListViewItem item in instsListView.Items) {\r
+                                       Installation inst = item.Tag as Installation;\r
+                                       if (inst != null) {\r
+                                               if (inst.IsSupportsSilent && inst.Silent == false) {\r
+                                                       inst.Silent = true;\r
+                                                       instViewUpdateSilentInstallView(item);\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       if (silentInstallAsPossibleCheckBox.CheckState == CheckState.Unchecked) {\r
+                               foreach (ListViewItem item in instsListView.Items) {\r
+                                       Installation inst = item.Tag as Installation;\r
+                                       if (inst != null) {\r
+                                               if ((!inst.SupportsSilentOnly) && inst.Silent == true) {\r
+                                                       inst.Silent = false;\r
+                                                       instViewUpdateSilentInstallView(item);\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       instsListView.EndUpdate();\r
+               }\r
+\r
+               void InstallationConfirmFormShown(object sender, EventArgs e)\r
+               {\r
+                       if (InvokeRequired) {\r
+                               Invoke(new MethodInvoker(resolveDependecies));\r
+                       } else {\r
+                               resolveDependecies();\r
                        }\r
-                       instsListView.Refresh();\r
                }\r
                \r
                /// <summary>\r
-               /// \83C\83\93\83X\83g\81[\83\8b\82·\82é\82æ\82¤\91I\91ð\82³\82ê\82½\83p\83b\83P\81[\83W\82Ì\94z\97ñ\r
+               /// 依存関係を解決する\r
+               /// </summary>\r
+               private void resolveDependecies()\r
+               {\r
+                       if (requiredInstallations == null) {\r
+                               Installation[] resolved, dependencies;\r
+                               \r
+                               instsListView.BeginUpdate();\r
+                               \r
+                               DependeciesResolver.ResolveInstallations(\r
+                                       selectedInstallations,\r
+                                       pkgListMan,\r
+                                       out resolved,\r
+                                       out dependencies);\r
+                               \r
+                               requiredInstallations = dependencies;\r
+                               \r
+                               addInstsListItemPerGroup(requiredInstallations, instsListView.Groups["requires"], true);\r
+                               \r
+                               updateCheckBoxStatuses();\r
+                               updateSilentInstallAsPossibleCheckBox();\r
+                               instsListView.EndUpdate();\r
+                       }\r
+               }\r
+               \r
+               /// <summary>\r
+               /// 依存関係を確認してGUIに反映させる。\r
+               /// 選択されていないが依存関係上必要なソフトを探し出す。\r
+               /// </summary>\r
+               /// <returns>選択されていないが依存関係上必要なソフトの個数(何もない場合はゼロ)</returns>\r
+               private uint checkUnselectedDependencies()\r
+               {\r
+                       uint retVal = 0;\r
+                       \r
+                       List<Package> instPkgs = new List<Package>();\r
+                       foreach (Installation inst in Installations) {\r
+                               instPkgs.Add(inst.InstalledPackage);\r
+                       }\r
+                       \r
+                       List<Package> pkg = new List<Package>();\r
+                       foreach (Installation inst in DependeciesResolver.CreateRequiresInstallations(CheckedInstallations, pkgListMan, instPkgs)) {\r
+                               pkg.Add(inst.InstalledPackage);\r
+                       }\r
+                       \r
+                       foreach (ListViewItem item in instsListView.Items) {\r
+                               if ((pkg.IndexOf(((Installation) item.Tag).InstalledPackage) >= 0) && !item.Checked) {\r
+                                       item.ForeColor = Color.Red;\r
+                                       retVal++;\r
+                               } else {\r
+                                       item.ForeColor = Color.Empty;\r
+                               }\r
+                               \r
+                       }\r
+                       return retVal;\r
+               }\r
+               \r
+               /// <summary>\r
+               /// インストールするよう選択されたパッケージの配列\r
                /// </summary>\r
                public Installation[] CheckedInstallations {\r
                        get {\r
-                               System.Collections.Generic.List<Installation> insts = new System.Collections.Generic.List<Installation>();\r
+                               List<Installation> insts = new List<Installation>();\r
                                foreach (ListViewItem item in instsListView.CheckedItems) {\r
                                        insts.Add((Installation) item.Tag);\r
                                }\r
@@ -154,10 +447,10 @@ namespace AppliStation
                        }\r
                }\r
                \r
-               #region runas\8aÖ\98A\r
+               #region runas関連\r
                \r
                /// <summary>\r
-               /// runas\82Å\8eÀ\8ds\82·\82é\82©\94Û\82©\r
+               /// runasで実行するか否か\r
                /// </summary>\r
                public bool UseRunas {\r
                        set {\r
@@ -171,23 +464,23 @@ namespace AppliStation
                }\r
                \r
                /// <summary>\r
-               /// \91I\91ð\82³\82ê\82½\83p\83b\83P\81[\83W\82ð\92²\8d¸\82µ\82Ä\81ARunas\82ð\8eg\82¤\82×\82«\82©\82¢\82È\82©\82ð\95Ô\82·\r
+               /// 選択されたパッケージを調査して、Runasを使うべきかいなかを返す\r
                /// </summary>\r
                public bool GetShouldUseRunas()\r
                {\r
                        if (NaGet.Utils.IsAdministrators()) {\r
-                               // \8aÇ\97\9d\8eÒ\8c \8cÀ\82Å\93®\82¢\82Ä\82¢\82é\8fê\8d\87\82Í\95s\97v\r
-                               return false;   \r
+                               // 管理者権限で動いている場合は不要\r
+                               return false;\r
                        } else if (NaGet.Utils.IsUACEnabled()) {\r
-                               // UAC\82ª\93K\97p\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82Í\95W\8f\80\82Å\82Í\95s\97v\82Æ\82·\82é\r
-                               return false;   \r
+                               // UACが適用されている場合は標準では不要とする\r
+                               return false;\r
                        }\r
                        \r
-                       // \82Ð\82Æ\82Â\82Å\82àPC\83^\81[\83Q\83b\83g\82È\83C\83\93\83X\83g\81[\83\89\82ª\82 \82ê\82Î\95K\97v\82Æ\82·\82é\r
+                       // ひとつでもPCターゲットなインストーラーがあれば必要とする\r
                        foreach (Installation inst in CheckedInstallations) {\r
                                if (inst.TargetPC) return true;\r
                        }\r
-                       // \82»\82ê\88È\8aO\82Í\95s\97v\r
+                       // それ以外は不要\r
                        return false;\r
                }\r
                \r
@@ -198,16 +491,9 @@ namespace AppliStation
                \r
                private void updateUseRunas()\r
                {\r
-                       if (UseRunas) {\r
-                               System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InstallationConfirmForm));\r
-                               okButton.Image = ((System.Drawing.Bitmap)(resources.GetObject("okButton.Image")));\r
-                       } else {\r
-                               okButton.Image = null;\r
-                       }\r
+                       AppliStation.Util.NativeMethods.Button_SetElevationRequiredState(okButton, UseRunas);\r
                }\r
                \r
                #endregion\r
-\r
-\r
        }\r
 }\r