--- openide.loaders/apichanges.xml +++ openide.loaders/apichanges.xml @@ -109,6 +109,34 @@ + + + Introduces system property to set the default ordering of DataFolder's children. + + + + + +

+ Added support for the configuration of default sorting of DataObjects. + Use system property org.openide.loaders.DataFolder.default.sortmode. + The value of type char determines the sorting of children (folders and files) of a DataFolder. + + 'N': by name - default + 'L': by name (natural ordering, f.e. A9 before A10); + 'C': by class + 'M': by last modified date + 'S': by size; + 'X': by extension; + 'O': no ordering + +

+
+ + +
Introduces SortMode for natural sorting. --- openide.loaders/arch.xml +++ openide.loaders/arch.xml @@ -533,6 +533,19 @@ between successive refreshes of contents of a folder. Can be used to tweak performance of folder refresh. Defaults to 10. + + + The value of type char determines the sorting of children (folders and files) of a DataFolder. +
+                'N': by name - default
+                'L': by name (natural ordering, f.e. A9 before A10);
+                'C': by class
+                'M': by last modified date
+                'S': by size;
+                'X': by extension;
+                'O': no ordering
+        
+
If set to true, the DataObject.copy, move, createFromTemplate --- openide.loaders/manifest.mf +++ openide.loaders/manifest.mf @@ -1,6 +1,6 @@ Manifest-Version: 1.0 OpenIDE-Module: org.openide.loaders -OpenIDE-Module-Specification-Version: 7.66 +OpenIDE-Module-Specification-Version: 7.67 OpenIDE-Module-Localizing-Bundle: org/openide/loaders/Bundle.properties OpenIDE-Module-Provides: org.netbeans.modules.templates.v1_0 OpenIDE-Module-Layer: org/netbeans/modules/openide/loaders/layer.xml --- openide.loaders/src/org/openide/loaders/DataFolder.java +++ openide.loaders/src/org/openide/loaders/DataFolder.java @@ -1117,6 +1117,24 @@ */ public static final SortMode NATURAL = new FolderComparator(FolderComparator.NATURAL); + private static SortMode parseMode(Character c) { + if (null == c) { + return FOLDER_NAMES; + } + switch (c) { + case 'N': return NAMES; + case 'C': return CLASS; + case 'O': return NONE; + case 'M': return LAST_MODIFIED; + case 'S': return SIZE; + case 'X': return EXTENSIONS; + case 'L': return NATURAL; + case 'F': + default: + return FOLDER_NAMES; + } + } + /** Method to write the sort mode to a folder's attributes. * @param folder folder write this mode to */ @@ -1149,24 +1167,20 @@ /** Reads sort mode for given folder. */ static SortMode read (FileObject f) { - String x = (String)f.getAttribute (EA_SORT_MODE); - if (x == null || x.length () != 1) { - return FOLDER_NAMES; + String x = (String) f.getAttribute(EA_SORT_MODE); + Character c = null; + if (x != null && x.length() == 1) { + c = x.charAt(0); + } else { + // no mode set, so use the default one + // allowed values: see parseMode + String mode = System.getProperty("org.openide.loaders.DataFolder.default.sortmode"); + if (mode != null && mode.length() == 1) { + c = mode.charAt(0); + } } - char c = x.charAt (0); - switch (c) { - case 'N': return NAMES; - case 'C': return CLASS; - case 'O': return NONE; - case 'M': return LAST_MODIFIED; - case 'S': return SIZE; - case 'X': return EXTENSIONS; - case 'L': return NATURAL; - case 'F': - default: - return FOLDER_NAMES; - } + return parseMode(c); } } --- openide.loaders/src/org/openide/loaders/FolderComparator.java +++ openide.loaders/src/org/openide/loaders/FolderComparator.java @@ -150,7 +150,7 @@ /** for sorting data objects by names */ private int compareNames(Object o1, Object o2) { - return findFileObject(o1).getNameExt().compareTo(findFileObject(o2).getNameExt()); + return findFileObject(o1).getNameExt().compareToIgnoreCase(findFileObject(o2).getNameExt()); } /** for sorting folders first and then by names */ @@ -177,14 +177,14 @@ if (folder1 != folder2) { return folder1 ? -1 : 1; // folders first } else if (folder1) { // && folder2 - return obj1.getNameExt().compareTo(obj2.getNameExt()); // by nameExt + return obj1.getNameExt().compareToIgnoreCase(obj2.getNameExt()); // by nameExt } else { String ext1 = obj1.getExt(); String ext2 = obj2.getExt(); if (ext1.equals(ext2)) { // same extensions - return obj1.getName().compareTo(obj2.getName()); // by name + return obj1.getName().compareToIgnoreCase(obj2.getName()); // by name } else { // different extensions - return ext1.compareTo(ext2); // by extension + return ext1.compareToIgnoreCase(ext2); // by extension } } } @@ -245,7 +245,7 @@ } else if (d2.after(d1)) { return 1; } else { - return fo1.getNameExt().compareTo(fo2.getNameExt()); + return fo1.getNameExt().compareToIgnoreCase(fo2.getNameExt()); } } @@ -269,7 +269,7 @@ } else if (s2 > s1) { return 1; } else { - return fo1.getNameExt().compareTo(fo2.getNameExt()); + return fo1.getNameExt().compareToIgnoreCase(fo2.getNameExt()); } } @@ -323,14 +323,14 @@ boolean unfinished1 = p1 < n1.length(); boolean unfinished2 = p2 < n2.length(); if (!unfinished1 && !unfinished2) { - return name1.compareTo(name2); + return name1.compareToIgnoreCase(name2); } else if (unfinished1) { return 1; // first string is longer (prefix of second string) } else if (unfinished2) { return -1; // second string is longer (prefix of first string) } else { assert false : "Invalid state in natural comparator"; //NOI18N - return n1.compareTo(n2); + return n1.compareToIgnoreCase(n2); } } --- openide.loaders/test/unit/src/org/openide/loaders/FolderComparatorTest.java +++ openide.loaders/test/unit/src/org/openide/loaders/FolderComparatorTest.java @@ -83,7 +83,7 @@ "b 9.txt", "b 10.txt", "b0070.txt" - }); + }, FolderComparator.NATURAL); } @Test @@ -98,7 +98,7 @@ "a01b", "a02", "a2x" - }); + }, FolderComparator.NATURAL); } @Test @@ -141,15 +141,44 @@ "a001.txt", "A1.txt" }, new String[]{ - "A1.txt", "a001.txt", - "a01.txt" - }); + "a01.txt", + "A1.txt", + }, FolderComparator.NATURAL); } - private void testNaturalComparator(String[] fileNames, - String[] expectedOrder) throws IOException { - FolderComparator c = new FolderComparator(FolderComparator.NATURAL); + @Test + public void testIncaseSensitive_NAMES() throws IOException { + testNaturalComparator(new String[]{ + "CustomerInvoice.txt", + "Customerappro.txt", + "CustomerABC.txt", + "Customerinterview.txt" + }, new String[]{ + "CustomerABC.txt", + "Customerappro.txt", + "Customerinterview.txt", + "CustomerInvoice.txt", + }, FolderComparator.NAMES); + } + + @Test + public void testIncaseSensitive_NONE() throws IOException { + testNaturalComparator(new String[]{ + "CustomerInvoice.txt", + "Customerappro.txt", + "CustomerABC.txt", + "Customerinterview.txt" + }, new String[]{ + "CustomerInvoice.txt", + "Customerappro.txt", + "CustomerABC.txt", + "Customerinterview.txt", + }, FolderComparator.NONE); + } + + private void testNaturalComparator(String[] fileNames, String[] expectedOrder, int mode) throws IOException { + FolderComparator c = new FolderComparator(mode); FileSystem fs = FileUtil.createMemoryFileSystem(); FileObject root = fs.getRoot(); List list = new ArrayList();