1"""
2
3.. moduleauthor:: easygui developers and Stephen Raymond Ferg
4.. default-domain:: py
5.. highlight:: python
6
7Version |release|
8
9"""
10import os
11try:
12    from . import utils as ut
13except (SystemError, ValueError, ImportError):
14    import utils as ut
15
16try:
17    import tkinter as tk  # python 3
18    import tkinter.font as tk_Font
19except:
20    import Tkinter as tk  # python 2
21    import tkFont as tk_Font
22
23# -------------------------------------------------------------------
24#
25# fileboxSetup
26#
27# -------------------------------------------------------------------
28
29
30def fileboxSetup(default, filetypes):
31    if not default:
32        default = os.path.join(".", "*")
33    initialdir, initialfile = os.path.split(default)
34    if not initialdir:
35        initialdir = "."
36    if not initialfile:
37        initialfile = "*"
38    initialbase, initialext = os.path.splitext(initialfile)
39    initialFileTypeObject = FileTypeObject(initialfile)
40
41    allFileTypeObject = FileTypeObject("*")
42    ALL_filetypes_was_specified = False
43
44    if not filetypes:
45        filetypes = list()
46    filetypeObjects = list()
47
48    for filemask in filetypes:
49        fto = FileTypeObject(filemask)
50
51        if fto.isAll():
52            ALL_filetypes_was_specified = True  # remember this
53
54        if fto == initialFileTypeObject:
55            initialFileTypeObject.add(fto)  # add fto to initialFileTypeObject
56        else:
57            filetypeObjects.append(fto)
58
59    # ------------------------------------------------------------------
60    # make sure that the list of filetypes includes the ALL FILES type.
61    # ------------------------------------------------------------------
62    if ALL_filetypes_was_specified:
63        pass
64    elif allFileTypeObject == initialFileTypeObject:
65        pass
66    else:
67        filetypeObjects.insert(0, allFileTypeObject)
68    # ------------------------------------------------------------------
69    # Make sure that the list includes the initialFileTypeObject
70    # in the position in the list that will make it the default.
71    # This changed between Python version 2.5 and 2.6
72    # ------------------------------------------------------------------
73    if len(filetypeObjects) == 0:
74        filetypeObjects.append(initialFileTypeObject)
75
76    if initialFileTypeObject in (filetypeObjects[0], filetypeObjects[-1]):
77        pass
78    else:
79        if ut.runningPython27:
80            filetypeObjects.append(initialFileTypeObject)
81        else:
82            filetypeObjects.insert(0, initialFileTypeObject)
83
84    filetypes = [fto.toTuple() for fto in filetypeObjects]
85
86    return initialbase, initialfile, initialdir, filetypes
87
88    # Hotkeys
89    if buttons:
90        for button_name, button in buttons.items():
91            hotkey_pressed = event.keysym
92            if event.keysym != event.char:  # A special character
93                hotkey_pressed = '<{}>'.format(event.keysym)
94            if button['hotkey'] == hotkey_pressed:
95                __replyButtonText = button_name
96                boxRoot.quit()
97                return
98
99    print("Event not understood")
100
101
102# -------------------------------------------------------------------
103# class FileTypeObject for use with fileopenbox
104# -------------------------------------------------------------------
105class FileTypeObject:
106
107    def __init__(self, filemask):
108        if len(filemask) == 0:
109            raise AssertionError('Filetype argument is empty.')
110
111        self.masks = list()
112
113        if isinstance(filemask, ut.basestring):  # a str or unicode
114            self.initializeFromString(filemask)
115
116        elif isinstance(filemask, list):
117            if len(filemask) < 2:
118                raise AssertionError('Invalid filemask.\n'
119                                     + 'List contains less than 2 members: "{}"'.format(filemask))
120            else:
121                self.name = filemask[-1]
122                self.masks = list(filemask[:-1])
123        else:
124            raise AssertionError('Invalid filemask: "{}"'.format(filemask))
125
126    def __eq__(self, other):
127        if self.name == other.name:
128            return True
129        return False
130
131    def add(self, other):
132        for mask in other.masks:
133            if mask in self.masks:
134                pass
135            else:
136                self.masks.append(mask)
137
138    def toTuple(self):
139        return self.name, tuple(self.masks)
140
141    def isAll(self):
142        if self.name == "All files":
143            return True
144        return False
145
146    def initializeFromString(self, filemask):
147        # remove everything except the extension from the filemask
148        self.ext = os.path.splitext(filemask)[1]
149        if self.ext == "":
150            self.ext = ".*"
151        if self.ext == ".":
152            self.ext = ".*"
153        self.name = self.getName()
154        self.masks = ["*" + self.ext]
155
156    def getName(self):
157        e = self.ext
158        file_types = {".*": "All", ".txt": "Text",
159                      ".py": "Python", ".pyc": "Python", ".xls": "Excel"}
160        if e in file_types:
161            return '{} files'.format(file_types[e])
162        if e.startswith("."):
163            return '{} files'.format(e[1:].upper())
164        return '{} files'.format(e.upper())
165