text: #!/usr/bin/env python3
  # Copyright © 2012-13 Qtrac Ltd. All rights reserved.
  # This program or module 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 3 of the
  # License, or (at your option) any later version. It is provided for
  # educational purposes and 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.
  
  import os
  import tkinter as tk
  if __name__ == "__main__": # For stand-alone testing with parallel TkUtil
      import sys
      sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
          "..")))
  import TkUtil.TextEdit
  from Globals import *
  
  
  def report(text=None):
      print(text)
  
  
  class Editor(TkUtil.TextEdit.TextEdit):
  
      def __init__(self, master, set_status_text=report, **kwargs):
          super().__init__(master, **kwargs)
          self.set_status_text = set_status_text
          self.filename = None
          for justify in (tk.LEFT, tk.CENTER, tk.RIGHT):
              self.text.tag_configure(justify, justify=justify)
  
  
      def is_empty(self):
          end = self.text.index(tk.END)
          if end == "2.0":
              return len(self.text.get("1.0", end).strip()) == 0
          return False
  
  
      def align(self, alignment):
          for justify in {tk.LEFT, tk.CENTER, tk.RIGHT} - {alignment}:
              self.text.tag_remove(justify, "1.0", tk.END)
          self.text.tag_add(alignment, "1.0", tk.END)
  
  
      def edit_redo(self): # Needed because Redo is always enabled.
          try:
              self.text.edit_redo()
          except tk._tkinter.TclError as err:
              if str(err) != "nothing to redo":
                  self.set_status_text("Can't redo: {}".format(err))
  
  
      def new(self):
          self.delete("1.0", tk.END)
          self.edit_modified(False)
          self.edit_reset()
          self.filename = None
          self.master.title(APPNAME)
          self.set_status_text("")
  
  
      def load(self, filename):
          self.delete("1.0", tk.END)
          try:
              with open(filename, "r", encoding="utf-8") as file:
                  self.insert("1.0", file.read())
          except EnvironmentError as err:
              self.set_status_text("Failed to load {}".format(filename))
              return False
          self.mark_set(tk.INSERT, "1.0")
          self.edit_modified(False)
          self.edit_reset()
          self.master.title("{} \u2014 {}".format(os.path.basename(filename),
                  APPNAME))
          self.filename = filename
          self.set_status_text("Loaded {}".format(filename))
          return True
  
  
      def save(self, filename=None):
          if filename is not None:
              self.filename = filename
          self.master.title("{} \u2014 {}".format(os.path.basename(
                  self.filename), APPNAME))
          try:
              with open(self.filename, "w", encoding="utf-8") as file:
                  file.write(self.get("1.0", tk.END))
          except EnvironmentError as err:
              self.set_status_text("Failed to save {}".format(self.filename))
              return False
          self.edit_modified(False)
          self.set_status_text("Saved {}".format(self.filename))
          return True
  
  
  if __name__ == "__main__":
      if sys.stdout.isatty():
          application = tk.Tk()
          application.title("Editor")
          editor = Editor(application)
          editor.pack(fill=tk.BOTH, expand=True)
          editor.insert("end", "This is a test of the Editor.")
          editor.text.focus()
          application.mainloop()
      else:
          print("Loaded OK")
  