1*b1cdbd2cSJim JagielskiVERSION 1.0 CLASS 2*b1cdbd2cSJim JagielskiBEGIN 3*b1cdbd2cSJim Jagielski MultiUse = -1 'True 4*b1cdbd2cSJim JagielskiEND 5*b1cdbd2cSJim JagielskiAttribute VB_Name = "MigrationAnalyser" 6*b1cdbd2cSJim JagielskiAttribute VB_GlobalNameSpace = False 7*b1cdbd2cSJim JagielskiAttribute VB_Creatable = False 8*b1cdbd2cSJim JagielskiAttribute VB_PredeclaredId = False 9*b1cdbd2cSJim JagielskiAttribute VB_Exposed = False 10*b1cdbd2cSJim Jagielski'************************************************************************* 11*b1cdbd2cSJim Jagielski' 12*b1cdbd2cSJim Jagielski' Licensed to the Apache Software Foundation (ASF) under one 13*b1cdbd2cSJim Jagielski' or more contributor license agreements. See the NOTICE file 14*b1cdbd2cSJim Jagielski' distributed with this work for additional information 15*b1cdbd2cSJim Jagielski' regarding copyright ownership. The ASF licenses this file 16*b1cdbd2cSJim Jagielski' to you under the Apache License, Version 2.0 (the 17*b1cdbd2cSJim Jagielski' "License"); you may not use this file except in compliance 18*b1cdbd2cSJim Jagielski' with the License. You may obtain a copy of the License at 19*b1cdbd2cSJim Jagielski' 20*b1cdbd2cSJim Jagielski' http://www.apache.org/licenses/LICENSE-2.0 21*b1cdbd2cSJim Jagielski' 22*b1cdbd2cSJim Jagielski' Unless required by applicable law or agreed to in writing, 23*b1cdbd2cSJim Jagielski' software distributed under the License is distributed on an 24*b1cdbd2cSJim Jagielski' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 25*b1cdbd2cSJim Jagielski' KIND, either express or implied. See the License for the 26*b1cdbd2cSJim Jagielski' specific language governing permissions and limitations 27*b1cdbd2cSJim Jagielski' under the License. 28*b1cdbd2cSJim Jagielski' 29*b1cdbd2cSJim Jagielski'************************************************************************* 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim JagielskiOption Explicit 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim JagielskiPrivate mAnalysis As DocumentAnalysis 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski'***ADDING-ISSUE: Use Following Skeleton as Guideline for Adding Issue 37*b1cdbd2cSJim Jagielski' For complete list of all RID_STR_... for Issues (IssueType), SubIssues (SubType) and Attributes refer to: 38*b1cdbd2cSJim Jagielski' powerpoint_res.bas and common_res.bas 39*b1cdbd2cSJim Jagielski' 40*b1cdbd2cSJim Jagielski' For complete list of all CID_... for Issue Categories(IssueID) and 41*b1cdbd2cSJim Jagielski' CSTR_... for XML Issues (IssueTypeXML) and XML SubIssues (SubTypeXML) refer to: 42*b1cdbd2cSJim Jagielski' ApplicationSpecific.bas and CommonMigrationAnalyser.bas 43*b1cdbd2cSJim Jagielski' 44*b1cdbd2cSJim Jagielski' You should not have to add any new Issue Categories or matching IssueTypes, only new SubIssues 45*b1cdbd2cSJim JagielskiSub Analyze_SKELETON() 46*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 47*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 48*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_SKELETON" 49*b1cdbd2cSJim Jagielski Dim myIssue As IssueInfo 50*b1cdbd2cSJim Jagielski Set myIssue = New IssueInfo 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski With myIssue 53*b1cdbd2cSJim Jagielski .IssueID = CID_VBA_MACROS 'Issue Category 54*b1cdbd2cSJim Jagielski .IssueType = RID_STR_COMMON_ISSUE_VBA_MACROS 'Issue String 55*b1cdbd2cSJim Jagielski .SubType = RID_STR_COMMON_SUBISSUE_PROPERTIES 'SubIssue String 56*b1cdbd2cSJim Jagielski .Location = .CLocationDocument 'Location string 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski .IssueTypeXML = CSTR_ISSUE_VBA_MACROS 'Non localised XML Issue String 59*b1cdbd2cSJim Jagielski .SubTypeXML = CSTR_SUBISSUE_PROPERTIES 'Non localised XML SubIssue String 60*b1cdbd2cSJim Jagielski .locationXML = .CXMLLocationDocument 'Non localised XML location 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski .SubLocation = 0 'if not set will default to RID_STR_NOT_AVAILABLE_SHORTHAND 63*b1cdbd2cSJim Jagielski .Line = 0 'if not set will default to RID_STR_NOT_AVAILABLE_SHORTHAND 64*b1cdbd2cSJim Jagielski .column = 0 'if not set will default to RID_STR_NOT_AVAILABLE_SHORTHAND 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski ' Add as many Attribute Value pairs as needed 67*b1cdbd2cSJim Jagielski ' Note: following must always be true - Attributes.Count = Values.Count 68*b1cdbd2cSJim Jagielski .Attributes.Add "AAA" 69*b1cdbd2cSJim Jagielski .Values.Add "foobar" 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski ' Use AddIssueDetailsNote to add notes to the Issue Details if required 72*b1cdbd2cSJim Jagielski ' Public Sub AddIssueDetailsNote(myIssue As IssueInfo, noteNum As Long, noteStr As String, _ 73*b1cdbd2cSJim Jagielski ' Optional preStr As String = RID_STR_COMMON_NOTE_PRE) 74*b1cdbd2cSJim Jagielski ' Where preStr is prepended to the output, with "Note" as the default 75*b1cdbd2cSJim Jagielski AddIssueDetailsNote myIssue, 0, RID_STR_COMMON_NOTE_DOCUMENT_PROPERTIES_LOST 76*b1cdbd2cSJim Jagielski 77*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_VBA_MACROS) = _ 78*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_VBA_MACROS) + 1 79*b1cdbd2cSJim Jagielski End With 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski mAnalysis.Issues.Add myIssue 82*b1cdbd2cSJim Jagielski 83*b1cdbd2cSJim JagielskiFinalExit: 84*b1cdbd2cSJim Jagielski Set myIssue = Nothing 85*b1cdbd2cSJim Jagielski Exit Sub 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim JagielskiHandleErrors: 88*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 89*b1cdbd2cSJim Jagielski Resume FinalExit 90*b1cdbd2cSJim JagielskiEnd Sub 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim JagielskiSub DoAnalyse(fileName As String, userFormTypesDict As Scripting.Dictionary, _ 93*b1cdbd2cSJim Jagielski startDir As String, storeToDir As String, fso As FileSystemObject) 94*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 95*b1cdbd2cSJim Jagielski Dim containsInvalidChar As Boolean 96*b1cdbd2cSJim Jagielski containsInvalidChar = False 97*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 98*b1cdbd2cSJim Jagielski currentFunctionName = "DoAnalyse" 99*b1cdbd2cSJim Jagielski mAnalysis.name = fileName 100*b1cdbd2cSJim Jagielski Dim aPres As Presentation 101*b1cdbd2cSJim Jagielski mAnalysis.TotalIssueTypes = CTOTAL_CATEGORIES 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielski If InStr(fileName, "[") = 0 And InStr(fileName, "]") = 0 Then 'If fileName does not contain [ AND ] 104*b1cdbd2cSJim Jagielski containsInvalidChar = False 105*b1cdbd2cSJim Jagielski Else 106*b1cdbd2cSJim Jagielski containsInvalidChar = True 107*b1cdbd2cSJim Jagielski End If 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski 'Cannot Turn off any AutoExce macros before loading the Presentation 110*b1cdbd2cSJim Jagielski 'WordBasic.DisableAutoMacros 1 111*b1cdbd2cSJim Jagielski 'On Error GoTo HandleErrors 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski On Error Resume Next ' Ignore errors on setting 114*b1cdbd2cSJim Jagielski If containsInvalidChar = True Then 115*b1cdbd2cSJim Jagielski GoTo HandleErrors 116*b1cdbd2cSJim Jagielski End If 117*b1cdbd2cSJim Jagielski Set aPres = Presentations.Open(fileName:=fileName, ReadOnly:=True) 118*b1cdbd2cSJim Jagielski If Err.Number <> 0 Then 119*b1cdbd2cSJim Jagielski mAnalysis.Application = RID_STR_COMMON_CANNOT_OPEN 120*b1cdbd2cSJim Jagielski GoTo HandleErrors 121*b1cdbd2cSJim Jagielski End If 122*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski 'MsgBox "Window: " & PPViewType(aPres.Windows(1).viewType) & _ 125*b1cdbd2cSJim Jagielski ' " Pane: " & PPViewType(aPres.Windows(1).ActivePane.viewType) 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski 'Set Doc Properties 128*b1cdbd2cSJim Jagielski SetDocProperties mAnalysis, aPres, fso 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski Analyze_SlideIssues aPres 131*b1cdbd2cSJim Jagielski Analyze_Macros mAnalysis, userFormTypesDict, aPres 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski ' Doc Preparation only 134*b1cdbd2cSJim Jagielski ' Save document with any fixed issues under <storeToDir>\prepared\<source doc name> 135*b1cdbd2cSJim Jagielski If mAnalysis.PreparableIssuesCount > 0 And CheckDoPrepare Then 136*b1cdbd2cSJim Jagielski Dim preparedFullPath As String 137*b1cdbd2cSJim Jagielski preparedFullPath = GetPreparedFullPath(mAnalysis.name, startDir, storeToDir, fso) 138*b1cdbd2cSJim Jagielski If preparedFullPath <> "" Then 139*b1cdbd2cSJim Jagielski If fso.FileExists(preparedFullPath) Then 140*b1cdbd2cSJim Jagielski fso.DeleteFile preparedFullPath, True 141*b1cdbd2cSJim Jagielski End If 142*b1cdbd2cSJim Jagielski If fso.FolderExists(fso.GetParentFolderName(preparedFullPath)) Then 143*b1cdbd2cSJim Jagielski aPres.SaveAs preparedFullPath 144*b1cdbd2cSJim Jagielski End If 145*b1cdbd2cSJim Jagielski End If 146*b1cdbd2cSJim Jagielski End If 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim JagielskiFinalExit: 149*b1cdbd2cSJim Jagielski If Not aPres Is Nothing Then 'If Not IsEmpty(aDoc) Then 150*b1cdbd2cSJim Jagielski aPres.Saved = True 151*b1cdbd2cSJim Jagielski aPres.Close 152*b1cdbd2cSJim Jagielski End If 153*b1cdbd2cSJim Jagielski Set aPres = Nothing 154*b1cdbd2cSJim Jagielski Exit Sub 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim JagielskiHandleErrors: 157*b1cdbd2cSJim Jagielski If containsInvalidChar = False Then 158*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 159*b1cdbd2cSJim Jagielski Else 160*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": The file name contains the invalid character [ or ]. Please change the file name and run analysis again." 161*b1cdbd2cSJim Jagielski End If 162*b1cdbd2cSJim Jagielski Resume FinalExit 163*b1cdbd2cSJim JagielskiEnd Sub 164*b1cdbd2cSJim Jagielski 165*b1cdbd2cSJim JagielskiSub SetDocProperties(docAnalysis As DocumentAnalysis, pres As Presentation, fso As FileSystemObject) 166*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 167*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 168*b1cdbd2cSJim Jagielski currentFunctionName = "SetDocProperties" 169*b1cdbd2cSJim Jagielski Dim f As File 170*b1cdbd2cSJim Jagielski Set f = fso.GetFile(docAnalysis.name) 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski Const appPropertyAppName = 9 173*b1cdbd2cSJim Jagielski Const appPropertyLastAuthor = 7 174*b1cdbd2cSJim Jagielski Const appPropertyRevision = 8 175*b1cdbd2cSJim Jagielski Const appPropertyTemplate = 6 176*b1cdbd2cSJim Jagielski Const appPropertyTimeCreated = 11 177*b1cdbd2cSJim Jagielski Const appPropertyTimeLastSaved = 12 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski On Error Resume Next 180*b1cdbd2cSJim Jagielski docAnalysis.PageCount = pres.Slides.count 181*b1cdbd2cSJim Jagielski docAnalysis.Created = f.DateCreated 182*b1cdbd2cSJim Jagielski docAnalysis.Modified = f.DateLastModified 183*b1cdbd2cSJim Jagielski docAnalysis.Accessed = f.DateLastAccessed 184*b1cdbd2cSJim Jagielski docAnalysis.Printed = DateValue("01/01/1900") 185*b1cdbd2cSJim Jagielski 186*b1cdbd2cSJim Jagielski On Error Resume Next 'Some apps may not support all props 187*b1cdbd2cSJim Jagielski DocAnalysis.Application = getAppSpecificApplicationName & " " & Application.Version 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski 'docAnalysis.Application = pres.BuiltInDocumentProperties(appPropertyAppName) 190*b1cdbd2cSJim Jagielski 'If InStr(docAnalysis.Application, "Microsoft") = 1 Then 191*b1cdbd2cSJim Jagielski ' docAnalysis.Application = Mid(docAnalysis.Application, Len("Microsoft") + 2) 192*b1cdbd2cSJim Jagielski 'End If 193*b1cdbd2cSJim Jagielski 'If InStr(Len(docAnalysis.Application) - 2, docAnalysis.Application, ".") = 0 Then 194*b1cdbd2cSJim Jagielski ' docAnalysis.Application = docAnalysis.Application & " " & Application.Version 195*b1cdbd2cSJim Jagielski 'End If 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski docAnalysis.SavedBy = _ 198*b1cdbd2cSJim Jagielski pres.BuiltInDocumentProperties(appPropertyLastAuthor) 199*b1cdbd2cSJim Jagielski docAnalysis.Revision = _ 200*b1cdbd2cSJim Jagielski val(pres.BuiltInDocumentProperties(appPropertyRevision)) 201*b1cdbd2cSJim Jagielski docAnalysis.Template = _ 202*b1cdbd2cSJim Jagielski fso.GetFileName(pres.BuiltInDocumentProperties(appPropertyTemplate)) 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim JagielskiFinalExit: 205*b1cdbd2cSJim Jagielski Set f = Nothing 206*b1cdbd2cSJim Jagielski Exit Sub 207*b1cdbd2cSJim Jagielski 208*b1cdbd2cSJim JagielskiHandleErrors: 209*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 210*b1cdbd2cSJim Jagielski Resume FinalExit 211*b1cdbd2cSJim JagielskiEnd Sub 212*b1cdbd2cSJim Jagielski 213*b1cdbd2cSJim JagielskiFunction PPViewType(viewType As PPViewType) As String 214*b1cdbd2cSJim Jagielski 215*b1cdbd2cSJim Jagielski Select Case viewType 216*b1cdbd2cSJim Jagielski Case ppViewHandoutMaster 217*b1cdbd2cSJim Jagielski PPViewType = RID_STR_PP_ENUMERATION_VIEW_HANDOUT_MASTER 218*b1cdbd2cSJim Jagielski Case ppViewNormal 219*b1cdbd2cSJim Jagielski PPViewType = RID_STR_PP_ENUMERATION_VIEW_NORMAL 220*b1cdbd2cSJim Jagielski Case ppViewNotesMaster 221*b1cdbd2cSJim Jagielski PPViewType = RID_STR_PP_ENUMERATION_VIEW_NOTES_MASTER 222*b1cdbd2cSJim Jagielski Case ppViewNotesPage 223*b1cdbd2cSJim Jagielski PPViewType = RID_STR_PP_ENUMERATION_VIEW_NOTES_PAGE 224*b1cdbd2cSJim Jagielski Case ppViewOutline 225*b1cdbd2cSJim Jagielski PPViewType = RID_STR_PP_ENUMERATION_VIEW_OUTLINE 226*b1cdbd2cSJim Jagielski Case ppViewSlide 227*b1cdbd2cSJim Jagielski PPViewType = RID_STR_PP_ENUMERATION_VIEW_SLIDE 228*b1cdbd2cSJim Jagielski Case ppViewSlideMaster 229*b1cdbd2cSJim Jagielski PPViewType = RID_STR_PP_ENUMERATION_VIEW_SLIDE_MASTER 230*b1cdbd2cSJim Jagielski Case ppViewSlideSorter 231*b1cdbd2cSJim Jagielski PPViewType = RID_STR_PP_ENUMERATION_VIEW_SLIDE_SORTER 232*b1cdbd2cSJim Jagielski Case ppViewTitleMaster 233*b1cdbd2cSJim Jagielski PPViewType = RID_STR_PP_ENUMERATION_VIEW_TITLE_MASTER 234*b1cdbd2cSJim Jagielski Case Else 235*b1cdbd2cSJim Jagielski PPViewType = RID_STR_PP_ENUMERATION_UNKNOWN 236*b1cdbd2cSJim Jagielski End Select 237*b1cdbd2cSJim JagielskiEnd Function 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim JagielskiSub Analyze_SlideIssues(curPresentation As Presentation) 240*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 241*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 242*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_SlideIssues" 243*b1cdbd2cSJim Jagielski 244*b1cdbd2cSJim Jagielski Dim mySlide As Slide 245*b1cdbd2cSJim Jagielski Dim SlideNum As Integer 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski SlideNum = 1 248*b1cdbd2cSJim Jagielski For Each mySlide In curPresentation.Slides 249*b1cdbd2cSJim Jagielski ActiveWindow.View.GotoSlide index:=SlideNum 250*b1cdbd2cSJim Jagielski Analyze_ShapeIssues mySlide 251*b1cdbd2cSJim Jagielski Analyze_Hyperlinks mySlide 252*b1cdbd2cSJim Jagielski Analyze_Templates mySlide 253*b1cdbd2cSJim Jagielski SlideNum = SlideNum + 1 254*b1cdbd2cSJim Jagielski Next mySlide 255*b1cdbd2cSJim Jagielski 256*b1cdbd2cSJim Jagielski Analyze_TabStops curPresentation 257*b1cdbd2cSJim Jagielski 258*b1cdbd2cSJim Jagielski Exit Sub 259*b1cdbd2cSJim JagielskiHandleErrors: 260*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 261*b1cdbd2cSJim JagielskiEnd Sub 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim JagielskiSub Analyze_TabStops(curPresentation As Presentation) 264*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 265*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 266*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_TabStops" 267*b1cdbd2cSJim Jagielski 268*b1cdbd2cSJim Jagielski 'Dim firstSlide As Slide 269*b1cdbd2cSJim Jagielski 'Dim firstShape As Shape 270*b1cdbd2cSJim Jagielski Dim mySlide As Slide 271*b1cdbd2cSJim Jagielski Dim myShape As Shape 272*b1cdbd2cSJim Jagielski Dim bInitialized, bHasDifferentDefaults As Boolean 273*b1cdbd2cSJim Jagielski Dim curDefault, lastDefault As Single 274*b1cdbd2cSJim Jagielski 275*b1cdbd2cSJim Jagielski bInitialized = False 276*b1cdbd2cSJim Jagielski bHasDifferentDefaults = False 277*b1cdbd2cSJim Jagielski 278*b1cdbd2cSJim Jagielski For Each mySlide In curPresentation.Slides 279*b1cdbd2cSJim Jagielski For Each myShape In mySlide.Shapes 280*b1cdbd2cSJim Jagielski If myShape.HasTextFrame Then 281*b1cdbd2cSJim Jagielski If myShape.TextFrame.HasText Then 282*b1cdbd2cSJim Jagielski curDefault = myShape.TextFrame.Ruler.TabStops.DefaultSpacing 283*b1cdbd2cSJim Jagielski If Not bInitialized Then 284*b1cdbd2cSJim Jagielski bInitialized = True 285*b1cdbd2cSJim Jagielski lastDefault = curDefault 286*b1cdbd2cSJim Jagielski 'Set firstSlide = mySlide 287*b1cdbd2cSJim Jagielski 'Set firstShape = myShape 288*b1cdbd2cSJim Jagielski End If 289*b1cdbd2cSJim Jagielski If curDefault <> lastDefault Then 290*b1cdbd2cSJim Jagielski bHasDifferentDefaults = True 291*b1cdbd2cSJim Jagielski Exit For 292*b1cdbd2cSJim Jagielski End If 293*b1cdbd2cSJim Jagielski End If 294*b1cdbd2cSJim Jagielski End If 295*b1cdbd2cSJim Jagielski Next myShape 296*b1cdbd2cSJim Jagielski If bHasDifferentDefaults Then Exit For 297*b1cdbd2cSJim Jagielski Next mySlide 298*b1cdbd2cSJim Jagielski 299*b1cdbd2cSJim Jagielski If Not bHasDifferentDefaults Then Exit Sub 300*b1cdbd2cSJim Jagielski 301*b1cdbd2cSJim Jagielski Dim myIssue As IssueInfo 302*b1cdbd2cSJim Jagielski Set myIssue = New IssueInfo 303*b1cdbd2cSJim Jagielski 304*b1cdbd2cSJim Jagielski With myIssue 305*b1cdbd2cSJim Jagielski .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES 306*b1cdbd2cSJim Jagielski .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES 307*b1cdbd2cSJim Jagielski .SubType = RID_RESXLS_COST_Tabstop 308*b1cdbd2cSJim Jagielski .Location = .CLocationSlide 309*b1cdbd2cSJim Jagielski 310*b1cdbd2cSJim Jagielski .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES 311*b1cdbd2cSJim Jagielski .SubTypeXML = CSTR_SUBISSUE_TABSTOP 312*b1cdbd2cSJim Jagielski .locationXML = .CXMLLocationSlide 313*b1cdbd2cSJim Jagielski 314*b1cdbd2cSJim Jagielski .SubLocation = mySlide.name 315*b1cdbd2cSJim Jagielski .Line = myShape.top 316*b1cdbd2cSJim Jagielski .column = myShape.Left 317*b1cdbd2cSJim Jagielski 318*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME 319*b1cdbd2cSJim Jagielski .Values.Add myShape.name 320*b1cdbd2cSJim Jagielski 321*b1cdbd2cSJim Jagielski AddIssueDetailsNote myIssue, 0, RID_STR_PP_SUBISSUE_TABSTOP_NOTE 322*b1cdbd2cSJim Jagielski 323*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ 324*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 325*b1cdbd2cSJim Jagielski End With 326*b1cdbd2cSJim Jagielski 327*b1cdbd2cSJim Jagielski mAnalysis.Issues.Add myIssue 328*b1cdbd2cSJim Jagielski 329*b1cdbd2cSJim JagielskiFinalExit: 330*b1cdbd2cSJim Jagielski Set myIssue = Nothing 331*b1cdbd2cSJim Jagielski Exit Sub 332*b1cdbd2cSJim Jagielski 333*b1cdbd2cSJim JagielskiHandleErrors: 334*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 335*b1cdbd2cSJim Jagielski Resume FinalExit 336*b1cdbd2cSJim JagielskiEnd Sub 337*b1cdbd2cSJim Jagielski 338*b1cdbd2cSJim JagielskiSub Analyze_Fonts(curPresentation As Presentation) 339*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 340*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 341*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_Fonts" 342*b1cdbd2cSJim Jagielski 343*b1cdbd2cSJim Jagielski Dim myFont As Font 344*b1cdbd2cSJim Jagielski Dim bHasEmbeddedFonts As Boolean 345*b1cdbd2cSJim Jagielski 346*b1cdbd2cSJim Jagielski bHasEmbeddedFonts = False 347*b1cdbd2cSJim Jagielski For Each myFont In curPresentation.Fonts 348*b1cdbd2cSJim Jagielski If myFont.Embedded Then 349*b1cdbd2cSJim Jagielski bHasEmbeddedFonts = True 350*b1cdbd2cSJim Jagielski Exit For 351*b1cdbd2cSJim Jagielski End If 352*b1cdbd2cSJim Jagielski Next 353*b1cdbd2cSJim Jagielski 354*b1cdbd2cSJim Jagielski If Not bHasEmbeddedFonts Then Exit Sub 355*b1cdbd2cSJim Jagielski 356*b1cdbd2cSJim Jagielski Dim myIssue As IssueInfo 357*b1cdbd2cSJim Jagielski Set myIssue = New IssueInfo 358*b1cdbd2cSJim Jagielski 359*b1cdbd2cSJim Jagielski With myIssue 360*b1cdbd2cSJim Jagielski .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES 361*b1cdbd2cSJim Jagielski .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES 362*b1cdbd2cSJim Jagielski .SubType = RID_STR_PP_SUBISSUE_FONTS 363*b1cdbd2cSJim Jagielski .Location = .CLocationSlide 364*b1cdbd2cSJim Jagielski 365*b1cdbd2cSJim Jagielski .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES 366*b1cdbd2cSJim Jagielski .SubTypeXML = CSTR_SUBISSUE_FONTS 367*b1cdbd2cSJim Jagielski .locationXML = .CXMLLocationSlide 368*b1cdbd2cSJim Jagielski 369*b1cdbd2cSJim Jagielski .SubLocation = mySlide.name 370*b1cdbd2cSJim Jagielski .Line = myShape.top 371*b1cdbd2cSJim Jagielski .column = myShape.Left 372*b1cdbd2cSJim Jagielski 373*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME 374*b1cdbd2cSJim Jagielski .Values.Add myShape.name 375*b1cdbd2cSJim Jagielski 376*b1cdbd2cSJim Jagielski AddIssueDetailsNote myIssue, 0, RID_STR_PP_SUBISSUE_FONTS_NOTE 377*b1cdbd2cSJim Jagielski 378*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ 379*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 380*b1cdbd2cSJim Jagielski End With 381*b1cdbd2cSJim Jagielski 382*b1cdbd2cSJim Jagielski mAnalysis.Issues.Add myIssue 383*b1cdbd2cSJim Jagielski 384*b1cdbd2cSJim JagielskiFinalExit: 385*b1cdbd2cSJim Jagielski Set myIssue = Nothing 386*b1cdbd2cSJim Jagielski Exit Sub 387*b1cdbd2cSJim Jagielski 388*b1cdbd2cSJim JagielskiHandleErrors: 389*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 390*b1cdbd2cSJim Jagielski Resume FinalExit 391*b1cdbd2cSJim JagielskiEnd Sub 392*b1cdbd2cSJim Jagielski 393*b1cdbd2cSJim JagielskiSub Analyze_Templates(mySlide As Slide) 394*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 395*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 396*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_Templates" 397*b1cdbd2cSJim Jagielski 398*b1cdbd2cSJim Jagielski If mySlide.Layout <> ppLayoutTitle Then Exit Sub 399*b1cdbd2cSJim Jagielski 400*b1cdbd2cSJim Jagielski Dim myIssue As IssueInfo 401*b1cdbd2cSJim Jagielski Set myIssue = New IssueInfo 402*b1cdbd2cSJim Jagielski 403*b1cdbd2cSJim Jagielski With myIssue 404*b1cdbd2cSJim Jagielski .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES 405*b1cdbd2cSJim Jagielski .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES 406*b1cdbd2cSJim Jagielski .SubType = RID_RESXLS_COST_Template 407*b1cdbd2cSJim Jagielski .Location = .CLocationSlide 408*b1cdbd2cSJim Jagielski 409*b1cdbd2cSJim Jagielski .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES 410*b1cdbd2cSJim Jagielski .SubTypeXML = CSTR_SUBISSUE_TEMPLATE 411*b1cdbd2cSJim Jagielski .locationXML = .CXMLLocationSlide 412*b1cdbd2cSJim Jagielski .SubLocation = mySlide.name 413*b1cdbd2cSJim Jagielski 414*b1cdbd2cSJim Jagielski '.Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME 415*b1cdbd2cSJim Jagielski '.Values.Add mySlide.name 416*b1cdbd2cSJim Jagielski 417*b1cdbd2cSJim Jagielski AddIssueDetailsNote myIssue, 0, RID_STR_PP_SUBISSUE_TEMPLATE_NOTE 418*b1cdbd2cSJim Jagielski 419*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ 420*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 421*b1cdbd2cSJim Jagielski End With 422*b1cdbd2cSJim Jagielski 423*b1cdbd2cSJim Jagielski mAnalysis.Issues.Add myIssue 424*b1cdbd2cSJim Jagielski 425*b1cdbd2cSJim JagielskiFinalExit: 426*b1cdbd2cSJim Jagielski Set myIssue = Nothing 427*b1cdbd2cSJim Jagielski Exit Sub 428*b1cdbd2cSJim Jagielski 429*b1cdbd2cSJim JagielskiHandleErrors: 430*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 431*b1cdbd2cSJim Jagielski Resume FinalExit 432*b1cdbd2cSJim JagielskiEnd Sub 433*b1cdbd2cSJim Jagielski 434*b1cdbd2cSJim JagielskiSub Analyze_Hyperlinks(mySlide As Slide) 435*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 436*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 437*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_Hyperlinks" 438*b1cdbd2cSJim Jagielski 439*b1cdbd2cSJim Jagielski Dim myIssue As IssueInfo 440*b1cdbd2cSJim Jagielski Dim hl As Hyperlink 441*b1cdbd2cSJim Jagielski Dim bHasMultipleFonts As Boolean 442*b1cdbd2cSJim Jagielski Dim bHasMultipleLines As Boolean 443*b1cdbd2cSJim Jagielski 444*b1cdbd2cSJim Jagielski bHasMultipleFonts = False 445*b1cdbd2cSJim Jagielski bHasMultipleLines = False 446*b1cdbd2cSJim Jagielski 447*b1cdbd2cSJim Jagielski For Each hl In mySlide.Hyperlinks 448*b1cdbd2cSJim Jagielski If TypeName(hl.Parent.Parent) = "TextRange" Then 449*b1cdbd2cSJim Jagielski Dim myTextRange As TextRange 450*b1cdbd2cSJim Jagielski Dim currRun As TextRange 451*b1cdbd2cSJim Jagielski Dim currLine As TextRange 452*b1cdbd2cSJim Jagielski Dim first, last, noteCount As Long 453*b1cdbd2cSJim Jagielski 454*b1cdbd2cSJim Jagielski Set myTextRange = hl.Parent.Parent 455*b1cdbd2cSJim Jagielski first = myTextRange.start 456*b1cdbd2cSJim Jagielski last = first + myTextRange.Length - 1 457*b1cdbd2cSJim Jagielski 458*b1cdbd2cSJim Jagielski For Each currRun In myTextRange.Runs 459*b1cdbd2cSJim Jagielski If (currRun.start > first And currRun.start < last) Then 460*b1cdbd2cSJim Jagielski bHasMultipleFonts = True 461*b1cdbd2cSJim Jagielski Exit For 462*b1cdbd2cSJim Jagielski End If 463*b1cdbd2cSJim Jagielski Next 464*b1cdbd2cSJim Jagielski 465*b1cdbd2cSJim Jagielski For Each currLine In myTextRange.Lines 466*b1cdbd2cSJim Jagielski Dim lineEnd As Long 467*b1cdbd2cSJim Jagielski lineEnd = currLine.start + currLine.Length - 1 468*b1cdbd2cSJim Jagielski If (first <= lineEnd And last > lineEnd) Then 469*b1cdbd2cSJim Jagielski bHasMultipleLines = True 470*b1cdbd2cSJim Jagielski Exit For 471*b1cdbd2cSJim Jagielski End If 472*b1cdbd2cSJim Jagielski Next 473*b1cdbd2cSJim Jagielski End If 474*b1cdbd2cSJim Jagielski 475*b1cdbd2cSJim Jagielski noteCount = 0 476*b1cdbd2cSJim Jagielski 477*b1cdbd2cSJim Jagielski If bHasMultipleFonts Then 478*b1cdbd2cSJim Jagielski Set myIssue = New IssueInfo 479*b1cdbd2cSJim Jagielski 480*b1cdbd2cSJim Jagielski With myIssue 481*b1cdbd2cSJim Jagielski .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES 482*b1cdbd2cSJim Jagielski .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES 483*b1cdbd2cSJim Jagielski .SubType = RID_RESXLS_COST_Hyperlink 484*b1cdbd2cSJim Jagielski .Location = .CLocationSlide 485*b1cdbd2cSJim Jagielski 486*b1cdbd2cSJim Jagielski .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES 487*b1cdbd2cSJim Jagielski .SubTypeXML = CSTR_SUBISSUE_HYPERLINK 488*b1cdbd2cSJim Jagielski .locationXML = .CXMLLocationSlide 489*b1cdbd2cSJim Jagielski .SubLocation = mySlide.name 490*b1cdbd2cSJim Jagielski 491*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME 492*b1cdbd2cSJim Jagielski .Values.Add myTextRange.Text 493*b1cdbd2cSJim Jagielski 494*b1cdbd2cSJim Jagielski AddIssueDetailsNote myIssue, 0, RID_STR_PP_SUBISSUE_HYPERLINK_NOTE 495*b1cdbd2cSJim Jagielski 496*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ 497*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 498*b1cdbd2cSJim Jagielski End With 499*b1cdbd2cSJim Jagielski mAnalysis.Issues.Add myIssue 500*b1cdbd2cSJim Jagielski Set myIssue = Nothing 501*b1cdbd2cSJim Jagielski bHasMultipleFonts = False 502*b1cdbd2cSJim Jagielski End If 503*b1cdbd2cSJim Jagielski If bHasMultipleLines Then 504*b1cdbd2cSJim Jagielski Set myIssue = New IssueInfo 505*b1cdbd2cSJim Jagielski 506*b1cdbd2cSJim Jagielski With myIssue 507*b1cdbd2cSJim Jagielski .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES 508*b1cdbd2cSJim Jagielski .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES 509*b1cdbd2cSJim Jagielski .SubType = RID_RESXLS_COST_HyperlinkSplit 510*b1cdbd2cSJim Jagielski .Location = .CLocationSlide 511*b1cdbd2cSJim Jagielski 512*b1cdbd2cSJim Jagielski .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES 513*b1cdbd2cSJim Jagielski .SubTypeXML = CSTR_SUBISSUE_HYPERLINK_SPLIT 514*b1cdbd2cSJim Jagielski .locationXML = .CXMLLocationSlide 515*b1cdbd2cSJim Jagielski .SubLocation = mySlide.name 516*b1cdbd2cSJim Jagielski 517*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME 518*b1cdbd2cSJim Jagielski .Values.Add myTextRange.Text 519*b1cdbd2cSJim Jagielski 520*b1cdbd2cSJim Jagielski AddIssueDetailsNote myIssue, 0, RID_STR_PP_SUBISSUE_HYPERLINK_SPLIT_NOTE 521*b1cdbd2cSJim Jagielski 522*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ 523*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 524*b1cdbd2cSJim Jagielski End With 525*b1cdbd2cSJim Jagielski mAnalysis.Issues.Add myIssue 526*b1cdbd2cSJim Jagielski Set myIssue = Nothing 527*b1cdbd2cSJim Jagielski bHasMultipleLines = False 528*b1cdbd2cSJim Jagielski End If 529*b1cdbd2cSJim Jagielski Next 530*b1cdbd2cSJim Jagielski 531*b1cdbd2cSJim JagielskiFinalExit: 532*b1cdbd2cSJim Jagielski Set myIssue = Nothing 533*b1cdbd2cSJim Jagielski Exit Sub 534*b1cdbd2cSJim Jagielski 535*b1cdbd2cSJim JagielskiHandleErrors: 536*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 537*b1cdbd2cSJim Jagielski Resume FinalExit 538*b1cdbd2cSJim JagielskiEnd Sub 539*b1cdbd2cSJim Jagielski 540*b1cdbd2cSJim JagielskiSub Analyze_ShapeIssues(mySlide As Slide) 541*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 542*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 543*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_ShapeIssues" 544*b1cdbd2cSJim Jagielski Dim myShape As Shape 545*b1cdbd2cSJim Jagielski 546*b1cdbd2cSJim Jagielski For Each myShape In mySlide.Shapes 547*b1cdbd2cSJim Jagielski 'myShape.Select msoTrue 548*b1cdbd2cSJim Jagielski Analyze_Movie mySlide, myShape 549*b1cdbd2cSJim Jagielski Analyze_Comments mySlide, myShape 550*b1cdbd2cSJim Jagielski Analyze_Background mySlide, myShape 551*b1cdbd2cSJim Jagielski Analyze_Numbering mySlide, myShape 552*b1cdbd2cSJim Jagielski 'Analyze global issues 553*b1cdbd2cSJim Jagielski Analyze_OLEEmbeddedSingleShape mAnalysis, myShape, mySlide.name 554*b1cdbd2cSJim Jagielski Analyze_Lines mAnalysis, myShape, mySlide.name 555*b1cdbd2cSJim Jagielski Analyze_Transparency mAnalysis, myShape, mySlide.name 556*b1cdbd2cSJim Jagielski Analyze_Gradients mAnalysis, myShape, mySlide.name 557*b1cdbd2cSJim Jagielski Next myShape 558*b1cdbd2cSJim Jagielski 559*b1cdbd2cSJim Jagielski Exit Sub 560*b1cdbd2cSJim JagielskiHandleErrors: 561*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 562*b1cdbd2cSJim JagielskiEnd Sub 563*b1cdbd2cSJim Jagielski 564*b1cdbd2cSJim JagielskiSub Analyze_Numbering(mySlide As Slide, myShape As Shape) 565*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 566*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 567*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_Numbering" 568*b1cdbd2cSJim Jagielski 569*b1cdbd2cSJim Jagielski If Not myShape.HasTextFrame Then Exit Sub 570*b1cdbd2cSJim Jagielski If Not myShape.TextFrame.HasText Then Exit Sub 571*b1cdbd2cSJim Jagielski Dim shapeText As TextRange 572*b1cdbd2cSJim Jagielski 573*b1cdbd2cSJim Jagielski Set shapeText = myShape.TextFrame.TextRange 574*b1cdbd2cSJim Jagielski 575*b1cdbd2cSJim Jagielski If shapeText.Paragraphs.count < 2 Then Exit Sub 576*b1cdbd2cSJim Jagielski If Not (shapeText.ParagraphFormat.Bullet.Type = ppBulletMixed Or _ 577*b1cdbd2cSJim Jagielski shapeText.ParagraphFormat.Bullet.Type = ppBulletNumbered) Then Exit Sub 578*b1cdbd2cSJim Jagielski 579*b1cdbd2cSJim Jagielski ' OpenOffice has Problems when the numbering does not start with the first 580*b1cdbd2cSJim Jagielski ' paragraph or when there are empty paragraphs which do not have a number. 581*b1cdbd2cSJim Jagielski ' Because PowerPoint does not give us the length of each paragraph ( .Length 582*b1cdbd2cSJim Jagielski ' does not work ), we have to compute the length ourself. 583*b1cdbd2cSJim Jagielski 584*b1cdbd2cSJim Jagielski Dim I As Long 585*b1cdbd2cSJim Jagielski Dim lastType As PpBulletType 586*b1cdbd2cSJim Jagielski Dim currType As PpBulletType 587*b1cdbd2cSJim Jagielski Dim lastStart As Long 588*b1cdbd2cSJim Jagielski Dim lastLength As Long 589*b1cdbd2cSJim Jagielski Dim currStart As Long 590*b1cdbd2cSJim Jagielski Dim bHasNumProblem As Boolean 591*b1cdbd2cSJim Jagielski Dim bHasEmptyPar As Boolean 592*b1cdbd2cSJim Jagielski 593*b1cdbd2cSJim Jagielski bHasNumProblem = False 594*b1cdbd2cSJim Jagielski bHasEmptyPar = False 595*b1cdbd2cSJim Jagielski 596*b1cdbd2cSJim Jagielski lastType = shapeText.Paragraphs(1, 0).ParagraphFormat.Bullet.Type 597*b1cdbd2cSJim Jagielski lastStart = shapeText.Paragraphs(1, 0).start 598*b1cdbd2cSJim Jagielski 599*b1cdbd2cSJim Jagielski For I = 2 To shapeText.Paragraphs.count 600*b1cdbd2cSJim Jagielski currType = shapeText.Paragraphs(I, 0).ParagraphFormat.Bullet.Type 601*b1cdbd2cSJim Jagielski currStart = shapeText.Paragraphs(I, 0).start 602*b1cdbd2cSJim Jagielski lastLength = currStart - lastStart - 1 603*b1cdbd2cSJim Jagielski 604*b1cdbd2cSJim Jagielski If currType <> lastType Then 605*b1cdbd2cSJim Jagielski lastType = currType 606*b1cdbd2cSJim Jagielski If currType = ppBulletNumbered Then 607*b1cdbd2cSJim Jagielski bHasNumProblem = True 608*b1cdbd2cSJim Jagielski Exit For 609*b1cdbd2cSJim Jagielski End If 610*b1cdbd2cSJim Jagielski End If 611*b1cdbd2cSJim Jagielski If lastLength = 0 Then 612*b1cdbd2cSJim Jagielski bHasEmptyPar = True 613*b1cdbd2cSJim Jagielski Else 614*b1cdbd2cSJim Jagielski If (bHasEmptyPar) Then 615*b1cdbd2cSJim Jagielski bHasNumProblem = True 616*b1cdbd2cSJim Jagielski Exit For 617*b1cdbd2cSJim Jagielski End If 618*b1cdbd2cSJim Jagielski End If 619*b1cdbd2cSJim Jagielski lastStart = currStart 620*b1cdbd2cSJim Jagielski Next I 621*b1cdbd2cSJim Jagielski 622*b1cdbd2cSJim Jagielski lastLength = shapeText.Length - lastStart 623*b1cdbd2cSJim Jagielski If (lastLength <> 0) And bHasEmptyPar Then 624*b1cdbd2cSJim Jagielski bHasNumProblem = True 625*b1cdbd2cSJim Jagielski End If 626*b1cdbd2cSJim Jagielski 627*b1cdbd2cSJim Jagielski If Not bHasNumProblem Then Exit Sub 628*b1cdbd2cSJim Jagielski 629*b1cdbd2cSJim Jagielski Dim myIssue As IssueInfo 630*b1cdbd2cSJim Jagielski Set myIssue = New IssueInfo 631*b1cdbd2cSJim Jagielski 632*b1cdbd2cSJim Jagielski With myIssue 633*b1cdbd2cSJim Jagielski .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES 634*b1cdbd2cSJim Jagielski .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES 635*b1cdbd2cSJim Jagielski .SubType = RID_RESXLS_COST_Numbering 636*b1cdbd2cSJim Jagielski .Location = .CLocationSlide 637*b1cdbd2cSJim Jagielski 638*b1cdbd2cSJim Jagielski .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES 639*b1cdbd2cSJim Jagielski .SubTypeXML = CSTR_SUBISSUE_NUMBERING 640*b1cdbd2cSJim Jagielski .locationXML = .CXMLLocationSlide 641*b1cdbd2cSJim Jagielski 642*b1cdbd2cSJim Jagielski .SubLocation = mySlide.name 643*b1cdbd2cSJim Jagielski .Line = myShape.top 644*b1cdbd2cSJim Jagielski .column = myShape.Left 645*b1cdbd2cSJim Jagielski 646*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME 647*b1cdbd2cSJim Jagielski .Values.Add myShape.name 648*b1cdbd2cSJim Jagielski 649*b1cdbd2cSJim Jagielski AddIssueDetailsNote myIssue, 0, RID_STR_PP_SUBISSUE_NUMBERING_NOTE 650*b1cdbd2cSJim Jagielski 651*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ 652*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 653*b1cdbd2cSJim Jagielski End With 654*b1cdbd2cSJim Jagielski 655*b1cdbd2cSJim Jagielski mAnalysis.Issues.Add myIssue 656*b1cdbd2cSJim Jagielski 657*b1cdbd2cSJim JagielskiFinalExit: 658*b1cdbd2cSJim Jagielski Set myIssue = Nothing 659*b1cdbd2cSJim Jagielski Exit Sub 660*b1cdbd2cSJim Jagielski 661*b1cdbd2cSJim JagielskiHandleErrors: 662*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 663*b1cdbd2cSJim Jagielski Resume FinalExit 664*b1cdbd2cSJim JagielskiEnd Sub 665*b1cdbd2cSJim Jagielski 666*b1cdbd2cSJim JagielskiSub Analyze_Background(mySlide As Slide, myShape As Shape) 667*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 668*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 669*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_Background" 670*b1cdbd2cSJim Jagielski 671*b1cdbd2cSJim Jagielski If myShape.Fill.Type <> msoFillBackground Then Exit Sub 672*b1cdbd2cSJim Jagielski 673*b1cdbd2cSJim Jagielski Dim myIssue As IssueInfo 674*b1cdbd2cSJim Jagielski Set myIssue = New IssueInfo 675*b1cdbd2cSJim Jagielski Dim strCr As String 676*b1cdbd2cSJim Jagielski strCr = "" & vbCr 677*b1cdbd2cSJim Jagielski 678*b1cdbd2cSJim Jagielski With myIssue 679*b1cdbd2cSJim Jagielski .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES 680*b1cdbd2cSJim Jagielski .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES 681*b1cdbd2cSJim Jagielski .SubType = RID_RESXLS_COST_Background 682*b1cdbd2cSJim Jagielski .Location = .CLocationSlide 683*b1cdbd2cSJim Jagielski 684*b1cdbd2cSJim Jagielski .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES 685*b1cdbd2cSJim Jagielski .SubTypeXML = CSTR_SUBISSUE_BACKGROUND 686*b1cdbd2cSJim Jagielski .locationXML = .CXMLLocationSlide 687*b1cdbd2cSJim Jagielski 688*b1cdbd2cSJim Jagielski .SubLocation = mySlide.name 689*b1cdbd2cSJim Jagielski .Line = myShape.top 690*b1cdbd2cSJim Jagielski .column = myShape.Left 691*b1cdbd2cSJim Jagielski 692*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME 693*b1cdbd2cSJim Jagielski .Values.Add myShape.name 694*b1cdbd2cSJim Jagielski 695*b1cdbd2cSJim Jagielski AddIssueDetailsNote myIssue, 0, RID_STR_PP_SUBISSUE_BACKGROUND_NOTE 696*b1cdbd2cSJim Jagielski 697*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ 698*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 699*b1cdbd2cSJim Jagielski End With 700*b1cdbd2cSJim Jagielski 701*b1cdbd2cSJim Jagielski mAnalysis.Issues.Add myIssue 702*b1cdbd2cSJim Jagielski 703*b1cdbd2cSJim JagielskiFinalExit: 704*b1cdbd2cSJim Jagielski Set myIssue = Nothing 705*b1cdbd2cSJim Jagielski Exit Sub 706*b1cdbd2cSJim Jagielski 707*b1cdbd2cSJim JagielskiHandleErrors: 708*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 709*b1cdbd2cSJim Jagielski Resume FinalExit 710*b1cdbd2cSJim JagielskiEnd Sub 711*b1cdbd2cSJim Jagielski 712*b1cdbd2cSJim JagielskiSub Analyze_Comments(mySlide As Slide, myShape As Shape) 713*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 714*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 715*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_Comments" 716*b1cdbd2cSJim Jagielski 717*b1cdbd2cSJim Jagielski If myShape.Type <> msoComment Then Exit Sub 718*b1cdbd2cSJim Jagielski 719*b1cdbd2cSJim Jagielski Dim myIssue As IssueInfo 720*b1cdbd2cSJim Jagielski Set myIssue = New IssueInfo 721*b1cdbd2cSJim Jagielski Dim strCr As String 722*b1cdbd2cSJim Jagielski strCr = "" & vbCr 723*b1cdbd2cSJim Jagielski 724*b1cdbd2cSJim Jagielski With myIssue 725*b1cdbd2cSJim Jagielski .IssueID = CID_CONTENT_AND_DOCUMENT_PROPERTIES 726*b1cdbd2cSJim Jagielski .IssueType = RID_STR_COMMON_ISSUE_CONTENT_AND_DOCUMENT_PROPERTIES 727*b1cdbd2cSJim Jagielski .SubType = RID_STR_PP_SUBISSUE_COMMENT 728*b1cdbd2cSJim Jagielski .Location = .CLocationSlide 729*b1cdbd2cSJim Jagielski 730*b1cdbd2cSJim Jagielski .IssueTypeXML = CSTR_ISSUE_CONTENT_DOCUMENT_PROPERTIES 731*b1cdbd2cSJim Jagielski .SubTypeXML = CSTR_SUBISSUE_COMMENT 732*b1cdbd2cSJim Jagielski .locationXML = .CXMLLocationSlide 733*b1cdbd2cSJim Jagielski 734*b1cdbd2cSJim Jagielski .SubLocation = mySlide.name 735*b1cdbd2cSJim Jagielski .Line = myShape.top 736*b1cdbd2cSJim Jagielski .column = myShape.Left 737*b1cdbd2cSJim Jagielski 738*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME 739*b1cdbd2cSJim Jagielski .Values.Add myShape.name 740*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_PP_ATTRIBUTE_CONTENT 741*b1cdbd2cSJim Jagielski .Values.Add Replace(myShape.TextFrame.TextRange.Text, strCr, "") 742*b1cdbd2cSJim Jagielski 743*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) = _ 744*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_CONTENT_AND_DOCUMENT_PROPERTIES) + 1 745*b1cdbd2cSJim Jagielski End With 746*b1cdbd2cSJim Jagielski 747*b1cdbd2cSJim Jagielski mAnalysis.Issues.Add myIssue 748*b1cdbd2cSJim Jagielski 749*b1cdbd2cSJim JagielskiFinalExit: 750*b1cdbd2cSJim Jagielski Set myIssue = Nothing 751*b1cdbd2cSJim Jagielski Exit Sub 752*b1cdbd2cSJim Jagielski 753*b1cdbd2cSJim JagielskiHandleErrors: 754*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 755*b1cdbd2cSJim Jagielski Resume FinalExit 756*b1cdbd2cSJim JagielskiEnd Sub 757*b1cdbd2cSJim JagielskiSub Analyze_Movie(mySlide As Slide, myShape As Shape) 758*b1cdbd2cSJim Jagielski On Error GoTo HandleErrors 759*b1cdbd2cSJim Jagielski Dim currentFunctionName As String 760*b1cdbd2cSJim Jagielski currentFunctionName = "Analyze_Movie" 761*b1cdbd2cSJim Jagielski 762*b1cdbd2cSJim Jagielski If myShape.Type <> msoMedia Then Exit Sub 763*b1cdbd2cSJim Jagielski If myShape.MediaType <> ppMediaTypeMovie Then Exit Sub 764*b1cdbd2cSJim Jagielski 765*b1cdbd2cSJim Jagielski Dim myIssue As IssueInfo 766*b1cdbd2cSJim Jagielski Set myIssue = New IssueInfo 767*b1cdbd2cSJim Jagielski 768*b1cdbd2cSJim Jagielski With myIssue 769*b1cdbd2cSJim Jagielski .IssueID = CID_OBJECTS_GRAPHICS_TEXTBOXES 770*b1cdbd2cSJim Jagielski .IssueType = RID_STR_PP_ISSUE_OBJECTS_GRAPHICS_AND_TEXTBOXES 771*b1cdbd2cSJim Jagielski .SubType = RID_STR_PP_SUBISSUE_MOVIE 772*b1cdbd2cSJim Jagielski .Location = .CLocationSlide 773*b1cdbd2cSJim Jagielski 774*b1cdbd2cSJim Jagielski .IssueTypeXML = CSTR_ISSUE_OBJECTS_GRAPHICS_AND_TEXTBOXES 775*b1cdbd2cSJim Jagielski .SubTypeXML = CSTR_SUBISSUE_MOVIE 776*b1cdbd2cSJim Jagielski .locationXML = .CXMLLocationSlide 777*b1cdbd2cSJim Jagielski 778*b1cdbd2cSJim Jagielski .SubLocation = mySlide.name 779*b1cdbd2cSJim Jagielski .Line = myShape.top 780*b1cdbd2cSJim Jagielski .column = myShape.Left 781*b1cdbd2cSJim Jagielski 782*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_COMMON_ATTRIBUTE_NAME 783*b1cdbd2cSJim Jagielski .Values.Add myShape.name 784*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_COMMON_ATTRIBUTE_SOURCE 785*b1cdbd2cSJim Jagielski .Values.Add myShape.LinkFormat.SourceFullName 786*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_PP_ATTRIBUTE_PLAYONENTRY 787*b1cdbd2cSJim Jagielski .Values.Add IIf(myShape.AnimationSettings.PlaySettings.PlayOnEntry, RID_STR_PP_TRUE, RID_STR_PP_FALSE) 788*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_PP_ATTRIBUTE_LOOP 789*b1cdbd2cSJim Jagielski .Values.Add IIf(myShape.AnimationSettings.PlaySettings.LoopUntilStopped, RID_STR_PP_TRUE, RID_STR_PP_FALSE) 790*b1cdbd2cSJim Jagielski .Attributes.Add RID_STR_PP_ATTRIBUTE_REWIND 791*b1cdbd2cSJim Jagielski .Values.Add IIf(myShape.AnimationSettings.PlaySettings.RewindMovie, RID_STR_PP_TRUE, RID_STR_PP_FALSE) 792*b1cdbd2cSJim Jagielski 793*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_OBJECTS_GRAPHICS_TEXTBOXES) = _ 794*b1cdbd2cSJim Jagielski mAnalysis.IssuesCountArray(CID_OBJECTS_GRAPHICS_TEXTBOXES) + 1 795*b1cdbd2cSJim Jagielski End With 796*b1cdbd2cSJim Jagielski 797*b1cdbd2cSJim Jagielski mAnalysis.Issues.Add myIssue 798*b1cdbd2cSJim Jagielski 799*b1cdbd2cSJim JagielskiFinalExit: 800*b1cdbd2cSJim Jagielski Set myIssue = Nothing 801*b1cdbd2cSJim Jagielski Exit Sub 802*b1cdbd2cSJim Jagielski 803*b1cdbd2cSJim JagielskiHandleErrors: 804*b1cdbd2cSJim Jagielski WriteDebug currentFunctionName & " : " & mAnalysis.name & ": " & Err.Number & " " & Err.Description & " " & Err.Source 805*b1cdbd2cSJim Jagielski Resume FinalExit 806*b1cdbd2cSJim JagielskiEnd Sub 807*b1cdbd2cSJim Jagielski 808*b1cdbd2cSJim JagielskiPrivate Sub Class_Initialize() 809*b1cdbd2cSJim Jagielski Set mAnalysis = New DocumentAnalysis 810*b1cdbd2cSJim JagielskiEnd Sub 811*b1cdbd2cSJim JagielskiPrivate Sub Class_Terminate() 812*b1cdbd2cSJim Jagielski Set mAnalysis = Nothing 813*b1cdbd2cSJim JagielskiEnd Sub 814*b1cdbd2cSJim Jagielski 815*b1cdbd2cSJim JagielskiPublic Property Get Results() As DocumentAnalysis 816*b1cdbd2cSJim Jagielski Set Results = mAnalysis 817*b1cdbd2cSJim JagielskiEnd Property 818*b1cdbd2cSJim Jagielski 819