#   Programmer: Daniel Pozmanter
#   E-mail:     drpython@bluebottle.com
#   Note:       You must reply to the verification e-mail to get through.
#
#   Copyright 2003-2007 Daniel Pozmanter
#
#   Distributed under the terms of the GPL (GNU Public License)
#
#   DrPython is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program 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 General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#   Requirements(Dependencies):  Install Python, and wxPython.
#
#   Tested On Windows, Linux, Mac OS X
#
#   Icons taken from "Klassic New Crisp Icons" by Asif Ali Rizwaan (therizwaan) from the KDE-LOOK site (some edited a bit).
#   A humble and excellent artist.
#   Oh, the python icon is taken from wxPython.
#   The basic design of the program is meant to roughly (ROUGHLY) mimick DrScheme.
#   The purpose is the same, to provide a simple IDE(integrated development environment) ideal for teaching.
#   The DrPython icon itself was based on the DrScheme icon, with a slightly edited wxpython icon inserted(note yellow tongue, googly eyes).
#
#   This program could not have been written without the wonderful work of the people behind
#   python and wxPython, in particular the Styled Text Control.  Thank you.  Hopefully this tool will be of use.

#This is a module to make adding
#to / from zip files really easy.

#Targets are prefs directory,
#creating a directory structure from the drscript menu
#an all plugins.

import os, zipfile, string, tempfile
from drPrefsFile import ExtractPreferenceFromText

def AddDirectoryToZipFile(directory, dirname, zip):
    dlist = os.listdir(directory)

    for item in dlist:
        absitem = os.path.join(directory, item)
        zipitem = os.path.join(dirname, item)
        if os.path.isdir(absitem):
            AddDirectoryToZipFile(absitem, zipitem, zip)
        else:
            zip.write(absitem, zipitem)

def AddDrScriptsToZipFile(prefdir, zip):
    scriptfile = prefdir + "/drscript.dat"

    if os.path.exists(scriptfile):
        newlines = []

        dirstrings = ['drscripts']
        lastCount = 0
        #Read from the file
        f = open(scriptfile, 'rb')
        #Initialize
        line = f.readline()
        while line:
            c = line.count('\t')
            indentationstring = line[:c]
            line = line[c:].rstrip()
            while lastCount > c:
                dirstrings.pop()
                lastCount = lastCount - 1

            if line[0] == '>':
                dirstrings.append(line[1:])
                newlines.append(indentationstring + line)
                c = c + 1
            else:
                line_path = ExtractPreferenceFromText(line, "path")
                line_title = ExtractPreferenceFromText(line, "title")

                line_filename = os.path.basename(line_path)

                if os.path.exists(line_path):
                    zippath = string.join(dirstrings, '/')
                    zipname = os.path.join(zippath, line_filename)
                    zip.write(line_path, zipname)
                    newlines.append(indentationstring + '<path>' + zipname + '</path><title>' + line_title + '</title>')

            lastCount = c
            line = f.readline()
        f.close()


        #Add the edited Script File:
        newtext = string.join(newlines, '\n')

        tdrscript = tempfile.mktemp()

        f = file(tdrscript, 'wb')
        f.write(newtext)
        f.close()

        zip.write(tdrscript, 'drscript.dat')

        #Remove the temporary file:
        os.remove(tdrscript)

        #Add Shortcuts
        zip.write(prefdir + "/drscript.shortcuts.dat", 'drscript.shortcuts.dat')


def CreateDirectories(targetdir, zippedfilename):
    zippedfilename = zippedfilename.replace('\\', '/')
    d = zippedfilename.find('/')
    while d > -1:
        dir = zippedfilename[:d]
        targetdir = targetdir + '/' + dir
        if not os.path.exists(targetdir):
            os.mkdir(targetdir)
        zippedfilename = zippedfilename[d+1:]
        d = zippedfilename.find('/')

def ExportDirectoryTo(targetdirectory, filename, ziproot = ''):
    zf = zipfile.ZipFile(filename, 'w')

    AddDirectoryToZipFile(targetdirectory, ziproot, zf)

    zf.close()

def ExportDrScriptsTo(prefdir, filename):
    zf = zipfile.ZipFile(filename, 'w')

    AddDrScriptsToZipFile(prefdir, zf)

    zf.close()

