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