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
     
    1313import org.sophie2.main.dnd.dnddata.ResourceRefData; 
    1414import org.sophie2.main.dnd.dnddata.ResourceRevisionData; 
    1515import org.sophie2.main.dnd.providers.BookResourceDataProvider; 
    16 import org.sophie2.main.dnd.providers.CommonResourceDataProvider; 
    1716import org.sophie2.main.dnd.providers.FrameResourceDataProvider; 
    1817import org.sophie2.main.dnd.providers.ImageResourceDataProvider; 
    1918import org.sophie2.main.dnd.providers.PageResourceDataProvider; 
     
    9493                                new ResourceRevisionData.ResourceRevisionDndProvider())); 
    9594                res.add(new SimpleSophieExtension<DndProvider>(DndProvider.class,  
    9695                                new FileListData.FileListDndProvider())); 
     96                res.add(new SimpleSophieExtension<ResourceDataProvider>( 
     97                                ResourceDataProvider.class, new FrameResourceDataProvider())); 
    9798                 
    9899                res.add(new SimpleSophieExtension<ResourceDataProvider>( 
    99100                                ResourceDataProvider.class, new ImageResourceDataProvider())); 
    100101                res.add(new SimpleSophieExtension<ResourceDataProvider>( 
    101                                 ResourceDataProvider.class, new FrameResourceDataProvider())); 
    102                 res.add(new SimpleSophieExtension<ResourceDataProvider>( 
    103102                                ResourceDataProvider.class, new PageResourceDataProvider())); 
    104103                res.add(new SimpleSophieExtension<ResourceDataProvider>( 
    105104                                ResourceDataProvider.class, new BookResourceDataProvider())); 
    106                 res.add(new SimpleSophieExtension<ResourceDataProvider>( 
    107                                 ResourceDataProvider.class, new CommonResourceDataProvider())); 
    108105                res.add(new SimpleSophieExtension<DndProvider>(DndProvider.class,  
    109106                                new TemplateRefData.TemplateRefDndProvider())); 
    110107                 
  • src/main/java/org/sophie2/main/dnd/dnddata/FileListData.java

     
    2323 *  
    2424 * @author deni 
    2525 */ 
    26 public class FileListData extends DndData { 
     26public abstract class FileListData extends DndData { 
    2727         
    2828        /** 
    2929         * The data flavors supported by this {@link DndData}. 
    3030         */ 
    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") }; 
    3333 
    3434        /** 
    3535         * Constructs an object by <code>DndTransferable</code>. 
     
    4747         * @return 
    4848         *              A list of the {@link File}s this data is responsible for. 
    4949         */ 
    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(); 
    7455        } 
     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//      } 
    7589                 
    7690                private static List<File> textURIListToFileList(String data) { 
    7791                        List<File> list = new ArrayList<File>(1); 
     
    104118         */ 
    105119        public static class FileListDndProvider implements DndProvider { 
    106120 
    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                        }; 
    109152                } 
    110153 
    111154                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 deni 
    20  */ 
    21 // TODO: make all or most of the other ResourceDataProviders extend this class 
    22 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                         @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                 datas.add(new ResourceRevisionData(transferable) { 
    44  
    45                         @Override 
    46                         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

     
    44 
    55import org.sophie2.base.dnd.DndData; 
    66import org.sophie2.base.dnd.SophieTransferable; 
     7import org.sophie2.base.model.resources.r4.access.ResourceLocator; 
    78import org.sophie2.base.model.resources.r4.resources.ResourceH; 
    89import org.sophie2.base.model.resources.r4.resources.ResourceR4; 
    910import org.sophie2.core.logging.SophieLog; 
     
    2223public class ResourceTransferable extends SophieTransferable { 
    2324 
    2425        private ResourceH resource; 
     26        private ResourceLocator locator; 
    2527 
    2628        /** 
    2729         * Constructs transferable by given {@link ResourceR4}. 
    2830         *  
    2931         * @param resource 
    3032         *            The resource that should be transfered. 
     33         * @param locator 
     34         *            ResourceLocator to use if needed. 
    3135         */ 
    32         public ResourceTransferable(ResourceH resource) { 
     36        public ResourceTransferable(ResourceH resource, ResourceLocator locator) { 
    3337 
    3438                this.resource = resource; 
     39                this.locator = locator; 
    3540        } 
    3641 
    3742        /** 
     
    4247        public ResourceH getResource() { 
    4348                return this.resource; 
    4449        } 
     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        } 
    4559 
    4660        @Override 
    4761        protected void deleteOriginal() { 
     
    6377                                        SophieLog.info(data); 
    6478                                        dataList.add(data); 
    6579                                } 
    66                                 return; 
    6780                        } 
    6881                } 
    6982        } 
  • 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(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/dnd/providers/FrameResourceDataProvider.java

     
     1package org.sophie2.main.dnd.providers; 
     2 
     3import java.util.ArrayList; 
     4import java.util.List; 
     5 
     6import org.sophie2.base.dnd.DndData; 
     7import org.sophie2.base.model.book.FrameH; 
     8import org.sophie2.base.model.resources.r4.ResourceRefR4; 
     9import org.sophie2.base.model.resources.r4.access.DelegatingAccess; 
     10import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
     11import org.sophie2.base.model.resources.r4.resources.ResourceH; 
     12import org.sophie2.main.dnd.dnddata.ResourceRefData; 
     13import 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 */ 
     20public 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
     
    1616import org.sophie2.core.modularity.SophieExtensionPoint; 
    1717import org.sophie2.core.modularity.SophieModule; 
    1818import org.sophie2.core.mvc.SimpleOperation; 
     19import org.sophie2.main.dnd.providers.FrameResourceDataProvider; 
     20import org.sophie2.main.dnd.providers.ResourceDataProvider; 
    1921import org.sophie2.main.func.resources.exports.ExportFormatDialog; 
    2022import org.sophie2.main.func.resources.exports.ResourceExportManager; 
    2123import org.sophie2.main.func.resources.exports.SophieFormatExportManager; 
     
    188190                res.add(new SimpleSophieExtension<Persister>(Persister.class, 
    189191                                new ResourceImportInfoPersister())); 
    190192                 
     193                res.add(new SimpleSophieExtension<ResourceDataProvider>( 
     194                                ResourceDataProvider.class, new CommonResourceDataProvider())); 
     195                 
    191196                BaseSkinPart partChooser = new BaseSkinPart(); 
    192197                String choserID = SkinUtil.getElementId(BinDataChooser.class); 
    193198                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; 
     1package org.sophie2.main.func.resources; 
    22 
     3import java.io.File; 
    34import java.util.ArrayList; 
    45import java.util.List; 
    56 
     
    910import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
    1011import org.sophie2.base.model.resources.r4.model.ResourceRevision; 
    1112import org.sophie2.base.model.resources.r4.resources.ResourceH; 
     13import org.sophie2.main.dnd.dnddata.FileListData; 
    1214import org.sophie2.main.dnd.dnddata.ResourceRefData; 
    1315import org.sophie2.main.dnd.dnddata.ResourceRevisionData; 
     16import org.sophie2.main.dnd.providers.ResourceDataProvider; 
    1417import org.sophie2.main.dnd.transferables.ResourceTransferable; 
     18import org.sophie2.main.func.resources.exports.SophieFormatExportManager; 
    1519 
    1620/** 
    1721 * An extension for {@link DndData}s that all {@link ResourceH}s provide. 
     
    2125// TODO: make all or most of the other ResourceDataProviders extend this class 
    2226public class CommonResourceDataProvider implements ResourceDataProvider { 
    2327 
    24         public List<DndData> getRegisteredDatas(ResourceTransferable transferable) { 
     28        public List<DndData> getRegisteredDatas(final ResourceTransferable transferable) { 
    2529                 
    2630                final ResourceH res = transferable.getResource(); 
    2731                 
     
    5458 
    5559                }); 
    5660                 
     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                 
    57100                return datas; 
    58101        } 
    59102 
  • src/main/java/org/sophie2/main/func/resources/view/AllResourcesPalette.java

     
    2525import org.sophie2.base.model.book.ElementH; 
    2626import org.sophie2.base.model.resources.r4.ResourceRefR4; 
    2727import org.sophie2.base.model.resources.r4.access.ResourceAccess; 
     28import org.sophie2.base.model.resources.r4.access.ResourceLocator; 
    2829import org.sophie2.base.model.resources.r4.resources.ResourceH; 
    2930import org.sophie2.base.skins.SkinElementId; 
    3031import org.sophie2.base.visual.BaseVisualElement; 
     
    4647import org.sophie2.core.prolib.interfaces.RwProp; 
    4748import org.sophie2.core.prolib.list.ProList; 
    4849import org.sophie2.core.prolib.list.ProListFilter; 
     50import org.sophie2.main.app.commons.app.AppMainWindow; 
    4951import org.sophie2.main.app.commons.book.BookDocView; 
    5052import org.sophie2.main.app.commons.book.BookViewOptions; 
    5153import org.sophie2.main.app.commons.util.AppViewUtil; 
     
    341343                                        return false; 
    342344                                } 
    343345                                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); 
    344351 
    345                                 SophieTransferable rt = new ResourceTransferable(res); 
    346  
    347352                                DndExport export = event.getEventParam( 
    348353                                                SophieDragDropHandler.TransferEventIds.TRANSACTION_PARAM_INDEX, 
    349354                                                DndExport.class); 
     
    408413 
    409414                                ResourceH res = ((ResourceItem) palette.firstSelectedItem().get()).resource().get(); 
    410415 
    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); 
    412420 
    413421                                ClipboardManager.get().setContents(rt, ClipboardManager.Operation.COPY); 
    414422 
  • src/main/java/org/sophie2/main/app/commons/element/ElementLogic.java

    #P org.sophie2.main.app.commons
     
    304304                ResourceRefR4 fakeParentRef = MemLocator.generateTempRef();                      
    305305                ModelResourceChanger fakeParentChanger = new ModelResourceChanger(ResourceModel.EMPTY); 
    306306                 
    307                 //FIXME: this does not preserve the z-order 
    308307                ImmTreeList<ActivationChannel> channels = ImmTreeList.<ActivationChannel>empty(); 
    309308                for (ElementView view : parentView.elementViews().get()) { 
    310309                        if (selected.contains(view)) { 
     
    332331                ResourceAccess fakeParentAccess = locator.create(fakeParentRef, null,  
    333332                                LocalResourceRevision.getInitialRevision(model));                        
    334333                ResourceH helper = ResourceH.getHelper(fakeParentAccess, ResourceH.class); 
    335                 ResourceTransferable contents = new ResourceTransferable(helper) { 
     334                ResourceTransferable contents = new ResourceTransferable(helper, locator) { 
    336335                         
    337336                        @Override 
    338337                        protected void deleteOriginal() {