Ticket #2300: drag-out-to-file-system.patch
File drag-out-to-file-system.patch, 20.9 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
13 13 import org.sophie2.main.dnd.dnddata.ResourceRefData; 14 14 import org.sophie2.main.dnd.dnddata.ResourceRevisionData; 15 15 import org.sophie2.main.dnd.providers.BookResourceDataProvider; 16 import org.sophie2.main.dnd.providers.CommonResourceDataProvider;17 16 import org.sophie2.main.dnd.providers.FrameResourceDataProvider; 18 17 import org.sophie2.main.dnd.providers.ImageResourceDataProvider; 19 18 import org.sophie2.main.dnd.providers.PageResourceDataProvider; … … 94 93 new ResourceRevisionData.ResourceRevisionDndProvider())); 95 94 res.add(new SimpleSophieExtension<DndProvider>(DndProvider.class, 96 95 new FileListData.FileListDndProvider())); 96 res.add(new SimpleSophieExtension<ResourceDataProvider>( 97 ResourceDataProvider.class, new FrameResourceDataProvider())); 97 98 98 99 res.add(new SimpleSophieExtension<ResourceDataProvider>( 99 100 ResourceDataProvider.class, new ImageResourceDataProvider())); 100 101 res.add(new SimpleSophieExtension<ResourceDataProvider>( 101 ResourceDataProvider.class, new FrameResourceDataProvider()));102 res.add(new SimpleSophieExtension<ResourceDataProvider>(103 102 ResourceDataProvider.class, new PageResourceDataProvider())); 104 103 res.add(new SimpleSophieExtension<ResourceDataProvider>( 105 104 ResourceDataProvider.class, new BookResourceDataProvider())); 106 res.add(new SimpleSophieExtension<ResourceDataProvider>(107 ResourceDataProvider.class, new CommonResourceDataProvider()));108 105 res.add(new SimpleSophieExtension<DndProvider>(DndProvider.class, 109 106 new TemplateRefData.TemplateRefDndProvider())); 110 107 -
src/main/java/org/sophie2/main/dnd/dnddata/FileListData.java
23 23 * 24 24 * @author deni 25 25 */ 26 public class FileListData extends DndData {26 public abstract class FileListData extends DndData { 27 27 28 28 /** 29 29 * The data flavors supported by this {@link DndData}. 30 30 */ 31 public static DataFlavor[] FLAVORS = { DataFlavor.javaFileListFlavor ,32 new DataFlavor("text/uri-list;class=java.lang.String", "Sophie2 URI List") };31 public static DataFlavor[] FLAVORS = { DataFlavor.javaFileListFlavor }; //, 32 //new DataFlavor("text/uri-list;class=java.lang.String", "Sophie2 URI List") }; 33 33 34 34 /** 35 35 * Constructs an object by <code>DndTransferable</code>. … … 47 47 * @return 48 48 * A list of the {@link File}s this data is responsible for. 49 49 */ 50 @SuppressWarnings("unchecked") 51 public List<File> getFiles() { 52 53 Transferable awtTransferable = this.getDndTransferable().getAwtTransferable(); 54 55 try { 56 if (awtTransferable.isDataFlavorSupported(FLAVORS[0])) { 57 return (List<File>) awtTransferable.getTransferData(FLAVORS[0]); 58 } 59 60 if (awtTransferable.isDataFlavorSupported(FLAVORS[1])) { 61 String uriList = (String) awtTransferable.getTransferData(FLAVORS[1]); 62 return textURIListToFileList(uriList); 63 } 64 65 // impossible to get here 66 throw new RuntimeException("Unsupported data flavor"); 67 } catch (UnsupportedFlavorException e) { 68 // impossible 69 throw new RuntimeException(e); 70 } catch (IOException e) { 71 // wrap it? 72 throw new RuntimeException(e); 73 } 50 public abstract List<File> getFiles(); 51 52 @Override 53 public Object exportToAwt() { 54 return getFiles(); 74 55 } 56 57 58 // /** 59 // * Gets the {@link File}s this data is responsible for. 60 // * 61 // * @return 62 // * A list of the {@link File}s this data is responsible for. 63 // */ 64 // @SuppressWarnings("unchecked") 65 // public List<File> getFiles() { 66 // 67 // Transferable awtTransferable = this.getDndTransferable().getAwtTransferable(); 68 // 69 // try { 70 // if (awtTransferable.isDataFlavorSupported(FLAVORS[0])) { 71 // return (List<File>) awtTransferable.getTransferData(FLAVORS[0]); 72 // } 73 // 74 // if (awtTransferable.isDataFlavorSupported(FLAVORS[1])) { 75 // String uriList = (String) awtTransferable.getTransferData(FLAVORS[1]); 76 // return textURIListToFileList(uriList); 77 // } 78 // 79 // // impossible to get here 80 // throw new RuntimeException("Unsupported data flavor"); 81 // } catch (UnsupportedFlavorException e) { 82 // // impossible 83 // throw new RuntimeException(e); 84 // } catch (IOException e) { 85 // // wrap it? 86 // throw new RuntimeException(e); 87 // } 88 // } 75 89 76 90 private static List<File> textURIListToFileList(String data) { 77 91 List<File> list = new ArrayList<File>(1); … … 104 118 */ 105 119 public static class FileListDndProvider implements DndProvider { 106 120 107 public DndData createDndData(AwtTransferable awtTransferable) { 108 return new FileListData(awtTransferable); 121 public DndData createDndData(AwtTransferable transferable) { 122 return new FileListData(transferable) { 123 124 @SuppressWarnings({ "synthetic-access", "unchecked" }) 125 @Override 126 public List<File> getFiles() { 127 128 Transferable awtTransferable = this.getDndTransferable().getAwtTransferable(); 129 130 try { 131 if (awtTransferable.isDataFlavorSupported(FLAVORS[0])) { 132 return (List<File>) awtTransferable.getTransferData(FLAVORS[0]); 133 } 134 135 if (awtTransferable.isDataFlavorSupported(FLAVORS[1])) { 136 String uriList = (String) awtTransferable.getTransferData(FLAVORS[1]); 137 return textURIListToFileList(uriList); 138 } 139 140 // impossible to get here 141 throw new RuntimeException("Unsupported data flavor"); 142 } catch (UnsupportedFlavorException e) { 143 // impossible 144 throw new RuntimeException(e); 145 } catch (IOException e) { 146 // wrap it? 147 throw new RuntimeException(e); 148 } 149 } 150 151 }; 109 152 } 110 153 111 154 public Class<? extends DndData> getProvidedData() { -
src/main/java/org/sophie2/main/dnd/providers/CommonResourceDataProvider.java
1 package org.sophie2.main.dnd.providers;2 3 import java.util.ArrayList;4 import java.util.List;5 6 import org.sophie2.base.dnd.DndData;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;11 import org.sophie2.base.model.resources.r4.resources.ResourceH;12 import org.sophie2.main.dnd.dnddata.ResourceRefData;13 import org.sophie2.main.dnd.dnddata.ResourceRevisionData;14 import org.sophie2.main.dnd.transferables.ResourceTransferable;15 16 /**17 * An extension for {@link DndData}s that all {@link ResourceH}s provide.18 *19 * @author deni20 */21 // TODO: make all or most of the other ResourceDataProviders extend this class22 public class CommonResourceDataProvider implements ResourceDataProvider {23 24 public List<DndData> getRegisteredDatas(ResourceTransferable transferable) {25 26 final ResourceH res = transferable.getResource();27 28 List<DndData> datas = new ArrayList<DndData>();29 datas.add(new ResourceRefData(transferable) {30 31 @Override32 public ResourceRefR4 getResourceRef() {33 34 ResourceAccess access = res.getAccess();35 36 assert access instanceof DelegatingAccess;37 38 return access.getRef();39 }40 41 });42 43 datas.add(new ResourceRevisionData(transferable) {44 45 @Override46 public ResourceRevision getResourceRevision() {47 ResourceAccess access = res.getAccess();48 49 assert access instanceof DelegatingAccess;50 ResourceRevision rev = ((DelegatingAccess) access).cloneHeadRevision();51 52 return rev;53 }54 55 });56 57 return datas;58 }59 60 public Class<? extends ResourceH> getResourceClass() {61 return ResourceH.class;62 }63 64 } -
src/main/java/org/sophie2/main/dnd/transferables/ResourceTransferable.java
4 4 5 5 import org.sophie2.base.dnd.DndData; 6 6 import org.sophie2.base.dnd.SophieTransferable; 7 import org.sophie2.base.model.resources.r4.access.ResourceLocator; 7 8 import org.sophie2.base.model.resources.r4.resources.ResourceH; 8 9 import org.sophie2.base.model.resources.r4.resources.ResourceR4; 9 10 import org.sophie2.core.logging.SophieLog; … … 22 23 public class ResourceTransferable extends SophieTransferable { 23 24 24 25 private ResourceH resource; 26 private ResourceLocator locator; 25 27 26 28 /** 27 29 * Constructs transferable by given {@link ResourceR4}. 28 30 * 29 31 * @param resource 30 32 * The resource that should be transfered. 33 * @param locator 34 * ResourceLocator to use if needed. 31 35 */ 32 public ResourceTransferable(ResourceH resource ) {36 public ResourceTransferable(ResourceH resource, ResourceLocator locator) { 33 37 34 38 this.resource = resource; 39 this.locator = locator; 35 40 } 36 41 37 42 /** … … 42 47 public ResourceH getResource() { 43 48 return this.resource; 44 49 } 50 51 /** 52 * Returns the {@link ResourceLocator} this transferable can use. 53 * 54 * @return The {@link ResourceLocator}. 55 */ 56 public ResourceLocator getLocator() { 57 return this.locator; 58 } 45 59 46 60 @Override 47 61 protected void deleteOriginal() { … … 63 77 SophieLog.info(data); 64 78 dataList.add(data); 65 79 } 66 return;67 80 } 68 81 } 69 82 } -
src/main/java/org/sophie2/main/dnd/providers/FrameResourceDataProvider.java
1 package org.sophie2.main.dnd.providers;2 3 import java.util.ArrayList;4 import java.util.List;5 6 import org.sophie2.base.dnd.DndData;7 import org.sophie2.base.model.book.FrameH;8 import org.sophie2.base.model.resources.r4.ResourceRefR4;9 import org.sophie2.base.model.resources.r4.access.DelegatingAccess;10 import org.sophie2.base.model.resources.r4.access.ResourceAccess;11 import org.sophie2.base.model.resources.r4.resources.ResourceH;12 import org.sophie2.main.dnd.dnddata.ResourceRefData;13 import org.sophie2.main.dnd.transferables.ResourceTransferable;14 15 /**16 * An extension for {@link DndData}s the {@link FrameH}s provide.17 *18 * @author jani19 */20 public class FrameResourceDataProvider implements ResourceDataProvider {21 22 public List<DndData> getRegisteredDatas(ResourceTransferable transferable) {23 24 final ResourceH res = transferable.getResource();25 assert res instanceof FrameH;26 27 List<DndData> datas = new ArrayList<DndData>();28 29 datas.add(new ResourceRefData(transferable) {30 31 @Override32 public ResourceRefR4 getResourceRef() {33 34 ResourceAccess access = res.getAccess();35 36 assert access instanceof DelegatingAccess;37 38 return access.getRef();39 }40 41 });42 43 return datas;44 }45 46 public Class<? extends ResourceH> getResourceClass() {47 return FrameH.class;48 }49 }50 No newline at end of file -
src/main/java/org/sophie2/main/dnd/providers/FrameResourceDataProvider.java
1 package org.sophie2.main.dnd.providers; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.sophie2.base.dnd.DndData; 7 import org.sophie2.base.model.book.FrameH; 8 import org.sophie2.base.model.resources.r4.ResourceRefR4; 9 import org.sophie2.base.model.resources.r4.access.DelegatingAccess; 10 import org.sophie2.base.model.resources.r4.access.ResourceAccess; 11 import org.sophie2.base.model.resources.r4.resources.ResourceH; 12 import org.sophie2.main.dnd.dnddata.ResourceRefData; 13 import org.sophie2.main.dnd.transferables.ResourceTransferable; 14 15 /** 16 * An extension for {@link DndData}s the {@link FrameH}s provide. 17 * 18 * @author jani 19 */ 20 public class FrameResourceDataProvider implements ResourceDataProvider { 21 22 public List<DndData> getRegisteredDatas(final ResourceTransferable transferable) { 23 24 final ResourceH res = transferable.getResource(); 25 assert res instanceof FrameH; 26 27 List<DndData> datas = new ArrayList<DndData>(); 28 29 datas.add(new ResourceRefData(transferable) { 30 31 @Override 32 public ResourceRefR4 getResourceRef() { 33 34 ResourceAccess access = res.getAccess(); 35 36 assert access instanceof DelegatingAccess; 37 38 return access.getRef(); 39 } 40 41 }); 42 43 return datas; 44 } 45 46 public Class<? extends ResourceH> getResourceClass() { 47 return FrameH.class; 48 } 49 } 50 No newline at end of file -
src/main/java/org/sophie2/main/func/resources/MainFuncResourcesModule.java
#P org.sophie2.main.func.resources
16 16 import org.sophie2.core.modularity.SophieExtensionPoint; 17 17 import org.sophie2.core.modularity.SophieModule; 18 18 import org.sophie2.core.mvc.SimpleOperation; 19 import org.sophie2.main.dnd.providers.FrameResourceDataProvider; 20 import org.sophie2.main.dnd.providers.ResourceDataProvider; 19 21 import org.sophie2.main.func.resources.exports.ExportFormatDialog; 20 22 import org.sophie2.main.func.resources.exports.ResourceExportManager; 21 23 import org.sophie2.main.func.resources.exports.SophieFormatExportManager; … … 188 190 res.add(new SimpleSophieExtension<Persister>(Persister.class, 189 191 new ResourceImportInfoPersister())); 190 192 193 res.add(new SimpleSophieExtension<ResourceDataProvider>( 194 ResourceDataProvider.class, new CommonResourceDataProvider())); 195 191 196 BaseSkinPart partChooser = new BaseSkinPart(); 192 197 String choserID = SkinUtil.getElementId(BinDataChooser.class); 193 198 partChooser.add(choserID, BinDataChooser.COPY_TITLE_PROP_ID, "Copy to '_files'"); -
src/main/java/org/sophie2/main/func/resources/CommonResourceDataProvider.java
1 package org.sophie2.main. dnd.providers;1 package org.sophie2.main.func.resources; 2 2 3 import java.io.File; 3 4 import java.util.ArrayList; 4 5 import java.util.List; 5 6 … … 9 10 import org.sophie2.base.model.resources.r4.access.ResourceAccess; 10 11 import org.sophie2.base.model.resources.r4.model.ResourceRevision; 11 12 import org.sophie2.base.model.resources.r4.resources.ResourceH; 13 import org.sophie2.main.dnd.dnddata.FileListData; 12 14 import org.sophie2.main.dnd.dnddata.ResourceRefData; 13 15 import org.sophie2.main.dnd.dnddata.ResourceRevisionData; 16 import org.sophie2.main.dnd.providers.ResourceDataProvider; 14 17 import org.sophie2.main.dnd.transferables.ResourceTransferable; 18 import org.sophie2.main.func.resources.exports.SophieFormatExportManager; 15 19 16 20 /** 17 21 * An extension for {@link DndData}s that all {@link ResourceH}s provide. … … 21 25 // TODO: make all or most of the other ResourceDataProviders extend this class 22 26 public class CommonResourceDataProvider implements ResourceDataProvider { 23 27 24 public List<DndData> getRegisteredDatas( ResourceTransferable transferable) {28 public List<DndData> getRegisteredDatas(final ResourceTransferable transferable) { 25 29 26 30 final ResourceH res = transferable.getResource(); 27 31 … … 54 58 55 59 }); 56 60 61 datas.add(new FileListData(transferable) { 62 63 @Override 64 public List<File> getFiles() { 65 List<File> result = new ArrayList<File>(); 66 67 SophieFormatExportManager manager = new SophieFormatExportManager(); 68 manager.initLocator(transferable.getLocator()); 69 File file = new File(manager.getFileName(res.getAccess())); 70 boolean handled = manager.export(res.getAccess(), file); 71 assert handled; 72 73 // OutputStreamWriter writer = null; 74 // try { 75 // writer = new OutputStreamWriter(new FileOutputStream(file)); 76 // writer.write("File!"); 77 // } catch (FileNotFoundException e1) { 78 // // TODO Auto-generated catch block 79 // e1.printStackTrace(); 80 // } catch (IOException e) { 81 // // TODO Auto-generated catch block 82 // e.printStackTrace(); 83 // } finally { 84 // if (writer != null) { 85 // try { 86 // writer.close(); 87 // } catch (IOException e) { 88 // // TODO Auto-generated catch block 89 // e.printStackTrace(); 90 // } 91 // } 92 // } 93 94 result.add(file); 95 return result; 96 } 97 98 }); 99 57 100 return datas; 58 101 } 59 102 -
src/main/java/org/sophie2/main/func/resources/view/AllResourcesPalette.java
25 25 import org.sophie2.base.model.book.ElementH; 26 26 import org.sophie2.base.model.resources.r4.ResourceRefR4; 27 27 import org.sophie2.base.model.resources.r4.access.ResourceAccess; 28 import org.sophie2.base.model.resources.r4.access.ResourceLocator; 28 29 import org.sophie2.base.model.resources.r4.resources.ResourceH; 29 30 import org.sophie2.base.skins.SkinElementId; 30 31 import org.sophie2.base.visual.BaseVisualElement; … … 46 47 import org.sophie2.core.prolib.interfaces.RwProp; 47 48 import org.sophie2.core.prolib.list.ProList; 48 49 import org.sophie2.core.prolib.list.ProListFilter; 50 import org.sophie2.main.app.commons.app.AppMainWindow; 49 51 import org.sophie2.main.app.commons.book.BookDocView; 50 52 import org.sophie2.main.app.commons.book.BookViewOptions; 51 53 import org.sophie2.main.app.commons.util.AppViewUtil; … … 341 343 return false; 342 344 } 343 345 ResourceH res = ((ResourceItem) firstItem).resource().get(); 346 347 AppMainWindow mainWindow = AppViewUtil.findMainWindow(palette); 348 ResourceLocator locator = mainWindow.locator().get(); 349 350 SophieTransferable rt = new ResourceTransferable(res, locator); 344 351 345 SophieTransferable rt = new ResourceTransferable(res);346 347 352 DndExport export = event.getEventParam( 348 353 SophieDragDropHandler.TransferEventIds.TRANSACTION_PARAM_INDEX, 349 354 DndExport.class); … … 408 413 409 414 ResourceH res = ((ResourceItem) palette.firstSelectedItem().get()).resource().get(); 410 415 411 SophieTransferable rt = new ResourceTransferable(res); 416 AppMainWindow mainWindow = AppViewUtil.findMainWindow(palette); 417 ResourceLocator locator = mainWindow.locator().get(); 418 419 SophieTransferable rt = new ResourceTransferable(res, locator); 412 420 413 421 ClipboardManager.get().setContents(rt, ClipboardManager.Operation.COPY); 414 422 -
src/main/java/org/sophie2/main/app/commons/element/ElementLogic.java
#P org.sophie2.main.app.commons
304 304 ResourceRefR4 fakeParentRef = MemLocator.generateTempRef(); 305 305 ModelResourceChanger fakeParentChanger = new ModelResourceChanger(ResourceModel.EMPTY); 306 306 307 //FIXME: this does not preserve the z-order308 307 ImmTreeList<ActivationChannel> channels = ImmTreeList.<ActivationChannel>empty(); 309 308 for (ElementView view : parentView.elementViews().get()) { 310 309 if (selected.contains(view)) { … … 332 331 ResourceAccess fakeParentAccess = locator.create(fakeParentRef, null, 333 332 LocalResourceRevision.getInitialRevision(model)); 334 333 ResourceH helper = ResourceH.getHelper(fakeParentAccess, ResourceH.class); 335 ResourceTransferable contents = new ResourceTransferable(helper ) {334 ResourceTransferable contents = new ResourceTransferable(helper, locator) { 336 335 337 336 @Override 338 337 protected void deleteOriginal() {