Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package nativedialogs;
- import com.sun.jna.Native;
- import com.sun.jna.WString;
- import java.awt.Window;
- import java.io.File;
- import java.nio.ByteBuffer;
- import java.nio.ByteOrder;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import nativedialogs.ComDlg32JNA.ComDlg32;
- import nativedialogs.ComDlg32JNA.ComDlg32.OPENFILENAME;
- public class OpenFileDialog {
- private static final int MAX_BUF_SIZE = 64 * 1024;
- private OpenFileDialog() {
- }
- public static List<File> display(Window parent, boolean allowMultiSelect) {
- ByteBuffer buffer = ByteBuffer.allocateDirect(MAX_BUF_SIZE);
- buffer.order(ByteOrder.LITTLE_ENDIAN);
- OPENFILENAME ofn = new OPENFILENAME();
- ofn.lStructSize = ofn.size();
- ofn.lpstrFile = Native.getDirectBufferPointer(buffer);
- ofn.nMaxFile = MAX_BUF_SIZE;
- ofn.hwndOwner = parent == null
- ? null
- : Native.getWindowPointer(parent);
- ofn.Flags = ComDlg32.OFN_EXPLORER
- | ComDlg32.OFN_FILEMUSTEXIST
- | (allowMultiSelect ? ComDlg32.OFN_ALLOWMULTISELECT : 0);
- ofn.lpstrTitle = new WString("Hello world!");
- ofn.lpstrFilter = new WString("All files (*.*)\0*.*\0\0");
- boolean approved = ComDlg32.INSTANCE.GetOpenFileNameW(ofn);
- if (!approved) {
- int errCode = ComDlg32.INSTANCE.CommDlgExtendedError();
- if (errCode != 0) {
- throw new RuntimeException(String.format(
- "GetOpenFileNameW failed. Error code: 0x%04X", errCode));
- }
- return null;
- }
- List<String> strings = extractNullSeparatedWideStrings(buffer);
- assert !strings.isEmpty();
- if (strings.size() == 1) {
- return Arrays.asList(new File(strings.get(0)));
- } else {
- List<File> files = new ArrayList<File>(strings.size() - 1);
- String dir = strings.get(0);
- for (String file : strings.subList(1, strings.size())) {
- files.add(new File(dir, file));
- }
- return files;
- }
- }
- private static List<String> extractNullSeparatedWideStrings(ByteBuffer buffer) {
- boolean lastWasNull = false;
- boolean foundTerminal = false;
- List<String> strings = new ArrayList<String>();
- StringBuilder sb = new StringBuilder();
- while (buffer.hasRemaining() && !foundTerminal) {
- char ch = buffer.getChar();
- if (ch != 0) {
- lastWasNull = false;
- sb.append(ch);
- } else if (lastWasNull) {
- foundTerminal = true;
- } else {
- lastWasNull = true;
- strings.add(sb.toString());
- sb.setLength(0);
- }
- }
- if (!foundTerminal) {
- throw new IllegalArgumentException("Buffer had no double NULL terminal");
- }
- return strings;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement