Ticket #2166: copy-paste-external-styled-text.patch

File copy-paste-external-styled-text.patch, 16.9 KB (added by deni, 15 years ago)
  • modules/org.sophie2.base.dnd/src/test/java/org/sophie2/base/dnd/DndDataTest.java

    ### Eclipse Workspace Patch 1.0
    #P sophie
     
    8484        public void testDndData() { 
    8585                 
    8686                try { 
    87                         new DndData(null, null) { 
     87                        new DndData(DataFlavor.stringFlavor, null) { 
    8888                                 
    8989                                @Override 
    9090                                public Object exportToAwt() { 
  • modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/dnddata/ImageData.java

     
    1818public abstract class ImageData extends DndData { 
    1919 
    2020        /** 
    21          * The {@link DataFlavor} this dnd data supports. 
     21         * The {@link DataFlavor}s this dnd data supports. 
    2222         */ 
    23         public static final DataFlavor FLAVOR = DataFlavor.imageFlavor; 
     23        public static final DataFlavor[] FLAVORS = { DataFlavor.imageFlavor }; 
    2424 
    2525        /** 
    2626         * A constructor. 
     
    2929         *            The {@link DndTransferable} this data is transferred by. 
    3030         */ 
    3131        public ImageData(DndTransferable dndTransferable) { 
    32                 super(FLAVOR, dndTransferable); 
     32                super(FLAVORS, dndTransferable); 
    3333        } 
    3434 
    3535        /** 
     
    6666                        return ImageData.class; 
    6767                } 
    6868 
    69                 public DataFlavor getSupportedFlavor() { 
    70                         return FLAVOR; 
     69                public DataFlavor[] getSupportedFlavors() { 
     70                        return FLAVORS; 
    7171                } 
    7272 
    7373        } 
  • modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/dnddata/StringData.java

     
    1818        /** 
    1919         * The data flavor supported by this. 
    2020         */ 
    21         public static final DataFlavor FLAVOR = DataFlavor.stringFlavor; 
     21        public static final DataFlavor[] FLAVORS = { DataFlavor.stringFlavor }; 
    2222 
    2323        /** 
    2424         * Constructor. 
     
    2828         *  
    2929         */ 
    3030        public StringData(DndTransferable transferable) { 
    31                 super(FLAVOR, transferable); 
     31                super(FLAVORS, transferable); 
    3232        } 
    3333 
    3434        /** 
     
    7070                        return StringData.class; 
    7171                } 
    7272 
    73                 public DataFlavor getSupportedFlavor() { 
    74                         return FLAVOR; 
     73                public DataFlavor[] getSupportedFlavors() { 
     74                        return FLAVORS; 
    7575                } 
    7676 
    7777        } 
  • modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/dnddata/RtfData.java

     
    2626        /** 
    2727         * The data flavor supported by this. 
    2828         */ 
    29         public static final DataFlavor FLAVOR =  
    30                 new DataFlavor("text/rtf;class=java.io.InputStream", "Sophie RTF");      
     29        public static final DataFlavor[] FLAVORS = { 
     30                new DataFlavor("text/rtf;class=java.io.InputStream", "Sophie RTF"), 
     31                new DataFlavor("text/rtf;class=java.io.InputStream;charset=unicode", "Sophie RTF"), 
     32                new DataFlavor("text/rtf;class=java.io.InputStream;charset=UTF-8", "Sophie RTF"),                
     33                new DataFlavor("text/rtf;class=java.io.InputStream;charset=UTF-16", "Sophie RTF"), 
     34                new DataFlavor("text/rtf;class=java.io.InputStream;charset=UTF-16BE", "Sophie RTF"), 
     35                new DataFlavor("text/rtf;class=java.io.InputStream;charset=UTF-16LE", "Sophie RTF"), 
     36                new DataFlavor("text/rtf;class=java.io.InputStream;charset=US-ASCII", "Sophie RTF"), 
     37                new DataFlavor("text/rtf;class=java.io.InputStream;charset=ISO-8859-1", "Sophie RTF"), 
     38                new DataFlavor("text/richtext;class=java.io.InputStream", "Sophie RTF"), 
     39                new DataFlavor("text/richtext;class=java.io.InputStream;charset=unicode", "Sophie RTF"), 
     40                new DataFlavor("text/richtext;class=java.io.InputStream;charset=UTF-8", "Sophie RTF"), 
     41                new DataFlavor("text/richtext;class=java.io.InputStream;charset=UTF-16", "Sophie RTF"), 
     42                new DataFlavor("text/richtext;class=java.io.InputStream;charset=UTF-16BE", "Sophie RTF"), 
     43                new DataFlavor("text/richtext;class=java.io.InputStream;charset=UTF-16LE", "Sophie RTF"), 
     44                new DataFlavor("text/richtext;class=java.io.InputStream;charset=US-ASCII", "Sophie RTF"), 
     45                new DataFlavor("text/richtext;class=java.io.InputStream;charset=ISO-8859-1", "Sophie RTF") 
     46        }; 
    3147         
    3248        /** 
    3349         * Constructor. 
     
    3753         *  
    3854         */ 
    3955        public RtfData(DndTransferable transferable) { 
    40                 super(FLAVOR, transferable); 
     56                super(FLAVORS, transferable); 
    4157        } 
    4258         
    4359        /** 
     
    104120                        return RtfData.class; 
    105121                } 
    106122 
    107                 public DataFlavor getSupportedFlavor() { 
    108                         return FLAVOR; 
     123                public DataFlavor[] getSupportedFlavors() { 
     124                        return FLAVORS; 
    109125                } 
    110126        } 
    111127} 
  • modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/SophieTransferable.java

     
    44import java.awt.datatransfer.Transferable; 
    55import java.awt.datatransfer.UnsupportedFlavorException; 
    66import java.io.IOException; 
     7import java.util.ArrayList; 
    78 
    89/** 
    910 * {@link DndTransferable} implementation supporting transfers originating from 
     
    1819 
    1920                        public boolean isDataFlavorSupported(DataFlavor flavor) { 
    2021                                for (DndData data : getDataList()) { 
    21                                         if (data.getFlavor().equals(flavor)) { 
     22                                        for (DataFlavor supportedFlavor : data.getFlavors()) 
     23                                        if (supportedFlavor.equals(flavor)) { 
    2224                                                return true; 
    2325                                        } 
    2426                                } 
     
    2830 
    2931                        public DataFlavor[] getTransferDataFlavors() { 
    3032 
    31                                 int size = getDataList().size(); 
    32  
    33                                 DataFlavor flavors[] = new DataFlavor[size]; 
    34                                 for (int i = 0; i < size; i++) { 
    35                                         flavors[i] = getDataList().get(i).getFlavor(); 
     33                                ArrayList<DataFlavor> flavorsList = new ArrayList<DataFlavor>(); 
     34                                for (DndData data: getDataList()) { 
     35                                        for (DataFlavor flavor : data.getFlavors()) { 
     36                                                flavorsList.add(flavor); 
     37                                        } 
    3638                                } 
    37  
    38                                 return flavors; 
     39                                 
     40                                return flavorsList.toArray(new DataFlavor[flavorsList.size()]); 
    3941                        } 
    4042 
    4143                        public Object getTransferData(DataFlavor flavor) 
    4244                                        throws UnsupportedFlavorException, IOException { 
    4345 
    4446                                for (DndData data : getDataList()) { 
    45                                         if (data.getFlavor().equals(flavor)) { 
     47                                        if (data.getFlavors().contains(flavor)) { 
    4648                                                return data.exportToAwt(); 
    4749                                        } 
    4850                                } 
  • modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/DndData.java

     
    11package org.sophie2.base.dnd; 
    22 
    33import java.awt.datatransfer.DataFlavor; 
     4import java.awt.datatransfer.Transferable; 
    45import java.awt.datatransfer.UnsupportedFlavorException; 
    56import java.io.IOException; 
    67import java.io.InputStream; 
    78import java.io.UnsupportedEncodingException; 
    89 
     10import org.sophie2.base.commons.util.ImmList; 
     11import org.sophie2.base.commons.util.NaiveImmList; 
    912import org.sophie2.base.commons.util.bindata.BinData; 
    1013import org.sophie2.base.commons.util.bindata.RawBinData; 
    1114import org.sophie2.core.prolib.annot.Immutable; 
     
    2427public abstract class DndData { 
    2528 
    2629        private final DndTransferable dndTransferable; 
    27         private final DataFlavor flavor; 
     30        private final ImmList<DataFlavor> flavors; 
    2831 
    2932        /** 
    3033         * A constructor for creating a {@link DndData}. Implementor should provide 
     
    3942                assert flavor != null; 
    4043                assert dndTransferable != null; 
    4144 
    42                 this.flavor = flavor; 
     45                this.flavors = NaiveImmList.<DataFlavor>getEmpty().add(flavor); 
    4346                this.dndTransferable = dndTransferable; 
    4447        } 
     48         
     49        /** 
     50         * A constructor for creating a {@link DndData}. Implementor should provide 
     51         * an already existing {@link DataFlavor}. 
     52         *  
     53         * @param flavors 
     54         *            The non-null data flavors for this. 
     55         * @param dndTransferable 
     56         *            The non-null parent dnd transferable for this. 
     57         */ 
     58        protected DndData(DataFlavor[] flavors, DndTransferable dndTransferable) { 
     59                assert flavors != null; 
     60                assert dndTransferable != null; 
    4561 
     62                NaiveImmList<DataFlavor> flavorsList = NaiveImmList.<DataFlavor>getEmpty(); 
     63                for (DataFlavor flavor : flavors) { 
     64                        flavorsList = flavorsList.add(flavor); 
     65                } 
     66                 
     67                this.flavors = flavorsList;              
     68                this.dndTransferable = dndTransferable; 
     69        } 
     70 
    4671        /** 
    47          * Gets the data flavor supported by this. 
     72         * Gets the data flavors supported by this. 
    4873         *  
    49          * @return The data flavor this is using. 
     74         * @return An ImmList containing all data flavors this is using. 
    5075         */ 
    51         public DataFlavor getFlavor() { 
    52                 return this.flavor; 
     76        public ImmList<DataFlavor> getFlavors() { 
     77                return this.flavors; 
    5378        } 
    5479 
    5580        /** 
     
    88113                assert getDndTransferable() instanceof SophieTransferable; 
    89114                throw new UnsupportedOperationException("Not implemented!"); 
    90115        } 
    91  
     116                 
    92117        /** 
    93118         * Helper method to get the data when it comes from an AWT transferable. 
    94119         *  
     
    105130         *             created properly. 
    106131         *  
    107132         */ 
    108         protected final Object getDataFromAwt() throws UnsupportedFlavorException, 
    109                         IOException { 
     133        protected final Object getDataFromAwt() throws UnsupportedFlavorException, IOException { 
    110134                assert this.dndTransferable instanceof AwtTransferable; 
    111                 return this.dndTransferable.getAwtTransferable().getTransferData( 
    112                                 getFlavor()); 
     135                Transferable awtTransferable = this.dndTransferable.getAwtTransferable();  
     136                 
     137                 
     138                for (DataFlavor flavor : getFlavors()) { 
     139                        if (awtTransferable.isDataFlavorSupported(flavor)) { 
     140                                return awtTransferable.getTransferData(flavor); 
     141                        } 
     142                } 
     143                 
     144                // if no appropriate data flavor is found 
     145                throw new RuntimeException("The requested data is not supported in this flavors"); 
    113146        } 
    114147 
    115148        /** 
     
    125158         */ 
    126159        protected final <T> T getDataFromAwtUnchecked(Class<T> dataClass) { 
    127160                try { 
    128                         return dataClass.cast(this.dndTransferable.getAwtTransferable() 
    129                                         .getTransferData(getFlavor())); 
     161                        return dataClass.cast(getDataFromAwt()); 
    130162                } catch (UnsupportedFlavorException e) { 
    131163                        throw new RuntimeException(e); 
    132164                } catch (IOException e) { 
  • modules/org.sophie2.main.dnd/src/main/java/org/sophie2/main/dnd/dnddata/ResourceRevisionData.java

     
    3030public abstract class ResourceRevisionData extends DndData { 
    3131 
    3232        /** 
    33          * The data flavor supported by this {@link DndData}. 
     33         * The data flavors supported by this {@link DndData}. 
    3434         */ 
    35         public static final DataFlavor FLAVOR = new DataFlavor("application/x-sophie-resource-revision;class=java.io.InputStream", 
    36                         "Sophie Resource Revision"); 
     35        public static final DataFlavor[] FLAVORS = { new DataFlavor("application/x-sophie-resource-revision;class=java.io.InputStream", 
     36                        "Sophie Resource Revision") }; 
    3737         
    3838        /** 
    3939         * Constructs an object by <code>DndTransferable</code>. 
     
    4242         *            The {@link DndTransferable} this data is transferred by. 
    4343         */ 
    4444        protected ResourceRevisionData(DndTransferable dndTransferable) { 
    45                 super(FLAVOR, dndTransferable); 
     45                super(FLAVORS, dndTransferable); 
    4646        } 
    4747         
    4848        /** 
     
    122122                        return ResourceRevisionData.class; 
    123123                } 
    124124 
    125                 public DataFlavor getSupportedFlavor() { 
    126                         return FLAVOR; 
     125                public DataFlavor[] getSupportedFlavors() { 
     126                        return FLAVORS; 
    127127                } 
    128128        } 
    129129} 
     130 No newline at end of file 
  • modules/org.sophie2.base.model.text/src/main/java/org/sophie2/base/model/text/HotTextData.java

     
    2828public abstract class HotTextData extends DndData { 
    2929 
    3030        /** 
    31          * The data flavor supported by this {@link DndData}. 
     31         * The data flavors supported by this {@link DndData}. 
    3232         */ 
    33         public static final DataFlavor FLAVOR = new DataFlavor( 
    34                         "application/x-sophie-hot-text;class=java.io.InputStream", "Hot Text"); 
     33        public static final DataFlavor FLAVORS[] = { new DataFlavor( 
     34                        "application/x-sophie-hot-text;class=java.io.InputStream", "Hot Text")}; 
    3535         
    3636        private static final String ROOT_NODE_NAME = "root"; 
    3737 
     
    4242         *            The {@link DndTransferable} this data is transferred by. 
    4343         */ 
    4444        public HotTextData(DndTransferable dndTransferable) { 
    45                 super(FLAVOR, dndTransferable); 
     45                super(FLAVORS, dndTransferable); 
    4646        } 
    4747 
    4848        /** 
     
    110110                        return HotTextData.class; 
    111111                } 
    112112 
    113                 public DataFlavor getSupportedFlavor() { 
    114                         return FLAVOR; 
     113                public DataFlavor[] getSupportedFlavors() { 
     114                        return FLAVORS; 
    115115                } 
    116116        } 
    117117} 
     118 No newline at end of file 
  • modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/DndProvider.java

     
    3434        Class<? extends DndData> getProvidedData(); 
    3535 
    3636        /** 
    37          * Get the {@link DataFlavor} this deals with. 
     37         * Get the {@link DataFlavor}s this deals with. 
    3838         *  
    39          * @return The flavor for this provider. 
     39         * @return The flavors for this provider. 
    4040         */ 
    41         DataFlavor getSupportedFlavor(); 
     41        DataFlavor[] getSupportedFlavors(); 
    4242 
    4343} 
  • modules/org.sophie2.main.dnd/src/main/java/org/sophie2/main/dnd/dnddata/ResourceRefData.java

     
    2020        /** 
    2121         * The data flavor supported by this {@link DndData}. 
    2222         */ 
    23         public static final DataFlavor FLAVOR = new DataFlavor("application/x-sophie-resource-ref;class=java.io.InputStream", 
    24                         "Sophie Resource Reference"); 
     23        public static final DataFlavor[] FLAVORS = { new DataFlavor( 
     24                        "application/x-sophie-resource-ref;class=java.io.InputStream", 
     25                        "Sophie Resource Reference") }; 
    2526 
    2627        /** 
    2728         * Constructs an object by <code>DndTransferable</code>. 
     
    3031         *            The {@link DndTransferable} this data is transferred by. 
    3132         */ 
    3233        protected ResourceRefData(DndTransferable dndTransferable) { 
    33                 super(FLAVOR, dndTransferable); 
     34                super(FLAVORS, dndTransferable); 
    3435        } 
    3536 
    3637        /** 
     
    8687                        return ResourceRefData.class; 
    8788                } 
    8889 
    89                 public DataFlavor getSupportedFlavor() { 
    90                         return FLAVOR; 
     90                public DataFlavor[] getSupportedFlavors() { 
     91                        return FLAVORS; 
    9192                } 
    9293        } 
    9394} 
     95 No newline at end of file 
  • modules/org.sophie2.base.model.text/src/main/java/org/sophie2/base/model/text/smart/ImmHotText.java

     
    545545                                HotPos midPos = changePosKind(pos, HotPosKind.MIDDLE); 
    546546                                if (!hasPosition(midPos)) { 
    547547                                        if (getPosComparator().compare(midPos, getBegin()) < 0) { 
    548                                                 prevPos = pos; 
     548                                                prevPos = changePosKind(getBegin(), pos.getKind()); 
    549549                                                continue; 
    550550                                        } 
    551551                                        // else 
  • modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/BaseDndModule.java

     
    9797                        //TODO may be optimized if find is used. 
    9898                        for(SophieExtension<DndProvider> e : extensions().get()) { 
    9999                                DndProvider provider = e.getObject(); 
    100                                 if (flavor.equals(provider.getSupportedFlavor())) { 
    101                                         return provider; 
     100                                for (DataFlavor supportedFlavor : provider.getSupportedFlavors()) { 
     101                                        if (supportedFlavor.equals(flavor)) { 
     102                                                return provider; 
     103                                        } 
    102104                                } 
    103105                        } 
    104106