aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/java/sip/communicator/impl/gui/utils/InviteContactTransferHandler.java
blob: e4be964c5745449764a8dca557f0e2ab0d77c63c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
/*
 * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
package net.java.sip.communicator.impl.gui.utils;

import java.awt.datatransfer.*;
import java.io.*;
import java.util.*;

import javax.swing.*;

import net.java.sip.communicator.impl.gui.main.contactlist.*;
import net.java.sip.communicator.service.contactlist.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.swing.*;

/**
 * A TransferHandler that we use to handle dropping of <tt>UIContact</tt>s or
 * simple string addresses to the conference invite dialog.
 *
 * @author Sebastien Vincent
 */
public class InviteContactTransferHandler
    extends ExtendedTransferHandler
{
    /**
     * Serial version UID.
     */
    private static final long serialVersionUID = 0L;

    /**
     * The logger.
     */
    private static final Logger logger
        = Logger.getLogger(InviteContactTransferHandler.class);

    /**
     * The data flavor used when transferring <tt>UIContact</tt>s.
     */
    protected static final DataFlavor uiContactDataFlavor
        = new DataFlavor(UIContact.class, "UIContact");

    /**
     * The data flavor used when transferring <tt>UIContact</tt>s.
     */
    protected static final DataFlavor metaContactDataFlavor
        = new DataFlavor(MetaContact.class, "MetaContact");

    /**
     * The invite dialog.
     */
    private final InviteDialog dialog;

    /**
     * If the component is the selected contact list or not
     */
    private final boolean selected;

    /**
     * Constructor.
     *
     * @param dialog the invite dialog
     * @param selected if the column is the selected ones
     */
    public InviteContactTransferHandler(InviteDialog dialog, boolean selected)
    {
        this.dialog = dialog;
        this.selected = selected;
    }

    /**
     * Creates a transferable for text pane components in order to enable drag
     * and drop of text.
     * @param component the component for which to create a
     * <tt>Transferable</tt>
     * @return the created <tt>Transferable</tt>
     */
    @Override
    protected Transferable createTransferable(JComponent component)
    {
        if (component instanceof DefaultContactList)
        {
            MetaContact c =
                (MetaContact)((DefaultContactList)component).getSelectedValue();
            return new MetaContactTransferable(c);
        }

        return super.createTransferable(component);
    }

    /**
     * Indicates whether a component will accept an import of the given
     * set of data flavors prior to actually attempting to import it. We return
     * <tt>true</tt> to indicate that the transfer with at least one of the
     * given flavors would work and <tt>false</tt> to reject the transfer.
     * <p>
     * @param comp component
     * @param flavor the data formats available
     * @return  true if the data can be inserted into the component, false
     * otherwise
     * @throws NullPointerException if <code>support</code> is {@code null}
     */
    public boolean canImport(JComponent comp, DataFlavor flavor[])
    {
        for (int i = 0, n = flavor.length; i < n; i++)
        {
            if (flavor[i].equals(uiContactDataFlavor) ||
                flavor[i].equals(metaContactDataFlavor))
            {
                if (comp instanceof DefaultContactList)
                {
                    return true;
                }

                return false;
            }
        }

        return false;
    }

    /**
     * Handles transfers to the invite dialog.
     *
     * @param comp  the component to receive the transfer;
     * @param t the data to import
     * @return  true if the data was inserted into the component and false
     * otherwise
     */
    public boolean importData(JComponent comp, Transferable t)
    {
        if (t.isDataFlavorSupported(uiContactDataFlavor))
        {
            if(!selected)
                return false;

            Object o = null;

            try
            {
                o = t.getTransferData(uiContactDataFlavor);
            }
            catch (UnsupportedFlavorException e)
            {
                if (logger.isDebugEnabled())
                    logger.debug("Failed to drop meta contact.", e);
            }
            catch (IOException e)
            {
                if (logger.isDebugEnabled())
                    logger.debug("Failed to drop meta contact.", e);
            }

            if (o instanceof ContactNode)
            {
                UIContact uiContact
                    = ((ContactNode) o).getContactDescriptor();

                Object obj = uiContact.getDescriptor();

                if(!(obj instanceof MetaContact))
                    return false;

                Iterator<UIContactDetail> contactDetails
                    = uiContact.getContactDetailsForOperationSet(
                        OperationSetBasicTelephony.class).iterator();
                if(!contactDetails.hasNext())
                    return false;

                MetaContact metaContact =
                    (MetaContact)uiContact.getDescriptor();

                dialog.addSelectedMetaContact(metaContact);
                return true;
            }
        }
        else if(t.isDataFlavorSupported(metaContactDataFlavor))
        {
            MetaContact c = null;

            try
            {
                c = (MetaContact)t.getTransferData(metaContactDataFlavor);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }

            if(selected)
            {
                dialog.removeMetaContact(c);
                dialog.addSelectedMetaContact(c);
                return true;
            }
            else
            {
                dialog.removeSelectedMetaContact(c);
                dialog.addMetaContact(c);
            }
            return true;
        }
        return false;
    }

    /**
     * Transferable for DefaultContactList that enables drag and drop of
     * meta contacts.
     */
    public class MetaContactTransferable
        implements Transferable
    {
        /**
         * The meta contact.
         */
        private final MetaContact metaContact;

        /**
         * Creates an instance of <tt>MetaContactTransferable</tt>.
         * @param metaContact the meta contact to transfer
         */
        public MetaContactTransferable(MetaContact metaContact)
        {
            this.metaContact = metaContact;
        }

        /**
         * Returns supported flavors.
         * @return an array of supported flavors
         */
        public DataFlavor[] getTransferDataFlavors()
        {
            return new DataFlavor[] {   metaContactDataFlavor};
        }

        /**
         * Returns <tt>true</tt> if the given <tt>flavor</tt> is supported,
         * otherwise returns <tt>false</tt>.
         * @param flavor the data flavor to verify
         * @return <tt>true</tt> if the given <tt>flavor</tt> is supported,
         * otherwise returns <tt>false</tt>
         */
        public boolean isDataFlavorSupported(DataFlavor flavor)
        {
            return metaContactDataFlavor.equals(flavor);
        }

        /**
         * Returns the selected text.
         * @param flavor the flavor
         * @return the selected text
         * @exception UnsupportedFlavorException if the requested data flavor
         * is not supported.
         * @exception IOException if the data is no longer available in the
         * requested flavor.
         */
        public Object getTransferData(DataFlavor flavor)
            throws  UnsupportedFlavorException,
                    IOException
        {
            return metaContact;
        }

        /**
         * Returns meta contact.
         *
         * @return meta contact
         */
        public MetaContact getMetaContact()
        {
            return metaContact;
        }
    }
}