|
|
VERSION 5.00 Begin {B3E55942-FFD8-11D1-9788-44A620524153} FileExplorer ClientHeight = 8775 ClientLeft = 0 ClientTop = 0 ClientWidth = 9285 _ExtentX = 16378 _ExtentY = 15478 m_iNextNodeNumber= 7 Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ImageLists {FFF9A8F6-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 4 KeysOnly = 0 BeginProperty Item1 {87BC1809-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "imgSmallFolders" Index = 1 Key = "imgSmallFolders" MaskColor = 8388736 BeginProperty ListImages {87BC180B-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 19 KeysOnly = 0 BeginProperty Item1 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "1" Tag = "0" Picture = "FileExplorer.dsx":0000 EndProperty BeginProperty Item2 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 2 Key = "2" Tag = "0" Picture = "FileExplorer.dsx":0352 EndProperty BeginProperty Item3 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 3 Key = "3" Tag = "0" Picture = "FileExplorer.dsx":06A4 EndProperty BeginProperty Item4 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 4 Key = "4" Tag = "0" Picture = "FileExplorer.dsx":09F6 EndProperty BeginProperty Item5 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 5 Key = "5" Tag = "0" Picture = "FileExplorer.dsx":0D48 EndProperty BeginProperty Item6 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 6 Key = "6" Tag = "0" Picture = "FileExplorer.dsx":109A EndProperty BeginProperty Item7 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 7 Key = "7" Tag = "0" Picture = "FileExplorer.dsx":13EC EndProperty BeginProperty Item8 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 8 Key = "8" Tag = "0" Picture = "FileExplorer.dsx":173E EndProperty BeginProperty Item9 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 9 Key = "9" Tag = "0" Picture = "FileExplorer.dsx":1A90 EndProperty BeginProperty Item10 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 10 Key = "10" Tag = "0" Picture = "FileExplorer.dsx":1DE2 EndProperty BeginProperty Item11 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 11 Key = "11" Tag = "0" Picture = "FileExplorer.dsx":2134 EndProperty BeginProperty Item12 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 12 Key = "12" Tag = "0" Picture = "FileExplorer.dsx":2486 EndProperty BeginProperty Item13 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 13 Key = "13" Tag = "0" Picture = "FileExplorer.dsx":27D8 EndProperty BeginProperty Item14 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 14 Key = "14" Tag = "0" Picture = "FileExplorer.dsx":2B2A EndProperty BeginProperty Item15 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 15 Key = "15" Tag = "0" Picture = "FileExplorer.dsx":2E7C EndProperty BeginProperty Item16 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 16 Key = "16" Tag = "0" Picture = "FileExplorer.dsx":31CE EndProperty BeginProperty Item17 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 17 Key = "17" Tag = "0" Picture = "FileExplorer.dsx":3520 EndProperty BeginProperty Item18 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 18 Key = "18" Tag = "0" Picture = "FileExplorer.dsx":3872 EndProperty BeginProperty Item19 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 19 Key = "19" Tag = "0" Picture = "FileExplorer.dsx":3BC4 EndProperty EndProperty DISPID = 1000 EndProperty BeginProperty Item2 {87BC1809-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "imgSmallOpenFolders" Index = 2 Key = "imgSmallOpenFolders" MaskColor = 8388736 BeginProperty ListImages {87BC180B-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 19 KeysOnly = 0 BeginProperty Item1 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "1" Tag = "0" Picture = "FileExplorer.dsx":3F16 EndProperty BeginProperty Item2 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 2 Key = "2" Tag = "0" Picture = "FileExplorer.dsx":4268 EndProperty BeginProperty Item3 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 3 Key = "3" Tag = "0" Picture = "FileExplorer.dsx":45BA EndProperty BeginProperty Item4 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 4 Key = "4" Tag = "0" Picture = "FileExplorer.dsx":490C EndProperty BeginProperty Item5 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 5 Key = "5" Tag = "0" Picture = "FileExplorer.dsx":4C5E EndProperty BeginProperty Item6 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 6 Key = "6" Tag = "0" Picture = "FileExplorer.dsx":4FB0 EndProperty BeginProperty Item7 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 7 Key = "7" Tag = "0" Picture = "FileExplorer.dsx":5302 EndProperty BeginProperty Item8 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 8 Key = "8" Tag = "0" Picture = "FileExplorer.dsx":5654 EndProperty BeginProperty Item9 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 9 Key = "9" Tag = "0" Picture = "FileExplorer.dsx":59A6 EndProperty BeginProperty Item10 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 10 Key = "10" Tag = "0" Picture = "FileExplorer.dsx":5CF8 EndProperty BeginProperty Item11 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 11 Key = "11" Tag = "0" Picture = "FileExplorer.dsx":604A EndProperty BeginProperty Item12 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 12 Key = "12" Tag = "0" Picture = "FileExplorer.dsx":639C EndProperty BeginProperty Item13 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 13 Key = "13" Tag = "0" Picture = "FileExplorer.dsx":66EE EndProperty BeginProperty Item14 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 14 Key = "14" Tag = "0" Picture = "FileExplorer.dsx":6A40 EndProperty BeginProperty Item15 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 15 Key = "15" Tag = "0" Picture = "FileExplorer.dsx":6D92 EndProperty BeginProperty Item16 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 16 Key = "16" Tag = "0" Picture = "FileExplorer.dsx":70E4 EndProperty BeginProperty Item17 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 17 Key = "17" Tag = "0" Picture = "FileExplorer.dsx":7436 EndProperty BeginProperty Item18 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 18 Key = "18" Tag = "0" Picture = "FileExplorer.dsx":7788 EndProperty BeginProperty Item19 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 19 Key = "19" Tag = "0" Picture = "FileExplorer.dsx":7ADA EndProperty EndProperty DISPID = 1001 EndProperty BeginProperty Item3 {87BC1809-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "imgLargeFolders" Index = 3 Key = "imgLargeFolders" MaskColor = 8388736 BeginProperty ListImages {87BC180B-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 19 KeysOnly = 0 BeginProperty Item1 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "1" Tag = "0" Picture = "FileExplorer.dsx":7E2C EndProperty BeginProperty Item2 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 2 Key = "2" Tag = "0" Picture = "FileExplorer.dsx":8A7E EndProperty BeginProperty Item3 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 3 Key = "3" Tag = "0" Picture = "FileExplorer.dsx":96D0 EndProperty BeginProperty Item4 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 4 Key = "4" Tag = "0" Picture = "FileExplorer.dsx":A322 EndProperty BeginProperty Item5 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 5 Key = "5" Tag = "0" Picture = "FileExplorer.dsx":AF74 EndProperty BeginProperty Item6 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 6 Key = "6" Tag = "0" Picture = "FileExplorer.dsx":BBC6 EndProperty BeginProperty Item7 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 7 Key = "7" Tag = "0" Picture = "FileExplorer.dsx":C818 EndProperty BeginProperty Item8 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 8 Key = "8" Tag = "0" Picture = "FileExplorer.dsx":D46A EndProperty BeginProperty Item9 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 9 Key = "9" Tag = "0" Picture = "FileExplorer.dsx":E0BC EndProperty BeginProperty Item10 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 10 Key = "10" Tag = "0" Picture = "FileExplorer.dsx":ED0E EndProperty BeginProperty Item11 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 11 Key = "11" Tag = "0" Picture = "FileExplorer.dsx":F960 EndProperty BeginProperty Item12 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 12 Key = "12" Tag = "0" Picture = "FileExplorer.dsx":105B2 EndProperty BeginProperty Item13 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 13 Key = "13" Tag = "0" Picture = "FileExplorer.dsx":11204 EndProperty BeginProperty Item14 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 14 Key = "14" Tag = "0" Picture = "FileExplorer.dsx":11E56 EndProperty BeginProperty Item15 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 15 Key = "15" Tag = "0" Picture = "FileExplorer.dsx":12AA8 EndProperty BeginProperty Item16 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 16 Key = "16" Tag = "0" Picture = "FileExplorer.dsx":136FA EndProperty BeginProperty Item17 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 17 Key = "17" Tag = "0" Picture = "FileExplorer.dsx":1434C EndProperty BeginProperty Item18 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 18 Key = "18" Tag = "0" Picture = "FileExplorer.dsx":14F9E EndProperty BeginProperty Item19 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 19 Key = "19" Tag = "0" Picture = "FileExplorer.dsx":15BF0 EndProperty EndProperty DISPID = 1002 EndProperty BeginProperty Item4 {87BC1809-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "imgButtons" Index = 4 Key = "imgButtons" MaskColor = 8388736 BeginProperty ListImages {87BC180B-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 5 KeysOnly = 0 BeginProperty Item1 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "1" Tag = "0" Picture = "FileExplorer.dsx":16842 EndProperty BeginProperty Item2 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 2 Key = "2" Tag = "0" Picture = "FileExplorer.dsx":16B94 EndProperty BeginProperty Item3 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 3 Key = "3" Tag = "0" Picture = "FileExplorer.dsx":16EE6 EndProperty BeginProperty Item4 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 4 Key = "4" Tag = "0" Picture = "FileExplorer.dsx":17238 EndProperty BeginProperty Item5 {87BC180D-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 5 Key = "5" Tag = "0" Picture = "FileExplorer.dsx":1758A EndProperty EndProperty DISPID = 1003 EndProperty EndProperty BeginProperty Menus {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 4 KeysOnly = 0 BeginProperty Item1 {91CC37D5-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Caption = "Menu1" Visible = -1 Checked = 0 Enabled = -1 Grayed = 0 MenuBreak = 0 MenuBarBreak = 0 Default = 0 Index = 1 Name = "mnuContext" Tag = 0 StatusBarText = "" BeginProperty Children {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 2 KeysOnly = 0 BeginProperty Item1 {91CC37D5-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Caption = "Run" Visible = -1 Checked = 0 Enabled = -1 Grayed = 0 MenuBreak = 0 MenuBarBreak = 0 Default = 0 Index = 1 Name = "mnuRun" Tag = 0 StatusBarText = "" BeginProperty Children {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Key = "4" DISPID = 1011 EndProperty BeginProperty Item2 {91CC37D5-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Caption = "RunAs" Visible = -1 Checked = 0 Enabled = -1 Grayed = 0 MenuBreak = 0 MenuBarBreak = 0 Default = 0 Index = 2 Name = "mnuRunAs" Tag = 0 StatusBarText = "" BeginProperty Children {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Key = "5" DISPID = 1012 EndProperty EndProperty Key = "1" DISPID = 1007 EndProperty BeginProperty Item2 {91CC37D5-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Caption = "Menu1" Visible = -1 Checked = 0 Enabled = -1 Grayed = 0 MenuBreak = 0 MenuBarBreak = 0 Default = 0 Index = 2 Name = "mnuNew" Tag = 0 StatusBarText = "" BeginProperty Children {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 0 BeginProperty Item1 {91CC37D5-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Caption = "Folder" Visible = -1 Checked = 0 Enabled = -1 Grayed = 0 MenuBreak = 0 MenuBarBreak = 0 Default = 0 Index = 1 Name = "mnuNewFolder" Tag = 0 StatusBarText = "Creates a new foolder under the selected folder" BeginProperty Children {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Key = "1" DISPID = 1016 EndProperty EndProperty Key = "2" DISPID = 1015 EndProperty BeginProperty Item3 {91CC37D5-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Caption = "Menu1" Visible = -1 Checked = 0 Enabled = -1 Grayed = 0 MenuBreak = 0 MenuBarBreak = 0 Default = 0 Index = 3 Name = "mnuFilterOp" StatusBarText = "" BeginProperty Children {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 2 KeysOnly = 0 BeginProperty Item1 {91CC37D5-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Caption = "Filter by name" Visible = -1 Checked = 0 Enabled = -1 Grayed = 0 MenuBreak = 0 MenuBarBreak = 0 Default = 0 Index = 1 Name = "mnuFilterByName" StatusBarText = "" BeginProperty Children {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Key = "Menu1" DISPID = 1018 EndProperty BeginProperty Item2 {91CC37D5-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Caption = "Filter by extension" Visible = -1 Checked = 0 Enabled = -1 Grayed = 0 MenuBreak = 0 MenuBarBreak = 0 Default = 0 Index = 2 Name = "mnuFilterByExt" StatusBarText = "" BeginProperty Children {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Key = "Menu1" DISPID = 1019 EndProperty EndProperty Key = "Menu1" DISPID = 1017 EndProperty BeginProperty Item4 {91CC37D5-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Caption = "Menu1" Visible = -1 Checked = 0 Enabled = -1 Grayed = 0 MenuBreak = 0 MenuBarBreak = 0 Default = 0 Index = 4 Name = "mnuNewURL" StatusBarText = "" BeginProperty Children {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 0 BeginProperty Item1 {91CC37D5-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Caption = "URL..." Visible = -1 Checked = 0 Enabled = -1 Grayed = 0 MenuBreak = 0 MenuBarBreak = 0 Default = 0 Index = 1 Name = "mnuURL" StatusBarText = "" BeginProperty Children {11517450-27FE-11D3-AA41-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Key = "Menu1" DISPID = 1021 EndProperty EndProperty Key = "Menu1" DISPID = 1020 EndProperty EndProperty BeginProperty Toolbars {FFF9A8FA-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 2 KeysOnly = 0 BeginProperty Item1 {91CC37E1-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "tbrFileMgr" Name = "tbrFileMgr" Tag = "0" BeginProperty Buttons {8B034115-FBB2-11D1-9785-EAA220524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 3 KeysOnly = 0 BeginProperty Item1 {91CC37E6-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ButtonMenus {91CC37E7-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Caption = "Add" Enabled = -1 Image = 1 Index = 1 Key = "1" MixedState = 0 Style = 0 Tag = "" ToolTipText = "Add a new folder" Value = 0 Visible = -1 EndProperty BeginProperty Item2 {91CC37E6-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ButtonMenus {91CC37E7-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Caption = "Run" Enabled = -1 Image = 4 Index = 2 Key = "2" MixedState = 0 Style = 0 Tag = "" ToolTipText = "Run" Value = 0 Visible = -1 EndProperty BeginProperty Item3 {91CC37E6-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ButtonMenus {91CC37E7-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Caption = "RunAs" Enabled = -1 Image = 5 Index = 3 Key = "3" MixedState = 0 Style = 0 Tag = "" ToolTipText = "Run with a special command line" Value = 0 Visible = -1 EndProperty EndProperty Images = "imgButtons" DISPID = 1005 EndProperty BeginProperty Item2 {91CC37E1-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 2 Key = "tbrMenuButton" Name = "tbrMenuButton" Tag = "0" BeginProperty Buttons {8B034115-FBB2-11D1-9785-EAA220524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 0 BeginProperty Item1 {91CC37E6-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ButtonMenus {91CC37E7-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 4 KeysOnly = 0 BeginProperty Item1 {91CC37E9-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Enabled = -1 Index = 1 Key = "1" Tag = "" Text = "New Folder" Visible = -1 Checked = 0 Grayed = -1 Separator = 0 MenuBreak = 0 MenuBarBreak = 0 EndProperty BeginProperty Item2 {91CC37E9-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Enabled = -1 Index = 2 Key = "2" Tag = "" Text = "Run" Visible = -1 Checked = 0 Grayed = -1 Separator = 0 MenuBreak = 0 MenuBarBreak = 0 EndProperty BeginProperty Item3 {91CC37E9-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Enabled = -1 Index = 3 Key = "3" Tag = "" Text = "Run As..." Visible = -1 Checked = 0 Grayed = -1 Separator = 0 MenuBreak = 0 MenuBarBreak = 0 EndProperty BeginProperty Item4 {91CC37E9-CE2B-11D1-B44D-7E92AF000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Enabled = -1 Index = 4 Key = "4" Tag = "" Text = "Configuration..." Visible = -1 Checked = 0 Grayed = 0 Separator = 0 MenuBreak = 0 MenuBarBreak = 0 EndProperty EndProperty Caption = "Explorer" Enabled = -1 Image = 1 Index = 1 Key = "" MixedState = 0 Style = 16 Tag = "" ToolTipText = "File Explorer Actions" Value = 0 Visible = -1 EndProperty EndProperty Images = "imgButtons" DISPID = 1006 EndProperty EndProperty BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 3 KeysOnly = 0 BeginProperty Item1 {FFF9A8EC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "lvExplorerFiles" Name = "lvExplorerFiles" AddToViewMenu = 0 ViewMenuText = "" ViewMenuStatusBarText= "" DefaultItemTypeGUID= "{D2B294B2-9F64-11d2-97E1-00104B880587}" Extensible = -1 BeginProperty ListView {87BC180F-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 4 KeysOnly = 0 BeginProperty Item1 {3B15D613-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "1" Tag = 0 Text = "Name" Object.Width = 175 Alignment = 0 Hidden = 0 TextFilter = "" TextFilterMaxLen= 260 NumericFilter = "" EndProperty BeginProperty Item2 {3B15D613-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 2 Key = "2" Tag = 0 Text = "Size" Object.Width = 125 Alignment = 0 Hidden = 0 TextFilter = "" TextFilterMaxLen= 260 NumericFilter = "" EndProperty BeginProperty Item3 {3B15D613-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 3 Key = "3" Tag = 0 Text = "Date" Object.Width = 125 Alignment = 0 Hidden = 0 TextFilter = "" TextFilterMaxLen= 260 NumericFilter = "" EndProperty BeginProperty Item4 {3B15D613-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 4 Key = "4" Tag = 0 Text = "Attributes" Object.Width = 75 Alignment = 0 Hidden = 0 TextFilter = "" TextFilterMaxLen= 260 NumericFilter = "" EndProperty EndProperty Icons = "imgLargeFolders" SmallIcons = "imgSmallFolders" Sorted = 0 SortKey = 1 SortOrder = 0 View = 4 Tag = 0 Virtual = 0 UseFontLinking = 0 MultiSelect = -1 HideSelection = 0 SortHeader = -1 SortIcon = -1 FilterChangeTimeout= 500 ShowChildScopeItems= -1 LexicalSort = 0 EndProperty EndProperty BeginProperty Item2 {FFF9A8EC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 2 Key = "lvExplorerMain" Name = "lvExplorerMain" AddToViewMenu = 0 ViewMenuText = "" ViewMenuStatusBarText= "" DefaultItemTypeGUID= "{D2B294B3-9F64-11d2-97E1-00104B880587}" Extensible = 0 BeginProperty ListView {87BC180F-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 4 KeysOnly = 0 BeginProperty Item1 {3B15D613-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "1" Tag = 0 Text = "Name" Object.Width = 150 Alignment = 0 Hidden = 0 TextFilter = "" TextFilterMaxLen= 260 NumericFilter = "" EndProperty BeginProperty Item2 {3B15D613-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 2 Key = "5" Tag = 0 Text = "Type" Object.Width = 100 Alignment = 0 Hidden = 0 TextFilter = "" TextFilterMaxLen= 260 NumericFilter = "" EndProperty BeginProperty Item3 {3B15D613-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 3 Key = "6" Tag = 0 Text = "Total Size" Object.Width = 100 Alignment = 0 Hidden = 0 TextFilter = "" TextFilterMaxLen= 260 NumericFilter = "" EndProperty BeginProperty Item4 {3B15D613-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 4 Key = "7" Tag = 0 Text = "Free Space" Object.Width = 100 Alignment = 0 Hidden = 0 TextFilter = "" TextFilterMaxLen= 260 NumericFilter = "" EndProperty EndProperty Icons = "imgLargeFolders" SmallIcons = "imgSmallFolders" Sorted = 0 SortKey = 0 SortOrder = 0 View = 3 Tag = 0 Virtual = 0 UseFontLinking = 0 MultiSelect = 0 HideSelection = 0 SortHeader = -1 SortIcon = -1 FilterChangeTimeout= 500 ShowChildScopeItems= -1 LexicalSort = 0 EndProperty EndProperty BeginProperty Item3 {FFF9A8EC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 3 Key = "lvExplorerTop" Name = "lvExplorerTop" AddToViewMenu = -1 ViewMenuText = "File Explorer" ViewMenuStatusBarText= "Start Using File Explorer" DefaultItemTypeGUID= "{D2B294B5-9F64-11d2-97E1-00104B880587}" Extensible = 0 BeginProperty ListView {87BC180F-C8FB-11D1-B44A-30F4BC000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 0 BeginProperty Item1 {3B15D613-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "1" Tag = 0 Text = "Name" Object.Width = 200 Alignment = 0 Hidden = 0 TextFilter = "" TextFilterMaxLen= 260 NumericFilter = "" EndProperty EndProperty Icons = "imgLargeFolders" SmallIcons = "imgSmallFolders" Sorted = 0 SortKey = 0 SortOrder = 0 View = 0 Tag = 0 Virtual = 0 UseFontLinking = 0 MultiSelect = 0 HideSelection = 0 SortHeader = -1 SortIcon = -1 FilterChangeTimeout= 500 ShowChildScopeItems= -1 LexicalSort = 0 EndProperty EndProperty EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 0 BeginProperty Item1 {FFF9A8EE-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "ovAbout" Name = "ovAbout" Tag = 0 AddToViewMenu = -1 ViewMenuText = "About..." ViewMenuStatusBarText= "About File Explorer" ProgID = "FileExplorerSample.AboutCtl" AlwaysCreateNewOCX= -1 EndProperty EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 0 BeginProperty Item1 {FFF9A8F2-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "StaticNodeTaskpad" Index = 1 Key = "StaticNodeTaskpad" AddToViewMenu = -1 ViewMenuText = "Welcome to File Explorer" ViewMenuStatusBarText= "First Time Users Select this View" UseWhenTaskpadViewPreferred= -1 BeginProperty Taskpad {861481F2-D867-11D1-B450-C43058000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "StaticNodeTaskpad" Type = 3 Title = "File Explorer" URL = "" DescriptiveText = "Welcome to the Visual Basic Snap-in Sample" BackgroundType = 1 MouseOverImage = "" MouseOffImage = "" FontFamily = "GLYPH 100" EOTFile = "res://mmc.exe/glyph100.eot" SymbolString = "4" ListpadStyle = 1 ListpadTitle = "" ListpadHasButton= 0 ListpadButtonText= "" ListView = "" BeginProperty Tasks {861481F4-D867-11D1-B450-C43058000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 4 KeysOnly = 0 BeginProperty Item1 {861481F7-D867-11D1-B450-C43058000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 1 Key = "UserGuide" Visible = -1 Tag = 0 Text = "How to Use the File Explorer" ImageType = 1 MouseOverImage = "" MouseOffImage = "" FontFamily = "GLYPH 100" EOTFile = "res://mmc.exe/glyph100.eot" SymbolString = "T" HelpString = "First Time Users Click Here" ActionType = 1 URL = "CUSTOM/USERGUIDE" Script = "" EndProperty BeginProperty Item2 {861481F7-D867-11D1-B450-C43058000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 2 Key = "Start" Visible = -1 Tag = 0 Text = "Start File Explorer" ImageType = 1 MouseOverImage = "" MouseOffImage = "" FontFamily = "GLYPH 100" EOTFile = "res://mmc.exe/glyph100.eot" SymbolString = "4" HelpString = "Experienced Users Click Here" ActionType = 0 URL = "" Script = "" EndProperty BeginProperty Item3 {861481F7-D867-11D1-B450-C43058000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 3 Key = "mmchome" Visible = -1 Tag = 0 Text = "MMC Home Page" ImageType = 1 MouseOverImage = "" MouseOffImage = "" FontFamily = "GLYPH 100" EOTFile = "res://mmc.exe/glyph100.eot" SymbolString = ":" HelpString = "Go to the MMC home page on microsoft.com" ActionType = 0 URL = "" Script = "" EndProperty BeginProperty Item4 {861481F7-D867-11D1-B450-C43058000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Index = 4 Key = "About" Visible = -1 Tag = 0 Text = "About..." ImageType = 1 MouseOverImage = "" MouseOffImage = "" FontFamily = "GLYPH 100" EOTFile = "res://mmc.exe/glyph100.eot" SymbolString = "T" HelpString = "About File Explorer" ActionType = 0 URL = "" Script = "" EndProperty EndProperty EndProperty EndProperty EndProperty EndProperty BeginProperty DataFormats {91FE14C5-7370-11D2-97D8-00104B880587} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty BeginProperty SnapInDef {FFF9A8E4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "FileExplorer" NodeTypeName = "FileExplorer" NodeTypeGUID = "{873CAEF3-4DA3-11D2-8873-0080C7E0ACE4}" DisplayName = "File Explorer" Type = 2 HelpFile = "mmc.chm" LinkedTopics = "" Description = "Snap-in designer sample" Provider = "Microsoft Corporation" Version = "1.0" SmallFolders = "imgSmallFolders" SmallFoldersOpen= "imgSmallOpenFolders" LargeFolders = "imgLargeFolders" Icon = "FileExplorer.dsx":178DC Watermark = "FileExplorer.dsx":17BF6 Header = "FileExplorer.dsx":89B88 Palette = "FileExplorer.dsx":9F006 StretchWatermark= 0 StaticFolder = "19" DefaultView = "lvExplorerTop" Extensible = -1 BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 1 Item1 = "lvExplorerTop" EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 1 Item1 = "StaticNodeTaskpad" EndProperty EndProperty BeginProperty Children {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty IID = "{04750E57-FD3C-4079-9FDB-B3E444539906}" Preload = 0 EndProperty BeginProperty ExtensionDefs {FFF9A8E6-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 ExtendsNewMenu = -1 ExtendsTaskMenu = 0 ExtendsTopMenu = -1 ExtendsViewMenu = -1 ExtendsPropertyPages= -1 ExtendsToolbar = -1 ExtendsNameSpace= -1 BeginProperty ExtendedSnapIns {BDA4B9D1-0872-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 0 BeginProperty Item1 {FFF9A8E8-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "" Index = 1 Key = "{476e6448-aaff-11d0-b944-00c04fd8d5b0}" CLSID = "{476e6448-aaff-11d0-b944-00c04fd8d5b0}" DisplayName = "" Dynamic = 0 ExtendsNameSpace= -1 ExtendsNewMenu = 0 ExtendsTaskMenu = 0 ExtendsPropertyPages= 0 ExtendsToolbar = 0 ExtendsTaskpad = 0 EndProperty EndProperty EndProperty BeginProperty AutoCreateNodes {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 0 BeginProperty Item1 {FFF9A8EA-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "Desktop" Index = 1 Key = "Desktop" NodeTypeName = "Desktop" NodeTypeGUID = "{873CAEFD-4DA3-11D2-8873-0080C7E0ACE4}" DisplayName = "Desktop" Folder = "1" DefaultDataFormat= "" AutoCreate = -1 DefaultView = "lvExplorerFiles" HasChildren = -1 Extensible = 0 BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 1 Item1 = "lvExplorerFiles" EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty EndProperty BeginProperty Children {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 6 KeysOnly = 0 BeginProperty Item1 {FFF9A8EA-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "MyComputer" Index = 1 Key = "MyComputer" NodeTypeName = "MyComputer" NodeTypeGUID = "{119067B6-4DBC-11D2-8873-0080C7E0ACE4}" DisplayName = "My Computer" Folder = "2" DefaultDataFormat= "" AutoCreate = -1 DefaultView = "lvExplorerMain" HasChildren = -1 Extensible = -1 BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 1 Item1 = "lvExplorerMain" EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty EndProperty BeginProperty Children {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Tag = "MyComputer" BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty EndProperty BeginProperty Item2 {FFF9A8EA-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "InternetExplorer" Index = 2 Key = "InternetExplorer" NodeTypeName = "InternetExplorer" NodeTypeGUID = "{1EF2C7CA-5299-11D2-887B-0080C7E0ACE4}" DisplayName = "Internet Explorer" Folder = "13" DefaultDataFormat= "" AutoCreate = -1 DefaultView = "uvBrowser" HasChildren = -1 Extensible = 0 BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty EndProperty BeginProperty Children {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Tag = "InternetExplorer" BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty EndProperty BeginProperty Item3 {FFF9A8EA-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "NetworkNeighborhood" Index = 3 Key = "NetworkNeighborhood" NodeTypeName = "NetworkNeighborhood" NodeTypeGUID = "{1EF2C7CB-5299-11D2-887B-0080C7E0ACE4}" DisplayName = "Network Neighborhood" Folder = "14" DefaultDataFormat= "" AutoCreate = -1 DefaultView = "" HasChildren = -1 Extensible = 0 BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty EndProperty BeginProperty Children {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Tag = "NetworkNeighborhood" BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty EndProperty BeginProperty Item4 {FFF9A8EA-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "RecycleBin" Index = 4 Key = "RecycleBin" NodeTypeName = "RecycleBin" NodeTypeGUID = "{1EF2C7D0-5299-11D2-887B-0080C7E0ACE4}" DisplayName = "Recycle Bin" Folder = "15" DefaultDataFormat= "" AutoCreate = -1 DefaultView = "" HasChildren = -1 Extensible = 0 BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty EndProperty BeginProperty Children {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Tag = "RecycleBin" BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty EndProperty BeginProperty Item5 {FFF9A8EA-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "MyBriefcase" Index = 5 Key = "MyBriefcase" NodeTypeName = "MyBriefcase" NodeTypeGUID = "{1EF2C7D1-5299-11D2-887B-0080C7E0ACE4}" DisplayName = "My Briefcase" Folder = "16" DefaultDataFormat= "" AutoCreate = -1 DefaultView = "" HasChildren = -1 Extensible = 0 BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty EndProperty BeginProperty Children {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Tag = "MyBriefcase" BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty EndProperty BeginProperty Item6 {FFF9A8EA-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "About" Index = 6 Key = "About" NodeTypeName = "About" NodeTypeGUID = "{74F84006-618B-4B3B-9EF3-C23E0723FA9D}" DisplayName = "About FileExplorer" Folder = 19 DefaultDataFormat= "" AutoCreate = -1 DefaultView = "ovAbout" HasChildren = -1 Extensible = -1 BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 1 Item1 = "ovAbout" EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty EndProperty BeginProperty Children {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty EndProperty EndProperty Tag = "Desktop" BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty EndProperty EndProperty BeginProperty OtherNodes {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 2 KeysOnly = 0 BeginProperty Item1 {FFF9A8EA-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "Directory" Index = 1 Key = "Directory" NodeTypeName = "Directory" NodeTypeGUID = "{119067F7-4DBC-11D2-8873-0080C7E0ACE4}" DisplayName = "Directory" Folder = "6" DefaultDataFormat= "" AutoCreate = 0 DefaultView = "lvExplorerFiles" HasChildren = -1 Extensible = -1 BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 1 Item1 = "lvExplorerFiles" EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty EndProperty BeginProperty Children {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Tag = "Directory" BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty EndProperty BeginProperty Item2 {FFF9A8EA-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Name = "ExtensionRoot" Index = 2 Key = "ExtensionRoot" NodeTypeName = "ExtensionRoot" NodeTypeGUID = "{2F6E942D-A3EB-11D2-97E4-00104B880587}" DisplayName = "File Explorer" Folder = "19" DefaultDataFormat= "" AutoCreate = 0 DefaultView = "lvExplorerTop" HasChildren = -1 Extensible = 0 BeginProperty ViewDefs {FFF9A8E1-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 BeginProperty ListViews {FFF9A8FC-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 1 Item1 = "lvExplorerTop" EndProperty BeginProperty OCXViews {FFF9A8FF-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty URLViews {FFF9A902-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 1 EndProperty BeginProperty TaskpadViews {FFF9A904-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 1 KeysOnly = 1 Item1 = "StaticNodeTaskpad" EndProperty EndProperty BeginProperty Children {FFF9A8F4-06CB-11D2-9791-50C320524153} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty Tag = 0 BeginProperty ColumnHeaders {3B15D611-CD57-11D1-B44C-44750B000000} Persistence.MajorVersion= 0 Persistence.MinorVersion= 12 Count = 0 KeysOnly = 0 EndProperty EndProperty EndProperty TypeinfoCookie = 199 ProjectName = "FileExplorerSample" End Attribute VB_Name = "FileExplorer" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = True Attribute VB_PredeclaredId = False Attribute VB_Exposed = True ' =========================================================================== ' | THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF | ' | ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO | ' | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A | ' | PARTICULAR PURPOSE. | ' | Copyright (c) 1998-1999 Microsoft Corporation | ' ===========================================================================
' ============================================================================= ' File: FileExplorer.dsr ' Project: FileExplorerSample ' Type: SnapIn Designer ' =============================================================================
Option Explicit
' Create the FileSystemObject once and hold onto it. Since this object ' will be used repeatedly, it is more convenient to have it as a global. ' This will not necessarily improve performance, as this is a UI-based ' component and the cycles used on creation/destruction of the object ' will be insignificant relative to the user's interaction.
Private m_FileSystemObject As New Scripting.FileSystemObject
' Create the configuration object once and hold onto it. This object has ' properties that hold the settings gathered by the configuration wizard ' property pages.
Private m_ConfigData As New ConfigData
' These variables hold the current filter operator. They are mutually exclusive i.e. one ' is always True and one is always False. The default is to filter by name. Private m_FilterByName As Boolean Private m_FilterByExt As Boolean
' This variable holds the current filter value. The default is "*" Private m_FilterValue As String
Const S_OK = 0& Const S_FALSE = 1&
' Definitions of all literal strings needed
' These are node type names
Const SZ_DIRECTORY = "Directory" Const SZ_EXTENSION_ROOT = "ExtensionRoot" Const SZ_STATICNODE = "Static Node" Const SZ_DESKTOP = "Desktop" Const SZ_MYCOMPUTER = "MyComputer" Const SZ_INTERNETEXPLORER = "InternetExplorer" Const SZ_NETWORKNEIGHBORHOOD = "NetworkNeighborhood" Const SZ_RECYCLEBIN = "RecycleBin" Const SZ_MYBRIEFCASE = "MyBriefcase" Const SZ_DRIVENODE = "Drive Node" Const SZ_ABOUT = "About"
' Key values for toolbar buttons, menu buttons, and menu items.
Const KEY_ADD = "1" Const KEY_RUN = "2" Const KEY_RUNAS = "3" Const KEY_CONFIGURATION = "4"
' Key values for images
Const KEY_DESKTOP = "1" Const KEY_MYCOMPUTER = "2" Const KEY_FLOPPYDRIVE = "3" Const KEY_LOCALDRIVE = "4" Const KEY_CDROM = "5" Const KEY_FOLDER = "6" Const KEY_REMOTEDRIVE = "7" Const KEY_REMOTEDRIVEOFFLINE = "8" Const KEY_FILE = "9" Const KEY_APPLICATION = "10" Const KEY_APPEXTENSION = "11" Const KEY_UNKNOWN = "12" Const KEY_INTERNETEXPLORER = "13" Const KEY_NETWORKNEIGHBORHOOD = "14" Const KEY_RECYCLEBIN = "15" Const KEY_MYBRIEFCASE = "16" Const KEY_FOLDERGRAY = "17" Const KEY_FILEGRAY = "18" Const KEY_EXPLORER = "19"
' Display names
Const SZDISPLAY_FLOPPYDRIVE = "Floppy Disk" Const SZDISPLAY_LOCALDRIVE = "Local Disk" Const SZDISPLAY_CDROM = "CD-ROM Disk" Const SZDISPLAY_REMOTEDRIVE = "Network Connection" Const SZDISPLAY_UNKNOWN = "Unknown Type"
Const SZDISPLAY_DESKTOP = "Desktop" Const SZDISPLAY_MYCOMPUTER = "My Computer" Const SZDISPLAY_SYSTEMFOLDER = "System Folder" Const SZDISPLAY_FOLDER = "File Folder" Const SZDISPLAY_REMOTEDRIVEOFFLINE = "Network Connection" Const SZDISPLAY_FILE = " File" Const SZDISPLAY_APPLICATION = "Application" Const SZDISPLAY_APPEXTENSION = "Application Extension" Const SZDISPLAY_INTERNETEXPLORER = "Internet Explorer" Const SZDISPLAY_NETWORKNEIGHBORHOOD = "Network Neighborhood" Const SZDISPLAY_RECYCLEBIN = "Recycle Bin" Const SZDISPLAY_MYBRIEFCASE = "My Briefcase"
' Column keys for detail view
Const KEY_NAME = "1" Const COLNUM_NAME = 1 Const KEY_TYPE = "5" Const KEY_TOTALSIZE = "6" Const COLNUM_TOTALSIZE = 3 Const KEY_FREESPACE = "7" Const COLNUM_FREESPACE = 4 Const KEY_SIZE = "2" Const COLNUM_SIZE = 2 Const KEY_DATE = "3" Const COLNUM_DATE = 3 Const KEY_ATTRIBUTES = "4"
' Column header text
Const SZDISPLAY_NAME = "Name" Const SZDISPLAY_SIZE = "Size" Const SZDISPLAY_DATE = "Date Modified" Const SZDISPLAY_TOTALSIZE = "Total Size" Const SZDISPLAY_FREESPACE = "Free Space" Const SZDISPLAY_ATTRIBUTES = "Attributes" Const SZDISPLAY_TYPE = "Type"
' Static node taskpad task keys
Const KEY_START = "Start" Const KEY_MMC_HOME_PAGE = "mmchome" Const KEY_ABOUT = "About"
' ResultView names
Const SZ_STATIC_NODE_TASKPAD = "StaticNodeTaskpad" Const SZ_ABOUT_OCX = "ovAbout"
' Shell library constants
Const SW_SHOWNORMAL = 1 Const MAX_PATH = 260 Const CSIDL_DESKTOP = 0
' Potential error values returned from ShellExecute
Const ERROR_FILE_NOT_FOUND = 2& Const ERROR_PATH_NOT_FOUND = 3& Const ERROR_BAD_FORMAT = 11& Const SE_ERR_FNF = 2& Const SE_ERR_PNF = 3& Const SE_ERR_ACCESSDENIED = 5& Const SE_ERR_OOM = 8& Const SE_ERR_SHARE = 26& Const SE_ERR_ASSOCINCOMPLETE = 27& Const SE_ERR_DDETIMEOUT = 28& Const SE_ERR_DDEFAIL = 29& Const SE_ERR_DDEBUSY = 30& Const SE_ERR_NOASSOC = 31& Const SE_ERR_DLLNOTFOUND = 32&
' Format specifiers for file dates and sizes
Const SIZE_FORMAT_SPECIFIER = "##,##0" Const DATE_FORMAT_SPECIFIER = "M/D/YY HH:MM AMPM" Const GIGA_FORMAT_SPECIFIER = "#,##0.0 GB" Const MEGA_FORMAT_SPECIFIER = "#,##0 MB" Const KILO_FORMAT_SPECIFIER = "#,##0 KB" Const BYTE_FORMAT_SPECIFIER = "#,##0 bytes"
Const GIGABYTE = 2 ^ 30 Const MEGABYTE = 2 ^ 20 Const KILOBYTE = 2 ^ 10
' Error message strings
Const SZ_ERRTITLE = "FileExplorer Runtime Error" Const SZ_ERRSHELLEXEC = "FileExplorer Application Launch Error"
' Shell library DLL function declarations
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal Path As String) As Long Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal ProcName As String) As Long Private Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hModule As Long) Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" (ByVal hwnd As Long, ByVal lpPath As String, ByVal nFolder As Long, ByVal fCreate As Boolean) As Long
' ============================================================================= ' Method: AddDrivesToScope ' Type: Subroutine ' Description: Enumerate all the disk drives located on this computer ' (using the FileSystemObject) and add a scope item for ' each drive. ' Parameters: nodeParent The ScopeNode under which to insert ' the scope items ' Output: None ' Notes: This method is called as part of the processing for ' the ScopeItems_Expand event, when the node being expanded ' is "MyComputer". By the time this method has been called, ' we have reached the last of our pre-defined, auto-created nodes. ' We use the FileSystemObject to provide the list of drives ' available, and we create a new ScopeItem for each. ' ' The MyComputer ScopeItem is extensible and it exports a data ' format called "Drives" that contains a string array of the ' drive names being displayed in FileExplorer. The DriveStats ' extension will use that format to display its listpad as the ' result view for the <Stats> node it adds under "My Computer". ' ============================================================================= ' Private Sub AddDrivesToScope(nodeParent As ScopeNode) On Error GoTo ErrTrap_AddDrivesToScope
Dim Drives As Drives ' the Drives collection Dim Drive As Drive ' empty drive object for For...Each Dim DriveScopeItem As ScopeItem ' reference to the newly added ScopeItem Dim szDisplay As String ' display text for scope pane node Dim szType As String ' display text for type of drive Dim szDriveNames() As String ' array of drive names for exported data Dim cDrives As Integer ' count of drives displayed cDrives = 0
' Get the drives collection... Set Drives = m_FileSystemObject.Drives
' ...and start to step through the list For Each Drive In Drives
' If this is a remote drive then check configuration data gathered ' during the configuration wizard to determine whether to add it. If (Drive.DriveType <> Remote) Or (m_ConfigData.ShowNetDrives) Then ' Add the drive name to the array for MyComputer's exported data cDrives = cDrives + 1 ReDim Preserve szDriveNames(1 To cDrives) As String szDriveNames(cDrives) = Drive.Path
' Build the display string for the drive nodes szDisplay = "(" & Drive.Path & ")" ' There is only one global ScopeItems collection, and it is ' a property of the snap-in itself. As such, it is globally ' available to be referenced. Set DriveScopeItem = ScopeItems.AddPreDefined(SZ_DIRECTORY, Drive.Path & "\", nodeParent, siParent) With DriveScopeItem ' Set the NodeID to the path as that is a unique non-localized string that can ' identify the node in the scope pane. Set SlowRetrieval to False so that ' when a console file is reloaded the same scope item will be selected. .NodeID = Drive.Path .SlowRetrieval = False ' Set exported data: Format is "Drive", data is drive name .Data.SetData Drive.Path, "Drive" ' Enable the DriveStats dynamic extension for this scope item. ' This is indexed by CLSID as node type names are not guaranteed to be registered ' or unique. .DynamicExtensions("{8A7A7E11-A8AC-11D2-97E5-00104B880587}").NameSpaceEnabled = True ' We have to separately set the displayed text for this new ScopeItem ' through its ScopeNode. .ScopeNode.DisplayName = szDisplay ' When displaying properties for the node we need to know ' what it represents so set ScopeItem.Tag to the Drive object Set .Tag = Drive ' Assign the appropriate bitmap and type description to the ' new ScopeItem, depending on what kind of drive it is. Select Case Drive.DriveType Case Removable .Folder = KEY_FLOPPYDRIVE szType = SZDISPLAY_FLOPPYDRIVE Case Fixed .Folder = KEY_LOCALDRIVE szType = SZDISPLAY_LOCALDRIVE Case CDRom .Folder = KEY_CDROM szType = SZDISPLAY_CDROM Case Remote .Folder = KEY_REMOTEDRIVE szType = SZDISPLAY_REMOTEDRIVE Case Else ' This is just a catch-all for anything that comes through ' that we don't expect or know how to deal with. .Folder = KEY_UNKNOWN szType = SZDISPLAY_UNKNOWN End Select ' Drive.DriveType ' The key for each item will be the fully ' qualified pathname. This is guaranteed to be unique, ' we don't have to create anything new, and we can easily ' make use of this in other parts of the code .Key = Drive.Path & "\" ' ColumnHeader objects define each of the columns shown in a ListView ' when the view mode is set to Report. ListSubItems CAN'T be added to ' a ListView unless there have been ColumnHeaders defined before then. ' For ListItems, these ColumnHeaders have already been defined as part ' of the ListView definition done through the designer at design-time. ' We add ColumnHeaders here in code to show how that can be done, ' but they could also be defined in the designer in the scope item ' property pages. ' NOTE: These ColumnHeaders MUST match the ColumnHeaders defined ' in the ListView, otherwise they will not display. With .ColumnHeaders .Add 1, KEY_NAME, SZDISPLAY_NAME .Add 2, KEY_TYPE, SZDISPLAY_TYPE .Add 3, KEY_TOTALSIZE, SZDISPLAY_TOTALSIZE .Add 4, KEY_FREESPACE, SZDISPLAY_FREESPACE End With ' .ColumnHeaders ' This is where we add the actual data that will be displayed in the ' in the ResultView for these nodes when the user selects detail view. With .ListSubItems .Add 1, KEY_NAME, szDisplay ' Column "Name" .Add 2, KEY_TYPE, szType ' Column "Type" If Drive.IsReady Then .Add 3, KEY_TOTALSIZE, Format(Drive.TotalSize, SIZE_FORMAT_SPECIFIER) ' Column "Total Size" .Add 4, KEY_FREESPACE, Format(Drive.FreeSpace, SIZE_FORMAT_SPECIFIER) ' Column "Free Space" Else .Add 3, KEY_TOTALSIZE, "0" ' Column "Total Size" .Add 4, KEY_FREESPACE, "0" ' Column "Free Space" End If End With ' .ListSubItems End With ' .DriveScopeItem End If ' Drive.DriveType <> Remote
Next Drive ' At this point the array of drive names is complete and can be exported With ScopeItems(SZ_MYCOMPUTER) .Data.SetData szDriveNames, "DriveNames" ' Enable the DriveStats dynamic extension for the MyComputer scope item. .DynamicExtensions("{8A7A7E11-A8AC-11D2-97E5-00104B880587}").NameSpaceEnabled = True End With Exit Sub
' Error Handler for this method ErrTrap_AddDrivesToScope: DisplayError "AddDrivesToScope"
End Sub
' ============================================================================= ' Method: AddFilesToView ' Type: Subroutine ' Description: Enumerate all the files located within the specified folder ' Parameters: Folder A FileSystemObject object encapsulating a ' directory folder to use for the enumeration ' ResultView A reference to the specific ResultView object ' being activated ' Output: None ' Notes: This method is called as part of the processing for ' the ResultViews_Initialize event, when the user has selected ' a drive or directory in the scope pane. ' We use the Folder object to provide the list of files ' available, and we create a new ListItem for each one. ' ============================================================================= ' Private Sub AddFilesToView(Folder As Scripting.Folder, _ ResultView As SnapInLib.ResultView)
On Error GoTo ErrTrap_AddFilesToView Dim Files As Scripting.Files ' collection of files from within a folder Dim File As Scripting.File ' reference to each file in the Files collection
' From the folder, get the Files collection... Set Files = Folder.Files ' Create each of the list items and all of their list sub-items.
With ResultView.ListView
For Each File In Files AddNewFile .ListItems, File Next File
End With Exit Sub
' Error Handler for this method ErrTrap_AddFilesToView: DisplayError "AddFilesToView"
End Sub
' ============================================================================= ' Method: AddNewFile ' Type: Subroutine ' Description: Add a list item for a file ' data ' Parameters: ListItems The MMCListItems object belonging to the ' ResultView.ListView being populated ' File The FileSystemObject object representing the file ' ' Output: None ' Notes: This method adds a new list item to the list view, sets the ' text for each of the list subitems used in the detail view, and ' sets the data exported for use by extension snap-ins. ' ============================================================================= ' Private Sub AddNewFile(ListItems As MMCListItems, File As Scripting.File) On Error GoTo ErrTrap_AddNewFile Dim ListItem As MMCListItem ' reference to the newly added ListItem ' Check whether the file name matches the current filtering criteria. If Not FileMatchesFilter(File.Name) Then Exit Sub End If ' The ListItems.Add call will add a new row entry ' .ListItems.Add(, ' omit index to append to the collection ' File.Path ' The key value, using the full pathname ' File.Name ' The display text for the item when not in ' ' in detail view ' KEY_FILE ' The index of the image to use
Set ListItem = ListItems.Add(, File.Path, File.Name, KEY_FILE)
' Set the subitem text InitListItem ListItem, File
' Set the exported data InitListItemData ListItem, File Exit Sub ' Error Handler for this method ErrTrap_AddNewFile: DisplayError "AddNewFile"
End Sub
' ============================================================================= ' Method: FileMatchesFilter ' Type: Subroutine ' Description: Check the file name against the current filtering criteria ' ' Parameters: FQFileName Fully qualified file name (drive + path + name) ' Output: True - file matches current filter ' False - file does not match current filter ' Notes: On MMC 1.1 or when the user disables filtering on MMC 1.2 the ' filter value will be * which means that everything matches. ' ============================================================================= ' Private Function FileMatchesFilter(FQFileName As String) Dim BaseName As String ' file name without path prefix Dim FileName As String ' file name portion before the last dot Dim FileExt As String ' file name portion after the last dot Dim DotPos As Integer ' position of dot in file name On Error GoTo ErrTrap_FileMatchesFilter ' We don 't really support a value of *.* but users are likely to type it in so ' treat it the same as * If (m_FilterValue = "*") Or (m_FilterValue = "*.*") Then FileMatchesFilter = True Exit Function End If ' Get file name without the path BaseName = FQFileName
' Get the position of the last dot in the file name DotPos = InStrRev(BaseName, ".", , vbTextCompare) ' Get the file name and extension If DotPos <> 0 Then FileName = Left(BaseName, DotPos - 1) FileExt = Right(BaseName, Len(BaseName) - DotPos) End If
' Apply filter If m_FilterByName Then If DotPos = 0 Then ' no dot, name must match as is If StrComp(BaseName, m_FilterValue, vbTextCompare) <> 0 Then FileMatchesFilter = False Else FileMatchesFilter = True End If Else ' dot found, check name before dot against filter If StrComp(FileName, m_FilterValue, vbTextCompare) <> 0 Then FileMatchesFilter = False Else FileMatchesFilter = True End If End If Else ' filtering by extension If DotPos = 0 Then ' no dot, not a match because file has no extension FileMatchesFilter = False Else ' dot found, check name after dot against filter If StrComp(FileExt, m_FilterValue, vbTextCompare) <> 0 Then FileMatchesFilter = False Else FileMatchesFilter = True End If End If End If
Exit Function
' Error Handler for this method ErrTrap_FileMatchesFilter: DisplayError "FileMatchesFilter"
End Function
' ============================================================================= ' Method: InitListItem ' Type: Subroutine ' Description: Set the list subitems for a new list item ' data ' Parameters: ListItem The MMCListItem object to be initialized ' File The FileSystemObject object for the file ' represented by the list item. ' Output: None ' Notes: This method adds the list subitems to a new list item and sets ' their text according to the column definitions. It also sets ' ListItem.Tag to the File object. ' ============================================================================= ' Private Sub InitListItem(ListItem As MMCListItem, File As Scripting.File)
On Error GoTo ErrTrap_InitListItem
Dim szAttributes As String ' display string to use to build file attributes Dim Index As String
' ListSubItems.Add will add the text to be displayed in all the columns of ' the ListView when shown in Report mode. First clear the subitems ' collection in case this method is being called due to a rename operation. Index = CStr(ListItem.Index) With ListItem.ListSubItems .Clear .Add 1, KEY_NAME & Index, File.Name .Add 2, KEY_SIZE & Index, Format(File.Size, SIZE_FORMAT_SPECIFIER) .Add 3, KEY_DATE & Index, Format(File.DateLastModified, DATE_FORMAT_SPECIFIER)
' Attributes is stored as a bitfield, so translate it ' into a readable string szAttributes = "" If File.Attributes And ReadOnly Then szAttributes = "R" If File.Attributes And Archive Then szAttributes = szAttributes & "A" If File.Attributes And System Then szAttributes = szAttributes & "S" If File.Attributes And Hidden Then szAttributes = szAttributes & "H"
.Add 4, KEY_ATTRIBUTES & Index, szAttributes End With
' In order to display properties for the item we'll need the File ' object so put into MMCListItem.Tag Set ListItem.Tag = File
Exit Sub
' Error Handler for this method ErrTrap_InitListItem: DisplayError "InitListItem"
End Sub
' ============================================================================= ' Method: InitListItemData ' Type: Subroutine ' Description: Set the exported data for a new list item ' data ' Parameters: ListItem The MMCListItem object to be initialized ' File The FileSystemObject object for the file ' represented by the list item. ' Output: None ' Notes: This method stores the exported data in ListItem.Data to be ' used by extension snap-ins. It the file is a DLL then the ' ComDetect sample dynamic extension is enabled. This allows ' ComDetect to add an item to the Task context menu for this ' file allowing the user to query whether the DLL is a COM server. ' ============================================================================= ' Private Sub InitListItemData(ListItem As MMCListItem, File As Scripting.File)
On Error GoTo ErrTrap_InitListItemData
' Set exported data:
'The 1st format is called "File". The data is the file name without the path ListItem.Data.SetData File.Name, "File"
'The 2nd format is called "Path". The data is the fully qualified file name ListItem.Data.SetData File.Path, "Path"
' If this file is a DLL then enable the dynamic extension ComDetect. ' We must use the CLSID as the key because node type names are not required ' by MMC in the registry and even if present, they may not be unique.
If Len(File.Name) > 4 Then If InStr(1, Right$(File.Name, 4), ".DLL", vbTextCompare) <> 0 Then ListItem.DynamicExtensions("{EB882E49-CDD4-11D2-97ED-00104B880587}").Enabled = True End If End If
Exit Sub
' Error Handler for this method ErrTrap_InitListItemData: DisplayError "InitListItemData"
End Sub
' ============================================================================= ' Method: AddFoldersToScope ' Type: Subroutine ' Description: Enumerate all the folders located under the specified folder ' (represented by the ParentScopeItem.Key value) using the ' FileSystemObject ' Parameters: ParentScopeItem The ScopeItem under whose ScopeNode to insert ' the new nodes being added ' Output: None ' Notes: This method is called to support the processing taking place ' during ScopeItems_Expand. ' ============================================================================= ' Private Sub AddFoldersToScope(ParentScopeItem As ScopeItem)
On Error GoTo ErrTrap_AddFoldersToScope Dim ParentFolder As Scripting.Folder Dim SubFolder As Scripting.Folder Dim Folders As Scripting.Folders
' Make sure that this drive is available to be queried If m_FileSystemObject.GetDrive(m_FileSystemObject.GetDriveName(ParentScopeItem.Key)).IsReady Then
' Get a reference to the actual folder represented by the Set ParentFolder = m_FileSystemObject.GetFolder(ParentScopeItem.Key) ' Get the folders collection containing the subdirectories of this folder... Set Folders = ParentFolder.SubFolders
'...and iterate through the list For Each SubFolder In Folders AddNewFolder ParentScopeItem, SubFolder Next SubFolder
End If
Exit Sub
' Error Handler for this method ErrTrap_AddFoldersToScope: DisplayError "AddFoldersToScope"
End Sub
' ============================================================================= ' Method: AddNewFolder ' Type: Subroutine ' Description: Add a new ScopeItem representing the specified SubFolder and ' initialize it ' ' Parameters: ParentScopeItem The ScopeItem under whose ScopeNode to insert ' the new nodes being added ' Output: None ' Notes: This method is called to support the processing taking place ' during ScopeItems_Expand. ' ============================================================================= ' Private Sub AddNewFolder(ParentScopeItem As ScopeItem, _ SubFolder As Scripting.Folder)
On Error GoTo ErrTrap_AddNewFolder Dim FolderScopeItem As ScopeItem
' There is only one global ScopeItems collection, and it is ' a property of the snap-in itself. As such, it is globally ' available to be referenced. Set FolderScopeItem = ScopeItems.AddPreDefined(SZ_DIRECTORY, _ SubFolder.Path, _ ParentScopeItem.ScopeNode, _ siParent)
' Set the NodeID to the path as that is a unique non-localized string that can ' identify the node in the scope pane. Set SlowRetrieval to False so that ' when a console file is reloaded the same scope node will be selected. FolderScopeItem.NodeID = SubFolder.Path FolderScopeItem.SlowRetrieval = False
' Set exported data: Format is "Folder", data is folder path FolderScopeItem.Data.SetData SubFolder.Path, "Folder"
' We have to separately set the displayed text for this new ScopeItem FolderScopeItem.ScopeNode.DisplayName = SubFolder.Name
' Store the fully qualified pathname as the key of the newly created node FolderScopeItem.Key = SubFolder.Path
' Set the image key FolderScopeItem.Folder = KEY_FOLDER
' Set the Folder object in the tag so we can display properties for ' the directory Set FolderScopeItem.Tag = SubFolder
' ColumnHeader objects define each of the columns shown in a ListView ' when the view mode is set to Report. ListSubItems CAN'T be added to ' a ListView unless there have been ColumnHeaders defined before then. ' For ListItems, these ColumnHeaders have already been defined as part ' of the ListView definition done through the designer at design-time. ' We add ColumnHeaders here in code to show how that can be done, ' but they could also be defined in the designer in the scope item ' property pages. ' NOTE: These ColumnHeaders MUST match the ColumnHeaders defined ' in the ListView, otherwise they will not display. With FolderScopeItem.ColumnHeaders .Add 1, KEY_NAME, SZDISPLAY_NAME .Add 2, KEY_SIZE, SZDISPLAY_SIZE .Add 3, KEY_DATE, SZDISPLAY_DATE .Add 4, KEY_ATTRIBUTES, SZDISPLAY_ATTRIBUTES End With
' This is where we add the actual data that will be displayed in the ' in the ResultView for these nodes. With FolderScopeItem.ListSubItems .Add 1, KEY_NAME, SubFolder.Name ' Column "Name" .Add 2, KEY_SIZE, "" ' Column "Size", not used for folders .Add 3, KEY_DATE, Format(SubFolder.DateLastModified, DATE_FORMAT_SPECIFIER) ' Column "Date" .Add 4, KEY_ATTRIBUTES, "" ' Column "Attributes", not used for folders End With
Exit Sub
' Error Handler for this method ErrTrap_AddNewFolder: DisplayError "AddNewFolder"
End Sub
' ============================================================================= ' Method: DisplayError ' Type: Subroutine ' Description: A method to format and display a runtime error ' Parameters: szLocation A string identifying the source location ' (i.e. method name) where the error occurred ' Output: None ' Notes: The error will be displayed in a messagebox formatted as the ' following sample: ' ' Method: SomeMethodName ' Source: MMCListSubItems ' Error: 2527h (9511) ' Description: There is already an item in the collection that has the specified key ' ' ============================================================================= ' Private Sub DisplayError(szLocation As String) ConsoleMsgBox "Method:" & vbTab & vbTab & szLocation & vbCrLf _ & "Source:" & vbTab & vbTab & Err.Source & vbCrLf _ & "Error:" & vbTab & vbTab & Hex(Err.Number) & "h (" & CStr(Err.Number) & ")" & vbCrLf _ & "Description:" & vbTab & Err.Description, _ vbCritical, SZ_ERRTITLE End Sub
' ============================================================================= ' Method: FormatByteCount ' Type: Function ' Description: A function to format a byte count as a string for display ' Parameters: nCount Value to be rounded and formatted ' Output: String A formatted, punctuated numeric string ' Notes: This function will first determine the appropriate suffix ' for the value size (i.e. GB, MB, etc.). It will then round ' the value and format it, with comma and appropriate suffix ' ============================================================================= ' Private Function FormatByteCount(nCount As Double) As String On Error GoTo ErrTrap_FormatByteCount If nCount >= GIGABYTE Then FormatByteCount = Format(nCount / GIGABYTE, GIGA_FORMAT_SPECIFIER) ElseIf nCount >= MEGABYTE And nCount < GIGABYTE Then FormatByteCount = Format(nCount / MEGABYTE, MEGA_FORMAT_SPECIFIER) ElseIf nCount >= KILOBYTE And nCount < MEGABYTE Then FormatByteCount = Format(nCount / KILOBYTE, KILO_FORMAT_SPECIFIER) Else FormatByteCount = Format(nCount, BYTE_FORMAT_SPECIFIER) End If
Exit Function
' Error Handler for this method ErrTrap_FormatByteCount: DisplayError "FormatByteCount" End Function
' ============================================================================= ' Method: LaunchFile ' Type: Subroutine ' Description: A method to start a program, either by starting an executable ' directly or by "executing" a well-known extension, whose ' association is recorded in the registry ' Parameters: FileName A string containing a fully qualified pathname ' Output: None ' Notes: This method utilizes the ShellExecute API. Telling ShellExecute ' to "Open" the file is the same as double-clicking on a file ' listing in the Windows Explorer. If the specified file is an ' application, it will be launched directly. If it is a data file ' and its extension is associated with an application in the ' registry, that application will be launched and loaded with ' this file. Otherwise, this call will fail. ' ============================================================================= ' Private Sub LaunchFile(szFileName As String) On Error GoTo ErrTrap_LaunchFile Dim handle As Long Dim szErrString As Long handle = ShellExecute(0, "Open", szFileName, 0, 0, SW_SHOWNORMAL) ' Check for failure and report it If handle <= 32 Then ' NOTE: Ordinarily, these strings should be stored in a string table as part ' of a resource file attached to this project. This would allow for a ' single place manage all literal strings, as well as allow for ' easy localization for international versions. For the purposes of ' simplicity, however, the strings have been placed here directly. Select Case handle Case ERROR_FILE_NOT_FOUND szErrString = "The specified file was not found." Case ERROR_PATH_NOT_FOUND szErrString = "The specified path was not found." Case ERROR_BAD_FORMAT szErrString = "The .exe file is invalid (non-Win32� .exe or error in .exe image)." Case SE_ERR_ACCESSDENIED szErrString = "The operating system denied access to the specified file." Case SE_ERR_ASSOCINCOMPLETE szErrString = "The file name association is incomplete or invalid." Case SE_ERR_DDEBUSY szErrString = "The DDE transaction could not be completed because other DDE transactions were being processed." Case SE_ERR_DDEFAIL szErrString = "The DDE transaction failed." Case SE_ERR_DDETIMEOUT szErrString = "The DDE transaction could not be completed because the request timed out." Case SE_ERR_DLLNOTFOUND szErrString = "The specified dynamic-link library was not found." Case SE_ERR_FNF szErrString = "The specified file was not found." Case SE_ERR_NOASSOC szErrString = "There is no application associated with the given file name extension." Case SE_ERR_OOM szErrString = "There was not enough memory to complete the operation." Case SE_ERR_PNF szErrString = "The specified path was not found." Case SE_ERR_SHARE szErrString = "A sharing violation occurred" End Select ConsoleMsgBox szErrString, vbExclamation, SZ_ERRSHELLEXEC End If ' handle <= 32
Exit Sub
' Error Handler for this method ErrTrap_LaunchFile: DisplayError "LaunchFile"
End Sub
' ============================================================================= ' Method: LaunchFiles ' Type: Subroutine ' Description: Calls LaunchFile for each file in the specified ListItems ' collection. ' Parameters: ListItems An MMCListItems collection. ' Output: None ' Notes: None ' ============================================================================= ' Private Sub LaunchFiles(ListItems As MMCListItems) On Error GoTo ErrTrap_LaunchFiles Dim ListItem As MMCListItem
For Each ListItem In ListItems LaunchFile ListItem.Key Next ListItem
Exit Sub
' Error Handler for this method ErrTrap_LaunchFiles: DisplayError "LaunchFiles"
End Sub
' ============================================================================= ' Method: LaunchFileRunAs ' Type: Subroutine ' Description: A method to start a program. This method will present a dialog ' box to allow the user to modify the command line before it ' is executed ' Parameters: FileName A string containing a fully qualified pathname ' Output: None ' Notes: In this method we use the Shell command rather than the ' ShellExecute. This is because the ShellExecute API does not ' search through the PATH string, but here we want the RunAs ' behavior to mimic a CommandPrompt ' ============================================================================= ' Private Sub LaunchFileRunAs(szFileName As String)
On Error GoTo ErrTrap_LaunchFileRunAs Dim szCommandLine As String
' Bring the dialog form into memory Load frmRunAs
' Prep the edit field for presentation to the user frmRunAs.txtCmdLine = szFileName ' Display the form as a Modal dialog. This is necessary since we ' cannot display modeless dialogs while running as a snap-in. frmRunAs.Show vbModal ' Check to see if there is a command line to execute If frmRunAs.txtCmdLine.Text <> "" Then ' The shell command will return a taskID upon successful ' completion. At this point, we don't really care what happens ' to the process we're launching, so we're not assigning ' the return value to anything. Shell frmRunAs.txtCmdLine, vbNormalFocus End If
' Dump the form from memory Unload frmRunAs
Exit Sub
' Error Handler for this method ErrTrap_LaunchFileRunAs: DisplayError "LaunchFileRunAs"
End Sub
' ============================================================================= ' Method: LaunchFilesRunAs ' Type: Subroutine ' Description: Calls LaunchFileRunAs for each file in the specified ListItems ' collection. ' Parameters: ListItems An MMCListItems collection. ' Output: None ' Notes: None ' ============================================================================= ' Private Sub LaunchFilesRunAs(ListItems As MMCListItems) On Error GoTo ErrTrap_LaunchFilesRunAs Dim ListItem As MMCListItem
For Each ListItem In ListItems LaunchFileRunAs ListItem.Key Next ListItem Exit Sub
' Error Handler for this method ErrTrap_LaunchFilesRunAs: DisplayError "LaunchFilesRunAs"
End Sub
' ============================================================================= ' Method: GetBaseName ' Type: Function ' Description: Returns the base name extracted from a fully qualified file path. ' ' Parameters: Path Fully qualified path name ' varLastBackSlashPos Optional. If present then 1 based index of ' last backslash is returned here ' Output: Base name of file ' Notes: Example: If path is "c:\winnt\system32\event.log" the returned ' string is "event.log" ' ============================================================================= ' Private Function GetBaseName(ByVal Path As String, _ ByRef varLastBackSlashPos As Variant) As String
On Error GoTo ErrTrap_GetBaseName
' Search from the last character of the string for the last occurrence of '\' Dim iLastBackSlashPos As Integer
iLastBackSlashPos = InStrRev(Path, "\", -1, vbTextCompare) If iLastBackSlashPos = 0 Then Err.Raise vbObjectError + 513, _ "FileExplorer", "Could not find last backslash in path " & Path End If
'Extract the file name from the right side of the path
GetBaseName = Right$(Path, Len(Path) - iLastBackSlashPos)
' If requested, return the position of the last backslash
If Not IsMissing(varLastBackSlashPos) Then varLastBackSlashPos = iLastBackSlashPos End If
Exit Function
' Error Handler for this method ErrTrap_GetBaseName: DisplayError "GetBaseName"
End Function
' ============================================================================= ' Method: Rename ' Type: Function ' Description: Replaces the file name within a fully qualified path ' ' Parameters: OldPath Fully qualified path name ' NewName New file name ' ' Output: New fully qualified path with file name replaced. ' Notes: Example: If OldPath is "c:\winnt\system32\event.log" and ' NewName is "event.txt", returns "c:\winnt\system32\event.txt" ' ============================================================================= ' Private Function Rename(OldPath As String, NewName As String) As String
On Error GoTo ErrTrap_Rename
Dim LastBackSlashPos As Integer Dim OldName As String
' Build the new complete path ' Get the old file name from the old path
OldName = GetBaseName(OldPath, LastBackSlashPos) Rename = Left$(OldPath, LastBackSlashPos) & NewName Exit Function
' Error Handler for this method ErrTrap_Rename: DisplayError "Rename"
End Function
' ============================================================================= ' Method: CreateNewDirectory ' Type: Subroutine ' Description: Creates a new directory in the file system and adds a new ' scope item for it ' ' Parameters: ParentScopeItem ScopeItem of parent directory in which to ' create the new directory ' ' Output: None ' Notes: Creates a new directory under the specified parent using the ' name "New Folder". If that name exists then searches for an ' unused name by appending digits e.g. "New Folder (1)". ' If the parent scope item has not yet been expanded in the ' namespace then that is done so that the scope item for the new ' folder may be added at this time. ' ============================================================================= ' Private Sub CreateNewDirectory(ParentScopeItem As SnapInLib.ScopeItem)
On Error GoTo ErrTrap_CreateNewDirectory Dim Drive As Scripting.Drive Dim Folder As Scripting.Folder Dim NewFolder As Scripting.Folder Dim NewFolderName As String Dim Digit As Integer If TypeOf ParentScopeItem.Tag Is Scripting.Drive Then Set Drive = ParentScopeItem.Tag Set Folder = Drive.RootFolder Else Set Folder = ParentScopeItem.Tag End If
' Find a unique name for the new folder. Try "New Folder". If that is used then try ' "New Folder(1)", "New Folder (2)", etc. NewFolderName = Folder.Path & "\New Folder" Digit = 0
While m_FileSystemObject.FolderExists(NewFolderName) Digit = Digit + 1 NewFolderName = Folder.Path & "\New Folder (" & LTrim$(Str$(Digit)) & ")" Wend
' Create the new folder
Set NewFolder = m_FileSystemObject.CreateFolder(NewFolderName) ' Add a new scope item for the sub-directory. If the parent hasn't yet been expanded ' then do it now and the scope item will be added. If it has already been expanded ' then add the new scope item.
If Not ParentScopeItem.ScopeNode.ExpandedOnce Then ParentScopeItem.ScopeNode.ExpandInNameSpace Else AddNewFolder ParentScopeItem, NewFolder End If
Exit Sub
' Error Handler for this method ErrTrap_CreateNewDirectory: DisplayError "CreateNewDirectory"
End Sub
' ============================================================================= ' Method: ProcessUICommand ' Type: Subroutine ' Description: Processes user input from toolbar, menu button, and context menus. ' ' Parameters: Selection MMCClipboard object containing the current selected ' items. The selection may be in either the scope pane ' or in the result pane. ' Command String containing key of command to execute (KEY_ADD, ' KEY_RUN, or KEY_RUNAS). ' ' Output: None ' Notes: For KEY_ADD creates a new directory under the selected directory ' For KEY_RUN calls LaunchFiles for the selected files ' For KEY_RUNAS calls LaunchFilesRunAs for the selected files ' ============================================================================= ' Private Sub ProcessUICommand(ByVal Selection As SnapInLib.IMMCClipboard, _ ByVal Command As String)
On Error GoTo ErrTrap_ProcessUICommand Dim RootScopeItem As ScopeItem
Dim SelectionType As SnapInSelectionTypeConstants
SelectionType = Selection.SelectionType
Select Case Command
Case KEY_ADD If SelectionType = siSingleScopeItem Then CreateNewDirectory Selection.ScopeItems(1) End If
Case KEY_RUN If (SelectionType = siSingleListItem) Or (SelectionType = siMultiListItems) Then ' Launch the requested files, using the LaunchFile utility method LaunchFiles Selection.ListItems End If
Case KEY_RUNAS If (SelectionType = siSingleListItem) Or (SelectionType = siMultiListItems) Then ' Launch the requested files, using the LaunchFileRunAs utility method LaunchFilesRunAs Selection.ListItems End If Case KEY_CONFIGURATION ' Get the root scope item of the snap-in On Error Resume Next Set RootScopeItem = ScopeItems(SZ_STATICNODE) On Error GoTo ErrTrap_ProcessUICommand If RootScopeItem Is Nothing Then Set RootScopeItem = ScopeItems(SZ_EXTENSION_ROOT) End If ' Create a property sheet with the configuration wizard. This is the same ' wizard that is displayed when FileExplorer is added to a console. With Views.CurrentView.PropertySheetProvider ' Create the property sheet as a wizard. .CreatePropertySheet "FileExplorer Configuration Wizard", siWizard, RootScopeItem ' Tell MMC to add the pages for the primary snap-in. This will fire ' Views_QueryPagesFor and Views_CreatePropertyPages .AddPrimaryPages True ' Tell MMC to show the property sheet starting with the 1st page .Show 1 ' Call the SnapIn_ConfigurationComplete event handler as it ' knows what to do after running the wizard. SnapIn_ConfigurationComplete m_ConfigData End With
Case Else ' This should not occur. If it does, it is because the ' toolbar, menu button, or context menus have been modified and ' this select statement has not been updated to deal with it. ' This will catch the developer's attention without causing problems ' for any unwary end users. Debug.Assert False End Select
Exit Sub
' Error Handler for this method ErrTrap_ProcessUICommand: DisplayError "ProcessUICommand"
End Sub
' ============================================================================= ' Method: ConfirmOverwrite ' Type: Function ' Description: Displays a message box asking the user whether to overwrite ' an existing file. ' ' Parameters: Path Fully qualified path of file that will be overwritten ' ' Output: True if user indicated it is OK to overwrite, otherwise False ' Notes: None ' ============================================================================= ' Private Function ConfirmOverwrite(Path As String) As Boolean
On Error GoTo ErrTrap_ConfirmOverwrite Dim Choice As Integer Choice = ConsoleMsgBox(Path & " exists." & vbCrLf & _ "Do you wish to overwrite?", _ vbYesNo, "FileExplorer") If Choice = vbYes Then ConfirmOverwrite = True Else ConfirmOverwrite = False End If
Exit Function
' Error Handler for this method ErrTrap_ConfirmOverwrite: DisplayError "ConfirmOverwrite"
End Function
' ============================================================================= ' Method: SetUpFilter ' Type: Subroutine ' Description: Initializes column header filters ' ' Parameters: ResultView ResultView being initialized ' ' Output: None ' Notes: We only support filtering on the file name so all other columns ' are set to a zero length empty string filter to prevent the user from ' typing in a value ' ' ============================================================================= ' Private Sub SetUpFilter(ResultView As SnapInLib.ResultView)
On Error GoTo ErrTrap_SetUpFilter m_FilterValue = "*" m_FilterByName = False m_FilterByExt = True
With ResultView.ListView .ColumnHeaders(KEY_NAME).TextFilter = "*" .ColumnHeaders(KEY_NAME).TextFilterMaxLen = 256 .ColumnHeaders(KEY_SIZE).TextFilter = "" .ColumnHeaders(KEY_SIZE).TextFilterMaxLen = 0 .ColumnHeaders(KEY_DATE).TextFilter = "" .ColumnHeaders(KEY_DATE).TextFilterMaxLen = 0 .ColumnHeaders(KEY_ATTRIBUTES).TextFilter = "" .ColumnHeaders(KEY_ATTRIBUTES).TextFilterMaxLen = 0 End With
Exit Sub
' Error Handler for this method ErrTrap_SetUpFilter: DisplayError "SetUpFilter"
End Sub
' ============================================================================= ' Method: ExtensionSnapIn_Expand ' Type: Event ' Description: Called when this snap-in is added as a namespace extension of ' Computer Management\System Tools on Windows 2000. ' ' Parameters: Data MMCDataObject containing the data exported by the ' parent node of the snap-in we are extending ' ScopeNode Represents the parent node ' ' Output: None ' Notes: The actual data exported by the System Tools node is not ' important so we do not examine it. We double check the parent ' node's node type GUID but in theory this is not necessary as ' this event would only be fired when the System Tools node is ' expanding as that it the only node type we extend. When extending ' multiple node types that check would be essential. We add our ' ExtensionRoot predefined node underneath the parent. This node ' is a carbon copy of our static node. ' ============================================================================= ' Private Sub ExtensionSnapIn_Expand(ByVal Data As SnapInLib.IMMCDataObject, _ ByVal ScopeNode As SnapInLib.IScopeNode) On Error GoTo ErrTrap_ExtensionSnapIn_Expand Dim MachineName As String Dim ExtensionRoot As ScopeItem
' If the expanding node is Computer Management\System Tools then add our ' extension root underneath it. If ScopeNode.NodeTypeGUID = "{476e6448-aaff-11d0-b944-00c04fd8d5b0}" Then On Error Resume Next MachineName = FormatData(Data.GetData("MMC_SNAPIN_MACHINE_NAME", 512), 1, siString) On Error GoTo ErrTrap_ExtensionSnapIn_Expand If MachineName = "" Then MachineName = "Local Machine" End If Set ExtensionRoot = ScopeItems.AddPreDefined(SZ_EXTENSION_ROOT, _ SZ_EXTENSION_ROOT, _ ScopeNode, siParent) ExtensionRoot.ScopeNode.DisplayName = "FileExplorer for " & MachineName End If Exit Sub
' Error Handler for this method ErrTrap_ExtensionSnapIn_Expand: DisplayError "ExtensionSnapIn_Expand" End Sub
' ============================================================================= ' Method: mnuNewFolder_Click ' Type: Event ' Description: Called when the "Folder" item on the "New" context menu is clicked ' ' ' Parameters: Index This will always be 1 as we are directly handling ' the event on the individual menu item rather than ' the event on its parent. ' Selection MMCClipboard object containing the currently selected ' items. The selection may be in either the scope pane ' or in the result pane. ' ' Output: None ' Notes: Calls ProcessUICommand to do the work. ' ============================================================================= ' Private Sub mnuNewFolder_Click(ByVal Index As Long, _ ByVal Selection As SnapInLib.IMMCClipboard)
On Error GoTo ErrTrap_mnuNewFolder_Click
ProcessUICommand Selection, KEY_ADD
Exit Sub
' Error Handler for this method ErrTrap_mnuNewFolder_Click: DisplayError "mnuNewFolder_Click"
End Sub
' ============================================================================= ' Method: mnuRun_Click ' Type: Event ' Description: Called when the "Run" item on the context menu is clicked ' ' ' Parameters: Index This will always be 1 as we are directly handling ' the event on the individual menu item rather than ' the event on its parent. ' Selection MMCClipboard object containing the currently selected ' items. The selection may be in either the scope pane ' or in the result pane. ' ' Output: None ' Notes: Calls ProcessUICommand to do the work. ' ============================================================================= ' Private Sub mnuRun_Click(ByVal Index As Long, _ ByVal Selection As SnapInLib.IMMCClipboard)
On Error GoTo ErrTrap_mnuRun_Click
ProcessUICommand Selection, KEY_RUN
Exit Sub
' Error Handler for this method ErrTrap_mnuRun_Click: DisplayError "mnuRun_Click"
End Sub
' ============================================================================= ' Method: mnuRunAs_Click ' Type: Event ' Description: Called when the "Run As..." item on the context menu is clicked ' ' ' Parameters: Index This will always be 1 as we are directly handling ' the event on the individual menu item rather than ' the event on its parent. ' Selection MMCClipboard object containing the currently selected ' items. The selection may be in either the scope pane ' or in the result pane. ' ' Output: None ' Notes: Calls ProcessUICommand to do the work. ' ============================================================================= ' Private Sub mnuRunAs_Click(ByVal Index As Long, _ ByVal Selection As SnapInLib.IMMCClipboard)
On Error GoTo ErrTrap_mnuRunAs_Click
ProcessUICommand Selection, KEY_RUNAS
Exit Sub
' Error Handler for this method ErrTrap_mnuRunAs_Click: DisplayError "mnuRunAs_Click"
End Sub
' ============================================================================= ' Method: FilterResultPane ' Type: Subroutine ' Description: Filters the contents of the list view in the result pane ' Parameters: ResultView The ResultView to be filtered ' Output: None ' Notes: See ResultViews_FilterButtonClick for an explanation of how the ' filter operator is applied. ' =============================================================================
Private Sub FilterResultPane(ResultView As SnapInLib.ResultView)
On Error GoTo ErrTrap_FilterResultPane Dim Folder As Scripting.Folder Dim Drive As Scripting.Drive With ResultView.ScopePaneItem.ScopeItem ' Get the folder of the currently selected scope item in the scope pane Set Folder = Nothing If TypeOf .Tag Is Scripting.Folder Then Set Folder = .Tag ElseIf TypeOf .Tag Is Scripting.Drive Then Set Drive = .Tag If Drive.IsReady Then Set Folder = Drive.RootFolder End If End If
If Folder Is Nothing Then Exit Sub End If ' Remove all the files from the result pane ResultView.ListView.ListItems.Clear ' Re-add all of the files. AddFilesToView will filter out files that do not ' apply AddFilesToView Folder, ResultView
End With Exit Sub
' Error Handler for this method ErrTrap_FilterResultPane: DisplayError "FilterResultPane"
End Sub
' ============================================================================= ' Method: mnuURL_Click ' Type: Event ' Description: Called when the "URL..." item is clicked on the "New" submenu ' for the Internet Explorer node ' ' Parameters: Index This will always be 1 as we are directly handling ' the event on the individual menu item rather than ' the event on its parent. ' Selection MMCClipboard object containing the currently selected ' items. The selection may be in either the scope pane ' or in the result pane. ' ' Output: None ' Notes: Display the property sheet for the Internet Explorer node. ' ============================================================================= ' Private Sub mnuURL_Click(ByVal Index As Long, _ ByVal Selection As SnapInLib.MMCClipboard)
On Error GoTo ErrTrap_mnuURL_Click ' Display the property sheet for the Internet Explorer node programmatically. With CurrentView.PropertySheetProvider .CreatePropertySheet "Internet Explorer", siPropertySheet, _ ScopeItems(SZ_INTERNETEXPLORER), True, True ' Check if the Internet Explorer scope item is selected in the scope pane If CurrentScopePaneItem.Key = SZ_INTERNETEXPLORER Then .AddPrimaryPages True Else .AddPrimaryPages False End If .Show 1 End With Exit Sub
' Error Handler for this method ErrTrap_mnuURL_Click: DisplayError "mnuURL_Click"
End Sub
' ============================================================================= ' Method: ResultViews_Activate ' Type: Event ' Description: Fired when a ResultView is about to be displayed in the result ' pane ' Parameters: ResultView The ResultView being shown ' Output: None ' Notes: We use this event to put a count of the objects in the result ' pane into the description bar. The description bar is like ' a status bar but it appears on top of the result pane. It is ' only displayed if the user makes it visible using the View menu. ' Note that a snap-in cannot write to the description bar during ' ResultViews_Initialize because MMC has not yet created ' the result pane at that point. ' ============================================================================= ' Private Sub ResultViews_Activate(ByVal ResultView As SnapInLib.IResultView) On Error GoTo ErrTrap_ResultViews_Activate Dim Drive As Scripting.Drive Dim Folder As Scripting.Folder Dim Files As Scripting.Files Set Folder = Nothing ' If this is the IE Browser Node then display the URL in the status bar If ResultView.ScopePaneItem.Name = SZ_INTERNETEXPLORER Then CurrentView.SetStatusBarText ResultView.DisplayString End If
' Get the folder for which contents are being displayed in the result pane With ResultView.ScopePaneItem.ScopeItem If TypeOf .Tag Is Scripting.Folder Then Set Folder = .Tag ElseIf TypeOf .Tag Is Scripting.Drive Then Set Drive = .Tag If Drive.IsReady Then Set Folder = Drive.RootFolder End If End If End With If Folder Is Nothing Then Exit Sub End If ' Put the count of all directories and files on the description bar ResultView.SetDescBarText CStr(Folder.SubFolders.Count + Folder.Files.Count) & " object(s)"
Exit Sub
' Error Handler for this method ErrTrap_ResultViews_Activate:
DisplayError "ResultViews_Activate"
End Sub
' ============================================================================= ' Method: ResultViews_CompareItems ' Type: Event ' Description: Fired when populating a sorted listview ' Parameters: ResultView The ResultView being populated ' Object1 First item to compare ' Object2 Second item to compare ' Column The column on which the sort is occurring ' Result Comparison Result returned here ' ' Output: Result 0 if list items are lexically equal ' 1 if item1 is lexcially greater than item 2 ' -1 if item1 is lexcially lesser than item 2 ' Notes: This event does not need to take into account the sort order as MMC ' will reverse the result as needed depending on the sort order. ' FileExplorer allows sorting on date and size for files and folders, or ' total size and free space for drives. ' Note that there is no code in this handler for the name and attribute ' columns because we use the default sort which is a alphabetical. ' On MMC 1.1, both objects will always be list items. On MMC 1.2 ' they could be either scope items or list items. ' ============================================================================= ' Private Sub ResultViews_CompareItems(ByVal ResultView As SnapInLib.ResultView, _ ByVal Object1 As Object, _ ByVal Object2 As Object, _ ByVal Column As Long, _ Result As Variant)
On Error GoTo ErrTrap_ResultViews_CompareItems Dim ScopeItem1 As ScopeItem Dim ScopeItem2 As ScopeItem Dim ListItem1 As MMCListItem Dim ListItem2 As MMCListItem Dim Drive1 As Scripting.Drive Dim Drive2 As Scripting.Drive Dim Folder1 As Scripting.Folder Dim Folder2 As Scripting.Folder Dim File1 As Scripting.File Dim File2 As Scripting.File Dim Size1 As Double Dim Size2 As Double Dim Date1 As Date Dim Date2 As Date Dim fSizeCompare As Boolean Dim fDateCompare As Boolean fSizeCompare = False fDateCompare = False ' Determine whether we have scope items or list items If TypeOf Object1 Is ScopeItem Then Set ScopeItem1 = Object1 Else Set ListItem1 = Object1 End If If TypeOf Object2 Is ScopeItem Then Set ScopeItem2 = Object2 Else Set ListItem2 = Object2 End If ' If we have scope items then determine whether they represent folders or ' drives. If Not ScopeItem1 Is Nothing Then If TypeOf ScopeItem1.Tag Is Scripting.Drive Then Set Drive1 = ScopeItem1.Tag ElseIf TypeOf ScopeItem1.Tag Is Scripting.Folder Then Set Folder1 = ScopeItem1.Tag End If End If If Not ScopeItem2 Is Nothing Then If TypeOf ScopeItem2.Tag Is Scripting.Drive Then Set Drive2 = ScopeItem2.Tag ElseIf TypeOf ScopeItem2.Tag Is Scripting.Folder Then Set Folder2 = ScopeItem2.Tag End If End If ' If we have list items then get the file objects If Not ListItem1 Is Nothing Then Set File1 = ListItem1.Tag End If If Not ListItem2 Is Nothing Then Set File2 = ListItem2.Tag End If
' If the request is to compare a folder and a file then return a result indicating that ' the folder is lexcially lesser than the file. This ensures that folders always appear ' together and files appear together, each group sorted among themselves. This is ' similar to the way the Windows Explorer displays folders and files. If (Not Folder1 Is Nothing) And (Not File2 Is Nothing) Then Result = -1 Exit Sub ElseIf (Not File1 Is Nothing) And (Not Folder2 Is Nothing) Then Result = 1 Exit Sub End If
' If we have drives then we could be sorting on total size or free space. If it is ' anything else then let the designer runtime do an alphabetical sort. If Not Drive1 Is Nothing Then If (Column <> COLNUM_TOTALSIZE) And (Column <> COLNUM_FREESPACE) Then Exit Sub End If fSizeCompare = True If Column = COLNUM_TOTALSIZE Then If Drive1.IsReady Then Size1 = Drive1.TotalSize Else Size1 = 0 End If If Drive2.IsReady Then Size2 = Drive2.TotalSize Else Size2 = 0 End If ElseIf Column = COLNUM_FREESPACE Then If Drive1.IsReady Then Size1 = Drive1.FreeSpace Else Size1 = 0 End If If Drive2.IsReady Then Size2 = Drive2.FreeSpace Else Size2 = 0 End If End If Else ' Folders or files. Could be size or date. If it is anything else then let the ' runtime handle it. If (Column <> COLNUM_SIZE) And (Column <> COLNUM_DATE) Then Exit Sub End If If Column = COLNUM_SIZE Then fSizeCompare = True If Not Folder1 Is Nothing Then Size1 = Folder1.Size Else Size1 = File1.Size End If If Not Folder2 Is Nothing Then Size2 = Folder2.Size Else Size2 = File2.Size End If Else ' COLNUM_DATE fDateCompare = True If Not Folder1 Is Nothing Then Date1 = Folder1.DateLastModified Else Date1 = File1.DateLastModified End If If Not Folder2 Is Nothing Then Date2 = Folder2.DateLastModified Else Date2 = File2.DateLastModified End If End If
End If ' At this point we know whether we are comparing sizes or dates so do the comparison ' and return a result. The result is computed in the same way as the function StrComp. If fSizeCompare Then If Size1 = Size2 Then Result = 0 ElseIf Size1 > Size2 Then Result = 1 Else Result = -1 End If Else If Date1 = Date2 Then Result = 0 ElseIf Date1 > Date2 Then Result = 1 Else Result = -1 End If End If Exit Sub
' Error Handler for this method ErrTrap_ResultViews_CompareItems:
DisplayError "ResultViews_CompareItems"
End Sub
' ============================================================================= ' Method: ResultViews_FilterButtonClick ' Type: Event ' Description: Fired when a the user clicks the filter button ' Parameters: ResultView The ResultView in which the click occurred ' Column The column on which the click occurred ' Left, Top The coordinates of the top left corner of ' the column header ' Height, Width The width of the column header ' Output: None ' Notes: The user clicks the filter button in order to change the ' filter operator. The filter operator determines how the snap-in ' interprets the filter value entered into the header control. ' FileExplorer does some very primitive file name filtering as ' an example of this feature. The user can choose to filter by ' file name or extension. For example, if the user filters by ' extension and enters "DLL" for the filter value then FileExplorer ' will display only files that match *.dll. Entering a filter ' value of "*" will display all files (i.e. *.*). ' ============================================================================= ' Private Sub ResultViews_FilterButtonClick(ByVal ResultView As SnapInLib.ResultView, _ ByVal Column As SnapInLib.MMCColumnHeader, _ ByVal Left As Long, _ ByVal Top As Long, _ ByVal Height As Long, _ ByVal Width As Long)
On Error GoTo ErrTrap_ResultViews_FilterButtonClick ' If this is not the name column then ignore it If Column.Key <> KEY_NAME Then Exit Sub End If
' Update the filter value m_FilterValue = Column.TextFilter ' Display the filter operator popup menu. If the user makes a selection then the ' menu event handlers will update m_FilterByName and m_FilterByExt. Set a checkmark ' next to the current filter operator before displaying the menu. If m_FilterByName Then mnuFilterByName.Checked = True Else mnuFilterByName.Checked = False End If If m_FilterByExt Then mnuFilterByExt.Checked = True Else mnuFilterByExt.Checked = False End If
CurrentView.PopupMenu mnuFilterOp, Left, Top ' MMC will generate a ResultViews_FilterChange event immediately after this ' in which we will update the result pane. Exit Sub
' Error Handler for this method ErrTrap_ResultViews_FilterButtonClick:
DisplayError "ResultViews_FilterButtonClick"
End Sub
' ============================================================================= ' Method: mnuFilterByName_Click ' Type: Event ' Description: Fired when a the user selects "Filter by name" on the filter ' button popup menu ' Parameters: Index Index of the menu item clicked ' Selection Not used ' Output: None ' Notes: Changes the values of module level variables that store the ' filter operator ' ============================================================================= ' Private Sub mnuFilterByName_Click(ByVal Index As Long, ByVal Selection As SnapInLib.MMCClipboard) m_FilterByName = True m_FilterByExt = False End Sub
' ============================================================================= ' Method: mnuFilterByExt_Click ' Type: Event ' Description: Fired when a the user selects "Filter by extension" on the filter ' button popup menu ' Parameters: Index Index of the menu item clicked ' Selection Not used ' Output: None ' Notes: Changes the values of module level variables that store the ' filter operator ' ============================================================================= ' Private Sub mnuFilterByExt_Click(ByVal Index As Long, ByVal Selection As SnapInLib.MMCClipboard) ' Set the current filter operator m_FilterByName = False m_FilterByExt = True End Sub
' ============================================================================= ' Method: ResultViews_FilterChange ' Type: Event ' Description: Fired when a the user enters a new filter value or ' enables/disables fitlering ' Parameters: ResultView The ResultView in which the click occurred ' Column The column on which the the click occurred ' ChangeType Enable/Disable/New Value ' ' Output: None ' ' Notes: If value has changed then record the filter and refresh the ' result pane. If filtering has been disabled then refresh the ' result pane so that all files will be displayed. ' ============================================================================= ' Private Sub ResultViews_FilterChange(ByVal ResultView As SnapInLib.ResultView, _ ByVal Column As SnapInLib.MMCColumnHeader, _ ByVal ChangeType As SnapInLib.SnapInFilterChangeTypeConstants) On Error GoTo ErrTrap_ResultViews_FilterChange
' If enabling, then there's nothing to do yet because the user hasn't entered ' any filter value If ChangeType = siEnable Then Exit Sub End If ' If disabling then reset the filter value and refresh the result pane If ChangeType = siDisable Then m_FilterValue = "*" FilterResultPane ResultView Exit Sub End If
' It is a filter value change. If this is not the Name column then ignore it If Column.Key <> KEY_NAME Then Exit Sub End If
' Record the new filter value m_FilterValue = Column.TextFilter
' Refresh the result pane and apply the filter FilterResultPane ResultView
Exit Sub
' Error Handler for this method ErrTrap_ResultViews_FilterChange:
DisplayError "ResultViews_FilterChange"
End Sub
' ============================================================================= ' Method: ResultViews_Initialize ' Type: Event ' Description: Fired when a new ResultView is created. ' Parameters: ResultView A reference to the specific ResultView object ' being initialized ' Output: None ' Notes: This is the event used to trigger population of the ResultView. ' It only occurs as a ResultView is being created. It is not ' fired in response to changing the view mode. In normal ' operation, a ResultView's ListItems are destroyed when a new ' ResultView is created. ResultViews are not cached by default. ' Any ListSubItems attached to ScopeItems appearing in the result ' pane will appear automatically. We only need to explicitly add ' items that only exist in the ListView (i.e. the files). ' ============================================================================= ' Private Sub ResultViews_Initialize(ByVal ResultView As SnapInLib.IResultView)
On Error GoTo ErrTrap_ResultViews_Initialize
Dim Folder As Scripting.Folder
' It is a files listview.
With ResultView.ScopePaneItem ' We are only going to populate the ListView with files for ' a node that represents a drive (root directory) or a folder If .ScopeItem.ScopeNode.NodeTypeName = SZ_DIRECTORY Then ' Let's first make sure that the drive represented by this ' ScopeItem is available to be queried (e.g. the A: drive ' may not have a floppy disk in it) If m_FileSystemObject.GetDrive(m_FileSystemObject.GetDriveName(.ScopeItem.Key)).IsReady Then ' Get a reference to the folder object represented ' by the current scope node Set Folder = m_FileSystemObject.GetFolder(.ScopeItem.Key) End If ElseIf .ScopeItem.ScopeNode.NodeTypeName = SZ_DESKTOP Then ' The Desktop is actually a special folder, that sits under ' \<Windows>\Profiles\<Current User>\Desktop, so we can ' have files to add to the ListView from here also. Dim szPath As String * MAX_PATH ' Variable to receive the pathname into Dim hModule As Long Dim ProcAddr As Long ' ' Ask the Shell for the real path of the current user's Desktop folder ' Note: If IE is installed without the Desktop Update this API is not ' available. Therefore, we need to verify the API is available prior ' to making the call. ' hModule = LoadLibrary("shell32.dll") If hModule <> 0 Then ProcAddr = GetProcAddress(hModule, "SHGetSpecialFolderPath") If ProcAddr <> 0 Then Dim hr As Long ' HRESULT for API call hr = SHGetSpecialFolderPath(0, szPath, CSIDL_DESKTOP, False) If hr = S_OK Or hr = S_FALSE Then ' If we got a valid string, try to open a folder object for it Set Folder = m_FileSystemObject.GetFolder(szPath) End If End If End If ' If the result view is filtered then switch to report mode as there is ' nothing to filter when the desktop is selected. If ResultView.ListView.View = siFiltered Then ResultView.ListView.View = siReport End If End If ' It is possible that the GetFolder call did not succeed. Check to ' see if there is a valid Folder object assigned to Folder. If Not Folder Is Nothing Then ' Set up column filters. If ResultView.ListView.View = siFiltered Then SetUpFilter ResultView End If
' Pass this folder object along with the ResultView object ' to the method that is actually responsible for adding the ListItems AddFilesToView Folder, ResultView End If End With ' ResultView.ScopePaneItem Exit Sub
' Error Handler for this method ErrTrap_ResultViews_Initialize:
DisplayError "ResultViews_Initialize"
End Sub
' ============================================================================= ' Method: ResultViews_InitializeControl ' Type: Event ' Description: ' Parameters: ResultView A reference to the specific ResultView object ' being activated ' Output: None ' Notes: This event is called when the ActiveX control used in an OCX ' result view is created. The snap-in may use it to set properties ' on the control. In this sample we set the text for the About ' information control. ' Note that from this event until the ResultView is destroyed ' (ResultViews_Terminate) the property ResultView.Control is ' valid. ' ============================================================================= ' Private Sub ResultViews_InitializeControl(ByVal ResultView As SnapInLib.IResultView) On Error GoTo ErrTrap_ResultViews_InitializeControl Dim Ctl As AboutCtl Set Ctl = ResultView.Control Ctl.AboutText = "About File Explorer" Ctl.PropertySheetProvider = ResultView.ScopePaneItem.Parent.Parent.PropertySheetProvider Ctl.RootScopeItem = ResultView.ScopePaneItem.ScopeItem
Exit Sub
' Error Handler for this method ErrTrap_ResultViews_InitializeControl: DisplayError "ResultViews_InitializeControl"
End Sub
' ============================================================================= ' Method: ResultViews_ItemRename ' Type: Event ' Description: ' Parameters: ResultView A reference to the ResultView in which the ' rename operation occurred. ' ListItem The MMCListItem object representing the item ' that was renamed ' NewName The new name specified by the user ' Output: None ' Notes: This event is called when the user renames a list item by either ' slow double click on its text or by selecting Rename from the ' context menu. ' The file is renamed and the list item is reinitialized as the ' File object contained in its Tag property and its text are now ' out of date. ' ListItem.Update is called so that the text will be redrawn in ' the result pane. ' ListItem.UpdateAllViews is called to notify any other existing ' Views to update their display as well. This will result in the ' firing of the event ResultViews_ItemViewChange on all other ' views (see below). ' ============================================================================= ' Private Sub ResultViews_ItemRename(ByVal ResultView As SnapInLib.IResultView, _ ByVal ListItem As SnapInLib.IMMCListItem, _ ByVal NewName As String) On Error GoTo ErrTrap_ResultViews_ItemRename Dim File As Scripting.File Dim OldPath As String Dim NewPath As String ' Get the old path. ' We can get the File object from ListItem.Tag
Set File = ListItem.Tag OldPath = File.Path
' Change the file name in the path
NewPath = Rename(OldPath, NewName)
' Rename the file
File.Move NewPath
' Reinitialize the list item from the altered file object
UpdateListItem ListItem, File
' Notify all other views that we have made the change. If there are other ' views then they will receive the ResultViews_ItemViewChange event and make ' the change in their corresponding list item. ' ' Send the old path as the hint so that the other views can find their ' existing list items. They will be able to get the new path from this ' list item as it will be passed as a parameter to ' ResultViews_ItemViewChange (see below).
ListItem.UpdateAllViews OldPath Exit Sub ' Error Handler for this method ErrTrap_ResultViews_ItemRename: DisplayError "ResultViews_ItemRename"
End Sub
' ============================================================================= ' Method: ResultViews_ItemViewChange ' Type: Event ' Description: ' Parameters: ResultView A reference to the ResultView in which the ' rename operation occurred. ' ListItem The MMCListItem object representing the item ' that has changed ' Hint Variant optionally passed to the ' MMCListItem.UpdateAllViews call that generated ' this event. ' Output: None ' Notes: This event is generated by a call to MMCListItem.UpdateAllViews. ' The MMCListItem passed here belongs to the generating view. ' In this sample the we find the list item in the specified ' result view and update it. ' ============================================================================= ' Private Sub ResultViews_ItemViewChange(ByVal ResultView As SnapInLib.IResultView, _ ByVal ListItem As SnapInLib.IMMCListItem, _ ByVal Hint As Variant)
On Error GoTo ErrTrap_ResultViews_ItemViewChange Dim File As Scripting.File Dim NewPath As String Dim OurListItem As MMCListItem
' Determine whether this view is currently displaying this list item by ' searching for it using the old path as the key. The old path is received ' in Hint
On Error Resume Next Set OurListItem = ResultView.ListView.ListItems(Hint) On Error GoTo ErrTrap_ResultViews_ItemViewChange
If OurListItem Is Nothing Then ' It is not there. This view is displaying a different folder. Exit Sub End If
' We can get the File object from the source's ListItem.Tag
Set File = ListItem.Tag
' Get a new updated File object for the list item in this view.
Set File = m_FileSystemObject.GetFile(File.Path)
' Reinitialize the list item from the new file object
UpdateListItem OurListItem, File
Exit Sub ' Error Handler for this method ErrTrap_ResultViews_ItemViewChange: DisplayError "ResultViews_ItemViewChange"
End Sub
' ============================================================================= ' Method: UpdateListItem ' Type: Subroutine ' Description: Reinitializes a list item's properties from a File object ' ' Parameters: ListItem The list item to be updated ' File A FileSystemObject File object whose properties ' are to be used to update the list item ' ' Output: None ' Notes: Reinitialize the list item's display strings, exported data, ' tag, and key. Tells MMC to update its display. ' ============================================================================= ' Private Sub UpdateListItem(ListItem As MMCListItem, _ File As Scripting.File)
On Error GoTo ErrTrap_UpdateListItem ' Update the list item's key to the new path
ListItem.Key = File.Path ' Update the ListItem's text property ListItem.Text = File.Name
' Reinitialize the display properties,
InitListItem ListItem, File
' Reinitialize the exported data
InitListItemData ListItem, File
' Update the list item's display in the MMC listview
ListItem.Update Exit Sub
' Error Handler for this method ErrTrap_UpdateListItem: DisplayError "UpdateListItem"
End Sub
' ============================================================================= ' Method: ScopeItems_PropertyChanged ' Type: Event ' Description: Fired when a proeprty page calls ScopeItem.PropertyChanged ' Allows a property page to inform the snap-in that the user has ' changed its property values. ' ' Parameters: ScopeItem The ScopeItem for which the property page is ' displayed. ' Data The Data parameter passed by the property page ' when it called ScopeItem.PropertyChanged ' ' Output: None ' Notes: FileExplorer uses this event for the Internet Explorer node. The ' user enters a new URL to navigate to in the property page. ' ============================================================================= ' Private Sub ScopeItems_PropertyChanged(ByVal ScopeItem As SnapInLib.ScopeItem, _ ByVal Data As Variant)
On Error GoTo ErrTrap_ScopeItems_PropertyChanged
' If the ScopeItem is the Internet Explorer node then select it and display ' a URL view with URL in the Data parameter. Note that we don't call ' ScopePaneItem.DisplayNewResultView because the IE node may not be currently ' selected in the scope pane even though its property page is open. The user ' may have displayed properties, left the sheet open, and then returned to ' the scope pane and selected another node. This is possible because MMC ' displays property sheets in a separate thread.
If ScopeItem.ScopeNode.NodeTypeName = SZ_INTERNETEXPLORER Then CurrentView.SelectScopeItem ScopeItem, siURLView, Data End If Exit Sub
' Error Handler for this method ErrTrap_ScopeItems_PropertyChanged: DisplayError "ScopeItems_PropertyChanged"
End Sub
' ============================================================================= ' Method: ScopeItems_Rename ' Type: Event ' Description: Fired when the user performs a rename operation on a scope item. ' ' Parameters: ScopeItem The selected ScopeItem ' NewName New name given by the user. ' ' Output: None ' Notes: Rename the file and reinitialize the ScopeItem. Note that there ' is no equivalent of MMCListItem.UpdateAllViews for ScopeItems ' (see ResultViews_ItemRename above). MMC handles the propagation ' of the display changes to all existing views. ' ============================================================================= ' Private Sub ScopeItems_Rename(ByVal ScopeItem As SnapInLib.IScopeItem, _ ByVal NewName As String)
On Error GoTo ErrTrap_ScopeItems_Rename
Dim OldName As String Dim Folder As Scripting.Folder Dim OldPath As String Dim NewPath As String Set Folder = ScopeItem.Tag OldPath = Folder.Path
' Change the folder name in the old path
NewPath = Rename(OldPath, NewName)
' Rename the folder
Folder.Move NewPath
' Change the key and name to the new path.
ScopeItem.Key = NewPath ScopeItem.Name = NewPath ' Change the display name and the 1st column text to the new name ScopeItem.ScopeNode.DisplayName = NewName ScopeItem.ListSubItems(1).Text = NewName ' Change the exported data: Format is "Folder", data is folder path ScopeItem.Data.SetData NewPath, "Folder" Exit Sub
' Error Handler for this method ErrTrap_ScopeItems_Rename: DisplayError "ScopeItems_Rename"
End Sub
' ============================================================================= ' Method: ResultViews_ListItemDblClick ' Type: Event ' Description: ' Parameters: ResultView The ResultView in which the double click occurred. ' ListItem MMCListItem object that was double clicked. ' DoDefault A flag to allow the snap-in to signal the ' Snap-in runtime whether to allow the default ' processing of a ListItem double-click. ' This value is initialized to TRUE. To disable ' default processing, set this parameter to FALSE. ' Output: None ' Notes: This event is handled for files. We call LaunchFile to ' run the file using the Win32 ShellExecute() API ' ============================================================================= ' Private Sub ResultViews_ListItemDblClick(ByVal ResultView As SnapInLib.IResultView, _ ByVal ListItem As SnapInLib.IMMCListItem, _ DoDefault As Boolean)
On Error GoTo ErrTrap_ResultViews_ListItemDblClick LaunchFile ListItem.Key
Exit Sub ' Error Handler for this method ErrTrap_ResultViews_ListItemDblClick: DisplayError "ResultViews_ListItemDblClick"
End Sub
' ============================================================================= ' Method: ResultViews_TaskClick ' Type: Event ' Description: Fired when the user clicks a task in a default taskpad ' ' Parameters: ResultView The ResultView in which the click occurred ' Task The Task clicked ' ' Output: None ' Notes: For the "Start File Explorer" task change the static node's ' result view to our standard listview lvExplorerTop. ' For the "MMC Home Page" task select the Internet Explorer node and ' display the MMC home page. ' For the "About..." task select the About node ' ============================================================================= ' Private Sub ResultViews_TaskClick(ByVal ResultView As SnapInLib.IResultView, _ ByVal Task As SnapInLib.ITask) On Error GoTo ErrTrap_ResultViews_TaskClick With CurrentScopePaneItem
If Task.Key = KEY_START Then .DisplayNewResultView "lvExplorerTop", siPreDefined ElseIf Task.Key = KEY_MMC_HOME_PAGE Then EnsureDesktopExpanded CurrentView.SelectScopeItem ScopeItems(SZ_INTERNETEXPLORER), siURLView, _ "http://www.microsoft.com/management/mmc/default.htm" ElseIf Task.Key = KEY_ABOUT Then EnsureDesktopExpanded CurrentView.SelectScopeItem ScopeItems(SZ_ABOUT) End If End With Exit Sub
' Error Handler for this method ErrTrap_ResultViews_TaskClick: DisplayError "ResultViews_TaskClick"
End Sub
' ============================================================================= ' Method: EnsureDesktopExpanded ' Type: Subroutine ' Description: Checks if the desktop node has been expanded in the namespace. ' If not then expands it. ' ' Parameters: None ' ' Output: None ' Notes: None ' ============================================================================= ' Private Sub EnsureDesktopExpanded()
On Error GoTo ErrTrap_EnsureDesktopExpanded Dim RootScopeItem As ScopeItem ' Determine whether the root scope item is the static node or the extension root
On Error Resume Next Set RootScopeItem = ScopeItems(SZ_STATICNODE) On Error GoTo ErrTrap_EnsureDesktopExpanded If RootScopeItem Is Nothing Then Set RootScopeItem = ScopeItems(SZ_EXTENSION_ROOT) End If ' Check if the root scope item has been expanded. If not then expand it to add the ' desktop node. If Not RootScopeItem.ScopeNode.ExpandedOnce Then RootScopeItem.ScopeNode.ExpandInNameSpace End If ' Check if the the desktop node has been expanded once. If not then expand it. We can ' use the Child property because the root node only has one child. If Not RootScopeItem.ScopeNode.Child.ExpandedOnce Then RootScopeItem.ScopeNode.Child.ExpandInNameSpace End If Exit Sub
' Error Handler for this method ErrTrap_EnsureDesktopExpanded: DisplayError "EnsureDesktopExpanded"
End Sub
' ============================================================================= ' Method: ResultViews_TaskNotify ' Type: Event ' Description: Fired when a custom taskpad calls MMCCtrl.TaskNotify. ' Our User Guide custom taskpad calls this method when ' the user clicks the "Return to File Explorer" button. ' Parameters: Arg Passed by the taskpad to MMCCtrl.TaskNotify ' Param Passed by the taskpad to MMCCtrl.TaskNotify ' ' Output: None ' Notes: This method changes the result view for the static node to ' StaticNodeTaskpad ' ============================================================================= ' Private Sub ResultViews_TaskNotify(ByVal ResultView As SnapInLib.IResultView, _ ByVal Arg As Variant, _ ByVal Param As Variant)
On Error GoTo ErrTrap_ResultViews_TaskNotify With Views.CurrentView.ScopePaneItems.SelectedItem .DisplayNewResultView SZ_STATIC_NODE_TASKPAD, siPreDefined End With Exit Sub
' Error Handler for this method ErrTrap_ResultViews_TaskNotify: DisplayError "ResultViews_TaskNotify"
End Sub
' ============================================================================= ' Method: ScopePaneItems_GetResultViewInfo ' Type: Event ' Description: Fired when a a scope item is selected in the scope pane to ' allow the snap-in to choose the result view that will be displayed. ' ' Parameters: ScopePaneItem A reference to the ScopePaneItem that was selected. ' ' ViewType Contains the default view type selected by the ' designer runtime. For nodes defined at design time ' that have default result views assigned, ViewType will ' be siPredefined. If the snap-in called ' ScopePaneItem.DisplayNewResultView then ViewType will ' contain the value passed to that method. ' ' DisplayString Contains the display string that accompanies ' ViewType. For predefined result views this will be the ' name of the result view defined at design time. For ' result views defined in code the contents vary based on ' the type. See the ScopePaneItem topic in the Snap-In ' Designer Programmer's Guide for more information. ' ' Output: The snap-in can change ViewType and DisplayString if needed. ' ' Notes: This event is handled by FileExplorer to set the URL to navigate to in ' the code-defined URL result view used for the Internet Explorer node. ' ============================================================================= ' Private Sub ScopePaneItems_GetResultViewInfo(ByVal ScopePaneItem As SnapInLib.ScopePaneItem, _ ViewType As SnapInLib.SnapInResultViewTypeConstants, _ DisplayString As String) On Error GoTo ErrTrap_ScopePaneItems_GetResultViewInfo ' If the Internet Explore node was selected in the scope pane then specify a URL view ' and set the display string to the URL to navigate to. If it was selected ' programmatically because the user selected the "MMC Home Page" task on the static node ' taskpad then the ViewType and display string will already be set. If the ' user is returning to the node or using a property page to change the URL ' then the view type will already be siURLView an the display string will ' already be set to the URL.
If ScopePaneItem.ScopeItem.ScopeNode.NodeTypeName = SZ_INTERNETEXPLORER Then If ViewType <> siURLView Then ViewType = siURLView DisplayString = "about:blank:" End If End If
Exit Sub ' Error Handler for this method ErrTrap_ScopePaneItems_GetResultViewInfo: DisplayError "ScopePaneItems_GetResultViewInfo"
End Sub
' ============================================================================= ' Method: Views_Print ' Type: Event ' Description: Fired when a file is selected and the user clicks the ' printer toolbar button or selects "Print" on the context menu ' (both mechanisms are standard verbs supplied by MMC) ' ' Parameters: View A reference to the specific View object ' in which the print request occurred. ' Selection An MMCClipboard object that contains ' the currently selected items. ' ' Output: None ' ' Notes: Uses VB's Shell function to run the system command processor's ' "PRINT" command for all files in the selection. ' ============================================================================= ' Private Sub Views_Print(ByVal View As SnapInLib.View, _ ByVal Selection As SnapInLib.MMCClipboard)
On Error GoTo ErrTrap_Views_Print
Dim ListItem As MMCListItem Dim File As Scripting.File For Each ListItem In Selection.ListItems Set File = ListItem.Tag
' Run the system command processor's print command Shell Environ("ComSpec") & " /c PRINT " & File.Path Next ListItem
Exit Sub ' Error Handler for this method ErrTrap_Views_Print: DisplayError "Views_Print"
End Sub
' ============================================================================= ' Method: ScopeItems_Expand ' Type: Event ' Description: Fired in response to one of two user events. Either the ScopeItem ' is being expanded because the plus sign has been clicked or ' because ScopeItem node itself has been selected. ' Parameters: ScopeItem The ScopeItem being expanded ' ' Output: None ' Notes: Unlike the VB Common Controls TreeView control, ' the Expand event for an MMC snap-in is only called the ' first time a node is expanded. ' For "My Computer" adds the drives. ' For the Extension root adds the Desktop. ' For drives and folders, adds the subfolders. ' ============================================================================= ' Private Sub ScopeItems_Expand(ByVal ScopeItem As SnapInLib.IScopeItem) On Error GoTo ErrTrap_ScopeItems_Expand If ScopeItem.Key = SZ_STATICNODE Then ' In this case, we have already defined an auto-create subnode ' that represents the Desktop. We could use this opportunity to ' add additional nodes if, say, we wanted to display multiple ' desktops ElseIf ScopeItem.Key = SZ_DESKTOP Or _ ScopeItem.Key = SZ_INTERNETEXPLORER Or _ ScopeItem.Key = SZ_NETWORKNEIGHBORHOOD Or _ ScopeItem.Key = SZ_RECYCLEBIN Or _ ScopeItem.Key = SZ_MYBRIEFCASE Or _ ScopeItem.Key = SZ_ABOUT Then ' In this current version of the sample, we are not populating any ' subnodes under these ElseIf ScopeItem.Key = SZ_MYCOMPUTER Then ' We have now reached the computer node, and we need to add subnodes ' to represent each of the drives on the machine. AddDrivesToScope ScopeItem.ScopeNode ElseIf ScopeItem.Key = SZ_EXTENSION_ROOT Then ' The ScopeItem we added in ExtensionSnapIn_Expand has now been expanded ' itself. We manually add the Desktop node. When it is expanded, the ' auto-create nodes underneath it will be expanded just as when we are ' operating as a stand-alone console. ScopeItems.AddPreDefined SZ_DESKTOP, SZ_DESKTOP, ScopeItem.ScopeNode, siParent Else ' The expanded node is either a drive or a directory, which means that ' everything here will be folders. We need to add subnodes to represent ' all the subfolders of any given drive or folder. Because we are using ' the fully qualified pathname as the key for each folder ScopeItem, we ' can use this utility method to nest to any arbitrary depth AddFoldersToScope ScopeItem End If
Exit Sub ' Error Handler for this method ErrTrap_ScopeItems_Expand: DisplayError "ScopeItems_Expand"
End Sub
' ============================================================================= ' Method: ScopeItems_Help ' Type: Event ' Description: Fired when the user selects a scope item and requests help. ' The snap-in should display context specific help for the selected ' ScopeItem. ' ' Parameters: ScopeItem The selected ScopeItem ' ' Output: None ' Notes: As an example, we display a topic in the MMC's ' help file. In general, the FileExplorer's .chm would be merged with MMC's because ' at design time because we set the HelpFile property to its file name. ' ============================================================================= ' Private Sub ScopeItems_Help(ByVal ScopeItem As SnapInLib.IScopeItem) On Error GoTo ErrTrap_ScopeItems_Help ' Display the topic "File Explorer - Event Handling\ScopeItems"
ShowHelpTopic "mmc.chm::/sag_MMCconcepts0_0.htm"
Exit Sub ' Error Handler for this method ErrTrap_ScopeItems_Help: DisplayError "ScopeItems_Help"
End Sub
' ============================================================================= ' Method: ResultViews_Help ' Type: Event ' Description: Fired when the user selects a list item and requests help. ' The snap-in should display context specific help for the selected ' list item. ' ' Parameters: ResultView The ResultView in which the request occurred. ' ListItem The selected list item. ' ' Output: None ' Notes: As an example, we display a topic in the MMC's ' help file. In general, the FileExplorer's .chm would be merged with MMC's because ' at design time because we set the HelpFile property to its file name. ' ============================================================================= ' Private Sub ResultViews_Help(ByVal ResultView As SnapInLib.IResultView, _ ByVal ListItem As SnapInLib.IMMCListItem) On Error GoTo ErrTrap_ResultViews_Help ' Display the topic "File Explorer - Event Handling\ResultViews" ShowHelpTopic "mmc.chm::/sag_MMCconcepts0_0.htm"
Exit Sub ' Error Handler for this method ErrTrap_ResultViews_Help: DisplayError "ResultViews_Help"
End Sub
' ============================================================================= ' Method: ScopeItems_Initialize ' Type: Event ' Description: Fired when a ScopeItem has just been created ' Parameters: ScopeItem The new ScopeItem ' ' Output: None ' Notes: This is called once for each ScopeItem as it is being added ' to the ScopeItems collection. This event will fire for both ' auto-created and pre-defined nodes. ' Any pre-defined nodes that are being initialized here ' are being created by code elsewhere in this snap-in (see ' the ScopeItems_Expand event). For auto-create nodes, however, ' this is the only opportunity to trap their creation, and modify ' their properties before they are available for use. Note that ' pre-defined nodes could be initialized when they are added or ' in this event. ' ============================================================================= ' Private Sub ScopeItems_Initialize(ByVal ScopeItem As SnapInLib.IScopeItem) On Error GoTo ErrTrap_ScopeItems_Initialize With ScopeItem ' In order for the auto-create nodes to display properly in the ' ListView, we need to add ColumnHeaders and ListSubItems. If .Key = SZ_STATICNODE Or _ .Key = SZ_EXTENSION_ROOT Then .ColumnHeaders.Add 1, KEY_NAME, SZDISPLAY_NAME .ListSubItems.Add 1, ScopeItem.Key, ScopeItem.ScopeNode.DisplayName Set ScopeItem.Tag = m_ConfigData ElseIf .Key = SZ_DESKTOP Or .Key = SZ_MYCOMPUTER Or _ .Key = SZ_INTERNETEXPLORER Or .Key = SZ_NETWORKNEIGHBORHOOD Or _ .Key = SZ_RECYCLEBIN Or .Key = SZ_MYBRIEFCASE Or .Key = SZ_ABOUT Then With .ColumnHeaders .Add 1, KEY_NAME, SZDISPLAY_NAME ' Column "Name" .Add 2, KEY_TYPE, SZDISPLAY_TYPE ' Column "Type" .Add 3, KEY_TOTALSIZE, SZDISPLAY_TOTALSIZE ' Column "Total Size" .Add 4, KEY_FREESPACE, SZDISPLAY_FREESPACE ' Column "Free Space" End With
' We're only adding one ListSubItem because the only column that ' really makes sense for these high level nodes is the "Name" column .ListSubItems.Add 1, ScopeItem.Key, ScopeItem.ScopeNode.DisplayName End If End With ' ScopeItem
Exit Sub ' Error Handler for this method ErrTrap_ScopeItems_Initialize: DisplayError "ScopeItems_Initialize"
End Sub
' ============================================================================= ' Method: SnapIn_QueryConfigurationWizard ' Type: Event ' Description: Fired when the user is adding the snap-in to the console in ' in MMC's Add/Remove snap-in dialog. Asks the snap-in whether it ' would like to display a configuration wizard before the snap-in ' is added. ' ' Parameters: HaveWizard Defaults to False. Set to True if the snap-in ' has a configuration wizard. ' ' Output: None ' Notes: None ' ============================================================================= ' Private Sub SnapIn_QueryConfigurationWizard(HaveWizard As Boolean) HaveWizard = True End Sub
' ============================================================================= ' Method: SnapIn_CreateConfigurationWizard ' Type: Event ' Description: Fired after returning True from SnapIn_QueryConfigurationWizard ' (see above). ' Gives the snap-in the opportunity to add its property pages to ' the configuration wizard property sheet being displayed ' by MMC for the snap-in. ' ' Parameters: PropertySheet PropertySheet object used to add the snap-in's ' property pages. ' ' Output: None ' Notes: We add our configuration wizard property pages and pass the ' ConfigData object so that the pages can directly set its ' properties. When the user has completed the wizard the event ' SnapIn_ConfigurationComplete will be fired. FileExplorer does ' not handle that event. ' ============================================================================= ' Private Sub SnapIn_CreateConfigurationWizard(ByVal PropertySheet As SnapInLib.MMCPropertySheet)
On Error GoTo ErrTrap_SnapIn_CreateConfigurationWizard
' Clear the the configuration dirty property so we can detect changes when the ' wizard is done. (See SnapIn_ConfigurationComplete below). m_ConfigData.ClearDirty ' Add the property pages to the wizard. Pass UseHelpButton=True so we get ' a help button on the property sheet.
PropertySheet.AddWizardPage "ppgWelcome", m_ConfigData, True PropertySheet.AddWizardPage "ppgNetDrives", m_ConfigData, True PropertySheet.AddWizardPage "ppgFolderAccess", m_ConfigData, True PropertySheet.AddWizardPage "ppgFileAccess", m_ConfigData, True PropertySheet.AddWizardPage "ppgFinish", m_ConfigData, True
Exit Sub
' Error Handler for this method ErrTrap_SnapIn_CreateConfigurationWizard: DisplayError "SnapIn_CreateConfigurationWizard"
End Sub ' ============================================================================= ' Method: SnapIn_ConfigurationComplete ' Type: Event ' Description: Fired when the user clicks the Finish button on a wizard. ' ' Parameters: ConfigurationObject The object passed to ' MMCPropertySheet.AddWizardPage for the ' page displaying the Finish button. ' Output: None ' Notes: If any of the configuration settings were changed and the scope ' pane has already been populated with drives then refresh ' MyComputer so that it will repopulate according to the new ' settings (e.g. network drives were shown prior to running the ' wizard and now they are not to be shown anymore). ' ============================================================================= ' Private Sub SnapIn_ConfigurationComplete(ByVal ConfigurationObject As Object)
Dim MyComputer As ScopeItem ' Check if any configuration settings were change. If Not m_ConfigData.Dirty Then Exit Sub End If ' Clear the the configuration dirty property m_ConfigData.ClearDirty ' Check for the presence of "My Computer" in ScopeItems On Error Resume Next Set MyComputer = ScopeItems(SZ_MYCOMPUTER) ' Resume normal error processing On Error GoTo ErrTrap_SnapIn_ConfigurationComplete If MyComputer Is Nothing Then Exit Sub End If ' Check if "My Computer" has been expanded. If not then we don't need to ' refresh it. If Not MyComputer.ScopeNode.ExpandedOnce Then Exit Sub End If
' "My Computer" is there and it has already been expanded so refresh it. RefreshScopeItem MyComputer
Exit Sub
' Error Handler for this method ErrTrap_SnapIn_ConfigurationComplete: DisplayError "SnapIn_ConfigurationComplete"
End Sub
' ============================================================================= ' Method: SnapIn_Initialize ' Type: Event ' Description: Fired whenever the snap-in created. When the user is adding a ' the snap-in to the console this event may be fired more than ' once because MMC will create the snap-in once to get display ' information for the Add/Remove dialog's listbox and then again ' if the user requests to add the snap-in. In general, this event ' should be used for quick initialization tasks (e.g. global ' variable initialization). ' ' Parameters: None ' ' Output: None ' Notes: ' ============================================================================= ' Private Sub SnapIn_Initialize() On Error GoTo ErrTrap_SnapIn_Initialize ' Set default filter operator and value. m_FilterByName = False m_FilterByExt = True m_FilterValue = "*" ' Load all static extensions up front so response time will be quicker ' when the user invokes properties, context menus etc. ' This should only be done for extensions that will be loaded often e.g. on ' every context menu invocation. RequiredExtensions.EnableAllStatic True Exit Sub
' Error Handler for this method ErrTrap_SnapIn_Initialize: DisplayError "SnapIn_Initialize"
End Sub
' ============================================================================= ' Method: SnapIn_ReadProperties ' Type: Event ' Description: Fired when the user saves a console file (.MSC). ' ' Parameters: PropertyBag Used to store properties in the console file. ' ' Output: None ' Notes: Writes the values of the ConfigData object's properties that ' determine whether the user can see network drives and ' rename/delete files and folders. ' ============================================================================= ' Private Sub SnapIn_WriteProperties(ByVal PropertyBag As SnapInLib.PropertyBag) On Error GoTo ErrTrap_SnapIn_WriteProperties
PropertyBag.WriteProperty "ShowNetDrives", m_ConfigData.ShowNetDrives PropertyBag.WriteProperty "AllowFileAccess", m_ConfigData.AllowFileAccess PropertyBag.WriteProperty "AllowFileAccess", m_ConfigData.AllowFolderAccess Exit Sub
' Error Handler for this method ErrTrap_SnapIn_WriteProperties: DisplayError "SnapIn_WriteProperties"
End Sub
' ============================================================================= ' Method: SnapIn_ReadProperties ' Type: Event ' Description: Fired when the user loads a console file (.MSC). ' ' Parameters: PropertyBag Used to read properties stored when saving the ' console in SnapIn_WriteProperties ' ' Output: None ' Notes: Reads the values of the ConfigData object's properties that ' determine whether the user can see network drives and ' rename/delete files and folders. ' ============================================================================= ' Private Sub SnapIn_ReadProperties(ByVal PropertyBag As SnapInLib.PropertyBag) On Error GoTo ErrTrap_SnapIn_ReadProperties
m_ConfigData.ShowNetDrives = PropertyBag.ReadProperty("ShowNetDrives", False) m_ConfigData.AllowFileAccess = PropertyBag.ReadProperty("AllowFileAccess", False) m_ConfigData.AllowFolderAccess = PropertyBag.ReadProperty("AllowFileAccess", False) Exit Sub
' Error Handler for this method ErrTrap_SnapIn_ReadProperties: DisplayError "SnapIn_ReadProperties"
End Sub
' ============================================================================= ' Method: tbrFileMgr_ButtonClick ' Type: Event ' Description: Fired when a Toolbar button is clicked ' Parameters: ' Selection A reference to an MMCClipboard object that is ' holding a reference to the currently selected ' item(s) ' Button A reference to the button object attached to ' the toolbar button that was clicked ' Output: None ' Notes: Calls ProcessUICommand to do the work. ' ============================================================================= ' Private Sub tbrFileMgr_ButtonClick(ByVal Selection As SnapInLib.IMMCClipboard, _ ByVal Button As SnapInLib.IMMCButton) On Error GoTo ErrTrap_tbrFileMgr_ButtonClick
ProcessUICommand Selection, Button.Key
Exit Sub
' Error Handler for this method ErrTrap_tbrFileMgr_ButtonClick: DisplayError "tbrFileMgr_ButtonClick"
End Sub
' ============================================================================= ' Method: tbrMenuButton_ButtonDropDown ' Type: Event ' Description: Fired when a menu button is clicked and the dropdown menu is ' about to be displayed. ' ' Parameters: Selection A reference to an MMCClipboard object that is ' holding a reference to the currently selected ' item(s) ' Button A reference to the MMCButton object attached to ' the menu button. ' Output: None ' Notes: Examines the selection and enables/disable MMCButtonMenu items ' as appropriate. ' ============================================================================= ' Private Sub tbrMenuButton_ButtonDropDown(ByVal Selection As SnapInLib.IMMCClipboard, _ ByVal Button As SnapInLib.IMMCButton)
On Error GoTo ErrTrap_tbrMenuButton_ButtonDropDown
Dim ButtonMenu As MMCButtonMenu Dim SelectionType As SnapInSelectionTypeConstants
SelectionType = Selection.SelectionType
' Disable everything then enable as needed.
For Each ButtonMenu In Button.ButtonMenus ButtonMenu.Grayed = True Next ButtonMenu Button.ButtonMenus(KEY_CONFIGURATION).Grayed = False
' For files enable Run and Run As. ' For a single scope item, if it is a folder or a drive, then enable add
If (SelectionType = siSingleListItem) Or (SelectionType = siMultiListItems) Then Button.ButtonMenus(KEY_RUN).Grayed = False Button.ButtonMenus(KEY_RUNAS).Grayed = False ElseIf SelectionType = siSingleScopeItem Then If (TypeOf Selection.ScopeItems(1).Tag Is Scripting.Folder) Or _ (TypeOf Selection.ScopeItems(1).Tag Is Scripting.Drive) Then Button.ButtonMenus(KEY_ADD).Grayed = False End If End If
Exit Sub
' Error Handler for this method ErrTrap_tbrMenuButton_ButtonDropDown: DisplayError "tbrMenuButton_ButtonDropDown"
End Sub
' ============================================================================= ' Method: tbrMenuButton_ButtonMenuClick ' Type: Event ' Description: Fired when a Toolbar button is clicked ' ' Parameters: Selection A reference to an MMCClipboard object that is ' holding a reference to the currently selected ' item(s) ' ButtonMenu A reference to the MMCButtonMenu object attached to ' the menu item selected. ' Output: None ' Notes: Calls ProcessUICommand to do the work. ' ============================================================================= ' Private Sub tbrMenuButton_ButtonMenuClick(ByVal Selection As SnapInLib.IMMCClipboard, _ ByVal ButtonMenu As SnapInLib.IMMCButtonMenu) On Error GoTo ErrTrap_tbrMenuButton_ButtonMenuClick
ProcessUICommand Selection, ButtonMenu.Key
Exit Sub
' Error Handler for this method ErrTrap_tbrMenuButton_ButtonMenuClick: DisplayError "tbrMenuButton_ButtonMenuClick"
End Sub
' ============================================================================= ' Method: Views_AddNewMenuItems ' Type: Event ' Description: Fired when a context menu is about to be displayed to give the ' snap-in the opportunity to add items to MMC's "New" sub-menu. ' ' Parameters: View The view in which the context menu ' invocation occurred. The context menu may ' have been invoked in either the scope pane ' or in the result pane. ' Selection MMCClipboard object containing the ' currently selected item(s). ' ContextMenu A ContextMenu object that allows adding the ' snap-in's menus. ' InsertionAllowed Defaults to True. If the snap-in sets it to ' False, then snap-ins that extend context ' menus for the selected item(s) will not be ' given the opportunity to alter the menu. ' Output: None ' Notes: For drives and folders adds mnuNew that has the item to create ' a new folder. For the Internet Explorer node adds a "URL..." item. ' ============================================================================= ' Private Sub Views_AddNewMenuItems(ByVal View As SnapInLib.IView, _ ByVal Selection As SnapInLib.IMMCClipboard, _ ByVal ContextMenu As SnapInLib.IContextMenu, _ InsertionAllowed As Boolean)
On Error GoTo ErrTrap_Views_AddNewMenuItems If Selection.SelectionType = siSingleScopeItem Then If (TypeOf Selection.ScopeItems(1).Tag Is Scripting.Drive) Or _ (TypeOf Selection.ScopeItems(1).Tag Is Scripting.Folder) Then ContextMenu.AddMenu mnuNew ElseIf Selection.ScopeItems(1).Key = SZ_INTERNETEXPLORER Then ContextMenu.AddMenu mnuNewURL End If End If
Exit Sub
' Error Handler for this method ErrTrap_Views_AddNewMenuItems: DisplayError "Views_AddNewMenuItems"
End Sub
' ============================================================================= ' Method: Views_AddTopMenuItems ' Type: Event ' Description: Fired when a context menu is about to be displayed to give the ' snap-in the opportunity to add items to the top of MMC's ' context menu. ' ' Parameters: View The view in which the context menu ' invocation occurred. The context menu may ' have been invoked in either the scope pane ' or in the result pane. ' Selection MMCClipboard object containing the ' currently selected item(s). ' ContextMenu A ContextMenu object that allows adding the ' snap-in's menus. ' InsertionAllowed Defaults to True. If the snap-in sets it to ' False, then snap-ins that extend context ' menus for the selected item(s) will not be ' given the opportunity to alter the menu. ' Output: None ' Notes: Enable items in mnuRun based on the selection and add it to ' to the context menu. ' ============================================================================= ' Private Sub Views_AddTopMenuItems(ByVal View As SnapInLib.IView, _ ByVal Selection As SnapInLib.IMMCClipboard, _ ByVal ContextMenu As SnapInLib.IContextMenu, _ InsertionAllowed As Boolean) On Error GoTo ErrTrap_Views_AddTopMenuItems ' Gray everything and then we'll enable as needed mnuRun.Grayed = True mnuRun.Enabled = True mnuRunAs.Grayed = True mnuRunAs.Enabled = False
Select Case Selection.SelectionType
Case siSingleListItem mnuRun.Grayed = False mnuRun.Enabled = True mnuRunAs.Grayed = False mnuRunAs.Enabled = True
Case siMultiListItems mnuRun.Grayed = False mnuRun.Enabled = True mnuRunAs.Grayed = False mnuRunAs.Enabled = True
End Select
ContextMenu.AddMenu mnuContext Exit Sub
' Error Handler for this method ErrTrap_Views_AddTopMenuItems: DisplayError "Views_AddTopMenuItems"
End Sub
' ============================================================================= ' Method: Views_GetMultiSelectData ' Type: Event ' Description: Fired when the user selects multiple items in a listview. Allows ' the snap-in to export data for the multiple selection. ' ' Parameters: View The View in which the request occurred. ' Selection The selected items ' Data Empty data object. The snap-in should add any ' desired formats to be exported for extensions ' or for other instances of itself. ' ' Output: None ' Notes: Set "Folders" format as a string array containing the path of ' each folder. ' Set "Files" format as a string array containing the name of ' each file. ' Set "Paths" format as a string array containing the path of ' each file. ' ============================================================================= ' Private Sub Views_GetMultiSelectData(ByVal View As SnapInLib.IView, _ ByVal Selection As SnapInLib.IMMCClipboard, _ ByVal Data As SnapInLib.IMMCDataObject)
On Error GoTo ErrTrap_Views_GetMultiSelectData
Dim Folders() As String Dim cFolders As Long Dim Folder As Scripting.Folder Dim Files() As String Dim Paths() As String Dim cFiles As Long Dim File As Scripting.File Dim ScopeItem As ScopeItem Dim ListItem As MMCListItem Dim i As Long
cFolders = 0 ' Count all the folders that are among the selected ScopeItems For Each ScopeItem In Selection.ScopeItems If TypeOf ScopeItem.Tag Is Scripting.Folder Then cFolders = cFolders + 1 End If Next ScopeItem
' If there are any folders then ReDim the string array and add each folder's ' path to the array. Set data format called "Folders" containing the string array.
If cFolders > 0 Then ReDim Folders(1 To cFolders) i = 1 For Each ScopeItem In Selection.ScopeItems If TypeOf ScopeItem.Tag Is Scripting.Folder Then Set Folder = ScopeItem.Tag Folders(i) = Folder.Path i = i + i End If Next ScopeItem Data.SetData Folders, "Folders" End If ' If there are any files in the selection then ReDim the string arrays and add ' each file's name and path to the arrays. Set data formats called "Files" and "Paths' ' containing the arrays. cFiles = Selection.ListItems.Count If cFiles = 0 Then Exit Sub End If ReDim Files(1 To cFiles) ReDim Paths(1 To cFiles) i = 1 For Each ListItem In Selection.ListItems Set File = ListItem.Tag Files(i) = File.Name Paths(i) = File.Path i = i + 1 Next ListItem Data.SetData Files, "Files" Data.SetData Paths, "Paths"
Exit Sub
' Error Handler for this method ErrTrap_Views_GetMultiSelectData: DisplayError "Views_GetMultiSelectData"
End Sub
' ============================================================================= ' Method: Views_QueryPagesFor ' Type: Event ' Description: Fired when the user requests properties for the selected ' items. ' ' Parameters: View The View in which the request occurred. ' Selection The selected items ' HasPropertyPages Defaults to False. Set to True if the snap-in ' has property pages for the selected items. ' ' Output: None ' Notes: We set HasPropertyPages=True for folders and files. ' ============================================================================= ' Private Sub Views_QueryPagesFor(ByVal View As SnapInLib.View, _ ByVal Selection As SnapInLib.MMCClipboard, _ HasPropertyPages As Boolean)
On Error GoTo ErrTrap_Views_QueryPagesFor
Dim ScopeItem As ScopeItem
' Assume no property pages. HasPropertyPages = False ' If the selection is a single scope item and it is the static node or the ' extension root then the user has requested to run the configuration wizard. ' If it is the Internet Explorer node then the user has requested to display ' properties to enter a new URL. If it is the About node then the user has ' clicked the configuration button on the About OCX.
If Selection.SelectionType = siSingleScopeItem Then If (Selection.ScopeItems(1).Key = SZ_STATICNODE) Or _ (Selection.ScopeItems(1).Key = SZ_EXTENSION_ROOT) Or _ (Selection.ScopeItems(1).Key = SZ_ABOUT) Or _ (Selection.ScopeItems(1).Key = SZ_INTERNETEXPLORER) Then HasPropertyPages = True Exit Sub End If End If ' If there are any list items then we do have property pages.
If Selection.ListItems.Count > 0 Then HasPropertyPages = True Exit Sub End If
' Iterate through selected ScopeItems and see if any of them represents a ' folder.
For Each ScopeItem In Selection.ScopeItems If TypeOf ScopeItem.Tag Is Scripting.Folder Then HasPropertyPages = True Exit Sub End If Next ScopeItem
Exit Sub
' Error Handler for this method ErrTrap_Views_QueryPagesFor: DisplayError "Views_QueryPagesFor"
End Sub
' ============================================================================= ' Method: Views_CreatePropertyPages ' Type: Event ' Description: Fired when the user requests properties for the selected ' items and True has been returned from ' the Views_QueryPagesFor event. Gives the snap-in the chance ' to add its property pages to the property sheet being displayed ' by MMC for the selected items. ' ' Parameters: View The View in which the request occurred. ' Selection The selected items ' PropertySheet PropertySheet object used to add the snap-in's ' property pages. ' ' Output: None ' Notes: We add an instance of the ppgGeneral page for each folder and ' for each file. We pass the zero-based position of each page ' for the InitData parameter to PropertySheet.AddPage so that each ' page will know which object in PropertyPage.SelectedControls ' it needs to display properties for. ' ============================================================================= ' Private Sub Views_CreatePropertyPages(ByVal View As SnapInLib.View, _ ByVal Selection As SnapInLib.MMCClipboard, _ ByVal PropertySheet As SnapInLib.MMCPropertySheet)
On Error GoTo ErrTrap_Views_CreatePropertyPages
Dim Position As Long Dim ScopeItem As ScopeItem Dim ListItem As MMCListItem
Position = 0 ' If the selection is a single scope item and it is the static node or the ' extension root then the user has requested to run the configuration wizard. ' We just invoke the SnapIn_CreateConfigurationWizard event handler as it does ' exactly that. If it is the Internet Explorer node then the user has requested ' to display properties to enter a new URL. If it is the About node then the ' user has clicked the configuration button on the About OCX.
If Selection.SelectionType = siSingleScopeItem Then If (Selection.ScopeItems(1).Key = SZ_STATICNODE) Or _ (Selection.ScopeItems(1).Key = SZ_EXTENSION_ROOT) Or _ (Selection.ScopeItems(1).Key = SZ_ABOUT) Then SnapIn_CreateConfigurationWizard PropertySheet Exit Sub ElseIf Selection.ScopeItems(1).Key = SZ_INTERNETEXPLORER Then PropertySheet.AddPage "ppgBrowser" End If End If
' Add folder property pages first
For Each ScopeItem In Selection.ScopeItems ' If the ScopeItem represents a folder: ' Add an instance of ppgGeneral: ' Use the folder name as the caption ' True=Use Help Button ' False=Text is Left to Right ' Pass the page's position in the property sheet for the InitData parameter If TypeOf ScopeItem.Tag Is Scripting.Folder Then PropertySheet.AddPage "ppgGeneral", ScopeItem.ScopeNode.DisplayName, _ True, False, Str(Position) Position = Position + 1 End If Next ScopeItem ' Add file property pages
For Each ListItem In Selection.ListItems ' Use the file name as the caption PropertySheet.AddPage "ppgGeneral", ListItem.Text, True, False, Str(Position) Position = Position + 1 Next ListItem
Exit Sub
' Error Handler for this method ErrTrap_Views_CreatePropertyPages: DisplayError "Views_CreatePropertyPages"
End Sub
' ============================================================================= ' Method: Views_QueryPaste ' Type: Event ' Description: Fired when MMC needs to determine whether to display the ' paste item on a context menu for a scope item and also when ' a drag occurs over a scope item. ' ' Parameters: DestView The destination view in which the paste may ' occur. ' SourceItems MMCClipboard object containing the item(s) ' that may be pasted. ' DestScopeItem The ScopeItem on which they may be pasted ' OKToPaste Defaults to False. If the snap-in sets it to ' True, then MMC will add the Paste item ' to the context menu for the ScopeItem or ' display the drop cursor over the ScopeItem. ' Output: None ' Notes: Examines the selection to determine whether a paste would be ' accepted. ' ============================================================================= ' Private Sub Views_QueryPaste(ByVal DestView As SnapInLib.IView, _ ByVal SourceItems As SnapInLib.IMMCClipboard, _ ByVal DestScopeItem As SnapInLib.IScopeItem, _ OKToPaste As Boolean)
On Error GoTo ErrTrap_Views_QueryPaste
Dim ScopeItem As ScopeItem
OKToPaste = False
' If the destination scope item is not a drive or a folder then ' we can't accept a paste
If (Not TypeOf DestScopeItem.Tag Is Scripting.Folder) And _ (Not TypeOf DestScopeItem.Tag Is Scripting.Drive) Then Exit Sub End If
' If the source items contain anything from another snap-in then we can't ' accept the paste
If (SourceItems.SelectionType = siSingleForeign) Or _ (SourceItems.SelectionType = siMultiForeign) Or _ (SourceItems.SelectionType = siMultiMixedForeign) Then Exit Sub End If
' If the source items contain any drives then we can't accept the paste
For Each ScopeItem In SourceItems.ScopeItems If TypeOf ScopeItem.Tag Is Scripting.Drive Then Exit Sub End If Next ScopeItem
' At this point we know the user is trying to paste either folders and/or files ' onto a drive or onto folder. We can accept this.
OKToPaste = True
Exit Sub
' Error Handler for this method ErrTrap_Views_QueryPaste: DisplayError "Views_QueryPaste"
End Sub
' ============================================================================= ' Method: Views_Paste ' Type: Event ' Description: Fired when MMC needs to determine whether to display the ' paste item on a context menu for a scope item and also when ' a drag occurs over a scope item. ' ' Parameters: DestView The destination view in which the paste has ' occurred. ' SourceItems MMCClipboard object containing the item(s) ' that are being pasted. ' DestScopeItem The ScopeItem on which they may be pasted ' RetToSource An empty MMCDataObject that will be returned ' to the source of the paste if this is a move ' operation (as opposed to a copy). The contents ' of the returned data are defined by the source ' snap-in. When moving within a single snap-in ' it is not used. In that case the destination ' sets ScopeItem.Pasted and ListItem.Pasted on ' each successfully pasted item. ' Move True=a move operation. False=a copy operation. ' ' Output: None ' Notes: Pastes are only supported within the same instance of the ' FileExplorer (see Views_QueryPaste above). Performs the associated ' file operations ands sets Pasted on the processed items. For a ' Move operation, the removal of the source items is handled in ' the Views_Cut event (see below). ' ============================================================================= ' Private Sub Views_Paste(ByVal DestView As SnapInLib.IView, _ ByVal SourceItems As SnapInLib.IMMCClipboard, _ ByVal DestScopeItem As SnapInLib.IScopeItem, _ ByVal RetToSource As SnapInLib.IMMCDataObject, _ ByVal Move As Boolean)
On Error GoTo ErrTrap_Views_Paste
Dim Drive As Scripting.Drive Dim Folder As Scripting.Folder Dim File As Scripting.File Dim DestPath As String Dim ScopeItem As ScopeItem Dim NewScopeItem As ScopeItem Dim ListItems As MMCListItems Dim ListItem As MMCListItem Dim NewPath As String Dim OKToPaste As Boolean Dim DestScopeItemSelected As Boolean Dim NewPathExists As Boolean
' In Views_QueryPaste we only allowed pasting of folders and/or files onto ' a drive or a folder so the source items must be of those types.
' Get the destination path
If TypeOf DestScopeItem.Tag Is Scripting.Drive Then Set Drive = DestScopeItem.Tag DestPath = Drive.Path ElseIf TypeOf DestScopeItem.Tag Is Scripting.Folder Then Set Folder = DestScopeItem.Tag DestPath = Folder.Path Else Debug.Assert False Exit Sub ' this should never happen End If
' Iterate through the source folders and either move or copy them ' to the destination as requested. If there is not yet a scope item at the ' destination then add one. If there is a potential overwrite then ask the ' user to confirm the operation. ' Set PasteOK on each one.
For Each ScopeItem In SourceItems.ScopeItems Set Folder = ScopeItem.Tag NewPath = DestPath & "\" & Folder.Name If m_FileSystemObject.FolderExists(NewPath) Then OKToPaste = ConfirmOverwrite(NewPath) NewPathExists = True Else OKToPaste = True NewPathExists = False End If If OKToPaste Then If Move Then If NewPathExists Then ' File.Move won't overwrite an existing folder so we delete it first m_FileSystemObject.DeleteFolder NewPath, True End If Folder.Move NewPath Else Folder.Copy NewPath, True End If ' Check whether the new ScopeItem exists. If not then add it. Set NewScopeItem = Nothing If NewPathExists Then On Error Resume Next Set NewScopeItem = ScopeItems(NewPath) On Error GoTo ErrTrap_Views_Paste End If
If NewScopeItem Is Nothing Then ' If the destination ScopeItem has never been expanded, then ' expand it in the namespace now, That will cause the enumeration of ' subfolders which will see the newly added folder. If Not DestScopeItem.ScopeNode.ExpandedOnce Then DestScopeItem.ScopeNode.ExpandInNameSpace Else ' The destination scope item has been expanded. Just add the new folder. AddNewFolder DestScopeItem, m_FileSystemObject.GetFolder(NewPath) End If End If ScopeItem.Pasted = True End If Next ScopeItem
' For files do the move or copy but only add the list item if ' DestScopeItem is the currently selected node in the scope pane.
With DestView.ScopePaneItems.SelectedItem If .ScopeItem Is DestScopeItem Then DestScopeItemSelected = True Set ListItems = .ResultView.ListView.ListItems Else DestScopeItemSelected = False End If End With
For Each ListItem In SourceItems.ListItems Set File = ListItem.Tag NewPath = DestPath & "\" & File.Name If m_FileSystemObject.FileExists(NewPath) Then OKToPaste = ConfirmOverwrite(NewPath) NewPathExists = True Else OKToPaste = True NewPathExists = False End If If OKToPaste Then If Move Then If NewPathExists Then ' File.Move won't overwrite an existing file so we delete it first m_FileSystemObject.DeleteFile NewPath, True End If File.Move NewPath Else File.Copy NewPath, True End If ListItem.Pasted = True If DestScopeItemSelected And (Not NewPathExists) Then AddNewFile ListItems, m_FileSystemObject.GetFile(NewPath) End If End If Next ListItem
Exit Sub
' Error Handler for this method ErrTrap_Views_Paste: DisplayError "Views_Paste"
End Sub
' ============================================================================= ' Method: Views_Cut ' Type: Event ' Description: Fired on the source snap-in following the Views_Paste event ' during a Move operation to allow the source to delete the pasted ' items. ' ' Parameters: View The view from which the items were cut ' ItemsPasted MMCClipboard object containing the item(s) ' that were cut and pasted. ' RetFromTarget An MMCDataObject containing data returned ' from the target of the paste if the target ' is not the same instance of the same snap-in. ' When moving within a single snap-in ' it is not used. In that case the destination ' set ScopeItem.Pasted and ListItem.Pasted on ' each successfully pasted item. ' ' Output: None ' Notes: Pastes are only supported within the same instance of the ' FileExplorer (see Views_QueryPaste above). Checks the Pasted ' property on each item and removes the corresponding ScopeItem ' or list item. ' ============================================================================= ' Private Sub Views_Cut(ByVal View As SnapInLib.IView, _ ByVal ItemsPasted As SnapInLib.IMMCClipboard, _ ByVal RetFromTarget As SnapInLib.IMMCDataObject)
On Error GoTo ErrTrap_Views_Cut
Dim ScopeItem As ScopeItem Dim ListItem As MMCListItem ' Each pasted scope item must be removed from the scope items collection. The ' actual file operation was done in Views_Paste.
For Each ScopeItem In ItemsPasted.ScopeItems If ScopeItem.Pasted Then ScopeItems.Remove (ScopeItem.Key) End If Next ScopeItem ' For list items we need to check whether they belong to the currently selected ' scope pane item. If so then we need to delete them. We do the check by using the ' key of one of the pasted items as an index into the current result view's list items. ' As with scope items, the actual file operation was done in Views_Paste so we are ' only updating MMC here.
If ItemsPasted.ListItems.Count = 0 Then Exit Sub End If
With View.ScopePaneItems.SelectedItem.ResultView.ListView On Error Resume Next Set ListItem = .ListItems(ItemsPasted.ListItems(1).Key) On Error GoTo ErrTrap_Views_Cut If ListItem Is Nothing Then Exit Sub End If ' The list items are from the current result view so delete them. For Each ListItem In ItemsPasted.ListItems If ListItem.Pasted Then .ListItems.Remove ListItem.Key End If Next ListItem End With
Exit Sub
' Error Handler for this method ErrTrap_Views_Cut: DisplayError "Views_Cut"
End Sub
' ============================================================================= ' Method: Views_Delete ' Type: Event ' Description: Fired when the user initiates a delete operation by selecting ' items and hitting the delete key, or by selecting "Delete" from ' the context menu, or by clicking the delete toolbar button. (All ' of these UI elements are supplied by MMC as a result of enabling ' the console delete verb. ' ' Parameters: View The view in which the delete request occurred. ' Selection MMCClipboard object containing the item(s) ' that are to be deleted. ' ' Output: None ' Notes: Performs the file operation and deletes the scope items and/or ' list items. ' ============================================================================= ' Private Sub Views_Delete(ByVal View As SnapInLib.IView, _ ByVal Selection As SnapInLib.IMMCClipboard)
On Error GoTo ErrTrap_Views_Delete
Dim ScopeItem As ScopeItem Dim ListItem As MMCListItem Dim Folder As Scripting.Folder Dim File As Scripting.File Dim Choice As Integer
' Request confirmation from the user before deleting Choice = ConsoleMsgBox("Are you sure you want to delete the selected items?", _ vbYesNo, "FileExplorer") If Choice = vbNo Then Exit Sub End If
' Delete the scope items from MMC and the folders from the file system
For Each ScopeItem In Selection.ScopeItems Set Folder = ScopeItem.Tag Folder.Delete True ' True=Delete even if read-only ScopeItems.Remove (ScopeItem.Key) Next ScopeItem
' Delete the list items from MMC and the files from the file system
With View.ScopePaneItems.SelectedItem.ResultView.ListView For Each ListItem In Selection.ListItems Set File = ListItem.Tag File.Delete True ' True=Delete even if read-only .ListItems.Remove (ListItem.Key) Next ListItem End With Exit Sub
' Error Handler for this method ErrTrap_Views_Delete: DisplayError "Views_Delete"
End Sub ' ============================================================================= ' Method: RefreshScopeItem ' Type: Event ' Description: Fired when the user requests to refresh the view ' by hitting F5 or selecting "Refresh" ' from the context menu. ' ' Parameters: ScopeItem ScopeItem to be refreshed ' ' Output: None ' Notes: Removes all of the child scope items and then iterates through ' the sub-folders and adds them back. If the scope item is ' currently selected in the scope pane then calls ' ScopePaneItem.DisplayNewResultView to refresh the result ' view. ' ============================================================================= ' Private Sub RefreshScopeItem(ByVal ScopeItem As SnapInLib.ScopeItem)
On Error GoTo ErrTrap_RefreshScopeItem Dim Drive As Scripting.Drive Dim SubFolders As Scripting.Folders Dim Folder As Scripting.Folder Dim Child As ScopeNode Dim ChildName As String ' Remove all of the child scope items of the refreshed scope item. We do this ' first so that we can reiterate through the sub-folders of this scope item and ' pick up any changes (renames, deletes, additions) done outside of FileExplorer
Set Child = ScopeItem.ScopeNode.Child
' This could also be done by simply calling ScopeItem.RemoveChildren. The ' technique used here is to demonstrate iteration of scope nodes. While Not Child Is Nothing ChildName = ScopeItems(Child).Name Set Child = Child.Next ScopeItems.Remove ChildName Wend ' Invoke the ScopeItems_Expand event handler is it knows how to populate the ' children of a given ScopeItem ScopeItems_Expand ScopeItem
' If the refreshed scope item is currently selected in the scope pane then ' refresh the result pane contents. This can be done by calling ' ScopePaneItem.DisplayNewResultView using the current display string and result ' view type.
If CurrentScopePaneItem Is Nothing Then Exit Sub End If
If ScopeItem Is CurrentScopePaneItem.ScopeItem Then CurrentScopePaneItem.DisplayNewResultView CurrentScopePaneItem.DisplayString, CurrentScopePaneItem.ResultViewType End If Exit Sub ' Error Handler for this method ErrTrap_RefreshScopeItem: DisplayError "RefreshScopeItem"
End Sub
' ============================================================================= ' Method: Views_Refresh ' Type: Event ' Description: Fired when the user requests to refresh the view ' by hitting F5 or selecting "Refresh" ' from the context menu. ' ' Parameters: View A reference to the specific View object ' in which the refresh request occurred. ' Selection An MMCClipboard object that contains ' the currently selected items. ' ' Output: None ' Notes: We support refresh for scope items only. ' Checks selection and calls subroutine RefreshScopeItem to do the work. ' ============================================================================= ' Private Sub Views_Refresh(ByVal View As SnapInLib.View, _ ByVal Selection As SnapInLib.MMCClipboard)
On Error GoTo ErrTrap_Views_Refresh ' Double check that the selection is indeed a single scope item and assign it to ' a local variable
If Selection.SelectionType <> siSingleScopeItem Then Exit Sub End If RefreshScopeItem Selection.ScopeItems(1)
Exit Sub ' Error Handler for this method ErrTrap_Views_Refresh: DisplayError "Views_Refresh"
End Sub
' ============================================================================= ' Method: Views_Select ' Type: Event ' Description: Occurs when the user selects item(s) in either the scope ' pane or in the result pane of a particular view. ' Parameters: View A reference to the specific View object ' in which the selection occurred. ' Selection An MMCClipboard object that contains ' the currently selected items. ' Selected A boolean indicating whether the items are ' being selected or de-selected ' ConsoleVerbs An IMMCConsoleVerbs interface that allows ' the snap-in to enable/disable the console verbs ' such as rename and delete. ' Output: None ' Notes: Determine which types of objects are currently selected and ' enable the console verbs we support for that combination of ' objects. Update the status bar with number of objects selected, ' total size of objects selected, and disk free space. ' ============================================================================= '
Private Sub Views_Select(ByVal View As SnapInLib.IView, _ ByVal Selection As SnapInLib.IMMCClipboard, _ ByVal Selected As Boolean, _ ByVal ConsoleVerbs As SnapInLib.IMMCConsoleVerbs)
On Error GoTo ErrTrap_Views_Select Dim ScopeItem As ScopeItem Dim ListItem As MMCListItem Dim Drive As Scripting.Drive Dim Folder As Scripting.Folder Dim File As Scripting.File Dim szDisplayText As String Dim DiskSpaceAvailable As Double Dim TotalSelectedFileSize As Double Dim SelectionType As SnapInSelectionTypeConstants
SelectionType = Selection.SelectionType
' Start out by disabling everything. ' We will then enable as needed ConsoleVerbs(siOpen).Enabled = False ConsoleVerbs(siCopy).Enabled = False ConsoleVerbs(siPaste).Enabled = False ConsoleVerbs(siDelete).Enabled = False ConsoleVerbs(siProperties).Enabled = False ConsoleVerbs(siRename).Enabled = False ConsoleVerbs(siRefresh).Enabled = False ConsoleVerbs(siPrint).Enabled = False ConsoleVerbs(siCut).Enabled = False
' If the selection is a single scope item and it is the static node then there is ' nothing to do because there is nothing to enable and MMC does not allow displaying ' anything in the status bar in this case. This code also handles the case where ' FileExplorer is extending the Computer Management snap-in in Windows 2000 and the ' ExtensionRoot node is selected. If SelectionType = siSingleScopeItem Then If Selection.ScopeItems(1).Key = SZ_STATICNODE Or _ Selection.ScopeItems(1).Key = SZ_EXTENSION_ROOT Then Exit Sub End If End If ' If the static node is currently selected in the scope pane then there is also ' nothing to do for the same reason. In this case the selection would be ' the desktop node in the result pane.
If Not View.ScopePaneItems.SelectedItem Is Nothing Then With View.ScopePaneItems.SelectedItem.ScopeItem If (.Name = SZ_STATICNODE) Or (.Name = SZ_EXTENSION_ROOT) Then Exit Sub End If End With End If ' If this is a deselection then don't enable anything and clear the status bar. If Not Selected Then View.SetStatusBarText "" Exit Sub End If ' Examine the selection and determine which verbs to enable
' For "My Computer" enable refresh ' For "Internet Explorer" enable properties.
' For a drive enable refresh if it has already been expanded. Always enable paste. ' This doesn't imply that the system clipboard currently contains something that we ' can paste. It only tells MMC that we can potentially paste on this selection ' and that it should ask us before displaying its context menu or enabling its ' paste button. When MMC does ask we will receive a Views_QueryPaste event.
' For a single folder enable properties. ' If it has already been expanded then enable refresh. ' Always enable paste for same reason described above for a drive. ' If permissions allow, enable cut, copy, rename, and delete
' For multiple folders, if permissions allow, enable cut, copy, and delete.
' For a single file enable properties and print. ' If permissions allow, then enable cut, copy, rename, and delete.
' For multiple files enable print. ' If permissions allow, then enable cut, copy, and delete.
' For mixed folders and files, if permissions allow enable cut, copy, and delete.
Select Case SelectionType
Case siSingleScopeItem Set ScopeItem = Selection.ScopeItems(1) If ScopeItem.Key = SZ_MYCOMPUTER Then If ScopeItem.ScopeNode.ExpandedOnce Then ConsoleVerbs(siRefresh).Enabled = True End If ElseIf ScopeItem.Key = SZ_INTERNETEXPLORER Then If ScopeItem.ScopeNode.ExpandedOnce Then ConsoleVerbs(siProperties).Enabled = True End If ElseIf TypeOf ScopeItem.Tag Is Scripting.Drive Then If ScopeItem.ScopeNode.ExpandedOnce Then ConsoleVerbs(siRefresh).Enabled = True End If ConsoleVerbs(siPaste).Enabled = True ElseIf TypeOf ScopeItem.Tag Is Scripting.Folder Then If ScopeItem.ScopeNode.ExpandedOnce Then ConsoleVerbs(siRefresh).Enabled = True End If ConsoleVerbs(siProperties).Enabled = True ConsoleVerbs(siPaste).Enabled = True
' Check permissions for other verbs If m_ConfigData.AllowFolderAccess Then ConsoleVerbs(siCut).Enabled = True ConsoleVerbs(siCopy).Enabled = True ConsoleVerbs(siRename).Enabled = True ConsoleVerbs(siDelete).Enabled = True End If End If
Case siSingleListItem ConsoleVerbs(siProperties).Enabled = True ConsoleVerbs(siPrint).Enabled = True
' Check permissions for other verbs If m_ConfigData.AllowFileAccess Then ConsoleVerbs(siCut).Enabled = True ConsoleVerbs(siCopy).Enabled = True ConsoleVerbs(siRename).Enabled = True ConsoleVerbs(siDelete).Enabled = True End If
Case siMultiScopeItems ' If there is anything other than a folder then don't enable anything
For Each ScopeItem In Selection.ScopeItems If Not TypeOf ScopeItem.Tag Is Scripting.Folder Then Exit Sub End If Next ScopeItem
ConsoleVerbs(siProperties).Enabled = True
' It is all folders. Check permissions for allowable verbs If m_ConfigData.AllowFolderAccess Then ConsoleVerbs(siCut).Enabled = True ConsoleVerbs(siCopy).Enabled = True ConsoleVerbs(siDelete).Enabled = True End If
Case siMultiListItems ConsoleVerbs(siPrint).Enabled = True ConsoleVerbs(siProperties).Enabled = True
' Check permissions for other verbs If m_ConfigData.AllowFileAccess Then ConsoleVerbs(siCut).Enabled = True ConsoleVerbs(siCopy).Enabled = True ConsoleVerbs(siDelete).Enabled = True End If
Case siMultiMixed
' If the ScopeItems are anything other than folders then don't enable anything
For Each ScopeItem In Selection.ScopeItems If Not TypeOf ScopeItem.Tag Is Scripting.Folder Then Exit Sub End If Next ScopeItem ConsoleVerbs(siProperties).Enabled = True
' It is all folders and files. Check permissions for allowable verbs If m_ConfigData.AllowFolderAccess And m_ConfigData.AllowFileAccess Then ConsoleVerbs(siCut).Enabled = True ConsoleVerbs(siCopy).Enabled = True ConsoleVerbs(siDelete).Enabled = True End If
End Select ' Gather data for the status bar string. Count the selected objects, get the disk ' free space, and add up the size of any selected files.
TotalSelectedFileSize = 0
If Selection.ListItems.Count > 0 Then
For Each ListItem In Selection.ListItems Set File = ListItem.Tag TotalSelectedFileSize = TotalSelectedFileSize + File.Size Next ListItem End If
' Determine the drive. One of the selected objects will lead us to it
Set Drive = Nothing
If Selection.ListItems.Count > 0 Then Set File = Selection.ListItems(1).Tag Set Drive = File.Drive ElseIf Selection.ScopeItems.Count > 0 Then For Each ScopeItem In Selection.ScopeItems If Drive Is Nothing Then If TypeOf ScopeItem.Tag Is Scripting.Folder Then Set Folder = ScopeItem.Tag Set Drive = Folder.Drive ElseIf TypeOf ScopeItem.Tag Is Scripting.Drive Then Set Drive = ScopeItem.Tag End If Else Exit For End If Next ScopeItem End If
' Put together the status bar string
szDisplayText = CStr(Selection.ListItems.Count + Selection.ScopeItems.Count) & " Object(s) selected" & Chr$(9) szDisplayText = szDisplayText & FormatByteCount(TotalSelectedFileSize)
If Not Drive Is Nothing Then If Drive.IsReady Then szDisplayText = szDisplayText & Chr$(9) & "(Disk free space: " & FormatByteCount(Drive.AvailableSpace) & ")" End If End If ' Disable for now due to MMC bug View.SetStatusBarText szDisplayText
Exit Sub
' Error Handler for this method ErrTrap_Views_Select: DisplayError "Views_Select"
End Sub
' ============================================================================= ' Method: Views_SetControlbar ' Type: Event ' Description: Fired before a view is displayed. It allows a snap-in to ' add or remove its toolbars and menu buttons. ' Parameters: View A reference to the current view object (as ' represented by the MDI Child window containing ' the snap-in) ' Controlbar A reference to the controlling object that ' manages the snap-in's toolbars and menu buttons ' Output: None ' Notes: While toolbars and menu buttons are added or removed through ' this event, the application always has access to the Toolbar ' object. Enabling/disabling or hiding/showing of individual ' buttons or button menus can be done at any time. ' ============================================================================= ' Private Sub Views_SetControlbar(ByVal View As SnapInLib.IView, _ ByVal Controlbar As SnapInLib.IMMCControlbar)
On Error GoTo ErrTrap_Views_SetControlbar ' Attach the one toolbar we have in this snap-in Controlbar.Attach tbrFileMgr ' Attach the one menu button we have in this snap-in Controlbar.Attach tbrMenuButton Exit Sub
' Error Handler for this method ErrTrap_Views_SetControlbar: DisplayError "Views_SetControlbar"
End Sub
' ============================================================================= ' Method: Views_UpdateControlbar ' Type: Event ' Description: Called following a selection change to allow the snap-in to ' update its toolbar(s) and menu buttons according to the ' selected item(s). ' Parameters: View A reference to the specific View object ' in which the selection has changed. ' Selection An MMCClipboard object that contains ' the current selection ' Selected A boolean showing whether the items are ' being selected or de-selected ' Controlbar A reference to the controlling object that ' manages the snap-in's toolbars and menu buttons ' Output: None ' Notes: Examine the selection and determine which toolbar buttons to ' enable. Always enable the menu button. If the user clicks ' the menu button we will enable/disable the individual menu ' items according to the selection. (See ' tbrMenuButton_ButtonDropDown above). ' ============================================================================= ' Private Sub Views_UpdateControlbar(ByVal View As SnapInLib.IView, _ ByVal Selection As SnapInLib.IMMCClipboard, _ ByVal Selected As Boolean, _ ByVal Controlbar As SnapInLib.IMMCControlbar)
On Error GoTo ErrTrap_Views_UpdateControlbar Dim Button As MMCButton Dim SelectionType As SnapInSelectionTypeConstants SelectionType = Selection.SelectionType
' First disable everything. Then enable as needed For Each Button In tbrFileMgr.Buttons Button.Enabled = False Next Button
' If we are deselecting then don't enable anything
If Selected = False Then Exit Sub End If
' For files enable Run and Run As. ' For a single scope item, if it is a folder or a drive, then enable Add
With tbrFileMgr If (SelectionType = siSingleListItem) Or _ (SelectionType = siMultiListItems) Then .Buttons(KEY_RUN).Enabled = True .Buttons(KEY_RUNAS).Enabled = True ElseIf SelectionType = siSingleScopeItem Then If (TypeOf Selection.ScopeItems(1).Tag Is Scripting.Folder) Or _ (TypeOf Selection.ScopeItems(1).Tag Is Scripting.Drive) Then .Buttons(KEY_ADD).Enabled = True End If End If
End With ' Always enable our menu button. If the user clicks it then in the ' tbrMenuButton_ButtonDropDown event we will enable/disable individual items tbrMenuButton.Buttons(1).Enabled = True
Exit Sub
' Error Handler for this method ErrTrap_Views_UpdateControlbar: DisplayError "Views_UpdateControlbar"
End Sub
|