Mercurial > libervia-web
annotate browser/sat_browser/richtext.py @ 1187:dab7a2b151ea
server (pages): added raise_on_missing arguments in getPostedData:
raise_on_missing argument can be set to False to use None for missing args instead of raising an exception.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 26 May 2019 22:18:04 +0200 |
parents | 3048bd137aaf |
children |
rev | line source |
---|---|
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
1 #!/usr/bin/python |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
3 |
339
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
4 # Libervia: a Salut à Toi frontend |
818 | 5 # Copyright (C) 2013-2016 Adrien Cossa <souliane@mailoo.org> |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
6 |
339
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
10 # (at your option) any later version. |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
11 |
339
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
15 # GNU Affero General Public License for more details. |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
16 |
339
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
327
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
19 |
449
981ed669d3b3
/!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents:
433
diff
changeset
|
20 from sat_frontends.tools import composition |
981ed669d3b3
/!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents:
433
diff
changeset
|
21 from sat.core.i18n import _ |
716
3b91225b457a
server + browser side: blogging refactoring (draft), huge commit sorry:
Goffi <goffi@goffi.org>
parents:
685
diff
changeset
|
22 from sat.core.log import getLogger |
3b91225b457a
server + browser side: blogging refactoring (draft), huge commit sorry:
Goffi <goffi@goffi.org>
parents:
685
diff
changeset
|
23 log = getLogger(__name__) |
449
981ed669d3b3
/!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents:
433
diff
changeset
|
24 |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
25 from pyjamas.ui.TextArea import TextArea |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
26 from pyjamas.ui.Button import Button |
353
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
27 from pyjamas.ui.CheckBox import CheckBox |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
28 from pyjamas.ui.Label import Label |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
29 from pyjamas.ui.FlexTable import FlexTable |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
30 from pyjamas.ui.HorizontalPanel import HorizontalPanel |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
31 from pyjamas.ui.KeyboardListener import KeyboardHandler |
355
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
32 from pyjamas import Window |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
33 from __pyjamas__ import doc |
323
0b7934e75e76
misc: reorganization of the file panels.py + clean the modules import:
souliane <souliane@mailoo.org>
parents:
319
diff
changeset
|
34 |
433
bbdbee25123a
import constants.Const as C (according to the coding rules)
souliane <souliane@mailoo.org>
parents:
432
diff
changeset
|
35 from constants import Const as C |
467 | 36 import dialog |
648
6d3142b782c3
browser_side: classes reorganisation:
Goffi <goffi@goffi.org>
parents:
624
diff
changeset
|
37 import base_panel |
6d3142b782c3
browser_side: classes reorganisation:
Goffi <goffi@goffi.org>
parents:
624
diff
changeset
|
38 import editor_widget |
467 | 39 import html_tools |
740
b6510fd9ae15
browser_side: implements tags UI
souliane <souliane@mailoo.org>
parents:
738
diff
changeset
|
40 import list_manager |
b6510fd9ae15
browser_side: implements tags UI
souliane <souliane@mailoo.org>
parents:
738
diff
changeset
|
41 |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
42 |
648
6d3142b782c3
browser_side: classes reorganisation:
Goffi <goffi@goffi.org>
parents:
624
diff
changeset
|
43 class RichTextEditor(editor_widget.BaseTextEditor, FlexTable): |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
44 """Panel for the rich text editor.""" |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
45 |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
46 STYLE = {'main': 'richTextEditor', |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
47 'title': 'richTextTitle', |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
48 'toolbar': 'richTextToolbar', |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
49 'textarea': 'richTextArea' |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
50 } |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
51 |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
52 def __init__(self, host, content=None, modifiedCb=None, afterEditCb=None, options=None): |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
53 """ |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
54 |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
55 @param host (SatWebFrontend): host instance |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
56 @param content (dict): dict with at least a 'text' key |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
57 @param modifiedCb (callable): to be called when the text has been modified |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
58 @param afterEditCb (callable): to be called when the edition is done |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
59 @param options (list[unicode]): UI options ("read_only", "update_msg") |
281
36ce989c73a5
browser_side: more customizable rich text editor
souliane <souliane@mailoo.org>
parents:
280
diff
changeset
|
60 """ |
593
b97c85b8a47e
browser side: fixed bad FlexTable __init__ call, need to be checked
Goffi <goffi@goffi.org>
parents:
574
diff
changeset
|
61 FlexTable.__init__(self) # FIXME |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
62 self.host = host |
352
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
63 self.wysiwyg = False |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
64 self.read_only = 'read_only' in options |
281
36ce989c73a5
browser_side: more customizable rich text editor
souliane <souliane@mailoo.org>
parents:
280
diff
changeset
|
65 self.update_msg = 'update_msg' in options |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
66 |
740
b6510fd9ae15
browser_side: implements tags UI
souliane <souliane@mailoo.org>
parents:
738
diff
changeset
|
67 indices = (-1, -1, 0, -1, -1) if self.read_only else (0, 1, 2, 3, 4) |
b6510fd9ae15
browser_side: implements tags UI
souliane <souliane@mailoo.org>
parents:
738
diff
changeset
|
68 self.title_offset, self.toolbar_offset, self.content_offset, self.tags_offset, self.command_offset = indices |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
69 self.addStyleName(self.STYLE['main']) |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
70 |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
71 editor_widget.BaseTextEditor.__init__(self, content, None, modifiedCb, afterEditCb) |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
72 |
362
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
73 def addEditListener(self, listener): |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
74 """Add a method to be called whenever the text is edited. |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
75 |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
76 @param listener: method taking two arguments: sender, keycode |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
77 """ |
648
6d3142b782c3
browser_side: classes reorganisation:
Goffi <goffi@goffi.org>
parents:
624
diff
changeset
|
78 editor_widget.BaseTextEditor.addEditListener(self, listener) |
362
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
79 if hasattr(self, 'display'): |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
80 self.display.addEditListener(listener) |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
81 |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
82 def refresh(self, edit=None): |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
83 """Refresh the UI for edition/display mode. |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
84 |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
85 @param edit: set to True to display the edition mode |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
86 """ |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
87 if edit is None: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
88 edit = hasattr(self, 'textarea') and self.textarea.getVisible() |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
89 |
741
c3cb68227cca
browser_side: read and write tags from microblog data:
souliane <souliane@mailoo.org>
parents:
740
diff
changeset
|
90 for widget in ['title_panel', 'tags_panel', 'command']: |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
91 if hasattr(self, widget): |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
92 getattr(self, widget).setVisible(edit) |
324
8131d0ccf21b
browser_side: prepare user input for microblog titles
souliane <souliane@mailoo.org>
parents:
323
diff
changeset
|
93 |
352
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
94 if hasattr(self, 'toolbar'): |
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
95 self.toolbar.setVisible(False) |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
96 |
352
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
97 if not hasattr(self, 'display'): |
648
6d3142b782c3
browser_side: classes reorganisation:
Goffi <goffi@goffi.org>
parents:
624
diff
changeset
|
98 self.display = editor_widget.HTMLTextEditor(options={'enhance_display': False, 'listen_keyboard': False}) # for display mode |
362
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
99 for listener in self.edit_listeners: |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
100 self.display.addEditListener(listener) |
759
34f066ed3b23
browser_side: replaced mbdata2tags and tags2mbdata by sat.tools.common.dict2iter and iter2dict
Goffi <goffi@goffi.org>
parents:
742
diff
changeset
|
101 |
352
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
102 if not self.read_only and not hasattr(self, 'textarea'): |
362
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
103 self.textarea = EditTextArea(self) # for edition mode |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
104 self.textarea.addStyleName(self.STYLE['textarea']) |
352
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
105 |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
106 self.getFlexCellFormatter().setColSpan(self.content_offset, 0, 2) |
352
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
107 if edit and not self.wysiwyg: |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
108 self.textarea.setWidth('100%') # CSS width doesn't do it, don't know why |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
109 self.setWidget(self.content_offset, 0, self.textarea) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
110 else: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
111 self.setWidget(self.content_offset, 0, self.display) |
352
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
112 if not edit: |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
113 return |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
114 |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
115 if not self.read_only and not hasattr(self, 'title_panel'): |
648
6d3142b782c3
browser_side: classes reorganisation:
Goffi <goffi@goffi.org>
parents:
624
diff
changeset
|
116 self.title_panel = base_panel.TitlePanel() |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
117 self.title_panel.addStyleName(self.STYLE['title']) |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
118 self.getFlexCellFormatter().setColSpan(self.title_offset, 0, 2) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
119 self.setWidget(self.title_offset, 0, self.title_panel) |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
120 |
741
c3cb68227cca
browser_side: read and write tags from microblog data:
souliane <souliane@mailoo.org>
parents:
740
diff
changeset
|
121 if not self.read_only and not hasattr(self, 'tags_panel'): |
740
b6510fd9ae15
browser_side: implements tags UI
souliane <souliane@mailoo.org>
parents:
738
diff
changeset
|
122 suggested_tags = [] # TODO: feed this list with tags suggestion |
741
c3cb68227cca
browser_side: read and write tags from microblog data:
souliane <souliane@mailoo.org>
parents:
740
diff
changeset
|
123 self.tags_panel = list_manager.TagsPanel(suggested_tags) |
740
b6510fd9ae15
browser_side: implements tags UI
souliane <souliane@mailoo.org>
parents:
738
diff
changeset
|
124 self.getFlexCellFormatter().setColSpan(self.tags_offset, 0, 2) |
741
c3cb68227cca
browser_side: read and write tags from microblog data:
souliane <souliane@mailoo.org>
parents:
740
diff
changeset
|
125 self.setWidget(self.tags_offset, 0, self.tags_panel) |
740
b6510fd9ae15
browser_side: implements tags UI
souliane <souliane@mailoo.org>
parents:
738
diff
changeset
|
126 |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
127 if not self.read_only and not hasattr(self, 'command'): |
281
36ce989c73a5
browser_side: more customizable rich text editor
souliane <souliane@mailoo.org>
parents:
280
diff
changeset
|
128 self.command = HorizontalPanel() |
36ce989c73a5
browser_side: more customizable rich text editor
souliane <souliane@mailoo.org>
parents:
280
diff
changeset
|
129 self.command.addStyleName("marginAuto") |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
130 self.command.add(Button("Cancel", lambda: self.edit(True, True))) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
131 self.command.add(Button("Update" if self.update_msg else "Send message", lambda: self.edit(False))) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
132 self.getFlexCellFormatter().setColSpan(self.command_offset, 0, 2) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
133 self.setWidget(self.command_offset, 0, self.command) |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
134 |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
135 def setToolBar(self, syntax): |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
136 """This method is called asynchronously after the parameter |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
137 holding the rich text syntax is retrieved. It is called at |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
138 each call of self.edit(True) because the user may |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
139 have change his setting since the last time.""" |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
140 if syntax is None or syntax not in composition.RICH_SYNTAXES.keys(): |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
141 syntax = composition.RICH_SYNTAXES.keys()[0] |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
142 if hasattr(self, "toolbar") and self.toolbar.syntax == syntax: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
143 self.toolbar.setVisible(True) |
352
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
144 return |
738
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
145 self.toolbar = HorizontalPanel() |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
146 self.toolbar.syntax = syntax |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
147 self.toolbar.addStyleName(self.STYLE['toolbar']) |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
148 for key in composition.RICH_SYNTAXES[syntax].keys(): |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
149 self.addToolbarButton(syntax, key) |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
150 self.wysiwyg_button = CheckBox(_('preview')) |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
151 wysiywgCb = lambda sender: self.setWysiwyg(sender.getChecked()) |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
152 self.wysiwyg_button.addClickListener(wysiywgCb) |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
153 self.toolbar.add(self.wysiwyg_button) |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
154 self.syntax_label = Label(_("Syntax: %s") % syntax) |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
155 self.syntax_label.addStyleName("richTextSyntaxLabel") |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
156 self.toolbar.add(self.syntax_label) |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
157 self.toolbar.setCellWidth(self.syntax_label, "100%") |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
158 self.getFlexCellFormatter().setColSpan(self.toolbar_offset, 0, 2) |
caad07bdb659
browser_side: simplify RichTextEditor initialization
souliane <souliane@mailoo.org>
parents:
737
diff
changeset
|
159 self.setWidget(self.toolbar_offset, 0, self.toolbar) |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
160 |
353
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
161 def setWysiwyg(self, wysiwyg, init=False): |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
162 """Toggle the edition mode between rich content syntax and wysiwyg. |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
163 @param wysiwyg: boolean value |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
164 @param init: set to True to re-init without switching the widgets.""" |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
165 def setWysiwyg(): |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
166 self.wysiwyg = wysiwyg |
364
4cf735b40304
browser_side: hide the syntax label when wysiwyg edtion is active
souliane <souliane@mailoo.org>
parents:
362
diff
changeset
|
167 try: |
353
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
168 self.wysiwyg_button.setChecked(wysiwyg) |
593
b97c85b8a47e
browser side: fixed bad FlexTable __init__ call, need to be checked
Goffi <goffi@goffi.org>
parents:
574
diff
changeset
|
169 except (AttributeError, TypeError): |
364
4cf735b40304
browser_side: hide the syntax label when wysiwyg edtion is active
souliane <souliane@mailoo.org>
parents:
362
diff
changeset
|
170 pass |
4cf735b40304
browser_side: hide the syntax label when wysiwyg edtion is active
souliane <souliane@mailoo.org>
parents:
362
diff
changeset
|
171 try: |
4cf735b40304
browser_side: hide the syntax label when wysiwyg edtion is active
souliane <souliane@mailoo.org>
parents:
362
diff
changeset
|
172 if wysiwyg: |
4cf735b40304
browser_side: hide the syntax label when wysiwyg edtion is active
souliane <souliane@mailoo.org>
parents:
362
diff
changeset
|
173 self.syntax_label.addStyleName('transparent') |
4cf735b40304
browser_side: hide the syntax label when wysiwyg edtion is active
souliane <souliane@mailoo.org>
parents:
362
diff
changeset
|
174 else: |
4cf735b40304
browser_side: hide the syntax label when wysiwyg edtion is active
souliane <souliane@mailoo.org>
parents:
362
diff
changeset
|
175 self.syntax_label.removeStyleName('transparent') |
593
b97c85b8a47e
browser side: fixed bad FlexTable __init__ call, need to be checked
Goffi <goffi@goffi.org>
parents:
574
diff
changeset
|
176 except (AttributeError, TypeError): |
364
4cf735b40304
browser_side: hide the syntax label when wysiwyg edtion is active
souliane <souliane@mailoo.org>
parents:
362
diff
changeset
|
177 pass |
353
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
178 if not wysiwyg: |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
179 self.display.removeStyleName('richTextWysiwyg') |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
180 |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
181 if init: |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
182 setWysiwyg() |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
183 return |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
184 |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
185 self.getFlexCellFormatter().setColSpan(self.content_offset, 0, 2) |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
186 if wysiwyg: |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
187 def syntaxConvertCb(text): |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
188 self.display.setContent({'text': text}) |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
189 self.textarea.removeFromParent() # XXX: force as it is not always done... |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
190 self.setWidget(self.content_offset, 0, self.display) |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
191 self.display.addStyleName('richTextWysiwyg') |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
192 self.display.edit(True) |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
193 content = self.getContent() |
433
bbdbee25123a
import constants.Const as C (according to the coding rules)
souliane <souliane@mailoo.org>
parents:
432
diff
changeset
|
194 if content['text'] and content['syntax'] != C.SYNTAX_XHTML: |
bbdbee25123a
import constants.Const as C (according to the coding rules)
souliane <souliane@mailoo.org>
parents:
432
diff
changeset
|
195 self.host.bridge.call('syntaxConvert', syntaxConvertCb, content['text'], content['syntax'], C.SYNTAX_XHTML) |
353
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
196 else: |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
197 syntaxConvertCb(content['text']) |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
198 else: |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
199 syntaxConvertCb = lambda text: self.textarea.setText(text) |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
200 text = self.display.getContent()['text'] |
433
bbdbee25123a
import constants.Const as C (according to the coding rules)
souliane <souliane@mailoo.org>
parents:
432
diff
changeset
|
201 if text and self.toolbar.syntax != C.SYNTAX_XHTML: |
353
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
202 self.host.bridge.call('syntaxConvert', syntaxConvertCb, text) |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
203 else: |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
204 syntaxConvertCb(text) |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
205 self.setWidget(self.content_offset, 0, self.textarea) |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
206 self.textarea.setWidth('100%') # CSS width doesn't do it, don't know why |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
207 |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
208 setWysiwyg() # do it in the end because it affects self.getContent |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
209 |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
210 def addToolbarButton(self, syntax, key): |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
211 """Add a button with the defined parameters.""" |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
212 button = Button('<img src="%s" class="richTextIcon" />' % |
254
28d3315a8003
browser_side: isolate the basic stuff of RecipientManager in a new class ListManager:
souliane <souliane@mailoo.org>
parents:
234
diff
changeset
|
213 composition.RICH_BUTTONS[key]["icon"]) |
28d3315a8003
browser_side: isolate the basic stuff of RecipientManager in a new class ListManager:
souliane <souliane@mailoo.org>
parents:
234
diff
changeset
|
214 button.setTitle(composition.RICH_BUTTONS[key]["tip"]) |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
215 button.addStyleName('richTextToolButton') |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
216 self.toolbar.add(button) |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
217 |
355
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
218 def buttonCb(): |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
219 """Generic callback for a toolbar button.""" |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
220 text = self.textarea.getText() |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
221 cursor_pos = self.textarea.getCursorPos() |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
222 selection_length = self.textarea.getSelectionLength() |
355
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
223 data = composition.RICH_SYNTAXES[syntax][key] |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
224 if selection_length == 0: |
355
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
225 middle_text = data[1] |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
226 else: |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
227 middle_text = text[cursor_pos:cursor_pos + selection_length] |
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
228 self.textarea.setText(text[:cursor_pos] |
355
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
229 + data[0] |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
230 + middle_text |
355
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
231 + data[2] |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
232 + text[cursor_pos + selection_length:]) |
355
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
233 self.textarea.setCursorPos(cursor_pos + len(data[0]) + len(middle_text)) |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
234 self.textarea.setFocus(True) |
362
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
235 self.textarea.onKeyDown() |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
236 |
355
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
237 def wysiwygCb(): |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
238 """Callback for a toolbar button while wysiwyg mode is enabled.""" |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
239 data = composition.COMMANDS[key] |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
240 |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
241 def execCommand(command, arg): |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
242 self.display.setFocus(True) |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
243 doc().execCommand(command, False, arg.strip() if arg else '') |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
244 # use Window.prompt instead of dialog.PromptDialog to not loose the focus |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
245 prompt = lambda command, text: execCommand(command, Window.prompt(text)) |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
246 if isinstance(data, tuple) or isinstance(data, list): |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
247 if data[1]: |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
248 prompt(data[0], data[1]) |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
249 else: |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
250 execCommand(data[0], data[2]) |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
251 else: |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
252 execCommand(data, False, '') |
362
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
253 self.textarea.onKeyDown() |
355
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
254 |
9bb78c09e9fc
browser_side: wysiwyg edition handles the toolbar buttons
souliane <souliane@mailoo.org>
parents:
353
diff
changeset
|
255 button.addClickListener(lambda: wysiwygCb() if self.wysiwyg else buttonCb()) |
232
0ed09cc0566f
browser_side: added UIs for rich text editor and addressing to multiple recipients
souliane <souliane@mailoo.org>
parents:
diff
changeset
|
256 |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
257 def getContent(self): |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
258 assert(hasattr(self, 'textarea')) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
259 assert(hasattr(self, 'toolbar')) |
353
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
260 if self.wysiwyg: |
433
bbdbee25123a
import constants.Const as C (according to the coding rules)
souliane <souliane@mailoo.org>
parents:
432
diff
changeset
|
261 content = {'text': self.display.getContent()['text'], 'syntax': C.SYNTAX_XHTML} |
353
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
262 else: |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
263 content = {'text': self.strproc(self.textarea.getText()), 'syntax': self.toolbar.syntax} |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
264 if hasattr(self, 'title_panel'): |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
265 content.update({'title': self.strproc(self.title_panel.getText())}) |
741
c3cb68227cca
browser_side: read and write tags from microblog data:
souliane <souliane@mailoo.org>
parents:
740
diff
changeset
|
266 if hasattr(self, 'tags_panel'): |
1156
3048bd137aaf
server, browser: changed blog items serialisation following changes in backend
Goffi <goffi@goffi.org>
parents:
1124
diff
changeset
|
267 content['tags'] = self.tags_panel.getTags() |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
268 return content |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
269 |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
270 def edit(self, edit=False, abort=False, sync=False): |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
271 """ |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
272 Remark: the editor must be visible before you call this method. |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
273 @param edit: set to True to edit the content or False to only display it |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
274 @param abort: set to True to cancel the edition and loose the changes. |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
275 If edit and abort are both True, self.abortEdition can be used to ask for a |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
276 confirmation. When edit is False and abort is True, abortion is actually done. |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
277 @param sync: set to True to cancel the edition after the content has been saved somewhere else |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
278 """ |
357
2b5503392fbd
browser_side: small fixes for RichTextEditor
souliane <souliane@mailoo.org>
parents:
356
diff
changeset
|
279 if not (edit and abort): |
2b5503392fbd
browser_side: small fixes for RichTextEditor
souliane <souliane@mailoo.org>
parents:
356
diff
changeset
|
280 self.refresh(edit) # not when we are asking for a confirmation |
648
6d3142b782c3
browser_side: classes reorganisation:
Goffi <goffi@goffi.org>
parents:
624
diff
changeset
|
281 editor_widget.BaseTextEditor.edit(self, edit, abort, sync) # after the UI has been refreshed |
353
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
282 if (edit and abort): |
648
6d3142b782c3
browser_side: classes reorganisation:
Goffi <goffi@goffi.org>
parents:
624
diff
changeset
|
283 return # self.abortEdition is called by editor_widget.BaseTextEditor.edit |
6d3142b782c3
browser_side: classes reorganisation:
Goffi <goffi@goffi.org>
parents:
624
diff
changeset
|
284 self.setWysiwyg(False, init=True) # after editor_widget.BaseTextEditor (it affects self.getContent) |
353
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
285 if sync: |
ddb909ab5cbc
browser_side: wysiwyg edtion, first steps (do not use the buttons yet)
souliane <souliane@mailoo.org>
parents:
352
diff
changeset
|
286 return |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
287 # the following must NOT be done at each UI refresh! |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
288 content = self._original_content |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
289 if edit: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
290 def getParamCb(syntax): |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
291 # set the editable text in the current user-selected syntax |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
292 def syntaxConvertCb(text=None): |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
293 if text is not None: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
294 # Important: this also update self._original_content |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
295 content.update({'text': text}) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
296 content.update({'syntax': syntax}) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
297 self.textarea.setText(content['text']) |
759
34f066ed3b23
browser_side: replaced mbdata2tags and tags2mbdata by sat.tools.common.dict2iter and iter2dict
Goffi <goffi@goffi.org>
parents:
742
diff
changeset
|
298 |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
299 if hasattr(self, 'title_panel') and 'title' in content: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
300 self.title_panel.setText(content['title']) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
301 self.title_panel.setStackVisible(0, content['title'] != '') |
741
c3cb68227cca
browser_side: read and write tags from microblog data:
souliane <souliane@mailoo.org>
parents:
740
diff
changeset
|
302 |
742
d123e27fc386
browser_side: use methods defined in quick_frontend to retrieve and set the tags from/to microblog data
souliane <souliane@mailoo.org>
parents:
741
diff
changeset
|
303 if hasattr(self, 'tags_panel'): |
1156
3048bd137aaf
server, browser: changed blog items serialisation following changes in backend
Goffi <goffi@goffi.org>
parents:
1124
diff
changeset
|
304 tags = content['tags'] |
741
c3cb68227cca
browser_side: read and write tags from microblog data:
souliane <souliane@mailoo.org>
parents:
740
diff
changeset
|
305 self.tags_panel.setTags(tags) |
c3cb68227cca
browser_side: read and write tags from microblog data:
souliane <souliane@mailoo.org>
parents:
740
diff
changeset
|
306 self.tags_panel.setStackVisible(0, len(tags) > 0) |
c3cb68227cca
browser_side: read and write tags from microblog data:
souliane <souliane@mailoo.org>
parents:
740
diff
changeset
|
307 |
352
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
308 self.setToolBar(syntax) |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
309 if content['text'] and content['syntax'] != syntax: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
310 self.host.bridge.call('syntaxConvert', syntaxConvertCb, content['text'], content['syntax']) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
311 else: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
312 syntaxConvertCb() |
352
2610443b05a2
browser_side: misc improvements for RichTextEditor to prepare Wysiwyg edition
souliane <souliane@mailoo.org>
parents:
351
diff
changeset
|
313 self.host.bridge.call('asyncGetParamA', getParamCb, composition.PARAM_NAME_SYNTAX, composition.PARAM_KEY_COMPOSITION) |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
314 else: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
315 if not self.initialized: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
316 # set the display text in XHTML only during init because a new MicroblogEntry instance is created after each modification |
400
487dd238ab88
browser_side: bug fixes for microblog raw/rich edition toggle
souliane <souliane@mailoo.org>
parents:
395
diff
changeset
|
317 self.setDisplayContent() |
357
2b5503392fbd
browser_side: small fixes for RichTextEditor
souliane <souliane@mailoo.org>
parents:
356
diff
changeset
|
318 self.display.edit(False) |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
319 |
400
487dd238ab88
browser_side: bug fixes for microblog raw/rich edition toggle
souliane <souliane@mailoo.org>
parents:
395
diff
changeset
|
320 def setDisplayContent(self): |
648
6d3142b782c3
browser_side: classes reorganisation:
Goffi <goffi@goffi.org>
parents:
624
diff
changeset
|
321 """Set the content of the editor_widget.HTMLTextEditor which is used for display/wysiwyg""" |
400
487dd238ab88
browser_side: bug fixes for microblog raw/rich edition toggle
souliane <souliane@mailoo.org>
parents:
395
diff
changeset
|
322 content = self._original_content |
487dd238ab88
browser_side: bug fixes for microblog raw/rich edition toggle
souliane <souliane@mailoo.org>
parents:
395
diff
changeset
|
323 text = content['text'] |
487dd238ab88
browser_side: bug fixes for microblog raw/rich edition toggle
souliane <souliane@mailoo.org>
parents:
395
diff
changeset
|
324 if 'title' in content and content['title']: |
765
a55df9c37d0e
browser_side (blog): display title with h2 instead of h1 + add some bottom margin for the tags
souliane <souliane@mailoo.org>
parents:
763
diff
changeset
|
325 title = '<h2>%s</h2>' % html_tools.html_sanitize(content['title']) |
876
ca31e4f677e5
browser (richtext): fixes uninitialized variable
souliane <souliane@mailoo.org>
parents:
818
diff
changeset
|
326 else: |
ca31e4f677e5
browser (richtext): fixes uninitialized variable
souliane <souliane@mailoo.org>
parents:
818
diff
changeset
|
327 title = "" |
763
7390cba0bb44
browser_side: display tags with nice icons like for the static blog
souliane <souliane@mailoo.org>
parents:
759
diff
changeset
|
328 |
7390cba0bb44
browser_side: display tags with nice icons like for the static blog
souliane <souliane@mailoo.org>
parents:
759
diff
changeset
|
329 tags = "" |
1156
3048bd137aaf
server, browser: changed blog items serialisation following changes in backend
Goffi <goffi@goffi.org>
parents:
1124
diff
changeset
|
330 for tag in content['tags']: |
763
7390cba0bb44
browser_side: display tags with nice icons like for the static blog
souliane <souliane@mailoo.org>
parents:
759
diff
changeset
|
331 tags += "<li><a>%s</a></li>" % html_tools.html_sanitize(tag) |
7390cba0bb44
browser_side: display tags with nice icons like for the static blog
souliane <souliane@mailoo.org>
parents:
759
diff
changeset
|
332 if tags: |
7390cba0bb44
browser_side: display tags with nice icons like for the static blog
souliane <souliane@mailoo.org>
parents:
759
diff
changeset
|
333 tags = '<ul class="mblog_tags">%s</ul>' % tags |
7390cba0bb44
browser_side: display tags with nice icons like for the static blog
souliane <souliane@mailoo.org>
parents:
759
diff
changeset
|
334 |
7390cba0bb44
browser_side: display tags with nice icons like for the static blog
souliane <souliane@mailoo.org>
parents:
759
diff
changeset
|
335 self.display.setContent({'text': "%s%s%s" % (title, tags, text)}) |
400
487dd238ab88
browser_side: bug fixes for microblog raw/rich edition toggle
souliane <souliane@mailoo.org>
parents:
395
diff
changeset
|
336 |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
337 def setFocus(self, focus): |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
338 self.textarea.setFocus(focus) |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
339 |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
340 def abortEdition(self, content): |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
341 """Ask for confirmation before closing the dialog.""" |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
342 def confirm_cb(answer): |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
343 if answer: |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
344 self.edit(False, True) |
467 | 345 _dialog = dialog.ConfirmDialog(confirm_cb, text="Do you really want to %s?" % ("cancel your changes" if self.update_msg else "cancel this message")) |
357
2b5503392fbd
browser_side: small fixes for RichTextEditor
souliane <souliane@mailoo.org>
parents:
356
diff
changeset
|
346 _dialog.cancel_button.setText(_("No")) |
351
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
347 _dialog.show() |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
348 |
c943fd54c90e
browser_side: heavy refactorisation for microblogs:
souliane <souliane@mailoo.org>
parents:
346
diff
changeset
|
349 |
362
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
350 class EditTextArea(TextArea, KeyboardHandler): |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
351 def __init__(self, _parent): |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
352 TextArea.__init__(self) |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
353 self._parent = _parent |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
354 KeyboardHandler.__init__(self) |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
355 self.addKeyboardListener(self) |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
356 |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
357 def onKeyDown(self, sender=None, keycode=None, modifiers=None): |
019e1e706e74
browser_side: display the popup notifying the message's recipient when you edit the blog entry's bubble.
souliane <souliane@mailoo.org>
parents:
359
diff
changeset
|
358 for listener in self._parent.edit_listeners: |
716
3b91225b457a
server + browser side: blogging refactoring (draft), huge commit sorry:
Goffi <goffi@goffi.org>
parents:
685
diff
changeset
|
359 listener(self, keycode, modifiers) # FIXME: edit_listeners must either be removed, or send an action instead of keycode/modifiers |