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
12 12 import org.sophie2.main.dnd.dnddata.FileListData; 13 13 import org.sophie2.main.dnd.dnddata.ResourceRefData; 14 14 import org.sophie2.main.dnd.dnddata.ResourceRevisionData; 15 import org.sophie2.main.dnd.providers.BookResourceDataProvider;16 15 import org.sophie2.main.dnd.providers.CommonResourceDataProvider; 17 import org.sophie2.main.dnd.providers.FrameResourceDataProvider;18 16 import org.sophie2.main.dnd.providers.ImageResourceDataProvider; 19 import org.sophie2.main.dnd.providers.PageResourceDataProvider;20 17 import org.sophie2.main.dnd.providers.ResourceDataProvider; 21 18 22 19 /** … … 97 94 98 95 res.add(new SimpleSophieExtension<ResourceDataProvider>( 99 96 ResourceDataProvider.class, new ImageResourceDataProvider())); 97 100 98 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>(107 99 ResourceDataProvider.class, new CommonResourceDataProvider())); 108 100 res.add(new SimpleSophieExtension<DndProvider>(DndProvider.class, 109 101 new TemplateRefData.TemplateRefDndProvider())); 102 res.add(new SimpleSophieExtension<DndProvider>(DndProvider.class, 103 new TemplateRevisionData.TemplateRevisionDndProvider())); 110 104 111 105 ResourceR4.registerAsExtension(res, CompositeDndElement.class); 112 106 } -
src/main/java/org/sophie2/main/dnd/TemplateRevisionData.java
1 package org.sophie2.main.dnd; 2 3 import java.awt.datatransfer.DataFlavor; 4 import java.io.ByteArrayOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 8 import org.sophie2.base.commons.util.bindata.BinData; 9 import org.sophie2.base.dnd.AwtTransferable; 10 import org.sophie2.base.dnd.DndData; 11 import org.sophie2.base.dnd.DndProvider; 12 import org.sophie2.base.dnd.DndTransferable; 13 import org.sophie2.base.model.resources.r4.model.ResourceRevision; 14 import org.sophie2.base.persistence.commons.PersistenceOptions; 15 import org.sophie2.base.persistence.commons.PersistenceUtil; 16 import org.sophie2.base.persistence.persister.MasterPersister; 17 import org.sophie2.base.persistence.persister.impl.OutputStreamPackagePersister; 18 import org.sophie2.base.persistence.ref.ValueRef; 19 import org.sophie2.base.persistence.storage.Storage; 20 import 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 */ 27 public 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
5 5 import org.sophie2.base.dnd.DndData; 6 6 import org.sophie2.base.dnd.SophieTransferable; 7 7 import org.sophie2.base.model.resources.r4.ResourceRefR4; 8 import org.sophie2.base.model.resources.r4.access.DelegatingAccess; 9 import org.sophie2.base.model.resources.r4.access.ResourceAccess; 10 import org.sophie2.base.model.resources.r4.model.ResourceRevision; 8 11 import org.sophie2.base.model.resources.r4.resources.ResourceH; 9 12 import org.sophie2.base.model.resources.r4.resources.ResourceR4; 10 13 import org.sophie2.main.dnd.TemplateRefData; 14 import org.sophie2.main.dnd.TemplateRevisionData; 11 15 12 16 /** 13 17 * A {@link SophieTransferable} that is responsible for transferring templates. … … 44 48 } 45 49 46 50 }); 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 }); 47 66 } 48 67 49 68 } -
src/main/java/org/sophie2/main/func/resources/logic/ChangeFrameMainResourceHandler.java
#P org.sophie2.main.func.resources
2 2 3 3 import org.sophie2.base.dnd.DndTransferable; 4 4 import org.sophie2.base.dnd.DropHandler; 5 import org.sophie2.base.model.book.BookH; 5 6 import org.sophie2.base.model.book.interfaces.ResourceFrame; 6 7 import org.sophie2.base.model.resources.r4.ResourceRefR4; 7 8 import org.sophie2.base.model.resources.r4.access.ResourceAccess; … … 12 13 import org.sophie2.main.app.commons.book.BookView; 13 14 import org.sophie2.main.app.commons.element.ElementDropHandler; 14 15 import org.sophie2.main.app.commons.frame.FrameView; 15 import org.sophie2.main.app.commons.util.AppViewUtil;16 16 import org.sophie2.main.dnd.dnddata.ResourceRefData; 17 17 import org.sophie2.main.func.resources.imports.ResourceImportProvider; 18 import org.sophie2.main.func.resources.imports.ResourceImportUtil; 18 19 import org.sophie2.main.func.resources.imports.SimpleResourceImportProvider; 19 20 import org.sophie2.main.func.resources.imports.SimpleResourceImportProvider.ResourceKindMatcher; 20 21 … … 49 50 ResourceRefData refData = transferable.getDndData(ResourceRefData.class); 50 51 assert refData != null : "There is no resource to set for main resource of the frame"; 51 52 53 BookH book = getView().getBookView().model().get(); 52 54 ResourceAccess frameAccess = getView().getAccess(); 53 55 54 56 ResourceRefR4 absRef = 55 57 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 } 57 70 58 71 // find the new kind of the frame 59 72 // (depending on the kind of the resource that was dropped) … … 65 78 } 66 79 final String newFrameKind = provider.getImportManager().getFrameKind(); 67 80 68 BookDocView bdw = AppViewUtil.getCurrentBookDocView(getView());81 BookDocView bdw = getView().findParentElement(BookDocView.class); 69 82 ResourceRefR4 bookToFrameRef = ResourceRefR4.getRelativeRef( 70 83 bdw.model().get().getRef(), frameAccess.getRef()); 71 84 -
src/main/java/org/sophie2/main/func/resources/imports/SophieFormatImportManager.java
3 3 import java.io.File; 4 4 5 5 import org.sophie2.base.commons.util.NaiveImmList; 6 import org.sophie2.base.dnd.DndTransferable; 6 7 import org.sophie2.base.model.resources.r4.ResourceRefR4; 7 8 import org.sophie2.base.model.resources.r4.access.ResourceAccess; 8 9 import org.sophie2.base.model.resources.r4.access.ResourceLocator; … … 13 14 import org.sophie2.base.model.resources.r4.resources.ResourceR4; 14 15 import org.sophie2.base.persistence.commons.PersistenceOptions; 15 16 import org.sophie2.base.persistence.commons.PersistenceUtil; 17 import org.sophie2.main.dnd.dnddata.ResourceRevisionData; 16 18 import org.sophie2.main.func.resources.logic.ResourceImportLogic; 17 19 18 20 /** … … 83 85 } 84 86 85 87 @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 86 98 public ResourceModel getResourceData(ResourceAccess resAccess) { 87 99 if (resAccess == null) { 88 100 return null; -
src/main/java/org/sophie2/main/func/resources/imports/ResourceImportUtil.java
32 32 import org.sophie2.base.model.resources.r4.changes.ResourceChanger; 33 33 import org.sophie2.base.model.resources.r4.keys.TemplatedKey; 34 34 import org.sophie2.base.model.resources.r4.keys.TemplatedKey.Mode; 35 import org.sophie2.base.model.resources.r4.model.ResourceModel; 35 36 import org.sophie2.base.model.resources.r4.resources.ResourceH; 36 37 import org.sophie2.base.model.resources.r4.resources.ResourceR4; 37 38 import org.sophie2.core.logging.SophieLog; … … 104 105 105 106 return resourceRef; 106 107 } 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() { 107 126 127 importManager.makeResource(getChanger(), childRef, importInfo); 128 129 } 130 }.register(book.getAccess()); 131 132 return book.getRef().append(childRef); 133 } 134 108 135 private static <D> void insert(final ResourceImportInfo<D> importInfo, 109 136 final ResourceImportManager<D> importManager, BookH book, 110 137 ElementH parent, final ResourceRefR4 parentRef, -
src/main/java/org/sophie2/main/app/layout/right/library/ApplyFrameTemplateHandler.java
#P org.sophie2.main.app.layout
2 2 3 3 import org.sophie2.base.commons.util.NaiveImmList; 4 4 import org.sophie2.base.dnd.DndTransferable; 5 import org.sophie2.base.model.book.BookH; 5 6 import org.sophie2.base.model.resources.r4.ResourceRefR4; 6 7 import org.sophie2.base.model.resources.r4.access.ResourceAccess; 7 8 import org.sophie2.base.model.resources.r4.changes.AutoAction; … … 43 44 44 45 public void handleDrop(DndTransferable transferable) { 45 46 ResourceAccess frameAccess = getView().getAccess(); 47 BookH book = getView().getBookView().model().get(); 46 48 47 49 TemplateRefData refData = transferable.getDndData(TemplateRefData.class); 48 50 assert refData != null : "There is no template to apply"; 49 final ResourceRefR4 templateRef = ResourceRefR4.getRelativeRef(frameAccess.getRef(),50 refData.getTemplateRef());51 51 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 52 61 ResourceAccess templateAccess = frameAccess.open(templateRef, null); 53 62 ResourceH templateH = ResourceH.getHelper(templateAccess); 54 63 final String templateKind = templateH.getKind();