1 #!/usr/bin/env python2.5
2 # -*- coding: utf-8 -*-
5 Copyright (C) 2007 Christoph Würstle
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation.
32 class Notizen(gtk.HBox):
34 def __init__(self, db, topBox):
39 self._noteBody = None #Last notetext
40 self._categoryName = ""
42 gtk.HBox.__init__(self, homogeneous = False, spacing = 0)
43 logging.info("libnotizen, init")
45 self._noteslist = simple_list.SimpleList()
46 self._noteslist.set_eventfunction_cursor_changed(self._update_noteslist)
48 self._noteslist.set_size_request(250, -1)
50 vbox = gtk.VBox(homogeneous = False, spacing = 0)
52 frame = gtk.Frame(_("Titles"))
53 frame.add(self._noteslist)
54 vbox.pack_start(frame, expand = True, fill = True, padding = 3)
56 buttonHBox = gtk.HBox()
57 vbox.pack_start(buttonHBox, expand = False, fill = True, padding = 3)
59 button = gtk.Button(stock = gtk.STOCK_ADD)
60 button.connect("clicked", self._on_add_note, None)
61 buttonHBox.pack_start(button, expand = True, fill = True, padding = 3)
63 button = gtk.Button(stock = gtk.STOCK_DELETE)
64 button.connect("clicked", self._on_delete_note, None)
65 buttonHBox.pack_start(button, expand = True, fill = True, padding = 3)
67 self.pack_start(vbox, expand = False, fill = True, padding = 3)
69 self._noteBodyView = gtk.TextView()
70 self._noteBodyView.connect("focus-out-event", self.save_note, "focus-out-event")
71 buf = self._noteBodyView.get_buffer()
73 buf.connect("changed", self._on_note_changed, None)
74 if gtkspell is not None:
75 self._noteBodySpellChecker = gtkspell.Spell(self._noteBodyView)
77 self._noteBodySpellChecker = None
79 #self.textviewNotiz.set_size_request(-1, 50)
80 self._noteScrollWindow = gtk.ScrolledWindow()
81 self._noteScrollWindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
82 self._noteScrollWindow.add(self._noteBodyView)
84 frame = gtk.Frame(_("Note"))
85 frame.add(self._noteScrollWindow)
87 vbox = gtk.VBox(homogeneous = False, spacing = 0)
88 vbox.pack_start(frame, expand = True, fill = True, padding = 3)
90 self._historyBox = gtk.HBox(homogeneous = False, spacing = 0)
92 self._historyStatusLabel = gtk.Label(_("No History"))
93 self._historyStatusLabel.set_alignment(0.0, 0.5)
94 self._historyBox.pack_start(self._historyStatusLabel, expand = True, fill = True, padding = 3)
96 button = gtk.Button(_("History"))
97 button.connect("clicked", self._on_show_history, None)
98 self._historyBox.pack_start(button, expand = True, fill = True, padding = 3)
100 vbox.pack_start(self._historyBox, expand = False, fill = True, padding = 3)
102 self.pack_start(vbox, expand = True, fill = True, padding = 3)
105 self._topBox.connect("reload_notes", self.load_notes)
107 def set_wordwrap(self, enableWordWrap):
109 self._noteScrollWindow.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
110 self._noteBodyView.set_wrap_mode(gtk.WRAP_WORD)
112 self._noteScrollWindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
113 self._noteBodyView.set_wrap_mode(gtk.WRAP_NONE)
115 def show_history_area(self, visible):
117 self._historyBox.show()
119 self._historyBox.hide()
121 def load_notes(self, data = None):
122 logging.info("load_notes params: pos:"+str(self._pos)+" noteid:"+str(self.noteId))
123 self._noteslist.clear_items()
124 self._noteslist.append_item(_("New Note..."), "new")
126 self._categoryName = self._topBox.get_category()
127 search = self._topBox.get_search_pattern()
128 notes = self._db.searchNotes(search, self._categoryName)
130 if notes is not None:
132 noteid, category, noteText = note
133 title = self._get_title(noteText)
134 self._noteslist.append_item(title, noteid)
138 self._noteBodyView.get_buffer().set_text("")
140 def save_note(self, widget = None, data = None, data2 = None):
141 logging.info("save_note params: pos:"+str(self._pos)+" noteid:"+str(self.noteId))
142 #print "params:", data, data2
143 buf = self._noteBodyView.get_buffer().get_text(self._noteBodyView.get_buffer().get_start_iter(), self._noteBodyView.get_buffer().get_end_iter())
144 if buf is None or len(buf) == 0:
147 if buf == self._noteBody:
150 logging.info("Saving note: "+buf)
151 if self._pos == -1 or self.noteId == -1:
153 self.noteId = str(uuid.uuid4())
154 self._db.saveNote(self.noteId, buf, self._categoryName)
155 self._noteslist.append_item(self._get_title(buf), self.noteId)
156 self._pos = self._noteslist.select_last_item()
158 self._db.saveNote(self.noteId, buf, self._categoryName)
160 self._topBox.define_this_category()
162 def _get_title(self, buf):
164 @returns the title of the current note
172 def _set_focus(self):
173 self._noteBodyView.grab_focus()
176 def _update_noteslist(self, data = None, data2 = None):
181 (pos, key, value) = self._noteslist.get_selection_data()
184 except StandardError:
189 if key == "new" or data == "new":
190 #both methods supported click add note or new note (first one disabled)
191 self.noteId = str(uuid.uuid4())
192 self._db.saveNote(self.noteId, "", self._categoryName)
194 self._noteslist.append_item("", self.noteId)
195 self._noteBodyView.get_buffer().set_text("")
196 self._pos = self._noteslist.select_last_item()
199 self.noteId, pcdatum, self._categoryName, self._noteBody = self._db.loadNote(key)
200 self._historyStatusLabel.set_text(time.strftime(_("Last change: %d.%m.%y %H:%M"), time.localtime(pcdatum)))
201 buf = self._noteBodyView.get_buffer()
202 buf.set_text(self._noteBody)
204 gobject.timeout_add(200, self._set_focus)
206 def _on_note_changed(self, widget = None, data = None):
207 if self._pos == -1 or self.noteId == -1:
210 buf = self._noteBodyView.get_buffer().get_text(self._noteBodyView.get_buffer().get_start_iter(), self._noteBodyView.get_buffer().get_end_iter())
212 title = self._get_title(buf)
213 value, key = self._noteslist.get_item(self._pos)
216 self._noteslist.change_item(self._pos, title, self.noteId)
218 def _on_add_note(self, widget = None, data = None):
219 self._update_noteslist("new")
221 def _on_delete_note(self, widget = None, data = None):
222 if (self.noteId == -1):
224 mbox = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO, _("Really delete?"))
225 response = mbox.run()
228 if response == gtk.RESPONSE_YES:
229 self._db.delNote(self.noteId)
231 self._noteslist.remove_item(self._pos)
233 self._noteBodyView.get_buffer().set_text("")
235 def _on_show_history(self, widget = None, data = None, label = None):
236 if self.noteId == -1:
237 mbox = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("No note selected."))
238 response = mbox.run()
243 rows = self._db.getNoteHistory(self.noteId)
246 dialog = libhistory.Dialog()
251 if daten != "" and lastNoteStr != daten:
253 dialog.noteHistory.append([row[0], row[1], row[2], row[3], daten+"\n"])
255 dialog.vbox.show_all()
256 dialog.set_size_request(600, 380)
258 if dialog.run() == gtk.RESPONSE_ACCEPT:
261 data = dialog.get_selected_row()
263 self._db.speichereSQL(data[2], data[3].split(" <<Tren-ner>> "), rowid = self.noteId)
264 logging.info("loading History")
265 self._update_noteslist()