#!/usr/bin/env python
# -*- coding: utf-8 -*-

# (c) 2009 Néstor Amigo Cairo <nestorac@gmail.com>
# Licensed under GPLv3 license or later, at your option

# A first test for the Component GUI system.

import pygtk
pygtk.require('2.0')

import gtk
import gtk.gdk
import time


DND_URI_TUPLE = ("text/uri-list", 0, 25)
DND_FILESOURCE_TUPLE = ("pitivi/file-source", 0, 26)


if gtk.gtk_version < (2, 12):
    import warnings

    msg = ('This example tested with version 2.12.9 of gtk. Your using version %d.%d.%d. Your milage may vary.'
            % gtk.gtk_version)
    warnings.warn(msg)


class FileList(object):
  # First create an iconview
  view = gtk.IconView()
  # Create a store for our iconview and fill it with stock icons
  store = gtk.ListStore(str, gtk.gdk.Pixbuf)
  # Pack our iconview into a scrolled window
  swin = gtk.ScrolledWindow()
  # pack the scrolled window into a simple dialog and run it
  dialog = gtk.Dialog('MSG to MIME conversor')
  
  def __init__(self):
    
#    for attr in dir(gtk):
#        if attr.startswith('STOCK_'):
#            stock_id = getattr(gtk, attr)
#            pixbuf = self.view.render_icon(stock_id,
#                size=gtk.ICON_SIZE_BUTTON, detail=None)
#            if pixbuf:
#                self.store.append(['gtk.%s' % attr, pixbuf])

    # Connect our iconview with our store
    self.view.set_model(self.store)
    # Map store text and pixbuf columns to iconview
    self.view.set_text_column(0)
    self.view.set_pixbuf_column(1)

    self.swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
    self.swin.add_with_viewport(self.view)
    self.swin.show_all()

    self.view.ipcTargets = [('image/png', 0, 0)]
#    view.ipcTargets = [('application/x-ole-storage', 0, 0)]

#    view.drag_source_set(gtk.gdk.BUTTON1_MASK, view.ipcTargets, gtk.gdk.ACTION_COPY)
#    view.connect('drag_data_get', self.drag_data_get

    
    # Drag and drop
    self.view.drag_dest_set(gtk.DEST_DEFAULT_DROP | gtk.DEST_DEFAULT_MOTION,
                        [DND_URI_TUPLE],
                        gtk.gdk.ACTION_COPY)

#    self.view.drag_source_set(gtk.gdk.BUTTON1_MASK,
#                                  [DND_URI_TUPLE, DND_FILESOURCE_TUPLE],
#                                  gtk.gdk.ACTION_COPY)
    self.view.connect("drag_begin", self._dnd_icon_begin)
    self.view.connect("drag_data_get", self._dnd_icon_data_get)
    self.view.connect("drag_data_received", self._dnd_data_received)
    
    close = self.dialog.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_NONE)
    self.dialog.set_default_size(400,400)
    self.dialog.vbox.pack_start(self.swin)
    self.dialog.run()
    
    
#  def drag_data_get(view, widget, context, selection_data, info, timestamp):
#      "Provide data to be copied in a drag-drop"
#      selected = view.get_selected_items()
#      if len(selected) is 0:
#          contents = ''
#      else:
#          contents = dialog.store[selected[0][0]][0] # the image xml
#      selection_data.set(selection_data.target, 8, contents)
#      
#  def on_iconview_drag_begin(dialog, widget, context):
#      selected = view.get_selected_items()
#      if selected:
#          view.drag_source_set_icon_pixbuf(store[selected[0][0]][1])
#      else:
#          view.drag_source_set_icon_stock('gtk-dnd')
          
  def _dnd_data_received(self, widget, context, x, y, selection, targetType,
                      time):
#    filenames = [x.strip() for x in selection.data.strip().split("\n")]
#    self.view.add_files(filenames)
    print 'targetType: %i' %targetType
    if targetType == 25:
      filename = selection.data
      pixbuf = gtk.gdk.pixbuf_new_from_file('/home/nestor/Proyectos/componentGui/dragtargets.py')
      self.store.append([filename, 0])
    else:
      print 'This type of target (%i) is not allowed to be pasted here.' %targetType
      print 'Please, only paste UNIX files.'

  def _dnd_icon_begin(self, widget, context):
      print "icon drag_begin"
      items = self.view.get_selected_items()
      print "got", len(items), "items"
      if len(items) < 1:
          context.drag_abort(int(time.time()))
      else:
          if len(items) == 1:
              thumbnail = self.store.get_value(self.store.get_iter(items[0]), 0)
              self.view.drag_source_set_icon_pixbuf(thumbnail)

  def _dnd_icon_data_get(self, widget, context, selection, targetType, eventTime):
      # calls context.drag_abort(time) if not in a valide place
      print "icon list data_get, type:", targetType
      # get the list of selected uris
      uris = [self.store.get_value(self.store.get_iter(x), 5) for x in self.view.get_selected_items()]
      if len(uris) < 1:
          return
      if targetType == DND_TYPE_PITIVI_FILESOURCE:
          selection.set(selection.target, 8,
                        uris[0])
      elif targetType == DND_TYPE_URI_LIST:
          selection.set(selection.target, 8,
                        string.join(uris, "\n"))



if __name__ == '__main__':

    dialog = FileList()


