# Sketch - A Python-based interactive drawing program
# Copyright (C) 2002 by Bernhard Herzog
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

"""User Script that reloads the image data of an external image or
updates the preview of an EPS file.
"""

import Sketch
from Sketch import _
import Sketch.Scripting
from Sketch.Graphics import external, eps


def reload_image(context):
    image = context.document.CurrentObject()
    if image is not None and isinstance(image, external.ExternalGraphics):
        # Don't try this at home :) It pokes around in the internals of
        # Sketch!

        olddata = image.data
        filename = olddata.Filename()
        oldrect = image.bounding_rect

        # first, remove the old object from the cache.
        if olddata.stored_in_cache \
           and external.instance_cache.has_key(filename):
            del external.instance_cache[filename]
            olddata.stored_in_cache = 0

        # now we can load the data again the normal way because it's not
        # in the cache anymore.
        if image.is_Eps:
            data = eps.load_eps(filename)
        else:
            data = Sketch.load_image(filename)

        # replace the old data object with the new one. Normally we
        # would have to handle the undo info returned. Here we just
        # discard it so that the reload won't be in the history.
        image.SetData(data)

        # some house keeping tasks that are necessary because the sort
        # of thing we're doing here, i.e. modifying an object without
        # undo information etc., wasn't anticipated:
        
        # to make sure that the bboxes get recomputed etc, call the
        # _changed method. SetData should probably do that
        # automatically, but currently it doesn't
        image._changed()

        # make sure the object itself is properly redrawn
        context.document.AddClearRect(oldrect)
        context.document.AddClearRect(image.bounding_rect)
        
        # make sure the selection's idea of the bounding rect is updated
        # too and have the canvas update the handles
        context.document.selection.ResetRectangle()
        context.main_window.canvas.update_handles()


        
Sketch.Scripting.AddFunction('reload_image', _("Reload Image"),
                             reload_image,
                             script_type = Sketch.Scripting.AdvancedScript)
