|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 function MultiplexHandler(aEvent) |
|
6 { |
|
7 MultiplexHandlerEx( |
|
8 aEvent, |
|
9 function Browser_SelectDetector(event) { |
|
10 BrowserCharsetReload(); |
|
11 /* window.content.location.reload() will re-download everything */ |
|
12 SelectDetector(event, null); |
|
13 }, |
|
14 function Browser_SetForcedCharset(charset, isPredefined) { |
|
15 BrowserSetForcedCharacterSet(charset); |
|
16 } |
|
17 ); |
|
18 } |
|
19 |
|
20 function MailMultiplexHandler(aEvent) |
|
21 { |
|
22 MultiplexHandlerEx( |
|
23 aEvent, |
|
24 function Mail_SelectDetector(event) { |
|
25 SelectDetector( |
|
26 event, |
|
27 function Mail_Reload() { |
|
28 messenger.setDocumentCharset(msgWindow.mailCharacterSet); |
|
29 } |
|
30 ); |
|
31 }, |
|
32 function Mail_SetForcedCharset(charset, isPredefined) { |
|
33 MessengerSetForcedCharacterSet(charset); |
|
34 } |
|
35 ); |
|
36 } |
|
37 |
|
38 function ComposerMultiplexHandler(aEvent) |
|
39 { |
|
40 MultiplexHandlerEx( |
|
41 aEvent, |
|
42 function Composer_SelectDetector(event) { |
|
43 SelectDetector( |
|
44 event, |
|
45 function Composer_Reload() { |
|
46 EditorLoadUrl(GetDocumentUrl()); |
|
47 } |
|
48 ); |
|
49 }, |
|
50 function Composer_SetForcedCharset(charset, isPredefined) { |
|
51 if ((!isPredefined) && charset.length > 0) { |
|
52 gCharsetMenu.SetCurrentComposerCharset(charset); |
|
53 } |
|
54 EditorSetDocumentCharacterSet(charset); |
|
55 } |
|
56 ); |
|
57 } |
|
58 |
|
59 function MultiplexHandlerEx(aEvent, aSelectDetector, aSetForcedCharset) |
|
60 { |
|
61 try { |
|
62 var node = aEvent.target; |
|
63 var name = node.getAttribute('name'); |
|
64 |
|
65 if (name == 'detectorGroup') { |
|
66 aSelectDetector(aEvent); |
|
67 } else if (name == 'charsetGroup') { |
|
68 var charset = node.getAttribute('id'); |
|
69 charset = charset.substring('charset.'.length, charset.length) |
|
70 aSetForcedCharset(charset, true); |
|
71 } else if (name == 'charsetCustomize') { |
|
72 //do nothing - please remove this else statement, once the charset prefs moves to the pref window |
|
73 } else { |
|
74 aSetForcedCharset(node.getAttribute('id'), false); |
|
75 } |
|
76 } catch(ex) { |
|
77 alert(ex); |
|
78 } |
|
79 } |
|
80 |
|
81 function SelectDetector(event, doReload) |
|
82 { |
|
83 dump("Charset Detector menu item pressed: " + event.target.getAttribute('id') + "\n"); |
|
84 |
|
85 var uri = event.target.getAttribute("id"); |
|
86 var prefvalue = uri.substring('chardet.'.length, uri.length); |
|
87 if ("off" == prefvalue) { // "off" is special value to turn off the detectors |
|
88 prefvalue = ""; |
|
89 } |
|
90 |
|
91 try { |
|
92 var pref = Components.classes["@mozilla.org/preferences-service;1"] |
|
93 .getService(Components.interfaces.nsIPrefBranch); |
|
94 var str = Components.classes["@mozilla.org/supports-string;1"] |
|
95 .createInstance(Components.interfaces.nsISupportsString); |
|
96 |
|
97 str.data = prefvalue; |
|
98 pref.setComplexValue("intl.charset.detector", |
|
99 Components.interfaces.nsISupportsString, str); |
|
100 if (typeof doReload == "function") doReload(); |
|
101 } |
|
102 catch (ex) { |
|
103 dump("Failed to set the intl.charset.detector preference.\n"); |
|
104 } |
|
105 } |
|
106 |
|
107 var gPrevCharset = null; |
|
108 function UpdateCurrentCharset() |
|
109 { |
|
110 // extract the charset from DOM |
|
111 var wnd = document.commandDispatcher.focusedWindow; |
|
112 if ((window == wnd) || (wnd == null)) wnd = window.content; |
|
113 |
|
114 // Uncheck previous item |
|
115 if (gPrevCharset) { |
|
116 var pref_item = document.getElementById('charset.' + gPrevCharset); |
|
117 if (pref_item) |
|
118 pref_item.setAttribute('checked', 'false'); |
|
119 } |
|
120 |
|
121 var menuitem = document.getElementById('charset.' + wnd.document.characterSet); |
|
122 if (menuitem) { |
|
123 menuitem.setAttribute('checked', 'true'); |
|
124 } |
|
125 } |
|
126 |
|
127 function UpdateCurrentMailCharset() |
|
128 { |
|
129 var charset = msgWindow.mailCharacterSet; |
|
130 var menuitem = document.getElementById('charset.' + charset); |
|
131 |
|
132 if (menuitem) { |
|
133 menuitem.setAttribute('checked', 'true'); |
|
134 } |
|
135 } |
|
136 |
|
137 function UpdateCharsetDetector() |
|
138 { |
|
139 var prefvalue; |
|
140 |
|
141 try { |
|
142 var pref = Components.classes["@mozilla.org/preferences-service;1"] |
|
143 .getService(Components.interfaces.nsIPrefBranch); |
|
144 prefvalue = pref.getComplexValue("intl.charset.detector", |
|
145 Components.interfaces.nsIPrefLocalizedString).data; |
|
146 } |
|
147 catch (ex) { |
|
148 prefvalue = ""; |
|
149 } |
|
150 |
|
151 if (prefvalue == "") prefvalue = "off"; |
|
152 dump("intl.charset.detector = "+ prefvalue + "\n"); |
|
153 |
|
154 prefvalue = 'chardet.' + prefvalue; |
|
155 var menuitem = document.getElementById(prefvalue); |
|
156 |
|
157 if (menuitem) { |
|
158 menuitem.setAttribute('checked', 'true'); |
|
159 } |
|
160 } |
|
161 |
|
162 function UpdateMenus(event) |
|
163 { |
|
164 // use setTimeout workaround to delay checkmark the menu |
|
165 // when onmenucomplete is ready then use it instead of oncreate |
|
166 // see bug 78290 for the detail |
|
167 UpdateCurrentCharset(); |
|
168 setTimeout(UpdateCurrentCharset, 0); |
|
169 UpdateCharsetDetector(); |
|
170 setTimeout(UpdateCharsetDetector, 0); |
|
171 } |
|
172 |
|
173 function CreateMenu(node) |
|
174 { |
|
175 var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); |
|
176 observerService.notifyObservers(null, "charsetmenu-selected", node); |
|
177 } |
|
178 |
|
179 function UpdateMailMenus(event) |
|
180 { |
|
181 // use setTimeout workaround to delay checkmark the menu |
|
182 // when onmenucomplete is ready then use it instead of oncreate |
|
183 // see bug 78290 for the detail |
|
184 UpdateCurrentMailCharset(); |
|
185 setTimeout(UpdateCurrentMailCharset, 0); |
|
186 UpdateCharsetDetector(); |
|
187 setTimeout(UpdateCharsetDetector, 0); |
|
188 } |
|
189 |
|
190 var gCharsetMenu = Components.classes['@mozilla.org/rdf/datasource;1?name=charset-menu'].getService().QueryInterface(Components.interfaces.nsICurrentCharsetListener); |
|
191 var gLastBrowserCharset = null; |
|
192 |
|
193 function charsetLoadListener (event) |
|
194 { |
|
195 var charset = window.content.document.characterSet; |
|
196 |
|
197 if (charset.length > 0 && (charset != gLastBrowserCharset)) { |
|
198 gCharsetMenu.SetCurrentCharset(charset); |
|
199 gPrevCharset = gLastBrowserCharset; |
|
200 gLastBrowserCharset = charset; |
|
201 } |
|
202 } |
|
203 |
|
204 |
|
205 function composercharsetLoadListener (event) |
|
206 { |
|
207 var charset = window.content.document.characterSet; |
|
208 |
|
209 |
|
210 if (charset.length > 0 ) { |
|
211 gCharsetMenu.SetCurrentComposerCharset(charset); |
|
212 } |
|
213 } |
|
214 |
|
215 function SetForcedEditorCharset(charset) |
|
216 { |
|
217 if (charset.length > 0 ) { |
|
218 gCharsetMenu.SetCurrentComposerCharset(charset); |
|
219 } |
|
220 EditorSetDocumentCharacterSet(charset); |
|
221 } |
|
222 |
|
223 |
|
224 var gLastMailCharset = null; |
|
225 |
|
226 function mailCharsetLoadListener (event) |
|
227 { |
|
228 if (msgWindow) { |
|
229 var charset = msgWindow.mailCharacterSet; |
|
230 if (charset.length > 0 && (charset != gLastMailCharset)) { |
|
231 gCharsetMenu.SetCurrentMailCharset(charset); |
|
232 gLastMailCharset = charset; |
|
233 } |
|
234 } |
|
235 } |
|
236 |
|
237 function InitCharsetMenu() |
|
238 { |
|
239 removeEventListener("load", InitCharsetMenu, true); |
|
240 |
|
241 var wintype = document.documentElement.getAttribute('windowtype'); |
|
242 if (window && (wintype == "navigator:browser")) |
|
243 { |
|
244 var contentArea = window.document.getElementById("appcontent"); |
|
245 if (contentArea) |
|
246 contentArea.addEventListener("pageshow", charsetLoadListener, true); |
|
247 } |
|
248 else |
|
249 { |
|
250 var arrayOfStrings = wintype.split(":"); |
|
251 if (window && arrayOfStrings[0] == "mail") |
|
252 { |
|
253 var messageContent = window.document.getElementById("messagepane"); |
|
254 if (messageContent) |
|
255 messageContent.addEventListener("pageshow", mailCharsetLoadListener, true); |
|
256 } |
|
257 else |
|
258 if (window && arrayOfStrings[0] == "composer") |
|
259 { |
|
260 contentArea = window.document.getElementById("appcontent"); |
|
261 if (contentArea) |
|
262 contentArea.addEventListener("pageshow", composercharsetLoadListener, true); |
|
263 } |
|
264 } |
|
265 } |
|
266 |
|
267 addEventListener("load", InitCharsetMenu, true); |