VERSION 2.00 Begin Form Child Caption = "Form2" ClientHeight = 3405 ClientLeft = 1935 ClientTop = 2565 ClientWidth = 4665 Height = 4335 HelpContextID = 17 Icon = DISKPCHD.FRX:0000 KeyPreview = -1 'True Left = 1875 LinkTopic = "Form2" MDIChild = -1 'True ScaleHeight = 3405 ScaleWidth = 4665 Top = 1695 Width = 4785 Begin CommonDialog CMDialog1 Left = 4080 Top = 2160 End Begin ListBox List2 Height = 225 Left = 2640 Sorted = -1 'True TabIndex = 6 Top = 2520 Visible = 0 'False Width = 1335 End Begin ListBox List1 Height = 225 Left = 2640 Sorted = -1 'True TabIndex = 5 Top = 2160 Visible = 0 'False Width = 1335 End Begin PictureBox Picture1 Height = 375 Left = 120 ScaleHeight = 345 ScaleWidth = 2385 TabIndex = 3 Top = 120 Visible = 0 'False Width = 2415 End Begin GRAPH Graph1 AsciiFFamily = "1~1~1~1" AsciiFSize = "200~150~100~500" AsciiFStyle = "0~0~0~2" AutoInc = 0 'Off DragIcon = DISKPCHD.FRX:0302 GraphStyle = 4 GraphType = 2 '3D Pie Height = 2655 Left = 120 NumPoints = 2 TabIndex = 4 Top = 600 Visible = 0 'False Width = 2415 End Begin FileListBox File1 Height = 420 Left = 2640 TabIndex = 2 Top = 2880 Visible = 0 'False Width = 1935 End Begin DirListBox Dir2 Height = 480 Left = 2640 TabIndex = 1 Top = 1560 Visible = 0 'False Width = 1935 End Begin DirListBox Dir1 Height = 480 Left = 2640 TabIndex = 0 Top = 960 Visible = 0 'False Width = 1935 End Begin Label Label1 BorderStyle = 1 'Fixed Single Caption = "This control and the six controls below it are INVISIBLE." Height = 735 Left = 2640 TabIndex = 7 Top = 120 Visible = 0 'False Width = 1935 End Begin Menu mnu_Main Caption = "&File" HelpContextID = 2 Index = 0 Begin Menu mnu_File Caption = "&Get Colors" HelpContextID = 3 Index = 0 End Begin Menu mnu_File Caption = "-" Index = 1 End Begin Menu mnu_File Caption = "&Print..." HelpContextID = 4 Index = 2 End Begin Menu mnu_File Caption = "P&rint Setup..." HelpContextID = 5 Index = 3 End Begin Menu mnu_File Caption = "-" Index = 4 End Begin Menu mnu_File Caption = "E&xit" HelpContextID = 21 Index = 5 End End Begin Menu mnu_Main Caption = "&Options" HelpContextID = 6 Index = 1 Begin Menu mnu_Options Caption = "&Save Layout on Exit" HelpContextID = 7 Index = 0 End Begin Menu mnu_Options Caption = "&Maximum Slices" HelpContextID = 8 Index = 102 Begin Menu mnu_Slice Caption = "&5" HelpContextID = 8 Index = 5 End Begin Menu mnu_Slice Caption = "&6" HelpContextID = 8 Index = 6 End Begin Menu mnu_Slice Caption = "&7" HelpContextID = 8 Index = 7 End Begin Menu mnu_Slice Caption = "&8" HelpContextID = 8 Index = 8 End Begin Menu mnu_Slice Caption = "&9" HelpContextID = 8 Index = 9 End Begin Menu mnu_Slice Caption = "1&0" HelpContextID = 8 Index = 10 End Begin Menu mnu_Slice Caption = "1&1" HelpContextID = 8 Index = 11 End Begin Menu mnu_Slice Caption = "1&2" HelpContextID = 8 Index = 12 End Begin Menu mnu_Slice Caption = "1&3" HelpContextID = 8 Index = 13 End Begin Menu mnu_Slice Caption = "1&4" HelpContextID = 8 Index = 14 End End End Begin Menu mnu_Main Caption = "&Window" HelpContextID = 9 Index = 2 WindowList = -1 'True Begin Menu mnu_Window Caption = "&Cascade" HelpContextID = 10 Index = 0 End Begin Menu mnu_Window Caption = "&Tile" HelpContextID = 11 Index = 1 End Begin Menu mnu_Window Caption = "&Arrange Icons" HelpContextID = 12 Index = 2 End Begin Menu mnu_Window Caption = "-" Index = 3 End Begin Menu mnu_Window Caption = "New &Dir Window" HelpContextID = 13 Index = 4 End Begin Menu mnu_Window Caption = "New &Ext Window" HelpContextID = 14 Index = 5 End Begin Menu mnu_Window Caption = "&Refresh Active Window" HelpContextID = 15 Index = 6 End Begin Menu mnu_Window Caption = "&Balance Slices" HelpContextID = 22 Index = 7 End End Begin Menu mnu_Main Caption = "&Help" HelpContextID = 16 Index = 3 Begin Menu mnu_Help Caption = "&Contents" HelpContextID = 16 Index = 0 End Begin Menu mnu_Help Caption = "&Search for Help On..." HelpContextID = 16 Index = 1 End Begin Menu mnu_Help Caption = "&How to Use Help" HelpContextID = 16 Index = 2 End Begin Menu mnu_Help Caption = "-" Index = 3 End Begin Menu mnu_Help Caption = "&About Disk Pie..." HelpContextID = 16 Index = 4 End End End Option Explicit ' The variables defined below exist separately for EACH instance of the ' child window form. ' Typ is "T" for Tree pie, "E" for Extension pie Dim Typ As String * 1 ' SliceShown is initially -1. After a pie slice has been clicked or ' space bar has been pressed, it identifies the slice whose detailed ' data is shown on the status bar. Dim SliceShown% ' GraphReady helps the program avoid trying to USE the graph before ' it has been completely created. Dim GraphReady% ' Breakout is true when the user breaks out of the scan process Dim Breakout% ' GrandTotal is the total size of all slices Dim GrandTotal! ' Balanced is true if slice size is balanced for best viewing, ' false if slices are sorted largest to smallest Dim Balanced% ' Each instance of the Child form makes its own copy of the global ' variable Dir2Use. Dim LocalDir2Use$ Sub BalanceGraph () ' Purpose - to "balance" the graph so the smallest slices are on the ' right and left, rather than piled up at the top where their labels ' overlap. Balanced = True SliceShown = -1 MdiForm1.Shape1.FillColor = &HFFFFFF MdiForm1.Label1.Caption = "" If Graph1.NumPoints < 3 Then Exit Sub Dim N%, Max% Max = Graph1.NumPoints Graph1.ThisPoint = 1 ' If the biggest slice is more than half the pie, simply move the ' next-biggest slice to the last position. This will push the ' smallest slices toward the 3-o'clock position. If Graph1.GraphData / GrandTotal > .5 Then Dim DataMax!, LgndMax$, Data2!, Lgnd2$ ' Store data and legend for slice Max Graph1.ThisPoint = Max DataMax = Graph1.GraphData LgndMax = Graph1.LegendText ' Store data and legend for slice N Graph1.ThisPoint = 2 Data2 = Graph1.GraphData Lgnd2 = Graph1.LegendText ' Set data and legend for slice N to values stored for M Graph1.GraphData = DataMax Graph1.LegendText = LgndMax ' Set data and legend for slice M to values stored for N Graph1.ThisPoint = Max Graph1.GraphData = Data2 Graph1.LegendText = Lgnd2 For N = 1 To Max Graph1.ThisPoint = N Graph1.ColorData = N Next N Exit Sub End If ' If the biggest slice is less than half the pie, attempt to balance ' the pie. Start with the next-biggest slice and add slices to the ' right or left of 12-o'clock, always adding to the side that ' currently has less. Put the biggest slice in the remaining space. ' With luck, the biggest slice will cross 6-o'clock, and the ' smallest will cluster around 3-o'clock and 9-o'clock. ReDim NewData(1 To Graph1.NumPoints) As Single ReDim NewLgnd(1 To Graph1.NumPoints) As String Dim LIndex%, RIndex%, LTotal!, RTotal!, LeftLast% LIndex = 1 RIndex = Max LTotal = 0 RTotal = 0 LeftLast = False For N = 2 To Max Graph1.ThisPoint = N If LTotal < RTotal Then NewData(LIndex) = Graph1.GraphData LTotal = LTotal + Graph1.GraphData NewLgnd(LIndex) = Graph1.LegendText LIndex = LIndex + 1 LeftLast = True Else NewData(RIndex) = Graph1.GraphData RTotal = RTotal + Graph1.GraphData NewLgnd(RIndex) = Graph1.LegendText RIndex = RIndex - 1 LeftLast = False End If Next N Graph1.ThisPoint = 1 Dim M% M = RIndex If LeftLast Then M = LIndex NewData(M) = Graph1.GraphData NewLgnd(M) = Graph1.LegendText For N = 1 To Max Graph1.ThisPoint = N Graph1.GraphData = NewData(N) Graph1.LegendText = NewLgnd(N) Graph1.ColorData = N Next N End Sub Sub EliminateZeros () ' Slices of zero size are pointless, so we strip 'em off. This ' routine is always called while the graph is SORTED, so any zero ' size slices will be at the end. Thus all we need do is decrement ' Graph1.NumPoints to get rid of a zero size slice. Dim N% For N = Graph1.NumPoints To 1 Step -1 Graph1.ThisPoint = N If (Graph1.GraphData = 0) And (Graph1.NumPoints > 2) Then Graph1.NumPoints = Graph1.NumPoints - 1 End If Next N End Sub Sub Form_Activate () ' When a child form is activated, if it was previously displaying ' slice info in the status bar, redisplay that data now. If Not GraphReady Then Exit Sub If WindowState = MINIMIZED Then Exit Sub If SliceShown = -1 Then MdiForm1.Shape1.FillColor = &HFFFFFF MdiForm1.Label1.Caption = "" Else Graph1.ThisPoint = SliceShown + 1 MdiForm1.Shape1.FillColor = SliceColors(Graph1.ColorData) MdiForm1.Label1.Caption = ReportString() End If End Sub Sub Form_KeyPress (KeyAscii As Integer) ' If the user presses space bar, select each slice in turn to show ' in the status bar. If the user presses Enter in a Directory pie ' generate a new pie from the selected slice. If Not GraphReady Then Exit Sub If KeyAscii = KEY_SPACE Then SliceShown = (SliceShown + 1) Mod Graph1.NumPoints Graph1.ThisPoint = SliceShown + 1 ' Handle one-slice pies If Graph1.LegendText = "" Then SliceShown = SliceShown - 1 Else MdiForm1.Label1.Caption = ReportString() MdiForm1.Shape1.FillColor = SliceColors(Graph1.ColorData) End If ElseIf KeyAscii = KEY_RETURN Then If SliceShown = -1 Then Exit Sub If Typ = "E" Then Exit Sub Graph1.ThisPoint = SliceShown + 1 If Graph1.LegendText = "OTHER" Then Exit Sub If Left$(Graph1.LegendText, 1) = "[" Then Exit Sub Dir2Use = "T" + Graph1.LegendText NewPie End If End Sub Sub Form_Load () LocalDir2Use = Dir2Use Screen.MousePointer = HOURGLASS ' In case this is the first child form, synch the child form menu ' with the main menu. mnu_Slice(NumSlices).Checked = True mnu_Options(0).Checked = SaveSettings SliceShown = -1 NumOpenWindows = NumOpenWindows + 1 MdiForm1.Shape1.FillColor = &HFFFFFF GraphReady = False Breakout = False ' Initialize the child form in one of four ways. If LocalDir2Use = "GETCOLORS" Then LoadGetColors Else If InStr("012345678", LocalDir2Use) > 0 Then LoadFromINI Else Typ = Left$(LocalDir2Use, 1) LocalDir2Use = Mid$(LocalDir2Use, 2) If Typ = "T" Then LoadDirData Else Icon = Graph1.DragIcon HelpContextID = 18 LoadExtData End If End If End If MdiForm1.Label1.Caption = "" DoEvents Screen.MousePointer = DEFAULT LocalDir2Use = "" If Breakout Then Exit Sub GraphReady = True ' If the window was created correctly, have the Graph draw itself, ' then copy the resulting picture to the picture box If (Caption <> "ERROR") And (Caption <> "Get Colors") Then Picture1.Visible = True Refresh End If End Sub Sub Form_Paint () ' Redraw the graph, and copy the graph to the picture. If GraphReady Then Graph1.DrawMode = G_DRAW Picture1 = Graph1.Picture End If End Sub Sub Form_QueryUnload (Cancel As Integer, UnloadMode As Integer) NumOpenWindows = NumOpenWindows - 1 ' Don't try to unload the child if it's not even done getting loaded If Not GraphReady Then 'Cancel = True Breakout = True Exit Sub End If ' If this is simply one child window closing, clear the status bar. ' The child window that gets activated next will put its own info ' into the status bar. If this was the last child window, the ' status bar will remain empty. If UnloadMode = FORM_CONTROLMENU Then MdiForm1.Label1.Caption = "" MdiForm1.Shape1.FillColor = &HFFFFFF End If If UnloadMode <> FORM_MDIFORM Then Exit Sub ' The QueryUnload method of each child is called *after* the ' QueryUnload of the main MDI form. The main form's QueryUnload ' method erases any [Window n] sections from the INI file. If SaveSettings Then Dim Sec$, Success%, N% Sec = "Window" + Str$(NextWindow) NextWindow = NextWindow + 1 Success = WPPS(Sec, "Type", Typ) Success = WPPS(Sec, "Dir", Mid$(Caption, InStr(Caption, ":") + 2)) GraphReady = False ' Don't bother re-drawing the graph NOW! If WindowState = MAXIMIZED Then WindowState = NORMAL Success = WPPS(Sec, "State", WindowState) WindowState = NORMAL Success = WPPS(Sec, "Left", Format$(Left)) Success = WPPS(Sec, "Top", Format$(Top)) Success = WPPS(Sec, "Width", Format$(Width)) Success = WPPS(Sec, "Height", Format$(Height)) Success = WPPS(Sec, "Slices", Graph1.NumPoints) Success = WPPS(Sec, "Balanced", Format$(Balanced)) For N = 1 To Graph1.NumPoints Graph1.ThisPoint = N Success = WPPS(Sec, "Data" + Str$(N), Format$(Graph1.GraphData)) Success = WPPS(Sec, "Legend" + Str$(N), Graph1.LegendText) Next N End If End Sub Sub Form_Resize () ' If the form is becoming iconized, clear the status bar If WindowState = MINIMIZED Then MdiForm1.Shape1.FillColor = &HFFFFFF MdiForm1.Label1.Caption = "" Else ' Otherwise, fit the graph and the picture to the new size. Graph1.Move 0, 0, ScaleWidth, ScaleHeight Picture1.Move 0, 0, ScaleWidth, ScaleHeight End If End Sub Sub GetExtensionData (ByVal DirName$) ' Recursive function, sums the sizes for the various file extensions ' in the current directory, then calls itself for each subdir. Dim TotalSize!, OneSize!, N%, DirCombine$, Temp$ DoEvents If Breakout Then Exit Sub Temp = "Scanning " + DirName + ". " Temp = Temp + Str$(List1.ListCount) + " extensions found." MdiForm1.Label1.Caption = Temp DoEvents TotalSize = 0 If Right$(DirName, 1) = "\" Then DirCombine = DirName Else DirCombine = DirName + "\" End If File1.Path = DirName File1.Pattern = "*.*" File1.Refresh ' File List box File1 contains a list of all files in current dir Dim Posn%, Locn%, Ext$, OneSiz!, TotalSiz! If File1.ListCount > 0 Then For N = 0 To File1.ListCount - 1 Posn = InStr(File1.List(N), ".") If Posn = 0 Then Ext = " ." Else Ext = Left$(Mid$(File1.List(N), Posn + 1) + " ", 3) + "." End If OneSiz = FileLen(DirCombine + File1.List(N)) Locn = LocationOf(Ext, List1) If Locn = -1 Then List1.AddItem Ext + Format$(OneSiz, "0000000000") Else TotalSiz = Val(Right$(List1.List(Locn), 10)) TotalSiz = TotalSiz + OneSiz List1.RemoveItem (Locn) List1.AddItem Ext + Format$(TotalSiz, "0000000000") End If Next N End If Dir2.Path = DirName Dir2.Refresh ' Directory list box Dir2 now contains a list of subdirectories. If Dir2.ListCount > 0 Then ' Copy the subdirectory list to a local array, because other ' instances of this recursive procedure will re-use Dir2 Dim Dirs$() ReDim Dirs$(Dir2.ListCount - 1) For N = 0 To Dir2.ListCount - 1 Dirs(N) = Dir2.List(N) Next N For N = 0 To UBound(Dirs) GetExtensionData (Dirs(N)) Next N End If End Sub Sub LoadDirData () ' This function is called to initialize a new child window with ' Directory pie information. Dim N%, M%, Slices% Caption = "TREE: " + LocalDir2Use Show On Error GoTo BadPathDir Dir1.Path = LocalDir2Use On Error GoTo 0 ' Add 1 to slices for "base" directory Slices = Dir1.ListCount + 1 If Slices < 2 Then ' If there would be < 2 slices, switch to an extension pie Typ = "E" Icon = Graph1.DragIcon LoadExtData Exit Sub Else GrandTotal = 0 Graph1.ThisSet = 1 Graph1.NumPoints = Slices ' Store data for each subdirectory right in Graph1. Note that ' Graph1 may well come to hold many more slices than specified ' by the NumSlices variable. Dim Siz& For N = 0 To Dir1.ListCount - 1 Graph1.ThisPoint = N + 1 Siz = SizeOfFiles(Dir1.List(N), True) DoEvents If Breakout Then Exit Sub Graph1.GraphData = Siz GrandTotal = GrandTotal + Siz Graph1.LegendText = Dir1.List(N) Next N ' Insert a slice for the base directory Graph1.ThisPoint = Slices Siz = SizeOfFiles(LocalDir2Use, False) Graph1.GraphData = Siz GrandTotal = GrandTotal + Siz Graph1.LegendText = "[" + LocalDir2Use + "]" End If If GrandTotal = 0 Then Msg = "There are no files in or below " + LocalDir2Use MsgType = MB_ICONSTOP MsgBox Msg, MsgType, MsgTitle Caption = "ERROR" Exit Sub End If MdiForm1.Label1.Caption = "Sorting..." SortDirData EliminateZeros ' If there are too many slices, merge smallest ones into "OTHER" If Graph1.NumPoints > NumSlices Then Dim OtherSiz! OtherSiz = 0 For N = NumSlices To Graph1.NumPoints Graph1.ThisPoint = N OtherSiz = OtherSiz + Graph1.GraphData Next N Graph1.NumPoints = NumSlices Graph1.ThisPoint = NumSlices Graph1.GraphData = OtherSiz Graph1.LegendText = "OTHER" End If ' Give each slice the color of its slice number, so DiskPie can ' identify slices by grabbing the color of a pixel. For N = 1 To Graph1.NumPoints Graph1.ThisPoint = N Graph1.ColorData = N Next N Exit Sub ' Error handling code follows, in case this subroutine received an ' invalid directory. BadPathDir: Caption = "ERROR" Msg = LocalDir2Use + " is not a valid path." MsgType = MB_ICONSTOP MsgBox Msg, MsgType, MsgTitle Exit Sub End Sub Sub LoadExtData () ' This function is called to initialize a new child window with ' Extension pie information. Dim N%, M%, Slices%, Temp$ Caption = "EXT: " + LocalDir2Use Show Temp = "Scanning " + LocalDir2Use + ". 0 extensions found." MdiForm1.Label1.Caption = Temp List1.Clear On Error GoTo BadPathExt File1.Path = LocalDir2Use File1.Refresh On Error GoTo 0 GetExtensionData (LocalDir2Use) DoEvents If Breakout Then Exit Sub Slices = List1.ListCount If Slices > NumSlices Then Slices = NumSlices If Slices < 2 Then Slices = 2 GrandTotal = 0 Graph1.ThisSet = 1 Graph1.NumPoints = Slices MdiForm1.Label1.Caption = "Sorting..." ' Sort the data simply by copying it to List2 with the size FIRST List2.Clear Dim TheLine$ For N = 0 To List1.ListCount - 1 TheLine = List1.List(N) List2.AddItem Right$(TheLine, 10) + Left$(TheLine, 4) Next N ' Put the biggest items into the graph For N = 1 To Slices Graph1.ThisPoint = N Graph1.ColorData = N TheLine = List2.List(List2.ListCount - N) Graph1.GraphData = Val(Left$(TheLine, 10)) GrandTotal = GrandTotal + Graph1.GraphData Graph1.LegendText = Mid$(TheLine, 11, 3) Next N ' Add the remaining items to the "OTHER" slice Dim OneData! If List2.ListCount > NumSlices Then Graph1.LegendText = "OTHER" For N = 0 To List2.ListCount - (Slices + 1) TheLine = List2.List(N) OneData = Val(Left$(TheLine, 10)) Graph1.GraphData = Graph1.GraphData + OneData GrandTotal = GrandTotal + OneData Next N End If If GrandTotal = 0 Then Msg = "There are no files in or below " + LocalDir2Use MsgType = MB_ICONSTOP MsgBox Msg, MsgType, MsgTitle Caption = "ERROR" Exit Sub End If EliminateZeros Exit Sub ' Error handling code follows, in case this subroutine received an ' invalid directory. BadPathExt: Caption = "ERROR" Msg = LocalDir2Use + " is not a valid path." MsgType = MB_ICONSTOP MsgBox Msg, MsgType, MsgTitle Exit Sub End Sub Sub LoadFromINI () ' Load a pie window from information saved in DISKPIE.INI Dim Sec$, N%, Success%, Temp$, Slices% Sec$ = "Window " + LocalDir2Use Success = GPPS(Sec$, "Type", "T", Typ, 1) Success = GPPS(Sec$, "Dir", "ERROR", Temp, 144) If Typ = "T" Then Caption = "TREE: " + Temp Else Caption = "EXT: " + Temp Icon = Graph1.DragIcon HelpContextID = 18 End If DoEvents Temp = "Loading " + Caption + " from INI file ..." MdiForm1.Label1.Caption = Temp DoEvents ' Start with the window in a normal state, to set the coords WindowState = NORMAL Dim xLeft%, xTop%, xWid%, xHig% xLeft = GPPI(Sec$, "Left", 0) xTop = GPPI(Sec$, "Top", 0) xWid = GPPI(Sec$, "Width", 1000) 'MdiForm1.ScaleWidth) xHig = GPPI(Sec$, "Height", 1000) 'MdiForm1.ScaleHeight) Move xLeft, xTop, xWid, xHig WindowState = GPPI(Sec$, "State", NORMAL) GrandTotal = 0 Graph1.NumPoints = GPPI(Sec$, "Slices", NumSlices) Balanced = GPPI(Sec, "Balanced", False) If Balanced Then mnu_Window(7).Caption = "&Sort Slices" End If Dim Key$ For N = 1 To Graph1.NumPoints Graph1.ThisPoint = N Graph1.ColorData = N Key = "Data" + Str$(N) ' Can't use GetPrivateProfileInt, because the stored values may ' well be too LARGE for an Integer. Success = GPPS(Sec, Key, "-1", Temp, 12) Graph1.GraphData = Val(Temp) GrandTotal = GrandTotal + Graph1.GraphData Key = "Legend" + Str$(N) Success = GPPS(Sec, Key, "ERROR", Temp, 144) Graph1.LegendText = Temp Next N End Sub Sub LoadGetColors () ' Load a child form that will be used just to get the colors of the ' pie slices. Dim N%, WasState MdiForm1!Label1.Caption = "GETTING COLOR VALUES..." Caption = "Get Colors" ' Draw a graph with 14 slices, each colors with the graph color of ' its number. Do not use 0 (black) or 15 (white). Make it a 2D ' pie chart, so the center of the pie will be IN the center of ' the graph. Graph1.NumPoints = 14 Graph1.GraphType = 1 Graph1.GraphStyle = 0 For N = 1 To 14 Graph1.ThisPoint = N Graph1.GraphData = 1 Graph1.ColorData = N Graph1.LabelText = "Slice #" + Format$(N) Next N Show Graph1.DrawMode = G_DRAW Picture1.Visible = True Picture1 = Graph1.Picture Dim X!, Y!, Angle!, Radius! ' (X,Y) is the center of the graph. X = Picture1.ScaleWidth / 2 Y = Picture1.ScaleHeight / 2 Radius = X / 3 If Radius > Y / 3 Then Radius = Y / 3 ' Find a point in each of the equal-size sectors and get its color. ' Start at straight up, which is -(pi/2). For the Nth slice go ' counter clockwise N 14ths of the distance. Then go halfway into ' the slice (pi / 14). Use a radius 1/6 the height of the graph ' or 1/6 the width, whichever is smaller. Dim TotalSuccess%, vX%, vY%, Key$, Valu$ TotalSuccess = True For N = 0 To 13 Angle = -(pi / 2) - ((((2 * pi) * N) / 14) + (pi / 14)) vX = X + Cos(Angle) * Radius vY = Y + Sin(Angle) * Radius SliceColors(N + 1) = Picture1.Point(vX, vY) If SliceColors(N + 1) = -1 Then TotalSuccess = False Else Key = "Color" + Str$(N + 1) Valu = Right$("00000000" + Hex$(SliceColors(N + 1)), 6) If WPPS("Settings", Key, Valu) = 0 Then TotalSuccess = False End If Next N If Not TotalSuccess Then Msg = "Failed to record the values of all graph colors 1-14. " Msg = Msg + "Examine the 'Color n=' keys in the [Settings] " Msg = Msg + "section of DISKPIE.INI." MsgType = MB_ICONSTOP MsgBox Msg, MsgType, MsgTitle End If End Sub Function LocationOf% (ByVal Ext$, L As ListBox) ' This is a binary search routine for locating a particular extension ' in the sorted list box List1. It returns -1 if the extension ' is not found, or the position within the list if found. Dim Top%, Bot%, Midl%, Found% If L.ListCount = 0 Then LocationOf = -1 Else Top = L.ListCount - 1 Bot = 0 Midl = (Top + Bot) \ 2 Found = False Do While (Not Found) And (Top >= Bot) Select Case StrComp(Ext, Left$(List1.List(Midl), 4), 1) Case Is < 0 ' Desired location is in bottom half of range. Set top to ' one less than current middle. Top = Midl - 1 Case 0 Found = True Case Is > 0 ' Desired location is in top half of range. Set bottom to ' one more than current middle. Bot = Midl + 1 End Select Midl = (Top + Bot) \ 2 Loop If Not Found Then LocationOf = -1 Else LocationOf = Midl End If End If End Function Sub mnu_File_Click (Index As Integer) If Not GraphReady Then Exit Sub Select Case Index Case 0 Dir2Use = "GETCOLORS" NewPie Case 2 PrepareAndPrint Case 3 CmDialog1.Flags = PD_PRINTSETUP CmDialog1.Action = DLG_PRINT Case 5 Unload MdiForm1 End Select End Sub Sub mnu_Help_Click (Index As Integer) ' The Mdi form and the child form have nearly identical menus. Both ' rely on functions in DISKPIE.BAS to process many of them. Share_Help_Click (Index) End Sub Sub mnu_Options_Click (Index As Integer) Select Case Index Case 0 mnu_Options(0).Checked = Not mnu_Options(0).Checked SaveSettings = mnu_Options(0).Checked ' Synchronize the main form's menu with this change MdiForm1.mnu_Options(0).Checked = SaveSettings End Select End Sub Sub mnu_Slice_Click (Index As Integer) ' Keep the main form menu and the child form menu in synch If Index <> NumSlices Then mnu_Slice(NumSlices).Checked = False MdiForm1.mnu_Slice(NumSlices).Checked = False NumSlices = Index mnu_Slice(NumSlices).Checked = True MdiForm1.mnu_Slice(NumSlices).Checked = True End If End Sub Sub mnu_Window_Click (Index As Integer) If Not GraphReady Then Exit Sub Select Case Index Case 0 MdiForm1.Arrange CASCADE Case 1 MdiForm1.Arrange TILE_HORIZONTAL Case 2 MdiForm1.Arrange ARRANGE_ICONS Case 4, 5 ' These two options are available even when no child window open. Share_Window_Click (Index) Case 6 Dir2Use = MdiForm1.ActiveForm.Caption Dim Posn% Posn = InStr(Dir2Use, ":") If Posn > 0 Then Dir2Use = Left$(Dir2Use, 1) + Mid$(Dir2Use, Posn + 2) Unload MdiForm1.ActiveForm NewPie End If Case 7 If Balanced Then SortDirData mnu_Window(7).Caption = "&Balance Slices" Else BalanceGraph mnu_Window(7).Caption = "&Sort Slices" End If Refresh End Select End Sub Sub Picture1_DblClick () If Not GraphReady Then Exit Sub ' If this isn't a directory pie, exit immediately. If Typ = "E" Then Exit Sub If SliceShown > -1 Then Graph1.ThisPoint = SliceShown + 1 If Graph1.LegendText = "OTHER" Then Exit Sub If Left$(Graph1.LegendText, 1) = "[" Then Exit Sub Dir2Use = "T" + Graph1.LegendText NewPie End If End Sub Sub Picture1_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single) ' If the user clicks the mouse, get the color of the pixel at the ' mouse pointer. If it matches one of the recorded slice colors, ' select that slice and display its data in the status bar. If it ' does not match and is not either white or black, warn the user ' to re-calibrate the colors. If Not GraphReady Then Exit Sub Dim Color&, N%, Found% Color = Picture1.Point(X, Y) Found = False SliceShown = -1 For N = 1 To 14 If Color = SliceColors(N) Then Graph1.ThisPoint = N SliceShown = N - 1 Found = True End If Next N If Found Then MdiForm1.Label1.Caption = ReportString() MdiForm1.Shape1.FillColor = Color End If End Sub Sub PrepareAndPrint () ' Before printing, change the graph for better printed output Dim N%, Temp$, G As Graph, GT! Set G = Graph1 GT = GrandTotal ' Change labels to index numbers. Prefix legend text with index ' number and add total size and percent data to it. For N = 1 To G.NumPoints G.ThisPoint = N G.LabelText = Format$(N, "#0\. ") Temp = G.LabelText + G.LegendText + " [" Temp = Temp + Format$(G.GraphData, "#,###,###,##0") + " bytes, " Temp = Temp + Format$(G.GraphData / GT, "#0.0%]") G.LegendText = Temp Next N ' Create titles for the output report G.GraphTitle = "DISKPIE Disk Space Usage Report" G.BottomTitle = MdiForm1.ActiveForm.Caption ' Switch to a 2D pie, because it prints better G.GraphType = G_PIE2D ' Make the labels bigger and bolder G.FontUse = 2 ' labels G.FontSize = 200 G.FontStyle = 2 ' bold ' Save the child and main window states and maximize both Dim CS%, MS% CS = WindowState MS = MdiForm1.WindowState ' Don't SHOW the changes GraphReady = False Picture1.Visible = False WindowState = MAXIMIZED MdiForm1.WindowState = MAXIMIZED ' PRINT IT! G.DrawMode = G_PRINT ' Now UNDO all the changes G.FontUse = 2 ' labels G.FontSize = 100 G.FontStyle = 0 ' default G.BottomTitle = "" G.GraphTitle = "" G.GraphType = G_PIE3D G.DataReset = G_LABEL_TEXT For N = 1 To G.NumPoints G.ThisPoint = N Temp = G.LegendText Temp = Left$(Temp, InStr(7, Temp, "[") - 2) Temp = Mid$(Temp, InStr(Temp, ".") + 2) G.LegendText = Temp Next N MdiForm1.WindowState = MS WindowState = CS GraphReady = True Picture1.Visible = True Refresh End Sub Function ReportString$ () ' Returns the string used on the status line to report the size ' of the selected slice. If Typ = "T" Then Msg = Graph1.LegendText + " - " Else Msg = "*." + UCase$(Graph1.LegendText) + " - " End If Msg = Msg + Format$(Graph1.GraphData, "#,###,###,##0") Msg = Msg + " bytes. (" Msg = Msg + Format$(Graph1.GraphData / GrandTotal, "#0.0%)") ReportString = Msg End Function Function SizeOfFiles! (ByVal DirName$, ByVal Recurse%) ' Function to get size of files in directory DirName. If the ' parameter Recurse is TRUE, the function recursively sums files in ' directories below DirName. Dim TotalSize!, OneSize!, N%, DirCombine$ MdiForm1.Label1.Caption = "Scanning " + DirName + "..." DoEvents If Breakout Then Exit Function TotalSize = 0 If Right$(DirName, 1) = "\" Then DirCombine = DirName Else DirCombine = DirName + "\" End If File1.Path = DirName File1.Pattern = "*.*" File1.Refresh ' Add the size of each file in the current directory If File1.ListCount > 0 Then For N = 0 To File1.ListCount - 1 TotalSize = TotalSize + FileLen(DirCombine + File1.List(N)) Next N End If If Recurse Then ' Use Dir2 to get a list of subdirectories Dir2.Path = DirName Dir2.Refresh If Dir2.ListCount > 0 Then ' Copy the list of subdirectories to a LOCAL variable Dim Dirs$() ReDim Dirs$(Dir2.ListCount - 1) For N = 0 To Dir2.ListCount - 1 Dirs(N) = Dir2.List(N) Next N ' For each subdirectory, call SizeOfFiles For N = 0 To UBound(Dirs) TotalSize = TotalSize + SizeOfFiles(Dirs(N), True) If Breakout Then Exit Function Next N End If End If SizeOfFiles = TotalSize End Function Sub SortDirData () ' Sort into descending size order using sorted list box Dim M%, N%, SizM!, SizN! Balanced = False SliceShown = -1 MdiForm1.Shape1.FillColor = &HFFFFFF MdiForm1.Label1.Caption = "" List1.Clear Dim Siz! For N = 1 To Graph1.NumPoints Graph1.ThisPoint = N Siz = Graph1.GraphData List1.AddItem Format$(Siz, "0000000000") + Graph1.LegendText Next N Dim TheLine$ For N = 1 To List1.ListCount Graph1.ThisPoint = N TheLine = List1.List(List1.ListCount - N) Graph1.LegendText = Mid$(TheLine, 11) Graph1.GraphData = Val(Left$(TheLine, 10)) Next N List1.Clear Exit Sub End Sub