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
84 84 public void testDndData() { 85 85 86 86 try { 87 new DndData( null, null) {87 new DndData(DataFlavor.stringFlavor, null) { 88 88 89 89 @Override 90 90 public Object exportToAwt() { -
modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/dnddata/ImageData.java
18 18 public abstract class ImageData extends DndData { 19 19 20 20 /** 21 * The {@link DataFlavor} this dnd data supports.21 * The {@link DataFlavor}s this dnd data supports. 22 22 */ 23 public static final DataFlavor FLAVOR = DataFlavor.imageFlavor;23 public static final DataFlavor[] FLAVORS = { DataFlavor.imageFlavor }; 24 24 25 25 /** 26 26 * A constructor. … … 29 29 * The {@link DndTransferable} this data is transferred by. 30 30 */ 31 31 public ImageData(DndTransferable dndTransferable) { 32 super(FLAVOR , dndTransferable);32 super(FLAVORS, dndTransferable); 33 33 } 34 34 35 35 /** … … 66 66 return ImageData.class; 67 67 } 68 68 69 public DataFlavor getSupportedFlavor() {70 return FLAVOR ;69 public DataFlavor[] getSupportedFlavors() { 70 return FLAVORS; 71 71 } 72 72 73 73 } -
modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/dnddata/StringData.java
18 18 /** 19 19 * The data flavor supported by this. 20 20 */ 21 public static final DataFlavor FLAVOR = DataFlavor.stringFlavor;21 public static final DataFlavor[] FLAVORS = { DataFlavor.stringFlavor }; 22 22 23 23 /** 24 24 * Constructor. … … 28 28 * 29 29 */ 30 30 public StringData(DndTransferable transferable) { 31 super(FLAVOR , transferable);31 super(FLAVORS, transferable); 32 32 } 33 33 34 34 /** … … 70 70 return StringData.class; 71 71 } 72 72 73 public DataFlavor getSupportedFlavor() {74 return FLAVOR ;73 public DataFlavor[] getSupportedFlavors() { 74 return FLAVORS; 75 75 } 76 76 77 77 } -
modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/dnddata/RtfData.java
26 26 /** 27 27 * The data flavor supported by this. 28 28 */ 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 }; 31 47 32 48 /** 33 49 * Constructor. … … 37 53 * 38 54 */ 39 55 public RtfData(DndTransferable transferable) { 40 super(FLAVOR , transferable);56 super(FLAVORS, transferable); 41 57 } 42 58 43 59 /** … … 104 120 return RtfData.class; 105 121 } 106 122 107 public DataFlavor getSupportedFlavor() {108 return FLAVOR ;123 public DataFlavor[] getSupportedFlavors() { 124 return FLAVORS; 109 125 } 110 126 } 111 127 } -
modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/SophieTransferable.java
4 4 import java.awt.datatransfer.Transferable; 5 5 import java.awt.datatransfer.UnsupportedFlavorException; 6 6 import java.io.IOException; 7 import java.util.ArrayList; 7 8 8 9 /** 9 10 * {@link DndTransferable} implementation supporting transfers originating from … … 18 19 19 20 public boolean isDataFlavorSupported(DataFlavor flavor) { 20 21 for (DndData data : getDataList()) { 21 if (data.getFlavor().equals(flavor)) { 22 for (DataFlavor supportedFlavor : data.getFlavors()) 23 if (supportedFlavor.equals(flavor)) { 22 24 return true; 23 25 } 24 26 } … … 28 30 29 31 public DataFlavor[] getTransferDataFlavors() { 30 32 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 } 36 38 } 37 38 return flavors ;39 40 return flavorsList.toArray(new DataFlavor[flavorsList.size()]); 39 41 } 40 42 41 43 public Object getTransferData(DataFlavor flavor) 42 44 throws UnsupportedFlavorException, IOException { 43 45 44 46 for (DndData data : getDataList()) { 45 if (data.getFlavor ().equals(flavor)) {47 if (data.getFlavors().contains(flavor)) { 46 48 return data.exportToAwt(); 47 49 } 48 50 } -
modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/DndData.java
1 1 package org.sophie2.base.dnd; 2 2 3 3 import java.awt.datatransfer.DataFlavor; 4 import java.awt.datatransfer.Transferable; 4 5 import java.awt.datatransfer.UnsupportedFlavorException; 5 6 import java.io.IOException; 6 7 import java.io.InputStream; 7 8 import java.io.UnsupportedEncodingException; 8 9 10 import org.sophie2.base.commons.util.ImmList; 11 import org.sophie2.base.commons.util.NaiveImmList; 9 12 import org.sophie2.base.commons.util.bindata.BinData; 10 13 import org.sophie2.base.commons.util.bindata.RawBinData; 11 14 import org.sophie2.core.prolib.annot.Immutable; … … 24 27 public abstract class DndData { 25 28 26 29 private final DndTransferable dndTransferable; 27 private final DataFlavor flavor;30 private final ImmList<DataFlavor> flavors; 28 31 29 32 /** 30 33 * A constructor for creating a {@link DndData}. Implementor should provide … … 39 42 assert flavor != null; 40 43 assert dndTransferable != null; 41 44 42 this.flavor = flavor;45 this.flavors = NaiveImmList.<DataFlavor>getEmpty().add(flavor); 43 46 this.dndTransferable = dndTransferable; 44 47 } 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; 45 61 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 46 71 /** 47 * Gets the data flavor supported by this.72 * Gets the data flavors supported by this. 48 73 * 49 * @return The data flavorthis is using.74 * @return An ImmList containing all data flavors this is using. 50 75 */ 51 public DataFlavor getFlavor() {52 return this.flavor ;76 public ImmList<DataFlavor> getFlavors() { 77 return this.flavors; 53 78 } 54 79 55 80 /** … … 88 113 assert getDndTransferable() instanceof SophieTransferable; 89 114 throw new UnsupportedOperationException("Not implemented!"); 90 115 } 91 116 92 117 /** 93 118 * Helper method to get the data when it comes from an AWT transferable. 94 119 * … … 105 130 * created properly. 106 131 * 107 132 */ 108 protected final Object getDataFromAwt() throws UnsupportedFlavorException, 109 IOException { 133 protected final Object getDataFromAwt() throws UnsupportedFlavorException, IOException { 110 134 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"); 113 146 } 114 147 115 148 /** … … 125 158 */ 126 159 protected final <T> T getDataFromAwtUnchecked(Class<T> dataClass) { 127 160 try { 128 return dataClass.cast(this.dndTransferable.getAwtTransferable() 129 .getTransferData(getFlavor())); 161 return dataClass.cast(getDataFromAwt()); 130 162 } catch (UnsupportedFlavorException e) { 131 163 throw new RuntimeException(e); 132 164 } catch (IOException e) { -
modules/org.sophie2.main.dnd/src/main/java/org/sophie2/main/dnd/dnddata/ResourceRevisionData.java
30 30 public abstract class ResourceRevisionData extends DndData { 31 31 32 32 /** 33 * The data flavor supported by this {@link DndData}.33 * The data flavors supported by this {@link DndData}. 34 34 */ 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") }; 37 37 38 38 /** 39 39 * Constructs an object by <code>DndTransferable</code>. … … 42 42 * The {@link DndTransferable} this data is transferred by. 43 43 */ 44 44 protected ResourceRevisionData(DndTransferable dndTransferable) { 45 super(FLAVOR , dndTransferable);45 super(FLAVORS, dndTransferable); 46 46 } 47 47 48 48 /** … … 122 122 return ResourceRevisionData.class; 123 123 } 124 124 125 public DataFlavor getSupportedFlavor() {126 return FLAVOR ;125 public DataFlavor[] getSupportedFlavors() { 126 return FLAVORS; 127 127 } 128 128 } 129 129 } 130 No newline at end of file -
modules/org.sophie2.base.model.text/src/main/java/org/sophie2/base/model/text/HotTextData.java
28 28 public abstract class HotTextData extends DndData { 29 29 30 30 /** 31 * The data flavor supported by this {@link DndData}.31 * The data flavors supported by this {@link DndData}. 32 32 */ 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")}; 35 35 36 36 private static final String ROOT_NODE_NAME = "root"; 37 37 … … 42 42 * The {@link DndTransferable} this data is transferred by. 43 43 */ 44 44 public HotTextData(DndTransferable dndTransferable) { 45 super(FLAVOR , dndTransferable);45 super(FLAVORS, dndTransferable); 46 46 } 47 47 48 48 /** … … 110 110 return HotTextData.class; 111 111 } 112 112 113 public DataFlavor getSupportedFlavor() {114 return FLAVOR ;113 public DataFlavor[] getSupportedFlavors() { 114 return FLAVORS; 115 115 } 116 116 } 117 117 } 118 No newline at end of file -
modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/DndProvider.java
34 34 Class<? extends DndData> getProvidedData(); 35 35 36 36 /** 37 * Get the {@link DataFlavor} this deals with.37 * Get the {@link DataFlavor}s this deals with. 38 38 * 39 * @return The flavor for this provider.39 * @return The flavors for this provider. 40 40 */ 41 DataFlavor getSupportedFlavor();41 DataFlavor[] getSupportedFlavors(); 42 42 43 43 } -
modules/org.sophie2.main.dnd/src/main/java/org/sophie2/main/dnd/dnddata/ResourceRefData.java
20 20 /** 21 21 * The data flavor supported by this {@link DndData}. 22 22 */ 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") }; 25 26 26 27 /** 27 28 * Constructs an object by <code>DndTransferable</code>. … … 30 31 * The {@link DndTransferable} this data is transferred by. 31 32 */ 32 33 protected ResourceRefData(DndTransferable dndTransferable) { 33 super(FLAVOR , dndTransferable);34 super(FLAVORS, dndTransferable); 34 35 } 35 36 36 37 /** … … 86 87 return ResourceRefData.class; 87 88 } 88 89 89 public DataFlavor getSupportedFlavor() {90 return FLAVOR ;90 public DataFlavor[] getSupportedFlavors() { 91 return FLAVORS; 91 92 } 92 93 } 93 94 } 95 No newline at end of file -
modules/org.sophie2.base.model.text/src/main/java/org/sophie2/base/model/text/smart/ImmHotText.java
545 545 HotPos midPos = changePosKind(pos, HotPosKind.MIDDLE); 546 546 if (!hasPosition(midPos)) { 547 547 if (getPosComparator().compare(midPos, getBegin()) < 0) { 548 prevPos = pos;548 prevPos = changePosKind(getBegin(), pos.getKind()); 549 549 continue; 550 550 } 551 551 // else -
modules/org.sophie2.base.dnd/src/main/java/org/sophie2/base/dnd/BaseDndModule.java
97 97 //TODO may be optimized if find is used. 98 98 for(SophieExtension<DndProvider> e : extensions().get()) { 99 99 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 } 102 104 } 103 105 } 104 106