# @+leo-ver=4-thin
# @+node:bob.20080109185406.1:@thin gtkDialogs.py
# @@language python
# @@tabwidth -4
# @<< docstring >>
# @+node:bob.20071220105852:<< docstring >>
"""Replace Tk dialogs with Gtk dialogs.

At the moment this plugin only replaces Tk's file dialogs, but
other dialogs may be replaced in future.

This plugin consists of two files, this one and runGtkDialogs.py.txt,
and obviously requires gtk2 to be availiable on your system.

runGtkDialogs.py.txt has a .txt extension so it can live
in the plugins folder without being mistaken for a plugin.
This python script is called to show the gtk dialogs.

@settings
=========

This plugin assumes that the command to invoke python is 'python'
but this may be changed by placing:

  @string gtkdialogs_pythoncommand = your_python_command

in the @settings tree of myLeoSettings.leo.


"""

# @-node:bob.20071220105852:<< docstring >>
# @nl
# @<< version history >>
# @+node:bob.20071220123624:<< version history >>
# @@killcolor
# @+at
#
# 1.1 plumloco: Initial version
# 1.2 plumloco: Changed root node to fit in leoPlugins
# 1.3 plumloco: check for c is None in hook handler
# @-at
# @nonl
# @-node:bob.20071220123624:<< version history >>
# @nl

# @<<imports>>
# @+node:bob.20071220110146:<< imports >>
import leoGlobals as g
import leoPlugins

import os
import pickle

try:
    from subprocess import *

    ok = True
except:
    ok = False

import re


# @-node:bob.20071220110146:<< imports >>
# @nl

__revision__ = re.sub(r'^\D+([\d\.]+)\D+$', r'\1', "$Revision: 1.3 $")

__version__ = '0.%s' % __revision__

__plugin_name__ = "GTK Dialogs"

__author__ = "plumloco@hcoop.net"


# @+others
# @+node:bob.20071220111856:init
def init():
    if g.unitTesting:
        return False

    if ok:
        leoPlugins.registerHandler('start2', onStart2)
        g.plugin_signon(__name__)

    return ok


# @-node:bob.20071220111856:init
# @+node:bob.20071220110328:onStart2
def onStart2(tag, keywords):
    """
    Replace tkfile open/save method with external calls to runGtkDialogs.
    """

    global oldopen, oldsave

    c = keywords.get('c')
    if not c:
        return

    global pythoncommand

    oldopen = g.app.gui.runOpenFileDialog
    oldsave = g.app.gui.runSaveFileDialog

    g.funcToMethod(runOpenFileDialog, g.app.gui)
    g.funcToMethod(runSaveFileDialog, g.app.gui)

    pythoncommand = c.config.getString('gtkdialogs_pythoncommand')


# @-node:bob.20071220110328:onStart2
# @+node:bob.20071220094231.10:callGtkDialogs
def callGtkDialogs(data, path='runGtkDialogs.py.txt'):
    data = pickle.dumps(data)

    path = g.os_path_abspath(g.os_path_join(g.app.loadDir, '..', 'plugins', path))

    command = [pythoncommand or 'python', path, data]

    try:
        o = Popen(command, stdout=PIPE)

        o.wait()
        ok = True
    except:
        ok = False

    if not ok:
        g.es('error running gtk file chooser\nreverting to tk dialogs', color='red')
        return False, None

    data = o.communicate()[0].rstrip()

    ret = o.returncode

    if ret or not data:
        return True, None

    return True, pickle.loads(data)


# @-node:bob.20071220094231.10:callGtkDialogs
# @+node:bob.20071220100337:runOpenFileDialog
def runOpenFileDialog(title=None, filetypes=None, defaultextension=None, multiple=False):
    """Call runGtkDialogs open file(s) dialog."""

    initialdir = g.app.globalOpenDir or g.os_path_abspath(os.getcwd())

    data = {
        'dialog': 'filechooser',
        'title': title,
        'initialdir': initialdir,
        'filetypes': filetypes,
        'defaultextension': defaultextension,
        'multiple': multiple,
        'action': 'open',
    }

    ok, data = callGtkDialogs(data)

    if not ok:
        return oldopen(
            title=title, filetypes=filetypes, defaultextension=defaultextension, multiple=multiple
        )

    if data is None:
        return ''
    return data['result']


# @-node:bob.20071220100337:runOpenFileDialog
# @+node:bob.20071220100831:runSaveFileDialog
def runSaveFileDialog(initialfile=None, title=None, filetypes=None, defaultextension=None):
    """Call runGtkDialogs save file dialog."""

    initialdir = g.app.globalOpenDir or g.os_path_abspath(os.getcwd())

    data = {
        'dialog': 'filechooser',
        'title': title,
        'initialdir': initialdir,
        'filetypes': filetypes,
        'defaultextension': defaultextension,
        'action': 'save',
    }

    ok, data = callGtkDialogs(data)
    if not ok:
        return oldsave(initialfile=initialfile, title=title, filetypes=none, defaultextension=none)

    if data is None:
        return ''

    return data['result']


# @-node:bob.20071220100831:runSaveFileDialog
# @-others
# @nonl
# @-node:bob.20080109185406.1:@thin gtkDialogs.py
# @-leo
