Advertisement
Guest User

OpenFileDialog

a guest
Jul 23rd, 2011
892
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.01 KB | None | 0 0
  1. package nativedialogs;
  2.  
  3. import com.sun.jna.Native;
  4. import com.sun.jna.WString;
  5. import java.awt.Window;
  6. import java.io.File;
  7. import java.nio.ByteBuffer;
  8. import java.nio.ByteOrder;
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. import java.util.List;
  12. import nativedialogs.ComDlg32JNA.ComDlg32;
  13. import nativedialogs.ComDlg32JNA.ComDlg32.OPENFILENAME;
  14.  
  15. public class OpenFileDialog {
  16.  
  17.     private static final int MAX_BUF_SIZE = 64 * 1024;
  18.  
  19.     private OpenFileDialog() {
  20.     }
  21.  
  22.     public static List<File> display(Window parent, boolean allowMultiSelect) {
  23.         ByteBuffer buffer = ByteBuffer.allocateDirect(MAX_BUF_SIZE);
  24.         buffer.order(ByteOrder.LITTLE_ENDIAN);
  25.         OPENFILENAME ofn = new OPENFILENAME();
  26.  
  27.         ofn.lStructSize = ofn.size();
  28.         ofn.lpstrFile = Native.getDirectBufferPointer(buffer);
  29.         ofn.nMaxFile = MAX_BUF_SIZE;
  30.         ofn.hwndOwner = parent == null
  31.                 ? null
  32.                 : Native.getWindowPointer(parent);
  33.         ofn.Flags = ComDlg32.OFN_EXPLORER
  34.                 | ComDlg32.OFN_FILEMUSTEXIST
  35.                 | (allowMultiSelect ? ComDlg32.OFN_ALLOWMULTISELECT : 0);
  36.         ofn.lpstrTitle = new WString("Hello world!");
  37.         ofn.lpstrFilter = new WString("All files (*.*)\0*.*\0\0");
  38.  
  39.         boolean approved = ComDlg32.INSTANCE.GetOpenFileNameW(ofn);
  40.         if (!approved) {
  41.             int errCode = ComDlg32.INSTANCE.CommDlgExtendedError();
  42.             if (errCode != 0) {
  43.                 throw new RuntimeException(String.format(
  44.                         "GetOpenFileNameW failed. Error code: 0x%04X", errCode));
  45.             }
  46.             return null;
  47.         }
  48.         List<String> strings = extractNullSeparatedWideStrings(buffer);
  49.         assert !strings.isEmpty();
  50.         if (strings.size() == 1) {
  51.             return Arrays.asList(new File(strings.get(0)));
  52.         } else {
  53.             List<File> files = new ArrayList<File>(strings.size() - 1);
  54.             String dir = strings.get(0);
  55.             for (String file : strings.subList(1, strings.size())) {
  56.                 files.add(new File(dir, file));
  57.             }
  58.             return files;
  59.         }
  60.     }
  61.  
  62.     private static List<String> extractNullSeparatedWideStrings(ByteBuffer buffer) {
  63.         boolean lastWasNull = false;
  64.         boolean foundTerminal = false;
  65.  
  66.         List<String> strings = new ArrayList<String>();
  67.         StringBuilder sb = new StringBuilder();
  68.         while (buffer.hasRemaining() && !foundTerminal) {
  69.             char ch = buffer.getChar();
  70.             if (ch != 0) {
  71.                 lastWasNull = false;
  72.                 sb.append(ch);
  73.             } else if (lastWasNull) {
  74.                 foundTerminal = true;
  75.             } else {
  76.                 lastWasNull = true;
  77.                 strings.add(sb.toString());
  78.                 sb.setLength(0);
  79.             }
  80.         }
  81.         if (!foundTerminal) {
  82.             throw new IllegalArgumentException("Buffer had no double NULL terminal");
  83.         }
  84.         return strings;
  85.     }
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement