func (dlg *FileDialog) show(owner Form, fun func(ofn *win.OPENFILENAME) bool) (accepted bool, err error) { ofn := new(win.OPENFILENAME) ofn.LStructSize = uint32(unsafe.Sizeof(*ofn)) if owner != nil { ofn.HwndOwner = owner.Handle() } filter := make([]uint16, len(dlg.Filter)+2) copy(filter, syscall.StringToUTF16(dlg.Filter)) // Replace '|' with the expected '\0'. for i, c := range filter { if byte(c) == '|' { filter[i] = uint16(0) } } ofn.LpstrFilter = &filter[0] ofn.NFilterIndex = uint32(dlg.FilterIndex) filePath := make([]uint16, 1024) copy(filePath, syscall.StringToUTF16(dlg.FilePath)) ofn.LpstrFile = &filePath[0] ofn.NMaxFile = uint32(len(filePath)) ofn.LpstrInitialDir = syscall.StringToUTF16Ptr(dlg.InitialDirPath) ofn.LpstrTitle = syscall.StringToUTF16Ptr(dlg.Title) ofn.Flags = win.OFN_FILEMUSTEXIST if !fun(ofn) { errno := win.CommDlgExtendedError() if errno != 0 { err = newError(fmt.Sprintf("Error %d", errno)) } return } dlg.FilePath = syscall.UTF16ToString(filePath) accepted = true return }
func (dlg *FileDialog) show(owner Form, fun func(ofn *win.OPENFILENAME) bool, flags uint32) (accepted bool, err error) { ofn := new(win.OPENFILENAME) ofn.LStructSize = uint32(unsafe.Sizeof(*ofn)) if owner != nil { ofn.HwndOwner = owner.Handle() } filter := make([]uint16, len(dlg.Filter)+2) copy(filter, syscall.StringToUTF16(dlg.Filter)) // Replace '|' with the expected '\0'. for i, c := range filter { if byte(c) == '|' { filter[i] = uint16(0) } } ofn.LpstrFilter = &filter[0] ofn.NFilterIndex = uint32(dlg.FilterIndex) ofn.LpstrInitialDir = syscall.StringToUTF16Ptr(dlg.InitialDirPath) ofn.LpstrTitle = syscall.StringToUTF16Ptr(dlg.Title) ofn.Flags = win.OFN_FILEMUSTEXIST | flags var fileBuf []uint16 if flags&win.OFN_ALLOWMULTISELECT > 0 { fileBuf = make([]uint16, 65536) } else { fileBuf = make([]uint16, 1024) copy(fileBuf, syscall.StringToUTF16(dlg.FilePath)) } ofn.LpstrFile = &fileBuf[0] ofn.NMaxFile = uint32(len(fileBuf)) if !fun(ofn) { errno := win.CommDlgExtendedError() if errno != 0 { err = newError(fmt.Sprintf("Error %d", errno)) } return } if flags&win.OFN_ALLOWMULTISELECT > 0 { split := func() [][]uint16 { var parts [][]uint16 from := 0 for i, c := range fileBuf { if c == 0 { if i == from { return parts } parts = append(parts, fileBuf[from:i]) from = i + 1 } } return parts } parts := split() if len(parts) == 1 { dlg.FilePaths = []string{syscall.UTF16ToString(parts[0])} } else { dirPath := syscall.UTF16ToString(parts[0]) dlg.FilePaths = make([]string, len(parts)-1) for i, fp := range parts[1:] { dlg.FilePaths[i] = filepath.Join(dirPath, syscall.UTF16ToString(fp)) } } } else { dlg.FilePath = syscall.UTF16ToString(fileBuf) } accepted = true return }