#!/usr/bin/env python # Not perfected, but completely usable. # Peter Wang (tjaden@users.sourceforge.net), 24 March 24 2000. import os, string from gtk import * notedir = '' class MyGtkText(GtkText): def clear(self): self.delete_text(0, self.get_length()) def get_text(self): return self.get_chars(0, self.get_length()) def set_text(self, newtext): self.clear() self.insert_defaults(newtext); class Alert(GtkWindow): def __init__(self, message): GtkWindow.__init__(self, WINDOW_DIALOG) self.connect('destroy', self.close) self.set_title('Alert') self.show() vbox = GtkVBox() self.add(vbox) vbox.show() label = GtkLabel(label=message) vbox.pack_start(label) label.show(); button = GtkButton(label='Close') button.connect('clicked', self.close) vbox.pack_end(button) button.show() def close(self, *args): self.destroy() mainquit() def mainloop(self): self.show() mainloop() class Page(MyGtkText): def __init__(self, filename, title='Untitled'): MyGtkText.__init__(self) self.filename = filename self.headers = { 'Title' : title } if os.path.exists(filename): self.read_file(filename) def read_file(self, filename): file = open(self.filename) strip = string.strip # header while 1: line = strip(file.readline()) if not line: break c = string.find(line, ':') if c: field = strip(line[:c]) info = strip(line[c+1:]) self.headers[field] = info # body text = string.join(file.readlines(), '') self.set_text(text) file.close() def write_file(self): def write_headers(file, headers): for i in headers.keys(): file.write(i + ": " + headers[i] + '\n') f = open(self.filename, 'w') write_headers(f, self.headers) f.write('\n') f.write(self.get_text()) f.close() def reload(self): self.read_file(self.filename) def get_filename(self): return self.filename def get_title(self): return self.headers['Title'] def set_title(self, title): self.headers['Title'] = title def lpr(self): import time # FIXME filename = '/tmp/tmp-notebook-' + os.environ['USER'] f = open(filename, 'w') f.write(self.get_title() + '\n\n') f.write(time.ctime(time.time()) + '\n\n\n') f.write(self.get_text()) f.close() os.system('lpr ' + filename) class NewPage(GtkVBox): def __init__(self): GtkVBox.__init__(self) self.show() box1 = GtkHBox() self.pack_start(box1) box1.show() label = GtkLabel(label='Filename: ') box1.pack_start(label) label.show() self.filename = fn = GtkEntry() fn.show() box1.pack_start(fn) box2 = GtkHBox() self.pack_start(box2) box2.show() label = GtkLabel(label='Title: ') box2.pack_start(label) label.show() self.title = title = GtkEntry() box2.pack_start(title) title.show() box3 = GtkHButtonBox() box3.set_layout_default(BUTTONBOX_END) self.pack_end(box3) box3.show() self.create = create = GtkButton(label='Create') create.show() box3.pack_end(create) def connect(self, *args): apply(self.create.connect, args) def get_filename(self): return self.filename.get_text() def get_title(self): return self.title.get_text() def clear(self): self.filename.set_text('') self.title.set_text('') class NotebookApp(GtkWindow): def __init__(self, pages): GtkWindow.__init__(self) self.connect('destroy', self.close) self.set_title('Notebook') self.set_border_width(5) self.set_usize(500, 450) box1 = GtkVBox() self.add(box1) box1.show() self.tabs = tabs = GtkNotebook() box1.pack_start(tabs) tabs.show() # create pages inside tabs for p in pages: self.add_tab(p) self.pagelist = pages label = GtkLabel(label='New') newpage = NewPage() newpage.connect('clicked', self.create_page, newpage) tabs.append_page(newpage, label) bbox = GtkHButtonBox() box1.pack_end(bbox) bbox.show() saveall = GtkButton(label='Save All') saveall.connect('clicked', self.save_all) bbox.pack_start(saveall) saveall.show() close = GtkButton(label='Close') close.connect('clicked', self.close) bbox.pack_end(close) close.show() def add_tab(self, page): box2 = GtkVBox() box2.show() page.set_editable(1) box2.pack_start(page) page.show() bbox = GtkHButtonBox() box2.pack_end(bbox) bbox.show() save = GtkButton(label='Save') save.connect('clicked', self.save_page, page) bbox.pack_start(save) save.show() reload = GtkButton(label='Reload') reload.connect('clicked', self.reload_page, page) bbox.pack_start(reload) reload.show() lpr = GtkButton(label='Print') lpr.connect('clicked', self.print_page, page) bbox.pack_end(lpr) lpr.show() label = GtkLabel(page.get_title()) # need connection here for title changes self.tabs.append_page(box2, label) def create_page(self, widget, newpage): filename = os.path.join(notedir, newpage.get_filename()) title = newpage.get_title() p = Page(filename, title=title) self.add_tab(p) self.pagelist.append(p) def save_page(self, widget, page): page.write_file() def reload_page(self, widget, page): page.reload() def print_page(self, widget, page): page.lpr() def save_all(self, *args): for p in self.pagelist: p.write_file() def close(self, *args): self.destroy() mainquit() def mainloop(self): self.show() mainloop() if __name__ == '__main__': if os.environ.has_key('NOTEBOOK'): notedir = os.environ['NOTEBOOK'] else: notedir = os.path.join(os.environ['HOME'], 'Notebook') try: files = os.listdir(notedir) files.sort() pages = [] for fn in files: fn = os.path.join(notedir, fn) if os.path.isfile(fn): p = Page(fn) pages.append(p) app = NotebookApp(pages) app.mainloop() except OSError: print 'No such directory %s.' % notedir # # end of notebook.py #