OSDN Git Service

チケット #38687 tar.gz 形式が 7-ZIP32.DLL がインストールされている環境下で正しく展開されない
[applistation/AppliStation.git] / AppliStation / InstallationConfirmForm.cs
index 3b7ed56..f6afea9 100644 (file)
@@ -19,6 +19,8 @@ namespace AppliStation
                private Installation[] requiredInstallations = null;\r
                \r
                private PackageListsManager pkgListMan;\r
+               \r
+               private ushort instslistviewitemcheckedguardcounter = 0;\r
 \r
                public IEnumerable<Installation> Installations {\r
                        get {\r
@@ -82,6 +84,8 @@ namespace AppliStation
                /// </summary>\r
                private void updateInstsListView()\r
                {\r
+                       instsListView.BeginUpdate();\r
+                       \r
                        if (instsListView.Items.Count > 0) {\r
                                instsListView.Items.Clear();\r
                        }\r
@@ -90,8 +94,10 @@ namespace AppliStation
                        addInstsListItemPerGroup(selectedInstallations, instsListView.Groups["install"], false);\r
                        addInstsListItemPerGroup(updateInstallations, instsListView.Groups["update"], false);\r
                        \r
-                       InstsListViewItemChecked(instsListView, null);\r
-                       instsListView.Refresh();\r
+                       updateCheckBoxStatuses();\r
+                       updateSilentInstallAsPossibleCheckBox();\r
+                       \r
+                       instsListView.EndUpdate();\r
                }\r
 \r
                /// <summary>\r
@@ -105,6 +111,8 @@ namespace AppliStation
                        // まず所属グループのアイテムをすべて削除する\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
@@ -115,7 +123,7 @@ namespace AppliStation
                                inst.Silent = true; // silent install as possible!\r
                                \r
                                Package curPkg = null;\r
-                               if (pkgListMan != null) {       \r
+                               if (pkgListMan != null) {\r
                                        curPkg = pkgListMan.InstalledPkgList.GetPackageForName(pkg.Name) ??\r
                                                pkgListMan.SystemInstalledPkgList.GetPackageForName(pkg.Name);\r
                                }\r
@@ -141,6 +149,8 @@ namespace AppliStation
                        } else {\r
                                instsListView.Items.AddRange(itemsToAdd.ToArray());\r
                        }\r
+                       \r
+                       instsListView.EndUpdate();\r
                }\r
 \r
                #endregion\r
@@ -148,7 +158,7 @@ namespace AppliStation
                /// <summary>\r
                /// アイテムのサイレントインストール部分の表示の更新を行う。\r
                /// </summary>\r
-               /// <param name="item">対象のインストーラのリストアイテム</param>\r
+               /// <param name="item">対象ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81®ã\83ªã\82¹ã\83\88ã\82¢ã\82¤ã\83\86ã\83 </param>\r
                private void instViewUpdateSilentInstallView(ListViewItem item)\r
                {\r
                        Installation inst = (Installation) item.Tag;\r
@@ -204,18 +214,38 @@ namespace AppliStation
                \r
                #endregion\r
                \r
-               void InstsListViewItemChecked(object sender, ItemCheckedEventArgs e)\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
+                       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
+                       // インストール可能か\r
                        okButton.Enabled = (checkeds != null) && (checkeds.Count > 0);\r
                        \r
                        checkUnselectedDependencies();\r
+                       \r
+                       instslistviewitemcheckedguardcounter --;\r
                }\r
-                               \r
+               \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
                        System.Windows.Forms.ListView.CheckedIndexCollection  chkIdxes = instsListView.CheckedIndices;\r
@@ -239,37 +269,103 @@ namespace AppliStation
                                                break;\r
                                        }\r
                                }\r
+                       } else {\r
+                               e.Cancel = true;\r
                        }\r
-                       instListToolStripSeparator.Visible = selIdxes.Count > 0;\r
-               \r
-                       \r
-                       selectAllInstsStripMenuItem.Enabled = chkIdxes.Count < instsListView.Items.Count;\r
-                       unselectAllInstsStripMenuItem.Enabled = chkIdxes.Count > 0;\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
-               void SelectAllInstsStripMenuItemClick(object sender, EventArgs e)\r
+               \r
+               void SelectAllCheckBoxCheckedChanged(object sender, EventArgs e)\r
+               {\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 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.Refresh();\r
+                       instsListView.EndUpdate();\r
                }\r
 \r
                void InstallationConfirmFormShown(object sender, EventArgs e)\r
@@ -289,6 +385,8 @@ namespace AppliStation
                        if (requiredInstallations == null) {\r
                                Installation[] resolved, dependencies;\r
                                \r
+                               instsListView.BeginUpdate();\r
+                               \r
                                DependeciesResolver.ResolveInstallations(\r
                                        selectedInstallations,\r
                                        pkgListMan,\r
@@ -299,8 +397,9 @@ namespace AppliStation
                                \r
                                addInstsListItemPerGroup(requiredInstallations, instsListView.Groups["requires"], true);\r
                                \r
-                               InstsListViewItemChecked(instsListView, null);\r
-                               instsListView.Refresh();\r
+                               updateCheckBoxStatuses();\r
+                               updateSilentInstallAsPossibleCheckBox();\r
+                               instsListView.EndUpdate();\r
                        }\r
                }\r
                \r
@@ -330,7 +429,7 @@ namespace AppliStation
                                } else {\r
                                        item.ForeColor = Color.Empty;\r
                                }\r
-                       \r
+                               \r
                        }\r
                        return retVal;\r
                }\r
@@ -371,13 +470,13 @@ namespace AppliStation
                {\r
                        if (NaGet.Utils.IsAdministrators()) {\r
                                // 管理者権限で動いている場合は不要\r
-                               return false;   \r
+                               return false;\r
                        } else if (NaGet.Utils.IsUACEnabled()) {\r
                                // UACが適用されている場合は標準では不要とする\r
-                               return false;   \r
+                               return false;\r
                        }\r
                        \r
-                       // ひとつでもPCターゲットなインストーラがあれば必要とする\r
+                       // ã\81²ã\81¨ã\81¤ã\81§ã\82\82PCã\82¿ã\83¼ã\82²ã\83\83ã\83\88ã\81ªã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81\8cã\81\82ã\82\8cã\81°å¿\85è¦\81ã\81¨ã\81\99ã\82\8b\r
                        foreach (Installation inst in CheckedInstallations) {\r
                                if (inst.TargetPC) return true;\r
                        }\r
@@ -392,12 +491,7 @@ 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