forked from iampiyushjain/Text-Editor
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Window.py
259 lines (232 loc) · 10.3 KB
/
Window.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
from tkinter import *
from tkinter import messagebox as message
from tkinter import filedialog as fd
from Stack import *
# Class Window is used for managing all the operations in TextEditor
class Window:
def __init__(self):
# Variables declarations at initial level
self.isFileOpen = True
self.File = ""
self.isFileChange = False
self.elecnt = 0
self.mode = "normal"
self.fileTypes = [('All Files', '*.*'),
('Python Files', '*.py'),
('Text Document', '*.txt')]
# Initialisation Of window
self.window = Tk()
self.window.geometry("1200x700+200+150")
self.window.wm_title("Untitled")
# Initialisation of Text Widget
self.TextBox = Text(self.window, highlightthickness=0, font=("Helvetica", 14))
# Initialisation of MenuBar
self.menuBar = Menu(self.window, bg="#eeeeee", font=("Helvetica", 13), borderwidth=0)
self.window.config(menu=self.menuBar)
# File Menu
self.fileMenu = Menu(self.menuBar, tearoff=0, activebackground="#d5d5e2", bg="#eeeeee", bd=2, font="Helvetica")
self.fileMenu.add_command(label=" New Ctrl+N", command=self.new_file, )
self.fileMenu.add_command(label=" Open... Ctrl+O", command=self.open_file)
self.fileMenu.add_command(label=" Save Ctrl+S", command=self.retrieve_input)
self.fileMenu.add_separator()
self.fileMenu.add_command(label=" Exit Ctrl+D", command=self._quit)
self.menuBar.add_cascade(label=" File ", menu=self.fileMenu)
# Edit Menu
self.editMenu = Menu(self.menuBar, tearoff=0, activebackground="#d5d5e2", bg="#eeeeee", bd=2,
font="Helvetica", )
self.editMenu.add_command(label=" Undo Ctrl+Z", command=self.undo)
self.editMenu.add_command(label=" Redo Ctrl+Shift+Z", command=self.redo)
self.editMenu.add_separator()
self.editMenu.add_command(label=" Cut Ctrl+X", command=self.cut)
self.editMenu.add_command(label=" Copy Ctrl+C", command=self.copy)
self.editMenu.add_command(label=" Paste Ctrl+V", command=self.paste)
self.menuBar.add_cascade(label=" Edit ", menu=self.editMenu)
# View Menu
self.viewMenu = Menu(self.menuBar, tearoff=0, activebackground="#d5d5e2", bg="#eeeeee", bd=2,
font="Helvetica", )
self.viewMenu.add_command(label=" Change Mode ", command=self.change_color)
self.menuBar.add_cascade(label=" View ", menu=self.viewMenu)
# Help Menu
self.helpMenu = Menu(self.menuBar, tearoff=0, activebackground="#d5d5e2", bg="#eeeeee", bd=2,
font="Helvetica", )
self.helpMenu.add_command(label=" About ", command=self.about)
self.menuBar.add_cascade(label=" Help ", menu=self.helpMenu)
# Initialisation Of Stack Objects By Original state i.e if the file contains data, it is the Original state of
# that file
self.UStack = Stack(self.TextBox.get("1.0", "end-1c"))
self.RStack = Stack(self.TextBox.get("1.0", "end-1c"))
# Member Functions
# 1. New File method which creates a new file
def new_file(self):
self.TextBox.config(state=NORMAL)
if self.isFileOpen:
if len(self.File) > 0:
if self.isFileChange:
self.save_file(self.File)
self.window.wm_title("Untitled")
self.TextBox.delete('1.0', END)
self.File = ''
else:
if self.isFileChange:
result = message.askquestion('Window Title', 'Do You Want to Save Changes')
self.save_new_file(result)
self.window.wm_title("Untitled")
self.TextBox.delete('1.0', END)
else:
self.isFileOpen = True
self.window.wm_title("Untitled")
self.isFileChange = False
if self.UStack.size() > 0:
self.UStack.clear_stack()
self.UStack.add(self.TextBox.get("1.0", "end-1c"))
# 2. Open a file which opens a file in editing mode
def open_file(self):
self.TextBox.config(state=NORMAL)
if self.isFileOpen and self.isFileChange:
self.save_file(self.File)
filename = fd.askopenfilename(filetypes=self.fileTypes, defaultextension=".txt")
if len(filename) != 0:
self.isFileChange = False
outfile = open(filename, "r")
text = outfile.read()
self.TextBox.delete('1.0', END)
self.TextBox.insert(END, text)
self.window.wm_title(filename)
self.isFileOpen = True
self.File = filename
if self.UStack.size() > 0:
self.UStack.clear_stack()
self.UStack.add(self.TextBox.get("1.0", "end-1c"))
# 3. Save file
def save_file(self, file):
result = message.askquestion('Window Title', 'Do You Want to Save Changes')
if result == "yes":
if len(file) == 0:
saveFile = fd.asksaveasfile(filetypes=self.fileTypes, defaultextension=".txt")
print(saveFile.name)
self.write_file(saveFile.name)
self.TextBox.delete('1.0', END)
else:
self.write_file(file)
# 4. Save new file -> this function is for saving the new file
def save_new_file(self, result):
self.isFileChange = False
if result == "yes":
saveFile = fd.asksaveasfile(filetypes=self.fileTypes, defaultextension=".txt")
self.write_file(saveFile.name)
self.File = saveFile.name
else:
self.TextBox.delete('1.0', END)
# 5. Writing in file
def write_file(self, file):
inputValue = self.TextBox.get("1.0", "end-1c")
outfile = open(file, "w")
outfile.write(inputValue)
# 6. Getting the data from file and showing in the text widget box
def retrieve_input(self):
if self.isFileOpen and len(self.File) != 0:
self.write_file(self.File)
self.isFileChange = False
else:
self.save_new_file("yes")
self.window.wm_title(self.File)
self.isFileOpen = True
# 7. This function invokes whenever a key is pressed whether it is a special-key or a normal key
def key_pressed(self, event):
if event.char == "\x1a" and event.keysym == "Z":
self.redo()
elif event.char == "\x1a" and event.keysym == "z":
self.undo()
elif event.char == "\x13":
self.retrieve_input()
elif event.char == "\x0f":
self.open_file()
elif event.char == "\x0e":
self.new_file()
elif event.char == "\x04":
self._quit()
elif event.char == " " or event.char == ".":
self.isFileChange = True
inputValue = self.TextBox.get("1.0", "end-1c")
self.UStack.add(inputValue)
elif event.keysym == 'Return':
self.isFileChange = True
inputValue = self.TextBox.get("1.0", "end-1c")
self.UStack.add(inputValue)
elif event.keysym == 'BackSpace':
self.isFileChange = True
inputValue = self.TextBox.get("1.0", "end-1c")
self.UStack.add(inputValue)
elif (event.keysym == 'Up' or event.keysym == 'Down') or (event.keysym == 'Left' or event.keysym == 'Right'):
self.isFileChange = True
self.elecnt = 0
inputValue = self.TextBox.get("1.0", "end-1c")
self.UStack.add(inputValue)
else:
self.isFileChange = True
inputValue = self.TextBox.get("1.0", "end-1c")
if self.elecnt >= 1:
self.UStack.remove()
self.UStack.add(inputValue)
self.elecnt += 1
if self.TextBox.get("1.0", "end-1c") == self.UStack.ele(0):
self.isFileChange = False
# 8. Undo the data by calling Stack class functions
def undo(self):
self.isFileChange = True
if self.UStack.size() == 1:
self.UStack.remove()
self.UStack.add(self.TextBox.get("1.0", "end-1c"))
else:
self.RStack.add(self.UStack.remove())
text = self.UStack.peek()
self.TextBox.delete('1.0', END)
self.TextBox.insert(END, text)
# 9. Redo/Rewrite the task/data by calling Stack class functions
def redo(self):
if self.RStack.size() > 1:
text = self.RStack.peek()
self.TextBox.delete('1.0', END)
self.TextBox.insert(END, text)
self.UStack.add(text)
self.RStack.remove()
# 10. Close the window (called when the close button at the right-top is clicked)
def on_closing(self):
if self.isFileOpen and self.isFileChange:
self.save_file(self.File)
self._quit()
# 11. Quit or Exit Function to exit from Text-Editor
def _quit(self):
self.window.quit()
self.window.destroy()
# 12. Night mode view by changing the color of Text widget
def change_color(self):
if self.mode == "normal":
self.mode = "dark"
self.TextBox.configure(background="#2f2b2b", foreground="#BDBDBD", font=("Helvetica", 14),
insertbackground="white")
else:
self.mode = "normal"
self.TextBox.configure(background="white", foreground="black", font=("Helvetica", 14),
insertbackground="black")
# 13. About
def about(self):
outfile = open("About.txt", "r")
text = outfile.read()
self.TextBox.insert(END, text)
self.TextBox.config(state=DISABLED)
# 14. Copy
def copy(self):
self.TextBox.clipboard_clear()
text = self.TextBox.get("sel.first", "sel.last")
self.TextBox.clipboard_append(text)
# 15. Cut
def cut(self):
self.copy()
self.TextBox.delete("sel.first", "sel.last")
self.UStack.add(self.TextBox.get("1.0", "end-1c"))
# 16. Paste
def paste(self):
text = self.TextBox.selection_get(selection='CLIPBOARD')
self.TextBox.insert('insert', text)
self.UStack.add(self.TextBox.get("1.0", "end-1c"))