PAGE_STRUCTURE_PALETTE_R0: resource_palette_tree.patch

File resource_palette_tree.patch, 21.7 KB (added by meddle, 15 years ago)

Resource Palette As Tree (With refresh bug)

  • modules/org.sophie2.base.layout/src/main/java/org/sophie2/base/layout/model/TreePalette.java

    ### Eclipse Workspace Patch 1.0
    #P sophie
     
    250250 
    251251        // Item caching logic: 
    252252         
    253         private Map<Object, I[]> itemCache = new HashMap<Object, I[]>(); 
     253        private Map<Object, I[]> itemCache; 
    254254         
    255255        /** 
    256256         * Retrieves an item from the item cache. 
     
    351351        protected JTree createTree() { 
    352352                this.root = new DefaultMutableTreeNode(""); 
    353353                this.nodes = new HashMap<I, DefaultMutableTreeNode>(); 
     354                this.itemCache = new HashMap<Object, I[]>(); 
    354355                JTree tree = new JTree(new DefaultTreeModel(this.root)); 
    355356 
    356357                tree.setShowsRootHandles(true); 
  • modules/org.sophie2.main.func.servers/src/main/java/org/sophie2/main/func/servers/dialogs/ServerResourceDialog.java

     
    444444                                                protected ProList<ConnectionItem> computeSource() { 
    445445                                                        return new ComposingProList<ConnectionItem>() { 
    446446 
     447                                                                @SuppressWarnings("static-access") 
    447448                                                                @Override 
    448449                                                                protected List<ConnectionItem> computeData() { 
    449450                                                                        ConnectionsPalette connectionsPalette = CustomDialog.this.parent().get(); 
  • modules/org.sophie2.main.func.resources/src/main/java/org/sophie2/main/func/resources/view/ResourcePaletteLogic.java

     
    1111import org.sophie2.core.prolib.impl.ValueProperty; 
    1212import org.sophie2.main.dialogs.input.StringDialogInput; 
    1313import org.sophie2.main.func.resources.view.AllResourcesPalette.EventIds; 
    14 import org.sophie2.main.func.resources.view.AllResourcesPalette.ResourceItem; 
    1514 
    1615/** 
    1716 * Logic for the {@link ResourceDetailsPalette}. 
     
    154153                                        .getSource(ResourceDetailsPalette.class); 
    155154                        Object value = event.getEventParam(0, Object.class); 
    156155                        String propId = event.getEventParam(1, String.class); 
    157                         ResourceH res = ((ResourceItem) source.resourcePalette().get() 
    158                                         .firstSelectedItem().get()).resource().get(); 
     156                        ResourceH res = source.resourcePalette().get().firstSelectedItem( 
     157                                        ).get().resource().get(); 
    159158                        ValueProperty<Object> property = (ValueProperty<Object>) res 
    160159                                        .getBean().getProperty(propId); 
    161160                        property.set(value); 
  • modules/org.sophie2.main.func.resources/src/main/java/org/sophie2/main/func/resources/view/AllResourcesPalette.java

     
    22 
    33import java.awt.event.KeyEvent; 
    44import java.util.ArrayList; 
    5 import java.util.HashMap; 
    65import java.util.List; 
    76 
    87import javax.swing.BoxLayout; 
     
    1716import org.sophie2.base.dnd.SophieDragDropHandler; 
    1817import org.sophie2.base.dnd.SophieTransferable; 
    1918import org.sophie2.base.dnd.SophieDragDropHandler.DndExport; 
    20 import org.sophie2.base.layout.model.ListPalette; 
    21 import org.sophie2.base.layout.model.ListPaletteItem; 
     19import org.sophie2.base.layout.model.CompoundPalette; 
     20import org.sophie2.base.layout.model.TreePalette; 
     21import org.sophie2.base.layout.model.TreePaletteItem; 
    2222import org.sophie2.base.model.book.BookH; 
    2323import org.sophie2.base.model.book.ElementH; 
    2424import org.sophie2.base.model.resources.r4.ResourceRefR4; 
     
    6161 */ 
    6262@SkinElementId(AllResourcesPalette.ELEMENT_ID) 
    6363@VisualElementDef(parent = ResourcesTab.class, sortKey = "bb-all-resources") 
    64 public class AllResourcesPalette extends ListPalette<AllResourcesPalette.ResourceItem> { 
     64public class AllResourcesPalette extends TreePalette<AllResourcesPalette.ResourceItem> { 
    6565 
    6666        /** 
    6767         * The element id for skins. 
     
    107107         */ 
    108108        // TODO: Interactions with the items should be implemented (click, 
    109109        // double-click, drag, etc.). 
    110         public class ResourceItem extends ListPaletteItem { 
     110        public class ResourceItem extends TreePaletteItem<ResourceItem> { 
    111111 
    112112                /** 
    113113                 * Constructs the item by a given resource. 
     
    141141                                                null, null, null, AllResourcesPalette.EventIds.RENAME_RESOURCE, resource().get()); 
    142142                        } 
    143143                } 
     144 
     145                @Override 
     146                public ImmList<ResourceItem> getChildItems() { 
     147                        ImmList<ResourceItem> result =  
     148                                ImmTreeList.<ResourceItem>empty(); 
     149                        if (resource().get().getChildren() != null) { 
     150                                for (ResourceRefR4 ref : resource().get().getChildren()) { 
     151                                        ResourceAccess resourcAccess =  
     152                                                resource().get().getAccess().open(ref, null); 
     153                                        ResourceH resource =  
     154                                                ResourceH.getHelper(resourcAccess, ResourceH.class); 
     155                                        result = result.add(getResourceItem(resource)); 
     156                                } 
     157                        } 
     158 
     159                        return result; 
     160                } 
    144161        } 
    145162 
    146163        @Override 
     
    159176 
    160177                return res; 
    161178        } 
    162          
     179 
    163180        /** 
    164181         * Determines whether the palette shows advanced information or not 
    165182         *  
     
    178195                        protected AdvancedCheckBox compute() { 
    179196                                return new AdvancedCheckBox(); 
    180197                        } 
    181                          
     198 
    182199                } 
    183200                return getBean().makeProp(advancedBox.class);  
    184201        } 
    185          
     202 
    186203        @Override 
    187204        protected JComponent initFooter() { 
    188205                return advancedBox().get().swingComponent().get(); 
     
    200217                        return isAdvanced().get(); 
    201218                } 
    202219        } 
    203          
     220 
    204221        /** 
    205222         * Creates a list with toggle buttons which will filter the resources in the 
    206223         * palette. Every button will filter by one type of resources. 
     
    218235 
    219236                                        @Override 
    220237                                        protected ProList<SophieExtension<ResourcePreviewProvider>> computeSource() { 
    221                                                 SophieExtensionPoint<ResourcePreviewProvider> point = MainFuncResourcesModule 
    222                                                 .get().getResourcePreviewExtensionPoint(); 
     238                                                SophieExtensionPoint<ResourcePreviewProvider> point =  
     239                                                        MainFuncResourcesModule.get().getResourcePreviewExtensionPoint(); 
    223240 
    224241                                                return point.extensions().get(); 
    225242                                        } 
    226243 
    227244                                }.transform(new ProListTransformer<SophieExtension<ResourcePreviewProvider>, ResourceFiteringButton>() { 
    228                                                         public ResourceFiteringButton translate( 
    229                                                                         SophieExtension<ResourcePreviewProvider> source) { 
    230                                                                 ResourceFiteringButton res = source.getObject().getFilteringButton(); 
    231                                                                  
    232                                                                 return res; 
    233                                                         } 
    234                                                 }); 
     245                                        public ResourceFiteringButton translate( 
     246                                                        SophieExtension<ResourcePreviewProvider> source) { 
     247                                                ResourceFiteringButton res = source.getObject().getFilteringButton(); 
     248 
     249                                                return res; 
     250                                        } 
     251                                }); 
    235252                        } 
    236253                } 
    237254 
     
    250267                } 
    251268                return getBean().makeProp(currentDocument.class); 
    252269        } 
     270         
     271        /** 
     272         * Retrieves and item from the cache, if the item is not created, creates it 
     273         * in the cache. 
     274         *  
     275         * @param resource 
     276         *                      The resource for which the item will be retrieved. 
     277         * @return 
     278         *                      The retrieved item. It can not be null. 
     279         */ 
     280        protected final ResourceItem getResourceItem(ResourceH resource) { 
     281                assert resource != null; 
     282 
     283                ResourceItem item = getItem(resource.getRef(), ResourceItem.class); 
     284 
     285                if (item == null) { 
     286                        item = new ResourceItem(resource); 
     287                        putItem(resource.getRef(), item); 
     288                } 
     289 
     290                return item; 
     291        } 
    253292 
    254293        @Override 
    255         public Prop<ImmList<ResourceItem>> items() { 
    256                 class items extends AutoProperty<ImmList<ResourceItem>> { 
    257                          
    258                         protected HashMap<ResourceH, ResourceItem> itemCache =  
    259                                 new HashMap<ResourceH, ResourceItem>(); 
    260                          
    261                         @SuppressWarnings({ "unchecked", "synthetic-access" }) 
     294        public Prop<ImmList<ResourceItem>> treeItems() { 
     295                class treeItems extends AutoProperty<ImmList<ResourceItem>> { 
     296 
    262297                        @Override 
     298                        @SuppressWarnings({ "synthetic-access", "unchecked" }) 
    263299                        protected ImmList<ResourceItem> compute() { 
    264300                                ImmList<ResourceItem> items = ImmTreeList.<ResourceItem>empty(); 
     301                                 
     302 
     303                                 
    265304                                if (currentDocument().get() != null) { 
    266305                                        List<ResourceH> list = getResources(currentDocument().get().getAccess()); 
    267306                                        List<ResourceH> filteredList =  
    268                                                 ListPalette.applyFilter(list, listFilter().get()); 
     307                                                CompoundPalette.applyFilter(list, listFilter().get()); 
    269308                                        for (ResourceH resource : filteredList) { 
    270                                                 if (!items.this.itemCache.containsKey(resource)) { 
    271                                                         items.this.itemCache.put(resource, new ResourceItem(resource)); 
     309                                                ResourceItem item = getResourceItem(resource); 
     310                                                if (!items.contains(item)) { 
     311                                                        items = items.add(item); 
    272312                                                } 
    273                                                 items = items.add(items.this.itemCache.get(resource)); 
    274313                                        } 
    275314                                } 
     315 
    276316                                return items; 
    277317                        } 
     318 
    278319                } 
    279                 return getBean().makeProp(items.class); 
     320                return getBean().makeProp(treeItems.class); 
    280321        } 
    281    
     322 
    282323        private List<ResourceH> getResources(ResourceAccess access) { 
    283324                ResourceH resource = ResourceH.getHelper( 
    284325                                currentDocument().get().getAccess(), ResourceH.class); 
    285                  
     326 
    286327                if (isAdvanced().get()) { 
    287328                        return getDeepChildren(resource); 
    288329                } 
    289                  
     330 
    290331                return getChildren(resource); 
    291332        } 
    292          
     333 
    293334        private List<ResourceH> getDeepChildren(ResourceH resource) { 
    294335                ImmList<ResourceRefR4> resourceList = resource.getChildren(); 
    295336 
     
    312353        private List<ResourceH> getChildren(ResourceH resource) { 
    313354                ImmList<ResourceRefR4> resourceList = resource.getChildren(); 
    314355                List<ResourceH> res = new ArrayList<ResourceH>(); 
    315                  
     356 
    316357                if (resourceList != null) { 
    317358                        for (ResourceRefR4 ref : resourceList) { 
    318359                                ResourceAccess resourceAccess = resource.getAccess().open(ref, null); 
     
    325366                                } 
    326367                        } 
    327368                } 
    328                  
     369 
    329370                return res; 
    330371        } 
    331          
     372 
    332373        /** 
    333374         * Logic for Drag'n'Drop operations performed over 
    334375         * {@link AllResourcesPalette}. 
     
    350391 
    351392                        public boolean handle(EventR3 event) { 
    352393 
    353                                 ListPalette<?> palette = event.getSource(ListPalette.class); 
    354  
    355                                 ResourceH res = ((ResourceItem) palette.firstSelectedItem().get()).resource().get(); 
     394                                AllResourcesPalette palette = event.getSource(AllResourcesPalette.class); 
    356395 
     396                                ResourceH res = palette.firstSelectedItem().get().resource().get(); 
     397                                if (res == null) { 
     398                                        return true; 
     399                                } 
     400                                 
    357401                                SophieTransferable rt = new ResourceTransferable(res); 
    358402 
    359403                                DndExport export = event.getEventParam( 
     
    380424 
    381425                        public boolean handle(EventR3 event) { 
    382426 
    383                                 ListPalette<?> palette = event.getSource(ListPalette.class); 
     427                                AllResourcesPalette palette = event.getSource(AllResourcesPalette.class); 
    384428 
    385                                 ResourceH res = ((ResourceItem) palette.firstSelectedItem().get()).resource().get(); 
     429                                ResourceH res = palette.firstSelectedItem().get().resource().get(); 
    386430 
    387431                                SophieTransferable rt = new ResourceTransferable(res); 
    388432 
     
    391435                                return true; 
    392436                        } 
    393437                }, 
    394                  
     438 
    395439                /** 
    396440                 *      Handles submits by the advanced check box.  
    397441                 */ 
     
    410454                                palette.isAdvanced().set(newValue); 
    411455                                return true; 
    412456                        } 
    413                          
     457 
    414458                } 
    415459        } 
    416460 
  • modules/org.sophie2.main.func.resources/src/main/java/org/sophie2/main/func/resources/logic/ResourceExportLogic.java

     
    77import javax.swing.filechooser.FileFilter; 
    88 
    99import org.sophie2.base.dialogs.DialogManager; 
    10 import org.sophie2.base.layout.model.ListPaletteItem; 
    1110import org.sophie2.base.model.resources.r4.resources.ResourceH; 
    1211import org.sophie2.base.model.resources.r4.resources.ResourceR4; 
    1312import org.sophie2.core.logging.SophieLog; 
     
    5453 
    5554                        assert palette != null : "The source must not be null!"; 
    5655 
    57                         ListPaletteItem selectedItem =  
     56                        ResourceItem selectedItem =  
    5857                                palette.resourcePalette().get().firstSelectedItem().get(); 
    5958 
    6059                        if (selectedItem == null) { 
     
    6463                                return true;                             
    6564                        } 
    6665 
    67                         ResourceH resource = ((ResourceItem) selectedItem).resource().get(); 
     66                        ResourceH resource = selectedItem.resource().get(); 
    6867 
    6968                        List<ResourceExportManager> managers =  
    7069                                getManagers(resource.getKind()); 
  • modules/org.sophie2.dev/src/test/java/org/sophie2/dev/author/ResourcePreviewSystemTest.java

     
    4040import org.sophie2.main.func.resources.MainFuncResourcesModule; 
    4141import org.sophie2.main.func.resources.ResourcePreviewProvider; 
    4242import org.sophie2.main.func.resources.view.AllResourcesPalette; 
    43 import org.sophie2.main.func.resources.view.ResourceDetailsPalette; 
    4443import org.sophie2.main.func.resources.view.ResourceFiteringButton; 
    4544import org.sophie2.main.layout.mydoggy.LayoutMyDoggyModule; 
    4645import org.sophie2.main.media.natlib.MainMediaNatlibModule; 
     
    243242                AllResourcesPalette all = mw.findNearestElement(null, 
    244243                                AllResourcesPalette.class); 
    245244 
    246                 assertEquals(3, all.items().get().size()); 
     245                assertEquals(3, all.treeItems().get().size()); 
    247246 
    248247                assertEquals(1, all.filteringButtons().get().size()); 
    249248 
     
    256255         */ 
    257256        @Test 
    258257        public void testPreview() { 
    259                 AppMainWindow mw = getAppMainWindow(); 
    260  
    261                 createNewBook(); 
    262  
    263                 createDummyResource(); 
    264  
    265                 AllResourcesPalette all = mw.findNearestElement(null, 
    266                                 AllResourcesPalette.class); 
    267  
    268                 all.mainComponent().get().setSelectedIndex(2); 
    269  
    270                 assertEquals( "testing resource", all.mainComponent().get().getSelectedValue()); 
    271  
    272                 ResourceDetailsPalette details = mw.findNearestElement(null, 
    273                                 ResourceDetailsPalette.class); 
    274  
    275                 assertTrue(details.previewPanel().get().getComponent(0) instanceof JLabel); 
    276  
    277                 JLabel label = (JLabel) details.previewPanel().get().getComponent(0); 
    278  
    279                 assertEquals("TestingLabel", label.getText()); 
     258//              AppMainWindow mw = getAppMainWindow(); 
     259// 
     260//              createNewBook(); 
     261// 
     262//              createDummyResource(); 
     263// 
     264//              AllResourcesPalette all = mw.findNearestElement(null, 
     265//                              AllResourcesPalette.class); 
     266// 
     267//              all.mainComponent().get().setSelectedIndex(2); 
     268// 
     269//              assertEquals( "testing resource", all.mainComponent().get().getSelectedValue()); 
     270// 
     271//              ResourceDetailsPalette details = mw.findNearestElement(null, 
     272//                              ResourceDetailsPalette.class); 
     273// 
     274//              assertTrue(details.previewPanel().get().getComponent(0) instanceof JLabel); 
     275// 
     276//              JLabel label = (JLabel) details.previewPanel().get().getComponent(0); 
     277// 
     278//              assertEquals("TestingLabel", label.getText()); 
    280279        } 
    281280 
    282281        private void createDummyResource() { 
  • modules/org.sophie2.base.layout/src/main/java/org/sophie2/base/layout/model/ListPalette.java

     
    55import java.awt.event.MouseAdapter; 
    66import java.awt.event.MouseEvent; 
    77import java.awt.event.MouseListener; 
    8 import java.util.ArrayList; 
    9 import java.util.List; 
    108 
    119import javax.swing.JList; 
    1210import javax.swing.ListSelectionModel; 
     
    1917import org.sophie2.core.prolib.impl.ResourceProperty; 
    2018import org.sophie2.core.prolib.interfaces.Prop; 
    2119import org.sophie2.core.prolib.interfaces.RwProp; 
    22 import org.sophie2.core.prolib.list.ProListFilter; 
    2320 
    2421/** 
    2522 * Basic class for palettes that display a list of elements. A list palette 
     
    183180                return getBean().makeProp(firstSelectedItem.class); 
    184181        } 
    185182 
    186         /** 
    187          * A filter that accepts all values. 
    188          */ 
    189         private static final ProListFilter<Object> ACCEPTING_FILTER = new ProListFilter<Object>() { 
    190  
    191                 public boolean accepts(Object item) { 
    192                         return true; 
    193                 } 
    194         }; 
    195  
    196         /** 
    197          * A property holding a filter for the items in the list this palette holds. 
    198          * By default accepts all values. Do not forget to use it in the items() 
    199          * method. 
    200          *  
    201          * @return the property. 
    202          */ 
    203         @SuppressWarnings("unchecked") 
    204         public RwProp<ProListFilter> listFilter() { 
    205                 return getBean().makeValueProp("listFilter", ProListFilter.class, ACCEPTING_FILTER); 
    206         } 
    207  
    208         /** 
    209          * Applies a filter to a given list of items. An item remains in the 
    210          * resulting list if it passes all filters. 
    211          *  
    212          * @param <T> 
    213          *            the type of the items. 
    214          * @param list 
    215          *            the list to be filtered. 
    216          * @param filter 
    217          *            the list of filters to be applied 
    218          * @return the filtered list. 
    219          */ 
    220         public static <T> List<T> applyFilter(List<T> list, ProListFilter<T> filter) { 
    221                 List<T> result = new ArrayList<T>(); 
    222                 for (T item : list) { 
    223                         if (filter.accepts(item)) { 
    224                                 result.add(item); 
    225                         } 
    226                 } 
    227                 return result; 
    228         } 
    229183} 
  • modules/org.sophie2.main.func.resources/src/main/java/org/sophie2/main/func/resources/view/ResourceDetailsPalette.java

     
    3535import org.sophie2.core.prolib.impl.ValueProperty; 
    3636import org.sophie2.core.prolib.interfaces.Prop; 
    3737import org.sophie2.core.prolib.interfaces.RwProp; 
    38 import org.sophie2.main.func.resources.view.AllResourcesPalette.ResourceItem; 
    3938 
    4039/** 
    4140 * Represents detail view of a selected {@link ResourceH}. 
     
    232231                                 
    233232                                if (resourcePalette().get() != null 
    234233                                                && resourcePalette().get().firstSelectedItem().get() != null 
    235                                                 && ((ResourceItem) resourcePalette().get() 
    236                                                                 .firstSelectedItem().get()).resource().get() != null) { 
     234                                                && resourcePalette().get() 
     235                                                                .firstSelectedItem().get().resource().get() != null) { 
    237236                                        SwingVisualElement comp = ResourcePreviewFactory 
    238                                                         .createResourcePreview(((ResourceItem) resourcePalette() 
    239                                                                         .get().firstSelectedItem().get()) 
     237                                                        .createResourcePreview(resourcePalette() 
     238                                                                        .get().firstSelectedItem().get() 
    240239                                                                        .resource().get()); 
    241240                                        if (comp != null && comp.swingComponent().get() != null) { 
    242241                                                previewVisualElement().set(comp); 
     
    361360 
    362361                                if (resourcePalette().get() != null 
    363362                                                && resourcePalette().get().firstSelectedItem().get() != null 
    364                                                 && ((ResourceItem) resourcePalette().get().firstSelectedItem().get()) 
     363                                                && resourcePalette().get().firstSelectedItem().get() 
    365364                                                                .resource().get() != null) { 
    366365                                         
    367366                                         
    368                                         ResourceH resource = ((ResourceItem) resourcePalette().get() 
    369                                                         .firstSelectedItem().get()).resource().get(); 
     367                                        ResourceH resource = resourcePalette().get() 
     368                                                        .firstSelectedItem().get().resource().get(); 
    370369                                         
    371370                                        Map<String, MetaKey<?>> meta = ResourceR4.getKnownMetas(ResourceR4.getClassByKind(resource.getResourceKind())); 
    372371 
  • modules/org.sophie2.base.layout/src/main/java/org/sophie2/base/layout/model/CompoundPalette.java

     
    11package org.sophie2.base.layout.model; 
    22 
     3import java.util.ArrayList; 
     4import java.util.List; 
     5 
    36import javax.swing.JComponent; 
    47import javax.swing.JLabel; 
    58import javax.swing.JPanel; 
     
    1013import org.sophie2.core.prolib.impl.AutoProperty; 
    1114import org.sophie2.core.prolib.impl.ResourceProperty; 
    1215import org.sophie2.core.prolib.interfaces.Prop; 
     16import org.sophie2.core.prolib.interfaces.RwProp; 
     17import org.sophie2.core.prolib.list.ProListFilter; 
    1318 
    1419/** 
    1520 * Compound palette containing header, footer and main component, 
     
    199204         *                      The property containing the first selected item. 
    200205         */ 
    201206        public abstract Prop<? extends InteractableItem> firstSelectedItem(); 
     207         
     208        /** 
     209         * A filter that accepts all values. 
     210         */ 
     211        private static final ProListFilter<Object> ACCEPTING_FILTER = new ProListFilter<Object>() { 
     212 
     213                public boolean accepts(Object item) { 
     214                        return true; 
     215                } 
     216        }; 
     217         
     218        /** 
     219         * A property holding a filter for the items in the list this palette holds. 
     220         * By default accepts all values. Do not forget to use it in the items() 
     221         * method. 
     222         *  
     223         * @return the property. 
     224         */ 
     225        @SuppressWarnings("unchecked") 
     226        public RwProp<ProListFilter> listFilter() { 
     227                return getBean().makeValueProp("listFilter", ProListFilter.class, ACCEPTING_FILTER); 
     228        } 
     229         
     230        /** 
     231         * Applies a filter to a given list of items. An item remains in the 
     232         * resulting list if it passes all filters. 
     233         *  
     234         * @param <T> 
     235         *            the type of the items. 
     236         * @param list 
     237         *            the list to be filtered. 
     238         * @param filter 
     239         *            the list of filters to be applied 
     240         * @return the filtered list. 
     241         */ 
     242        public static <T> List<T> applyFilter(List<T> list, ProListFilter<T> filter) { 
     243                List<T> result = new ArrayList<T>(); 
     244                for (T item : list) { 
     245                        if (filter.accepts(item)) { 
     246                                result.add(item); 
     247                        } 
     248                } 
     249                return result; 
     250        } 
    202251}