--- a/blogic/Editor.py Wed Jan 03 17:18:48 2007 -0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-#!/usr/bin/env python
-#
-# blogic - Tool for blog's messages publishing
-# Copyright (C) 2006 German Poo-Caaman~o <gpoo@ubiobio.cl>
-#
-# This program 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 2 of the License, or
-# (at your option) any later version.
-
-# This program 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.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-import pygtk
-pygtk.require('2.0')
-
-import gtk
-import gobject
-import gtkspell
-from gettext import bindtextdomain, textdomain
-from gettext import gettext as _
-
-class Editor(gtk.TextBuffer):
- __gsignals__ = {
- 'title-changed' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
- (str,str,)),
- 'body-changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
- (str, gobject.TYPE_OBJECT,))
- }
-
- supported_tags = {
- 'para': ['<p>', '</p>'],
- 'bold': ['<b>', '</b>'],
- 'italic': ['<i>', '</i>'],
- 'right': ['<div align="right">', '</div>'],
- 'left': ['<div align="left">', '</div>'],
- 'center': ['<div align="center">', '</div>'],
- 'strike': ['<span style="text-decoration: line-through;">',
- '</span>'],
- 'underline': ['<span style="text-decoration: underline;">',
- '</span>'],
- 'blockquote': ['<blockquote>', '</blockquote>'],
- }
-
- def __init__(self, *args):
- gtk.TextBuffer.__init__(self)
- self._create_tags()
-
- self.connect("modified-changed", self._on_modified_changed)
- self.connect('title-changed', self._on_title_changed)
- self.connect('body-changed', self._on_body_changed)
- self.title = ''
- self.title_modified = False
- self.body_modified = False
-
- def insert_tag(self, widget, tag):
- try:
- tag_start, tag_end = self.supported_tags[tag]
- except:
- raise _('Unsupported tag %s') % tag
-
- selection = self.get_selection_bound()
- insertion = self.get_insert()
-
- self.begin_user_action()
- try:
- start, end = self.get_selection_bounds()
- text = self.get_text(start, end)
- new_text = tag_start + text + tag_end
- self.delete(start, end)
- self.insert(start, new_text, -1)
- except:
- self.insert_at_cursor(tag_start + tag_end, -1)
- end = self.get_iter_at_mark(selection)
- end.backward_chars(len(tag_end))
- self.end_user_action()
-
- def _on_title_changed(self, title, buffer, *args):
- self.title_modified = False
-
- def _on_body_changed(self, body, buffer, *args):
- self.body_modified = False
-
- def _on_modified_changed(self, buffer):
- title = self.get_title()
-
- if self.get_modified():
- if title != self.title:
- self.title_modified = True
- self.title = title
- self.emit('title-changed', title, buffer)
- else:
- self.body_modified = True
- self.emit('body-changed', None, None)
-
- self.set_modified(False)
-
- def _create_tags(self):
- import pango
- self.create_tag('heading', weight=pango.WEIGHT_BOLD,
- size=10 * pango.SCALE,
- pixels_below_lines=8)
-
- def clear(self):
- start, end = self.get_bounds()
- self.delete(start, end)
- self.title_modified = False
- self.body_modified = False
- self.set_modified(False)
-
- def set_title(self, title=''):
- line_start = self.get_start_iter()
- line_end = line_start.copy()
- line_end.forward_to_line_end()
-
- title = title + '\n'
- self.begin_user_action()
- self.delete(line_start, line_end)
- self.insert_with_tags_by_name(line_start, title, 'heading')
- self.end_user_action()
-
- def get_title(self):
- line_start = self.get_start_iter()
- line_end = line_start.copy()
- line_end.forward_to_line_end()
-
- return self.get_text(line_start, line_end)
-
- def set_body(self, body):
- if self.get_line_count() > 1:
- start = self.get_iter_at_line(1)
- end = self.get_end_iter()
- self.delete(start, end)
- else:
- start, end = self.get_bounds()
- self.delete(start, end)
- self.set_title(_('Untitled post\n') )
- start = self.get_end_iter()
-
- self.begin_user_action()
- self.insert(start, body)
- self.end_user_action()
-
- def get_body(self):
- if self.get_line_count() > 1:
- start = self.get_iter_at_line(1)
- end = self.get_end_iter()
- body = self.get_text(start, end)
- else:
- body = ''
-
- return body
-
-if __name__ == "__main__":
- def title_changed(view, text, buffer, window, *args):
- window.set_title(view.get_title())
-
- def body_changed(view, text, buffer, window, *args):
- print view.get_body()
-
- def create_window():
- window = gtk.Window(gtk.WINDOW_TOPLEVEL)
- window.set_border_width(0)
- window.set_title('Test')
-
- buffer = Editor()
- buffer.connect('title-changed', title_changed, window)
- buffer.connect('body-changed', body_changed, window)
- view = gtk.TextView(buffer)
-
- window.connect('delete-event', gtk.main_quit, None)
-
- vbox = gtk.VBox(0, False)
- scroll = gtk.ScrolledWindow()
-
- window.add(vbox)
- vbox.pack_start(scroll, True, True, 0)
- scroll.add(view)
-
- #view.set_title('This is a title')
- buffer.set_body('This is a body\nline2\nline3\nline4')
-
- return window
-
- window = create_window()
- window.set_default_size(500,500)
- window.show_all()
-
- gtk.main()
-
--- a/blogic/app.py Wed Jan 03 17:18:48 2007 -0300
+++ b/blogic/app.py Wed Jan 03 18:06:01 2007 -0300
@@ -41,7 +41,7 @@
HOME_DIR, NOTEBOOK_PREVIEW
from HIG import HIGAlert
from HtmlPreview import HtmlPreview
-from Editor import Editor
+from editor import Editor
import BlogEngine
from BlogBase import BlogData
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/blogic/editor.py Wed Jan 03 18:06:01 2007 -0300
@@ -0,0 +1,196 @@
+#!/usr/bin/env python
+#
+# blogic - Tool for blog's messages publishing
+# Copyright (C) 2006 German Poo-Caaman~o <gpoo@ubiobio.cl>
+#
+# This program 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 2 of the License, or
+# (at your option) any later version.
+
+# This program 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.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import pygtk
+pygtk.require('2.0')
+
+import gtk
+import gobject
+import gtkspell
+from gettext import bindtextdomain, textdomain
+from gettext import gettext as _
+
+class Editor(gtk.TextBuffer):
+ __gsignals__ = {
+ 'title-changed' : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ (str,str,)),
+ 'body-changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
+ (str, gobject.TYPE_OBJECT,))
+ }
+
+ supported_tags = {
+ 'para': ['<p>', '</p>'],
+ 'bold': ['<b>', '</b>'],
+ 'italic': ['<i>', '</i>'],
+ 'right': ['<div align="right">', '</div>'],
+ 'left': ['<div align="left">', '</div>'],
+ 'center': ['<div align="center">', '</div>'],
+ 'strike': ['<span style="text-decoration: line-through;">',
+ '</span>'],
+ 'underline': ['<span style="text-decoration: underline;">',
+ '</span>'],
+ 'blockquote': ['<blockquote>', '</blockquote>'],
+ }
+
+ def __init__(self, *args):
+ gtk.TextBuffer.__init__(self)
+ self._create_tags()
+
+ self.connect("modified-changed", self._on_modified_changed)
+ self.connect('title-changed', self._on_title_changed)
+ self.connect('body-changed', self._on_body_changed)
+ self.title = ''
+ self.title_modified = False
+ self.body_modified = False
+
+ def insert_tag(self, widget, tag):
+ try:
+ tag_start, tag_end = self.supported_tags[tag]
+ except:
+ raise _('Unsupported tag %s') % tag
+
+ selection = self.get_selection_bound()
+ insertion = self.get_insert()
+
+ self.begin_user_action()
+ try:
+ start, end = self.get_selection_bounds()
+ text = self.get_text(start, end)
+ new_text = tag_start + text + tag_end
+ self.delete(start, end)
+ self.insert(start, new_text, -1)
+ except:
+ self.insert_at_cursor(tag_start + tag_end, -1)
+ end = self.get_iter_at_mark(selection)
+ end.backward_chars(len(tag_end))
+ self.end_user_action()
+
+ def _on_title_changed(self, title, buffer, *args):
+ self.title_modified = False
+
+ def _on_body_changed(self, body, buffer, *args):
+ self.body_modified = False
+
+ def _on_modified_changed(self, buffer):
+ title = self.get_title()
+
+ if self.get_modified():
+ if title != self.title:
+ self.title_modified = True
+ self.title = title
+ self.emit('title-changed', title, buffer)
+ else:
+ self.body_modified = True
+ self.emit('body-changed', None, None)
+
+ self.set_modified(False)
+
+ def _create_tags(self):
+ import pango
+ self.create_tag('heading', weight=pango.WEIGHT_BOLD,
+ size=10 * pango.SCALE,
+ pixels_below_lines=8)
+
+ def clear(self):
+ start, end = self.get_bounds()
+ self.delete(start, end)
+ self.title_modified = False
+ self.body_modified = False
+ self.set_modified(False)
+
+ def set_title(self, title=''):
+ line_start = self.get_start_iter()
+ line_end = line_start.copy()
+ line_end.forward_to_line_end()
+
+ title = title + '\n'
+ self.begin_user_action()
+ self.delete(line_start, line_end)
+ self.insert_with_tags_by_name(line_start, title, 'heading')
+ self.end_user_action()
+
+ def get_title(self):
+ line_start = self.get_start_iter()
+ line_end = line_start.copy()
+ line_end.forward_to_line_end()
+
+ return self.get_text(line_start, line_end)
+
+ def set_body(self, body):
+ if self.get_line_count() > 1:
+ start = self.get_iter_at_line(1)
+ end = self.get_end_iter()
+ self.delete(start, end)
+ else:
+ start, end = self.get_bounds()
+ self.delete(start, end)
+ self.set_title(_('Untitled post\n') )
+ start = self.get_end_iter()
+
+ self.begin_user_action()
+ self.insert(start, body)
+ self.end_user_action()
+
+ def get_body(self):
+ if self.get_line_count() > 1:
+ start = self.get_iter_at_line(1)
+ end = self.get_end_iter()
+ body = self.get_text(start, end)
+ else:
+ body = ''
+
+ return body
+
+if __name__ == "__main__":
+ def title_changed(view, text, buffer, window, *args):
+ window.set_title(view.get_title())
+
+ def body_changed(view, text, buffer, window, *args):
+ print view.get_body()
+
+ def create_window():
+ window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+ window.set_border_width(0)
+ window.set_title('Test')
+
+ buffer = Editor()
+ buffer.connect('title-changed', title_changed, window)
+ buffer.connect('body-changed', body_changed, window)
+ view = gtk.TextView(buffer)
+
+ window.connect('delete-event', gtk.main_quit, None)
+
+ vbox = gtk.VBox(0, False)
+ scroll = gtk.ScrolledWindow()
+
+ window.add(vbox)
+ vbox.pack_start(scroll, True, True, 0)
+ scroll.add(view)
+
+ #view.set_title('This is a title')
+ buffer.set_body('This is a body\nline2\nline3\nline4')
+
+ return window
+
+ window = create_window()
+ window.set_default_size(500,500)
+ window.show_all()
+
+ gtk.main()
+