home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / VCAFE.3.0A / Main.bin / TransferableVisualObjects.java < prev    next >
Text File  |  1998-10-25  |  6KB  |  154 lines

  1. /*
  2.  * Copyright 1998 Symantec Corporation, All Rights Reserved.
  3.  */
  4.  
  5. package com.symantec.itools.vcafe.openapi.datatransfer;
  6.  
  7. import com.symantec.itools.vcafe.openapi.VisualObject;
  8.  
  9. import java.awt.datatransfer.*;
  10. import java.io.IOException;
  11.  
  12. /**
  13.  * Adds <code>StringSelection</code> functionality to transferable <code>VisualObjects</code>.
  14.  * <p>The system clipboard essentially ignores non <code>StringSelection</code> transferables,
  15.  * so we wrap <code>VisualObjects</code> in order to force the system clipboard
  16.  * to freshen/clear Visual Cafe's clipboard.
  17.  * @see VisualCafeClipboard
  18.  * @see com.symantec.itools.vcafe.openapi.VisualCafe#getClipboard
  19.  *
  20.  * @author Symantec Internet Tools Division
  21.  * @version 1.0
  22.  * @since VCafe 3.0
  23.  */
  24. public class TransferableVisualObjects extends StringSelection
  25. {
  26.     /**
  27.      * The <code>DataFlavor</code> of transferable <code>VisualObjects</code>.
  28.      */
  29.     public static final DataFlavor transferableVisualObjectsFlavor = new DataFlavor(VisualObject[].class, "Visual Objects");
  30.     
  31.     /**
  32.      * Constructs a <code>TransferableVisualObjects</code> object that wraps the given <code>VisualObjects</code> as 
  33.      * a <code>Transferable</code> object.
  34.      * <p>Note: the transfer data of the <code>StringSelection</code> flavors is the text "Visual Objects".
  35.      * @param vos the <code>VisualObjects</code> to wrap as a <code>Transferable</code> object.
  36.      */
  37.     public TransferableVisualObjects(VisualObject[] vos) {
  38.         this(vos, ((vos.length == 1) ? vos[0].toString() : "Visual Objects"));
  39.     }
  40.     
  41.     /**
  42.      * Constructs a <code>TransferableVisualObjects</code> object that wraps the given <code>VisualObject</code> as 
  43.      * a <code>Transferable</code> object.
  44.      * <p>Note: the transfer data of the <code>StringSelection</code> flavors is the text "Visual Objects".
  45.      * @param vo the <code>VisualObject</code> to wrap as a <code>Transferable</code> object.
  46.      */
  47.     public TransferableVisualObjects(VisualObject vo) {
  48.         this(vo, vo.toString());
  49.     }
  50.  
  51.     /**
  52.      * Constructs a <code>TransferableVisualObjects</code> object that wraps the given <code>VisualObject</code> as 
  53.      * a <code>Transferable</code> object.
  54.      * @param vo the <code>VisualObject</code> to wrap as a <code>Transferable</code> object.
  55.      * @param textValue the <code>String</code> to use for the transfer data of the <code>StringSelection</code> flavors.
  56.      */
  57.     public TransferableVisualObjects(VisualObject vo, String textValue) {
  58.         this(new VisualObject[]{vo}, textValue);
  59.     }
  60.     
  61.     /**
  62.      * Constructs a <code>TransferableVisualObjects</code> object that wraps the given <code>VisualObjects</code> as 
  63.      * a <code>Transferable</code> object.
  64.      * @param vos the <code>VisualObjects</code> to wrap as a <code>Transferable</code> object.
  65.      * @param textValue the <code>String</code> to use for the transfer data of the <code>StringSelection</code> flavors.
  66.      */
  67.     public TransferableVisualObjects(VisualObject[] vos, String textValue) {
  68.         super(textValue);
  69.         visualObjects = vos;
  70.  
  71.         //
  72.         //    Determine the flavor of the VisualObjects.
  73.         //    If all of the VisualObjects are of the same type, we can
  74.         //    register a specific flavor for them, so clients can query on it
  75.         //
  76.         String flavorClassName = vos[0].getClassName();
  77.         for (int i = 1; i<vos.length; i++) {
  78.             if (!flavorClassName.equals(vos[i].getClassName())) {
  79.                 flavorClassName = null;
  80.                 break;
  81.             }
  82.         }
  83.         if (flavorClassName != null) {
  84.             try {
  85.                 visualObjectsFlavor = new DataFlavor(Class.forName(flavorClassName), flavorClassName);
  86.             } catch (ClassNotFoundException cnfe) {}
  87.         }
  88.     }
  89.  
  90.     /**
  91.      * Gets the transferable <code>VisualObjects</code>.
  92.      * @return an array of the <code>VisualObjects</code> being transferred.
  93.      */
  94.     public VisualObject[] getVisualObjects() {
  95.         return visualObjects;
  96.     }
  97.     
  98.     /**
  99.      * Gets an array of <code>DataFlavor</code> objects indicating the formats the data 
  100.      * can be provided in.  The array should be ordered according to preference
  101.      * for providing the data (from most richly descriptive to least descriptive).
  102.      * <p>The <code>StringSelection</code> flavors are at the end of the array.
  103.      * @return an array of data flavors in which this data can be transferred
  104.      */
  105.     public synchronized DataFlavor[] getTransferDataFlavors()
  106.     {
  107.         DataFlavor[] sFlavors = super.getTransferDataFlavors();
  108.    
  109.         DataFlavor[] flavors = new DataFlavor[sFlavors.length + 1];
  110.         flavors[0] = transferableVisualObjectsFlavor;
  111.         int f = 1;
  112.         for (int i = 0; i < sFlavors.length; i++, f++)
  113.             flavors[f] = sFlavors[i];
  114.             
  115.         return flavors;
  116.     }
  117.  
  118.     /**
  119.      * Determines whether the specified data flavor is supported for this object.
  120.      * @param flavor the requested flavor for the data.
  121.      * @return <code>true</code> if the <code>DataFlavor</code> is supported, <code>false</code> otherwise.
  122.      */
  123.     public boolean isDataFlavorSupported(DataFlavor flavor)
  124.     {
  125.         return flavor.equals(transferableVisualObjectsFlavor) ||
  126.                 (visualObjectsFlavor != null && flavor.equals(visualObjectsFlavor)) ||
  127.                 super.isDataFlavorSupported(flavor);
  128.     }
  129.  
  130.     /**
  131.      * Gets an object which represents the data to be transferred.  The class of the object returned 
  132.      * is defined by the representation class (<code>DataFlavor.getRepresentationClass()</code>)
  133.      * of the flavor.
  134.      * @param flavor the requested flavor for the data.
  135.      * @return The data to be transferred.
  136.      * @see DataFlavor#getRepresentationClass
  137.      * @exception IOException if the data is no longer available
  138.      *              in the requested flavor.
  139.      * @exception UnsupportedFlavorException if the requested data flavor is
  140.      *              not supported.
  141.      */
  142.     public synchronized Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
  143.     {
  144.         if (flavor.equals(transferableVisualObjectsFlavor))
  145.             return (Object) visualObjects;
  146.         if (visualObjectsFlavor != null && flavor.equals(visualObjectsFlavor))
  147.             return (Object) visualObjects;
  148.         return super.getTransferData(flavor);
  149.     }
  150.  
  151.     private VisualObject[] visualObjects;
  152.     private DataFlavor visualObjectsFlavor = null;        // If all visualObjects are the same type
  153. }
  154.