Ticket #2351: dnd-between-two-books.patch

File dnd-between-two-books.patch, 15.1 KB (added by deni, 15 years ago)
  • src/main/java/org/sophie2/main/dnd/MainDndModule.java

    ### Eclipse Workspace Patch 1.0
    #P org.sophie2.main.dnd
     
    1212import org.sophie2.main.dnd.dnddata.FileListData; 
    1313import org.sophie2.main.dnd.dnddata.ResourceRefData; 
    1414import org.sophie2.main.dnd.dnddata.ResourceRevisionData; 
    15 import org.sophie2.main.dnd.providers.BookResourceDataProvider; 
    1615import org.sophie2.main.dnd.providers.CommonResourceDataProvider; 
    17 import org.sophie2.main.dnd.providers.FrameResourceDataProvider; 
    1816import org.sophie2.main.dnd.providers.ImageResourceDataProvider; 
    19 import org.sophie2.main.dnd.providers.PageResourceDataProvider; 
    2017import org.sophie2.main.dnd.providers.ResourceDataProvider; 
    2118 
    2219/** 
     
    9794                 
    9895                res.add(new SimpleSophieExtension<ResourceDataProvider>( 
    9996                                ResourceDataProvider.class, new ImageResourceDataProvider())); 
     97         
    10098                res.add(new SimpleSophieExtension<ResourceDataProvider>( 
    101                                 ResourceDataProvider.class, new FrameResourceDataProvider())); 
    102                 res.add(new SimpleSophieExtension<ResourceDataProvider>( 
    103                                 ResourceDataProvider.class, new PageResourceDataProvider())); 
    104                 res.add(new SimpleSophieExtension<ResourceDataProvider>( 
    105                                 ResourceDataProvider.class, new BookResourceDataProvider())); 
    106                 res.add(new SimpleSophieExtension<ResourceDataProvider>( 
    10799                                ResourceDataProvider.class, new CommonResourceDataProvider())); 
    108100                res.add(new SimpleSophieExtension<DndProvider>(DndProvider.class,  
    109101                                new TemplateRefData.TemplateRefDndProvider())); 
     102                res.add(new SimpleSophieExtension<DndProvider>(DndProvider.class,  
     103                                new TemplateRevisionData.TemplateRevisionDndProvider())); 
    110104                 
    111105                ResourceR4.registerAsExtension(res, CompositeDndElement.class); 
    112106        } 
  • src/main/java/org/sophie2/main/dnd/TemplateRevisionData.java

     
     1package org.sophie2.main.dnd; 
     2 
     3import java.awt.datatransfer.DataFlavor; 
     4import java.io.ByteArrayOutputStream; 
     5import java.io.IOException; 
     6import java.io.InputStream; 
     7 
     8import org.sophie2.base.commons.util.bindata.BinData; 
     9import org.sophie2.base.dnd.AwtTransferable; 
     10import org.sophie2.base.dnd.DndData; 
     11import org.sophie2.base.dnd.DndProvider; 
     12import org.sophie2.base.dnd.DndTransferable; 
     13import org.sophie2.base.model.resources.r4.model.ResourceRevision; 
     14import org.sophie2.base.persistence.commons.PersistenceOptions; 
     15import org.sophie2.base.persistence.commons.PersistenceUtil; 
     16import org.sophie2.base.persistence.persister.MasterPersister; 
     17import org.sophie2.base.persistence.persister.impl.OutputStreamPackagePersister; 
     18import org.sophie2.base.persistence.ref.ValueRef; 
     19import org.sophie2.base.persistence.storage.Storage; 
     20import org.sophie2.main.dnd.dnddata.ResourceRevisionData; 
     21 
     22/** 
     23 * Implementation of <code>DndData</code> that is responsible for transferring templates. 
     24 *  
     25 * @author deni 
     26 */ 
     27public abstract class TemplateRevisionData extends DndData{ 
     28         
     29        /** 
     30         * The data flavors supported by this {@link DndData}. 
     31         */ 
     32        public static final DataFlavor[] FLAVORS = { new DataFlavor( 
     33                        "application/x-sophie-template-revision;class=java.io.InputStream", 
     34                        "Sophie Template Revision") }; 
     35         
     36        private ResourceRevisionData revisionData; 
     37         
     38        /** 
     39         * Constructs an object by <code>DndTransferable</code>. 
     40         *  
     41         * @param dndTransferable 
     42         *            The {@link DndTransferable} this data is transferred by. 
     43         */ 
     44        protected TemplateRevisionData(DndTransferable dndTransferable) { 
     45                super(FLAVORS, dndTransferable); 
     46                this.revisionData = new ResourceRevisionData(dndTransferable) { 
     47 
     48                        @Override 
     49                        public ResourceRevision getResourceRevision() { 
     50                                return getTemplateRevision(); 
     51                        } 
     52                }; 
     53        } 
     54 
     55        /** 
     56         * Get the <code>ResourceRevision</code> this dnd data is responsible for. 
     57         *  
     58         * @return The {@link ResourceRevision}. 
     59         */ 
     60        public abstract ResourceRevision getTemplateRevision(); 
     61         
     62        @Override 
     63        public BinData exportToBinData() { 
     64                return this.revisionData.exportToBinData(); 
     65        } 
     66         
     67        /** 
     68         * An extension for {@link TemplateRevisionData} objects. 
     69         *  
     70         * @author deni 
     71         */ 
     72        public static class TemplateRevisionDndProvider implements DndProvider { 
     73 
     74                public DndData createDndData(AwtTransferable awtTransferable) { 
     75                        return new TemplateRevisionData(awtTransferable) { 
     76 
     77                                @Override 
     78                                public ResourceRevision getTemplateRevision() { 
     79                                         
     80                                        // TODO: copied from TemplateRefData 
     81                                        PersistenceOptions actualOptions = PersistenceOptions.getLoadOptions(); 
     82                                        Storage root = new Storage(); 
     83                                        ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     84 
     85                                        try { 
     86                                                InputStream is = getDataFromAwtUnchecked(InputStream.class); 
     87                                                BinData.transport(is, bos); 
     88 
     89                                                MasterPersister.persist(root, bos, actualOptions, 
     90                                                                OutputStreamPackagePersister.OUTPUT_STREAM_PERSISTER_SCHEMA); 
     91 
     92                                                ValueRef<ResourceRevision> revisionRef = new ValueRef<ResourceRevision>(); 
     93                                                 
     94                                                MasterPersister.persist(revisionRef, root, actualOptions, PersistenceUtil 
     95                                                                .getStorageR3Schema(ResourceRevision.class)); 
     96                                                return revisionRef.get(); 
     97 
     98                                        } catch (IOException e) { 
     99                                                throw new RuntimeException(e); 
     100                                        } 
     101                                } 
     102 
     103                        }; 
     104                } 
     105 
     106                public Class<? extends DndData> getProvidedData() { 
     107                        return TemplateRevisionData.class; 
     108                } 
     109 
     110                public DataFlavor[] getSupportedFlavors() { 
     111                        return FLAVORS; 
     112                } 
     113        } 
     114 
     115} 
  • src/main/java/org/sophie2/main/dnd/transferables/TemplateTransferable.java

     
    55import org.sophie2.base.dnd.DndData; 
    66import org.sophie2.base.dnd.SophieTransferable; 
    77import org.sophie2.base.model.resources.r4.ResourceRefR4; 
     8import org.sophie2.base.model.resources.r4.access.DelegatingAccess; 
     9import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
     10import org.sophie2.base.model.resources.r4.model.ResourceRevision; 
    811import org.sophie2.base.model.resources.r4.resources.ResourceH; 
    912import org.sophie2.base.model.resources.r4.resources.ResourceR4; 
    1013import org.sophie2.main.dnd.TemplateRefData; 
     14import org.sophie2.main.dnd.TemplateRevisionData; 
    1115 
    1216/** 
    1317 * A {@link SophieTransferable} that is responsible for transferring templates. 
     
    4448                        } 
    4549                         
    4650                }); 
     51                 
     52                dataList.add(new TemplateRevisionData(this) { 
     53 
     54                        @SuppressWarnings("synthetic-access") 
     55                        @Override 
     56                        public ResourceRevision getTemplateRevision() { 
     57                                ResourceAccess access = TemplateTransferable.this.resource.getAccess(); 
     58 
     59                                assert access instanceof DelegatingAccess; 
     60                                ResourceRevision rev = ((DelegatingAccess) access).cloneHeadRevision(); 
     61                                 
     62                                return rev; 
     63                        } 
     64                         
     65                }); 
    4766        } 
    4867 
    4968} 
  • src/main/java/org/sophie2/main/func/resources/logic/ChangeFrameMainResourceHandler.java

    #P org.sophie2.main.func.resources
     
    22 
    33import org.sophie2.base.dnd.DndTransferable; 
    44import org.sophie2.base.dnd.DropHandler; 
     5import org.sophie2.base.model.book.BookH; 
    56import org.sophie2.base.model.book.interfaces.ResourceFrame; 
    67import org.sophie2.base.model.resources.r4.ResourceRefR4; 
    78import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
     
    1213import org.sophie2.main.app.commons.book.BookView; 
    1314import org.sophie2.main.app.commons.element.ElementDropHandler; 
    1415import org.sophie2.main.app.commons.frame.FrameView; 
    15 import org.sophie2.main.app.commons.util.AppViewUtil; 
    1616import org.sophie2.main.dnd.dnddata.ResourceRefData; 
    1717import org.sophie2.main.func.resources.imports.ResourceImportProvider; 
     18import org.sophie2.main.func.resources.imports.ResourceImportUtil; 
    1819import org.sophie2.main.func.resources.imports.SimpleResourceImportProvider; 
    1920import org.sophie2.main.func.resources.imports.SimpleResourceImportProvider.ResourceKindMatcher; 
    2021 
     
    4950                ResourceRefData refData = transferable.getDndData(ResourceRefData.class); 
    5051                assert refData != null : "There is no resource to set for main resource of the frame"; 
    5152                 
     53                BookH book = getView().getBookView().model().get();  
    5254                ResourceAccess frameAccess = getView().getAccess();  
    5355 
    5456                ResourceRefR4 absRef =  
    5557                        transferable.getDndData(ResourceRefData.class).getResourceRef(); 
    56                 final ResourceRefR4 relRef = ResourceRefR4.getRelativeRef(frameAccess.getRef(), absRef); 
     58                final ResourceRefR4 relRef; 
     59                if (absRef.getLocation().startsWith(book.getRef().getLocation())) { 
     60                        relRef = ResourceRefR4.getRelativeRef(frameAccess.getRef(), absRef); 
     61                } else { 
     62                        ResourceRefR4 importedResRef = ResourceImportUtil.importResource(book, transferable);                    
     63                        if (importedResRef == null) { 
     64                                return; 
     65                        } 
     66                         
     67                        relRef = ResourceRefR4.getRelativeRef(frameAccess.getRef(),  
     68                                        importedResRef); 
     69                } 
    5770                 
    5871                // find the new kind of the frame  
    5972                // (depending on the kind of the resource that was dropped) 
     
    6578                } 
    6679                final String newFrameKind = provider.getImportManager().getFrameKind(); 
    6780                                         
    68                 BookDocView bdw = AppViewUtil.getCurrentBookDocView(getView()); 
     81                BookDocView bdw = getView().findParentElement(BookDocView.class); 
    6982                ResourceRefR4 bookToFrameRef = ResourceRefR4.getRelativeRef( 
    7083                                bdw.model().get().getRef(), frameAccess.getRef()); 
    7184 
  • src/main/java/org/sophie2/main/func/resources/imports/SophieFormatImportManager.java

     
    33import java.io.File; 
    44 
    55import org.sophie2.base.commons.util.NaiveImmList; 
     6import org.sophie2.base.dnd.DndTransferable; 
    67import org.sophie2.base.model.resources.r4.ResourceRefR4; 
    78import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
    89import org.sophie2.base.model.resources.r4.access.ResourceLocator; 
     
    1314import org.sophie2.base.model.resources.r4.resources.ResourceR4; 
    1415import org.sophie2.base.persistence.commons.PersistenceOptions; 
    1516import org.sophie2.base.persistence.commons.PersistenceUtil; 
     17import org.sophie2.main.dnd.dnddata.ResourceRevisionData; 
    1618import org.sophie2.main.func.resources.logic.ResourceImportLogic; 
    1719 
    1820/** 
     
    8385        } 
    8486         
    8587        @Override 
     88        public ResourceModel getResourceData(DndTransferable transferable) { 
     89                ResourceRevisionData revisionData = transferable.getDndData(ResourceRevisionData.class); 
     90                if (revisionData == null) { 
     91                        return null; 
     92                } 
     93                 
     94                return revisionData.getResourceRevision().getModel(); 
     95        } 
     96         
     97        @Override 
    8698        public ResourceModel getResourceData(ResourceAccess resAccess) { 
    8799                if (resAccess == null) { 
    88100                        return null; 
  • src/main/java/org/sophie2/main/func/resources/imports/ResourceImportUtil.java

     
    3232import org.sophie2.base.model.resources.r4.changes.ResourceChanger; 
    3333import org.sophie2.base.model.resources.r4.keys.TemplatedKey; 
    3434import org.sophie2.base.model.resources.r4.keys.TemplatedKey.Mode; 
     35import org.sophie2.base.model.resources.r4.model.ResourceModel; 
    3536import org.sophie2.base.model.resources.r4.resources.ResourceH; 
    3637import org.sophie2.base.model.resources.r4.resources.ResourceR4; 
    3738import org.sophie2.core.logging.SophieLog; 
     
    104105 
    105106                return resourceRef; 
    106107        }        
     108         
     109        @SuppressWarnings("unchecked") 
     110        public static ResourceRefR4 importResource(BookH book, DndTransferable transferable) { 
     111                 
     112                final ResourceImportManager<?> importManager =  
     113                        ResourceImportUtil.SOPHIE_FORMAT_PROVIDER.getImportManager(); 
     114                ResourceModel data = (ResourceModel) importManager.getResourceData(transferable); 
     115                if (data == null) { 
     116                        return null; 
     117                } 
     118                 
     119                String title = data.getRaw(ResourceR4.KEY_TITLE); 
     120                final ResourceImportInfo importInfo = new ResourceImportInfo(data, title, null); 
     121                final ResourceRefR4 childRef = importManager.generateChildRef(); 
     122                 
     123                new AutoAction("Import resource " + importInfo.getName() + ".", false) { 
     124                        @Override 
     125                        public void performAuto() { 
    107126 
     127                                importManager.makeResource(getChanger(), childRef, importInfo); 
     128 
     129                        } 
     130                }.register(book.getAccess()); 
     131                 
     132                return book.getRef().append(childRef); 
     133        } 
     134 
    108135        private static <D> void insert(final ResourceImportInfo<D> importInfo, 
    109136                        final ResourceImportManager<D> importManager, BookH book, 
    110137                        ElementH parent, final ResourceRefR4 parentRef, 
  • src/main/java/org/sophie2/main/app/layout/right/library/ApplyFrameTemplateHandler.java

    #P org.sophie2.main.app.layout
     
    22 
    33import org.sophie2.base.commons.util.NaiveImmList; 
    44import org.sophie2.base.dnd.DndTransferable; 
     5import org.sophie2.base.model.book.BookH; 
    56import org.sophie2.base.model.resources.r4.ResourceRefR4; 
    67import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
    78import org.sophie2.base.model.resources.r4.changes.AutoAction; 
     
    4344         
    4445        public void handleDrop(DndTransferable transferable) { 
    4546                ResourceAccess frameAccess = getView().getAccess(); 
     47                BookH book = getView().getBookView().model().get(); 
    4648                 
    4749                TemplateRefData refData = transferable.getDndData(TemplateRefData.class); 
    4850                assert refData != null : "There is no template to apply"; 
    49                 final ResourceRefR4 templateRef = ResourceRefR4.getRelativeRef(frameAccess.getRef(), 
    50                                 refData.getTemplateRef()); 
    5151                 
     52                final ResourceRefR4 templateRef; 
     53                if (book.getRef().getLocation().startsWith(refData.getTemplateRef().getLocation())) { 
     54                        templateRef = ResourceRefR4.getRelativeRef(frameAccess.getRef(), 
     55                                                refData.getTemplateRef()); 
     56                } else { 
     57                        // import the template 
     58                        templateRef = ResourceRefR4.NONE_REF; 
     59                } 
     60                 
    5261                ResourceAccess templateAccess = frameAccess.open(templateRef, null); 
    5362                ResourceH templateH = ResourceH.getHelper(templateAccess);       
    5463                final String templateKind = templateH.getKind();