+# Copyright (C) 2002, Peter Roozemaal.
+#
+# GnuCoMo/CoConf is free software; you may 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, or (at your option)
+# any later version. See the file COPYING.
+
+# TODO: error handling
+
+import string
+import Tkinter
+import tkFileDialog
+import tkMessageBox
+import coxmlfile
+import cotkwidget
+import textbase
+import tkFont
+from textbase import txt
+
+_id = "$Id: cotk.py,v 1.1 2002-11-19 19:21:18 arjen Exp $"
+
+version = "0.0.1 $Date: 2002-11-19 19:21:18 $"
+
+copy = "Copyright (C) 2002, Peter Roozemaal"
+
+licence = txt("lice", "CoConf is free software; you may distribute it under the terms of the GNU General Public License")
+
+ids = ( "CoConf Version "+version, "", copy, licence, "",
+ _id, cotkwidget._id, coxmlfile._id, textbase._id )
+
+def is_a_form(dom):
+ return dom.documentElement.tagName == "form"
+
+# toplevel window
+class Main(Tkinter.Frame):
+ # TODO: translation
+ filetypes_forms = (
+ ( "Cocola forms", ".ccf" ),
+ ( "All files", ".*" )
+ )
+ filetypes_load = (
+ ( "Coconf files", ".ccs" ),
+ ( "Coconf files", ".ccx" ),
+ ( "Coconf files", ".gcm" ),
+ ( "Coconf save files", ".ccs" ),
+ ( "Coconf export files", ".ccx" ),
+ ( "Gnucomo configuration files", ".gcm" ),
+ ( "All files", ".*" )
+ )
+ filetypes_save = (
+ ( "Coconf save files", ".ccs" ),
+ ( "All files", ".*" )
+ )
+ filetypes_exp = (
+ ( "Coconf export files", ".ccx" ),
+ ( "Gnucomo configuration files", ".gcm" ),
+ ( "All files", ".*" )
+ )
+ def __init__(self, master=None):
+ Tkinter.Frame.__init__(self, master)
+ # The following command is important for security; it disables
+ # remote control and spying via the send command.
+ try:
+ self.tk.call(("rename", "send", ""))
+ except Tkinter.TclError:
+ pass
+ self.pack(expand=1, fill="both")
+ self.master.title(txt("ctitle", "Coconf configuration editor"))
+ self.menubar = MenuBar(self)
+ self.menubar.pack(side="top", fill="x")
+ self.status = StatusBar(self)
+ self.status.pack(side="bottom", fill="x")
+ self.main = MainFrame(self)
+ self.main.pack(side="top", fill="both", expand=1)
+ self.filename = ""
+ self.formname = ""
+ def load(self, file):
+ dom = coxmlfile.load_from_file(file)
+ if is_a_form(dom):
+ self.main.new_form(dom)
+ self.status.set_formname(file)
+ self.formname = file
+ self.menubar.helpmenu.entryconfigure(2, state="normal")
+ # TODO: process datafiles
+ dom.unlink()
+ def save(self, file, export):
+ document = coxmlfile.Document()
+ self.main.value_dom(document, export)
+ if not export:
+ document.documentElement.setAttribute("formfile", self.formname)
+ f = open(file, "w")
+ document.writexml(f)
+ f.close()
+ document.unlink()
+ def load_form(self):
+ filename = tkFileDialog.askopenfilename(filetypes=self.filetypes_forms)
+ if filename:
+ self.load(filename)
+ def load_file(self):
+ filename = tkFileDialog.askopenfilename(filetypes=self.filetypes_load)
+ if filename:
+ self.load(filename)
+ def save_file(self):
+ if self.filename:
+ self.save(self.filename, 0)
+ else:
+ self.save_as()
+ def save_copy(self):
+ filename = tkFileDialog.asksaveasfilename(filetypes=self.filetypes_save,
+ defaultextension=".ccs")
+ if filename:
+ self.save(filename, 0)
+ def save_as(self):
+ filename = tkFileDialog.asksaveasfilename(filetypes=self.filetypes_save,
+ defaultextension=".ccs")
+ if filename:
+ self.save(filename, 0)
+ self.filename = filename
+ def export(self):
+ filename = tkFileDialog.asksaveasfilename(filetypes=self.filetypes_exp,
+ defaultextension=".ccx")
+ if filename:
+ self.save(filename, 1)
+ def formhelp(self):
+ self.main.form.provide_help()
+ def about(self):
+ cotkwidget.HelpWin("About CoConf", string.join(ids, '\n'))
+ def help(self):
+ tkMessageBox.showerror(title=txt("sorry", "Sorry"),
+ message=txt("findhelp", "Can't find helpfile."))
+
+# menu bar
+class MenuBar(Tkinter.Frame):
+ def __init__(self, master):
+ Tkinter.Frame.__init__(self, master, relief="raised", borderwidth=2)
+
+ self.file = Tkinter.Menubutton(self, text=txt("mfile", "File"))
+ self.file.pack(side="left")
+ self.filemenu = Tkinter.Menu(self.file)
+ self.filemenu.add_command(label=txt("mform", "Form..."),
+ command=master.load_form)
+ self.filemenu.add_command(label=txt("mopen", "Open..."),
+ command=master.load_file)
+ self.filemenu.add_command(label=txt("msave", "Save"),
+ command=master.save_file)
+ self.filemenu.add_command(label=txt("msaveas", "Save as..."),
+ command=master.save_as)
+ self.filemenu.add_command(label=txt("msavecopy", "Save copy..."),
+ command=master.save_as)
+ self.filemenu.add_command(label=txt("mexport", "Export..."),
+ command=master.export)
+ self.filemenu.add_command(label=txt("mquit", "Quit"),
+ command=master.quit)
+ self.file["menu"] = self.filemenu
+
+ self.set = Tkinter.Menubutton(self, text=txt("mset", "Settings"),
+ state="disabled")
+ self.set.pack(side="left")
+
+ self.help = Tkinter.Menubutton(self, text=txt("mhelp", "Help"))
+ self.help.pack(side="right")
+ self.helpmenu = Tkinter.Menu(self.help)
+ self.helpmenu.add_command(label=txt("mwork", "Working..."),
+ command=master.help)
+ self.helpmenu.add_command(label=txt("mform", "Form..."),
+ state="disabled", command=master.formhelp)
+ self.helpmenu.add_separator()
+ self.helpmenu.add_command(label=txt("mabout", "About..."),
+ command=master.about)
+ self.help["menu"] = self.helpmenu
+
+# main form window with scrollbars
+class MainFrame(Tkinter.Frame):
+ def __init__(self, master):
+ Tkinter.Frame.__init__(self, master)
+ self.canvas = Tkinter.Canvas(self, scrollregion=(0, 0, 200, 200))
+ self.canvas.grid(row=0, column=0, sticky="news")
+ self.scrollY = Tkinter.Scrollbar(self, orient=Tkinter.VERTICAL,
+ command=self.canvas.yview)
+ self.scrollY.grid(row=0, column=1, sticky="ns")
+ self.canvas["yscrollcommand"] = self.scrollY.set
+ self.scrollX = Tkinter.Scrollbar(self, orient=Tkinter.HORIZONTAL,
+ command=self.canvas.xview)
+ self.scrollX.grid(row=1, column=0, sticky="ew")
+ self.canvas["xscrollcommand"] = self.scrollX.set
+ self.grid_columnconfigure(0, weight=1, minsize=0)
+ self.grid_rowconfigure(0, weight=1, minsize=0)
+ self.formid = None
+ self.form = None
+ def new_form(self, dom):
+ if self.formid != None:
+ self.canvas.delete(self.formid)
+ if self.form != None:
+ self.form.cleanup()
+ self.form = cotkwidget.FormWin(self.canvas, dom.documentElement)
+ self.formid = self.canvas.create_window(0, 0, window=self.form,
+ anchor="nw")
+ self.canvas.update();
+ self.canvas["scrollregion"] = self.canvas.bbox("all")
+ def value_dom(self, dom, flags):
+ self.form.value_dom(dom, dom, flags)
+
+# the status bar
+class StatusBar(Tkinter.Frame):
+ def __init__(self, master):
+ Tkinter.Frame.__init__(self, master, relief="raised", borderwidth=2)
+ self.lform = Tkinter.Label(self, text=txt("noform", "<no form>"),
+ relief="sunken", borderwidth=2)
+ self.lform.pack(side="left")
+ self.lfile = Tkinter.Label(self, text=txt("nofile", "<no file>"),
+ relief="sunken", borderwidth=2)
+ self.lfile.pack(side="left")
+ self.modinc = Tkinter.Label(self, text=" ", relief="sunken",
+ borderwidth=2)
+ self.modinc.pack(side="left")
+ self.filler = Tkinter.Label(self, relief="sunken", borderwidth=2)
+ self.filler.pack(side="right", fill="x", expand=1)
+ def set_filename(self, name):
+ if name:
+ self.lfile["text"] = name
+ else:
+ self.lfile["text"] = txt("nofile", "<no file>")
+ def set_formname(self, name):
+ if name:
+ self.lform["text"] = name
+ else:
+ self.lform["text"] = txt("noform", "<no form>")
+ def set_modified(self, mod):
+ if mod:
+ self.modinc["text"] = "*"
+ else:
+ self.modinc["text"] = " "