diff --git a/openide.loaders/apichanges.xml b/openide.loaders/apichanges.xml --- a/openide.loaders/apichanges.xml +++ b/openide.loaders/apichanges.xml @@ -109,6 +109,26 @@ + + + Introduces SortMode for sorting by file extension. + + + + + +

It's possible to sort files using sort mode "By Type", which + means using SortMode.CLASS. It may be confusing, as users + expect that the files will be sorted by file type, i.e. by + extension. "By Type" was renamed to "By Class" and new + sort mode "By Extension" (SortMode.EXTENSIONS) was added. +

+
+ + +
Introduces system property to change file size threshold. diff --git a/openide.loaders/manifest.mf b/openide.loaders/manifest.mf --- a/openide.loaders/manifest.mf +++ b/openide.loaders/manifest.mf @@ -1,6 +1,6 @@ Manifest-Version: 1.0 OpenIDE-Module: org.openide.loaders -OpenIDE-Module-Specification-Version: 7.53 +OpenIDE-Module-Specification-Version: 7.54 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 diff --git a/openide.loaders/src/org/openide/loaders/Bundle.properties b/openide.loaders/src/org/openide/loaders/Bundle.properties --- a/openide.loaders/src/org/openide/loaders/Bundle.properties +++ b/openide.loaders/src/org/openide/loaders/Bundle.properties @@ -105,10 +105,11 @@ # SortModeEditor VALUE_sort_none=Unsorted VALUE_sort_names=By Name -VALUE_sort_class=By Type +VALUE_sort_class=By Class VALUE_sort_folder_names=By Name (Packages First) VALUE_sort_last_modified=By Modification Time VALUE_sort_size=By File Size +VALUE_sort_extensions=By Extension # diff --git a/openide.loaders/src/org/openide/loaders/DataFolder.java b/openide.loaders/src/org/openide/loaders/DataFolder.java --- a/openide.loaders/src/org/openide/loaders/DataFolder.java +++ b/openide.loaders/src/org/openide/loaders/DataFolder.java @@ -1100,6 +1100,14 @@ */ public static final SortMode SIZE = new FolderComparator(FolderComparator.SIZE); + /** + * Folders go first (sorted by name) followed by files sorted by + * extension and then by name. + * + * @since org.openide.loaders 7.54 + */ + public static final SortMode EXTENSIONS = new FolderComparator(FolderComparator.EXTENSIONS); + /** Method to write the sort mode to a folder's attributes. * @param folder folder write this mode to */ diff --git a/openide.loaders/src/org/openide/loaders/FolderComparator.java b/openide.loaders/src/org/openide/loaders/FolderComparator.java --- a/openide.loaders/src/org/openide/loaders/FolderComparator.java +++ b/openide.loaders/src/org/openide/loaders/FolderComparator.java @@ -67,6 +67,8 @@ public static final int LAST_MODIFIED = 4; /** by folders, then size */ public static final int SIZE = 5; + /** by extension, then name */ + public static final int EXTENSIONS = 6; /** mode to use */ @@ -106,6 +108,8 @@ return compareLastModified(obj1, obj2); case SIZE: return compareSize(obj1, obj2); + case EXTENSIONS: + return compareExtensions(obj1, obj2); default: assert false : mode; return 0; @@ -158,6 +162,29 @@ return compareNames(o1, o2); } + /** for sorting folders first and then by extensions and then by names */ + private int compareExtensions(Object o1, Object o2) { + FileObject obj1 = findFileObject(o1); + FileObject obj2 = findFileObject(o2); + + boolean folder1 = obj1.isFolder(); + boolean folder2 = obj2.isFolder(); + + if (folder1 != folder2) { + return folder1 ? -1 : 1; // folders first + } else if (folder1) { // && folder2 + return obj1.getNameExt().compareTo(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 + } else { // different extensions + return ext1.compareTo(ext2); // by extension + } + } + } + /** for sorting data objects by their classes */ private int compareClass(Object o1, Object o2) { DataObject obj1 = findDataObject(o1); diff --git a/openide.loaders/src/org/openide/loaders/SortModeEditor.java b/openide.loaders/src/org/openide/loaders/SortModeEditor.java --- a/openide.loaders/src/org/openide/loaders/SortModeEditor.java +++ b/openide.loaders/src/org/openide/loaders/SortModeEditor.java @@ -58,6 +58,7 @@ DataFolder.SortMode.FOLDER_NAMES, DataFolder.SortMode.LAST_MODIFIED, DataFolder.SortMode.SIZE, + DataFolder.SortMode.EXTENSIONS }; /** Names for modes. First is for displaying files */ @@ -68,6 +69,7 @@ DataObject.getString ("VALUE_sort_folder_names"), DataObject.getString ("VALUE_sort_last_modified"), DataObject.getString ("VALUE_sort_size"), + DataObject.getString ("VALUE_sort_extensions") }; /** @return names of the two possible modes */ diff --git a/openide.loaders/test/unit/src/org/openide/loaders/DataFolderTest.java b/openide.loaders/test/unit/src/org/openide/loaders/DataFolderTest.java --- a/openide.loaders/test/unit/src/org/openide/loaders/DataFolderTest.java +++ b/openide.loaders/test/unit/src/org/openide/loaders/DataFolderTest.java @@ -588,6 +588,8 @@ assertEquals("next order is alphabetical", "a/b.xml/c/d.instance/e.xml", childrenOrder(folder)); folder.setSortMode(DataFolder.SortMode.CLASS); assertEquals("last order is by type", "d.instance/a/c/b.xml/e.xml", childrenOrder(folder)); + folder.setSortMode(DataFolder.SortMode.EXTENSIONS); + assertEquals("last order is by extension", "a/c/d.instance/b.xml/e.xml", childrenOrder(folder)); } public void testPositionalSort() throws Exception {