def ExportPreferencesTo(pluginsdirectory, prefdir, shortcutsdir, AppDataDir, filename,
                        shortcuts = True, popupmenu = True, toolbar = True, plugins = True, drscripts = True):
    zf = zipfile.ZipFile(filename, 'w')

    #Add Plugins
    if plugins:
        AddDirectoryToZipFile(pluginsdirectory, '', zf)

    if drscripts:
        AddDrScriptsToZipFile(prefdir, zf)

    #Add Preferences
    zf.write(prefdir + "/preferences.dat", 'preferences.dat')

    #Add Shortcuts
    if shortcuts:
        zf.write(shortcutsdir + "/shortcuts.dat", 'shortcuts.dat')
        zf.write(shortcutsdir + "/stcshortcuts.dat", 'stcshortcuts.dat')

    #Add Pop Up Menu
    if popupmenu:
        zf.write(AppDataDir +  "/popupmenu.dat", 'popupmenu.dat')

    #Add ToolBar
    if toolbar:
        zf.write(AppDataDir + "/toolbar.dat", 'toolbar.dat')

    zf.close()



def ImportDrScriptsFrom(prefdir, filename):
    UnPackIf(prefdir, filename, 'drscript')
    SetupImportedDrScripts(prefdir)

def ImportPluginsFrom(prefdir, filename):
    UnPackIf(prefdir, filename, 'plugins')

def ImportPreferencesFrom(prefdir, filename):
    UnPack(prefdir, filename)
    SetupImportedDrScripts(prefdir)

def ImportJustPreferencesFrom(prefdir, filename):
    UnPackJustPreferences(prefdir, filename)
    SetupImportedDrScripts(prefdir)

def SetupImportedDrScripts(prefdir):
    scriptfile = prefdir + "/drscript.dat"

    if os.path.exists(scriptfile):

        #Read from the file
        f = open(scriptfile, 'rb')
        lines = f.readlines()
        f.close()

        newlines = []

        for line in lines:
            c = line.count('\t')
            identationstring =  line[:c]

            if line[0] != '>':

                line_path = ExtractPreferenceFromText(line, "path")
                line_title = ExtractPreferenceFromText(line, "title")

                new_path = os.path.join(prefdir, line_path)

                if os.path.exists(new_path):
                    newlines.append(identationstring + '<path>' + new_path + '</path><title>' + line_title + '</title>\n')
            else:
                newlines.append(identationstring + line)

        f = open(scriptfile, 'wb')
        f.writelines(newlines)
        f.close()

def UnPack(targetdirectory, filename, label=''):
    zf = zipfile.ZipFile(filename, 'r')

    dir = targetdirectory + label

    if not os.path.exists(dir):
        os.mkdir(dir)

    zippedfiles = zf.namelist()

    for zippedfile in zippedfiles:
        l = len(zippedfile)
        if (zippedfile[l-1] == '/') or (zippedfile[l-1] == '\\'):
            CreateDirectories(dir, zippedfile)
        else:
            CreateDirectories(dir, zippedfile)
            data = zf.read(zippedfile)
            f = file(dir + '/' + zippedfile, 'wb')
            f.write(data)
            f.close()

    zf.close()

def UnPackIf(targetdirectory, filename, prefix, label=''):
    zf = zipfile.ZipFile(filename, 'r')

    dir = targetdirectory + label

    if not os.path.exists(dir):
        os.mkdir(dir)

    zippedfiles = zf.namelist()

    for zippedfile in zippedfiles:
        if zippedfile.find(prefix) == 0:
            l = len(zippedfile)
            if (zippedfile[l-1] == '/') or (zippedfile[l-1] == '\\'):
                CreateDirectories(dir, zippedfile)
            else:
                CreateDirectories(dir, zippedfile)
                data = zf.read(zippedfile)
                f = file(dir + '/' + zippedfile, 'wb')
                f.write(data)
                f.close()

    zf.close()

def UnPackJustPreferences(targetdirectory, filename, label=''):
    zf = zipfile.ZipFile(filename, 'r')

    dir = targetdirectory + label

    if not os.path.exists(dir):
        os.mkdir(dir)

    rawzippedfiles = zf.namelist()

    zippedfiles = []

    targets = ['preferences.dat', 'popupmenu.dat', 'shortcuts.dat', 'stcshortcuts.dat', 'toolbar.dat']

    for rz in rawzippedfiles:
        if rz in targets:
            zippedfiles.append(rz)

    for zippedfile in zippedfiles:
        l = len(zippedfile)
        if (zippedfile[l-1] == '/') or (zippedfile[l-1] == '\\'):
            CreateDirectories(dir, zippedfile)
        else:
            CreateDirectories(dir, zippedfile)
            data = zf.read(zippedfile)
            f = file(dir + '/' + zippedfile, 'wb')
            f.write(data)
            f.close()

    zf.close()
