File Dialog Macro

To often I have found my self in a situation where i needed to save or open a file through the standard common dialogs. The MFC implementation of the common dialog is quite elegant, but it involves alot of parameters, which are often hard to remember.

This macro will take you through a few steps, in a wizard like mode, and create the right code for you.

FileDialogHandler

Sub FileDialogHandler()

'DESCRIPTION: Automatically inserts the statements needed for a file-open/file-save dialog

    dim strExt

    

    writeln " {// BLOCK - inserted by CFileDialog macro"

    ' Ask for the type of dialog

    dim bSaveDialog

    bSaveDialog = 1

    bAnswer = MsgBox("Do you want to make a save dialog (Yes) or an open dialog (No)", vbYesNo)

    ActiveDocument.Selection.StartOfLine dsFirstText

    ActiveDocument.Selection = " CFileDialog dlg("

    if bAnswer = vbYes then

    ActiveDocument.Selection = "FALSE"

    else

    ActiveDocument.Selection = "TRUE"

    bSaveDialog = 0

    end if

    ' The extension of the file

    strExt = InputBox("What is the extension of the filetype?", "Extension", "txt")

    ' The name of the file

    strName = InputBox("What is the name of the filetype?", "Name", "Text File")

    ' Only apply a default extension if it is a save-as dialog

    if bAnswer = vbYes then

        ActiveDocument.Selection = ",""*." & strExt & """"

    else

        ActiveDocument.Selection = ", """""

    end if 

    ActiveDocument.Selection = ", "

    ' Only  if it is a save-as dialog should a default filename be provided

    dim strDefaultName

    if bAnswer = vbYes then

    strDefaultName = "Untitled." & strExt

        strDefName = InputBox("What is the default filename?", "Default Filename", strDefaultName)

        ActiveDocument.Selection = """" & strDefaultName & """, "

    else

        ActiveDocument.Selection = """"", "

    end if 

    dim flags

    dim filebuffer

    dim bMultiSelectDlg

    bMultiSelectDlg = 0

    filebuffer = "none"

    if bSaveDialog = 0 then

        ' Sp?rg om dialog typen

        bAnswer = MsgBox("Do you want a multiple selection dialog?", vbYesNo)

        if bAnswer = vbYes then

            bMultiSelectDlg = 1

            flags = "|OFN_ALLOWMULTISELECT"

            filebuffer = InputBox("How big should the selection buffer be?", "Multiple Selection", "10240")

        else

            flags = ""

        end if

    end if

    ActiveDocument.Selection.NewLine

    ActiveDocument.Selection.StartOfLine dsFirstText

    ActiveDocument.Selection = " OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT" & flags & ", "

    ActiveDocument.Selection.NewLine

    ActiveDocument.Selection.StartOfLine dsFirstText

    ActiveDocument.Selection = " """ & strName & " (*." & strExt & ")|*." & strExt & "|All Files (*.*)|*.*||"", this);"

    ActiveDocument.Selection.NewLine

    ActiveDocument.Selection.NewLine

    if filebuffer <> "none" then

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " char cbBuffer[" & filebuffer & "];"

        ActiveDocument.Selection.NewLine

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " dlg.m_ofn.nMaxFile = " & filebuffer & ";"

        ActiveDocument.Selection.NewLine

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " dlg.m_ofn.lpstrFile = cbBuffer;"

        ActiveDocument.Selection.NewLine

    end if

    ' If you want to use a special caption for your dialog

    dim caption

    if bSaveDialog = 1 then

        szDefCaption = "Save As"

    else

        szDefCaption = "Open"

    end if

    caption = InputBox("What should the caption of the dialog be? (cancel = default)", "Dialog Caption", szDefCaption)

    if caption <> "" then

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " dlg.m_ofn.lpstrTitle = " & caption & ";"

        ActiveDocument.Selection.NewLine        

    end if

    ' Initial directory to look in

    if bSaveDialog = 1 then

        szDefCaption = "Save As"

    else

        szDefCaption = "Open"

    end if

    caption = InputBox("Initial directory to search for files (cancel = default)? If you're using a string in stead of a variable put the string in quotation marks", "Dialog Caption", "")

    if caption <> "" then

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " dlg.m_ofn.lpstrInitialDir = " & caption & ";"

        ActiveDocument.Selection.NewLine        

    end if

    ActiveDocument.Selection.NewLine

    ActiveDocument.Selection.StartOfLine dsFirstText

    ActiveDocument.Selection = " if (dlg.DoModal() == IDOK)"

    ActiveDocument.Selection.NewLine

    ActiveDocument.Selection.StartOfLine dsFirstText

    ActiveDocument.Selection = " {"

    ActiveDocument.Selection.NewLine

    ActiveDocument.Selection.StartOfLine dsFirstText

    ActiveDocument.Selection = " // Insert your code here..."

    ActiveDocument.Selection.NewLine

    if bMultiSelectDlg = 1 then 

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " // Insert your code here..."

        ActiveDocument.Selection.NewLine

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " POSITION pos;"

        ActiveDocument.Selection.NewLine

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " for (pos = dlg.GetStartPosition() ; pos != NULL ; )"

        ActiveDocument.Selection.NewLine

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " {"

        ActiveDocument.Selection.NewLine

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " // Use dlg.GetNextPathName(pos); to extract filename (including path)"

        ActiveDocument.Selection.NewLine

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " {"

        ActiveDocument.Selection.NewLine

    else

        ActiveDocument.Selection.StartOfLine dsFirstText

        ActiveDocument.Selection = " // Use dlg.GetPathName() to extract filename (including path);"

        ActiveDocument.Selection.NewLine

    end if

    ActiveDocument.Selection.StartOfLine dsFirstText

    ActiveDocument.Selection = " }"

    ActiveDocument.Selection.NewLine

    ActiveDocument.Selection.StartOfLine dsFirstText

    ActiveDocument.Selection = " } // End block"

    ActiveDocument.Selection.NewLine

    ActiveDocument.Selection.StartOfLine dsFirstText

'End Recording

End Sub

A note about WriteLn

Because of compatibility reasons (I dont want people to have to copy one macro to use another), I have not used the function below to write text. However it is pretty handy, and will make your code look alot better. It does the same as WriteLn from pascal. 

This function is not meant to be called by the user, but only from other scripts.

sub writeln(line)

    ActiveDocument.Selection.StartOfLine dsFirstText

    ActiveDocument.Selection = line

    ActiveDocument.Selection.NewLine

end sub