## 05_pantomime1.2.dpatch by Sergey Golovin <svgol@mail.ru>
##
## DP: Convert to Pantomime 1.2.

@DPATCH@
diff -urNad lusernet.app-0.4.2~/ChangeLog ChangeLog
--- lusernet.app-0.4.2~/ChangeLog	1970-01-01 02:00:00.000000000 +0200
+++ ChangeLog	2006-09-27 00:13:21.000000000 +0300
@@ -0,0 +1,41 @@
+2006-09-19  Sergey V. Golovin  <svgol@mail.ru>
+
+	* main.m ([AppDelegate -changeEncoding:]): post
+	DefaultEncodingChangedNotification when done
+
+	* main.m: new notification DefaultEncodingChangedNotification
+
+	* ComposeWindowController.m: "DefaultEncoding" now influences all
+	 messages that going to be posted (Yavor Doganov <yavor@doganov.org>)
+
+	* NNTPSourceGUI.m ([NNTPSourcePropertiesController
+	-initWithNNTPSource:]): the NNTPSourcePropertiesController is
+	responsible for releasing its window ([win release] removed from
+	end of -initWithNNTPSource:) 
+
+	* MessageViewController.m ([MessageViewController -getData]): 
+	- The "DefaultEncoding" should influence only such messages that
+	have no the content type header
+	- All normal messages are displayed with their charsets
+
+	* MessageViewController.m ([MessageViewController -encodingChanged:]): added
+	([MessageViewController -initWithMsgDB:textView:scrollView:]): now it
+	waits for DefaultEncodingChangedNotification to redisplay
+	immediately a message if it is needed.
+
+2006-09-04  Sergey Golovin  <svgol@mail.ru>
+
+	* Pref_MessageViewing.m ([Pref_MessageViewing -willShow]): added
+	a pop-up button for charset selection
+	([Pref_MessageViewing -changeEncoding:]): added
+
+2006-09-02  Sergey Golovin  <svgol@mail.ru>
+
+	* MessageViewController.m ([MessageViewController -getData]):
+	- added from user defaults a charset header when a raw message has
+	no one 
+	- added from user defaults a content type header when a raw
+	message has no one 
+
+	* synchronized with Pantomime 1.2
+
diff -urNad lusernet.app-0.4.2~/ComposeWindowController.h ComposeWindowController.h
--- lusernet.app-0.4.2~/ComposeWindowController.h	2004-03-03 01:58:37.000000000 +0200
+++ ComposeWindowController.h	2006-09-27 00:13:21.000000000 +0300
@@ -6,7 +6,7 @@
 #define ComposeWindowController_h
 
 @class NSString,NSDictionary;
-@class Message;
+@class CWMessage;
 @class NSTextView,NSTextField,NSButton;
 
 @interface ComposeWindowController : NSWindowController
@@ -25,7 +25,7 @@
 
 - initWithHeaders: (NSDictionary *)headers  quoteContent: (NSString *)content;
 - initWithHeaders: (NSDictionary *)headers;
-- initWithFollowupToMessage: (Message *)msg;
+- initWithFollowupToMessage: (CWMessage *)msg;
 
 @end
 
diff -urNad lusernet.app-0.4.2~/ComposeWindowController.m ComposeWindowController.m
--- lusernet.app-0.4.2~/ComposeWindowController.m	2004-03-03 01:58:37.000000000 +0200
+++ ComposeWindowController.m	2006-09-27 00:13:21.000000000 +0300
@@ -13,6 +13,7 @@
 #include <AppKit/NSTextContainer.h>
 #include <AppKit/NSTextField.h>
 #include <AppKit/NSButton.h>
+#include <AppKit/NSGraphics.h>
 #include <GNUstepGUI/GSVbox.h>
 #include <GNUstepGUI/GSHbox.h>
 
@@ -21,11 +21,12 @@
 #include "main.h"
 #include "KeyWindow.h"
 #include "Pref_Posting.h"
+#include "Pref_MessageViewing.h"
 
-#include <Pantomime/Constants.h>
-#include <Pantomime/Message.h>
-#include <Pantomime/MimeUtility.h>
-#include <Pantomime/InternetAddress.h>
+#include <Pantomime/CWConstants.h>
+#include <Pantomime/CWMessage.h>
+#include <Pantomime/CWMIMEUtility.h>
+#include <Pantomime/CWInternetAddress.h>
 
 
 @implementation ComposeWindowController
@@ -33,7 +34,7 @@
 
 -(void) post: (id)sender
 {
-	Message *m=[[Message alloc] init];
+	CWMessage *m=[[CWMessage alloc] init];
 	NSMutableDictionary *md;
 	NSEnumerator *e;
 	NSString *header,*value;
@@ -64,7 +65,7 @@
 
 		if ([header isEqualToString: @"From"])
 		{
-			InternetAddress *ia=[[InternetAddress alloc] initWithString: value];
+			CWInternetAddress *ia=[[CWInternetAddress alloc] initWithString: value];
 			[m setFrom: ia];
 			DESTROY(ia);
 		}
@@ -81,7 +82,14 @@
 	[m setFormat: PantomimeFormatFlowed];
 	[m setContent: [text string]];
 
-	[m setCharset: [MimeUtility charsetForString: [text string]]];
+	if(![Pref_MessageViewing defaultEncoding])
+	  {
+	    [m setCharset: @"utf-8"];
+	  }
+	else
+	  {
+	    [m setCharset: [Pref_MessageViewing defaultEncoding]];
+	  }
 
 	state=1;
 	d=[m dataValue];
@@ -386,7 +394,7 @@
 }
 
 /* TODO: handle attributation, followup to sender, followup, etc. */
-- initWithFollowupToMessage: (Message *)msg
+- initWithFollowupToMessage: (CWMessage *)msg
 {
 	NSDictionary *headers;
 	NSString *subject,*references;
diff -urNad lusernet.app-0.4.2~/FolderThreader.m FolderThreader.m
--- lusernet.app-0.4.2~/FolderThreader.m	2004-03-03 01:58:37.000000000 +0200
+++ FolderThreader.m	2006-09-27 00:13:21.000000000 +0300
@@ -9,7 +9,7 @@
 
 #include "FolderThreader.h"
 
-#include <Pantomime/MimeUtility.h>
+#include <Pantomime/CWMIMEUtility.h>
 
 
 static NSDate *parse_date(const char *date_header)
@@ -544,7 +544,7 @@
 		return @"";
 
 	d=[[NSData alloc] initWithBytes: c length: strlen(c)];
-	s2=[MimeUtility decodeHeader: d  charset: nil];
+	s2=[CWMIMEUtility decodeHeader: d  charset: nil];
 	[d release];
 	return s2;
 }
@@ -586,7 +586,7 @@
 		else
 		{
 			d=[[NSData alloc] initWithBytes: c length: strlen(c)];
-			s2=[MimeUtility decodeHeader: d  charset: nil];
+			s2=[CWMIMEUtility decodeHeader: d  charset: nil];
 			[d release];
 			h->subject=[s2 retain];
 		}
@@ -595,7 +595,7 @@
 		if (c)
 		{
 			d=[[NSData alloc] initWithBytes: c length: strlen(c)];
-			s2=[MimeUtility decodeHeader: d  charset: nil];
+			s2=[CWMIMEUtility decodeHeader: d  charset: nil];
 			[d release];
 			h->from=[s2 retain];
 		}
diff -urNad lusernet.app-0.4.2~/FolderWindowController.m FolderWindowController.m
--- lusernet.app-0.4.2~/FolderWindowController.m	2004-03-03 01:58:37.000000000 +0200
+++ FolderWindowController.m	2006-09-27 00:13:21.000000000 +0300
@@ -20,7 +20,8 @@
 #include <AppKit/NSCell.h>
 #include <AppKit/NSFont.h>
+#include <AppKit/NSEvent.h>
 
-#include <Pantomime/MimeUtility.h>
+#include <Pantomime/CWMIMEUtility.h>
 
 #include "MsgDB.h"
 
diff -urNad lusernet.app-0.4.2~/MessageViewController.h MessageViewController.h
--- lusernet.app-0.4.2~/MessageViewController.h	2002-03-08 02:39:34.000000000 +0200
+++ MessageViewController.h	2006-09-27 00:13:21.000000000 +0300
@@ -6,7 +6,7 @@
 #define MessageViewController_h
 
 @class NSTextView,NSScrollView,NSMutableDictionary;
-@class Message;
+@class CWMessage;
 
 #include "MsgDB.h"
 
@@ -17,7 +17,7 @@
 
 	MsgDB *mdb;
 	msg_id_t mid;
-	Message *cur_message;
+	CWMessage *cur_message;
 
 	/* actually an NSMapTable */
 	void *cur_options;
@@ -48,6 +48,8 @@
 
 -(void) messageSave;
 
+-(void) encodingChanged: (NSNotification *)n;
+
 @end
 
 #endif
diff -urNad lusernet.app-0.4.2~/MessageViewController.m MessageViewController.m
--- lusernet.app-0.4.2~/MessageViewController.m	2004-03-03 01:58:37.000000000 +0200
+++ MessageViewController.m	2006-09-27 00:13:21.000000000 +0300
@@ -5,6 +5,9 @@
 #include <Foundation/NSObject.h>
 #include <Foundation/NSBundle.h>
 #include <Foundation/NSFileManager.h>
+#include <AppKit/NSAttributedString.h>
+#include <AppKit/NSGraphics.h>
+#include <AppKit/NSGraphicsContext.h>
 #include <AppKit/NSFileWrapper.h>
 #include <AppKit/NSTextView.h>
 #include <AppKit/NSScrollView.h>
@@ -21,11 +21,11 @@
 
 #include "GUISource.h"
 
-#include <Pantomime/Message.h>
-#include <Pantomime/MimeMultipart.h>
-#include <Pantomime/MimeUtility.h>
-#include <Pantomime/InternetAddress.h>
-#include <Pantomime/UUFile.h>
+#include <Pantomime/CWMessage.h>
+#include <Pantomime/CWMIMEMultipart.h>
+#include <Pantomime/CWMIMEUtility.h>
+#include <Pantomime/CWInternetAddress.h>
+#include <Pantomime/CWUUFile.h>
 
 //#define USE_MIME_STUFF
 
@@ -89,7 +89,7 @@
 
 
 @interface MessageViewController (private)
--(void) _renderContent:(id)p  parent:(Part *)parent  to:(NSMutableAttributedString *)str;
+-(void) _renderContent:(id)p  parent:(CWPart *)parent  to:(NSMutableAttributedString *)str;
 -(void) _renderPart:(id)p to:(NSMutableAttributedString *)str;
 
 -(void) displayMessage;
@@ -212,10 +212,10 @@
 }
 
 
--(void) _render_multipart: (MimeMultipart *)mp  type: (NSString *)ct
+-(void) _render_multipart: (CWMIMEMultipart *)mp  type: (NSString *)ct
 	to: (NSMutableAttributedString *)str
 {
-	Part *bp;
+	CWPart *bp;
 	int i;
 
 	if ([ct isEqual: @"multipart/alternative"])
@@ -227,14 +227,14 @@
 		else
 			disp=[mp count]-1;
 
-		bp=[mp bodyPartAtIndex: disp];
+		bp=[mp partAtIndex: disp];
 		append(str,header_bold_dict,_(@"Currently shown:"));
 		append(str,header_dict,@" %@\n",[bp contentType]);
 		append(str,header_bold_dict,_(@"Alternatives:"));
 		for (i=0;i<[mp count];i++)
 		{
 			appendLink(str,LINK_MULTIPART_ALTERNATIVE,mp,i+1,@" %@",
-				[[mp bodyPartAtIndex: i] contentType]);
+				[[mp partAtIndex: i] contentType]);
 		}
 		append(str,nil,@"\n");
 
@@ -249,7 +249,7 @@
 
 		for (i=0;i<[mp count];i++)
 		{
-			bp=[mp bodyPartAtIndex: i];
+			bp=[mp partAtIndex: i];
 			append(str,header_bold_dict,_(@"\nPart:"));
 			append(str,header_dict,@" %i %@\n",i,[bp contentType]);
 			[self _renderPart:bp to:str];
@@ -264,7 +264,7 @@
 	NSDictionary *fd;
 	NSFont *f;
 
-	NSRange r;
+	//	NSRange r;
 
 	if (cur_font)
 		f=[Pref_MessageViewing font2];
@@ -276,7 +276,7 @@
 
 #if 0 /* TODO: need to update with new Pantomime interface */
 	/* TODO: this should probably be optional */
-	r=[MimeUtility rangeOfUUEncodedStringFromString: text
+	r=[CWMIMEUtility rangeOfUUEncodedStringFromString: text
 		range: NSMakeRange(0,[text length])];
 
 	if (r.location==NSNotFound)
@@ -291,7 +291,7 @@
 			appendPlainText(str,fd,[text substringWithRange: NSMakeRange(0,r.location)]);
 
 		/* TODO: this is inefficient */
-		fw=[MimeUtility fileWrapperFromUUEncodedString: [text substringWithRange: r]];
+		fw=[CWMIMEUtility fileWrapperFromUUEncodedString: [text substringWithRange: r]];
 
 		append(str,header_bold_dict,_(@"UUEncoded file:"));
 		append(str,header_dict,@" %@    ",[fw preferredFilename]);
@@ -312,7 +312,7 @@
 }
 
 
--(void) _renderContent:(id)p  parent:(Part *)parent
+-(void) _renderContent:(id)p  parent:(CWPart *)parent
 	to:(NSMutableAttributedString *)str
 {
 	NSString *ct=[parent contentType];
@@ -340,9 +340,9 @@
 
 
 	/* Some content classes/types we handle internally. */
-	if ([p isKindOfClass: [MimeMultipart class]])
+	if ([p isKindOfClass: [CWMIMEMultipart class]])
 	{
-		[self _render_multipart: (MimeMultipart *)p  type: ct  to: str];
+		[self _render_multipart: (CWMIMEMultipart *)p  type: ct  to: str];
 		return;
 	}
 
@@ -352,7 +352,7 @@
 		return;
 	}
 
-	if ([p isKindOfClass: [Part class]])
+	if ([p isKindOfClass: [CWPart class]])
 	{
 		[self _renderPart: p to: str];
 		return;
@@ -553,13 +553,13 @@
 
 -(void) _renderPart:(id)p to:(NSMutableAttributedString *)str
 {
-	if ([p isKindOfClass: [Message class]])
+	if ([p isKindOfClass: [CWMessage class]])
 	{
-		Message *m=(Message *)p;
+		CWMessage *m=(CWMessage *)p;
 		append(str,header_bold_dict,_(@"Subject:"));
 		append(str,header_dict,@" %@\n",[m subject]);
 		append(str,header_bold_dict,_(@"From:"));
-		append(str,header_dict,@" %@\n",[[m from] unicodeStringValue]);
+		append(str,header_dict,@" %@\n",[[m from] stringValue]);
 		append(str,header_bold_dict,_(@"Newsgroups:"));
 		append(str,header_dict,@" %@\n",[m headerValueForName: @"Newsgroups"]);
 		append(str,header_bold_dict,_(@"Date:"));
@@ -569,9 +569,9 @@
 		append(str,nil,@"\n");
 		[self _renderContent:[m content] parent: m to:str];
 	}
-	else if ([p isKindOfClass: [Part class]])
+	else if ([p isKindOfClass: [CWPart class]])
 	{ /* handles MimeBodyPart and any extensions */
-		[self _renderContent:[(Part *)p content] parent: (Part *)p to:str];
+		[self _renderContent:[(CWPart *)p content] parent: (CWPart *)p to:str];
 	}
 	else
 	{
@@ -655,7 +655,27 @@
 		NSData *d;
 
 		d=[[NSData alloc] initWithBytes: data length: length];
-		cur_message=[(Message *)[Message alloc] initWithData: d];
+		if([mdb msg_getHeader: "ContentType" : mid])
+		  {
+		    cur_message=[(CWMessage *)[CWMessage alloc] initWithData: d];
+		  }
+		else
+		  {
+		    cur_message=[(CWMessage *)[CWMessage alloc] initWithData: d
+					      charset:[Pref_MessageViewing defaultEncoding]];
+		  }
+		if(![cur_message contentType])
+		  {
+		    [cur_message setContentType:@"text/plain"];
+		  }
+		else
+		  {
+		    ASSIGN(
+			   cur_message,
+			   [(CWMessage *)[CWMessage alloc] initWithData: d
+					 charset:[cur_message charset]]
+			   );
+		  }
 		[d release];
 		{
 			const char *c;
@@ -819,17 +839,17 @@
 		{
 			NSString *s=(NSString *)l->object;
 			NSRange r;
-			UUFile *fw;
-			r=[MimeUtility rangeOfUUEncodedStringFromString: s
+			CWUUFile *fw;
+			r=[CWUUFile rangeOfUUEncodedStringFromString: s
 				range: NSMakeRange(0,[s length])];
 
-			fw=[MimeUtility fileFromUUEncodedString: [s substringWithRange: r]];
+			fw=[CWUUFile fileFromUUEncodedString: [s substringWithRange: r]];
 			filename=AUTORELEASE(RETAIN([fw name]));
 			d=AUTORELEASE(RETAIN([fw data]));
 		}
 		else
 		{
-			Part *p=(Part *)l->object;
+			CWPart *p=(CWPart *)l->object;
 			d=(NSData *)[p content];
 			filename=[p filename];
 		}
@@ -926,6 +946,12 @@
 
 	mid=0;
 
+	[[NSNotificationCenter defaultCenter]
+	  addObserver: self
+	  selector: @selector(encodingChanged:)
+	  name: DefaultEncodingChangedNotification
+	  object: nil];
+
 	return self;
 }
 
@@ -1154,6 +1180,11 @@
 	[app_delegate composeFollowupToMessage: cur_message];
 }
 
+-(void) encodingChanged: (NSNotification *)n
+{
+  [self getData];
+  [self displayMessage];
+}
 
 @end
 
diff -urNad lusernet.app-0.4.2~/NNTPSourceGUI.m NNTPSourceGUI.m
--- lusernet.app-0.4.2~/NNTPSourceGUI.m	2004-03-03 01:58:37.000000000 +0200
+++ NNTPSourceGUI.m	2006-09-27 00:13:21.000000000 +0300
@@ -347,7 +347,6 @@
 	[win setTitle: _(@"NNTPSource properties")];
 	[win setDelegate: self];
 	[win autoSetupKeyViewChain];
-	[win release];
 
 	return self;
 }
diff -urNad lusernet.app-0.4.2~/Pref_MessageViewing.h Pref_MessageViewing.h
--- lusernet.app-0.4.2~/Pref_MessageViewing.h	2002-03-11 02:06:46.000000000 +0200
+++ Pref_MessageViewing.h	2006-09-27 00:13:21.000000000 +0300
@@ -27,6 +27,7 @@
 
 +(NSFont *) font1;
 +(NSFont *) font2;
++(NSString *) defaultEncoding;
 
 @end
 
diff -urNad lusernet.app-0.4.2~/Pref_MessageViewing.m Pref_MessageViewing.m
--- lusernet.app-0.4.2~/Pref_MessageViewing.m	2004-03-03 01:58:37.000000000 +0200
+++ Pref_MessageViewing.m	2006-09-27 00:13:21.000000000 +0300
@@ -8,11 +8,15 @@
 #include <Foundation/NSBundle.h>
 
 #include <AppKit/NSButton.h>
+#include <AppKit/NSFontManager.h>
+#include <AppKit/NSPopUpButton.h>
 #include <AppKit/NSTextField.h>
 #include <GNUstepGUI/GSVbox.h>
 #include <GNUstepGUI/GSHbox.h>
 #include <AppKit/NSFont.h>
 
+#include <Pantomime/CWCharset.h>
+
 #include "Pref_MessageViewing.h"
 
 
@@ -192,6 +195,7 @@
 		{
 			NSTextField *f;
 			NSButton *b;
+			NSPopUpButton *pop;
 			GSHbox *hb;
 
 			hb=[[GSHbox alloc] init];
@@ -289,6 +293,49 @@
 
 			[top addView: hb enablingYResizing: NO];
 			DESTROY(hb);
+
+			[top addSeparator];
+
+			hb=[[GSHbox alloc] init];
+			[hb setDefaultMinXMargin: 4];
+			[hb setAutoresizingMask: NSViewWidthSizable];
+
+			f=[[NSTextField alloc] init];
+			[f setStringValue: _(@"Default encoding ")];
+			[f setEditable: NO];
+			[f setDrawsBackground: NO];
+			[f setBordered: NO];
+			[f setBezeled: NO];
+			[f setSelectable: NO];
+			[f sizeToFit];
+			[f setAutoresizingMask: 0];
+			[hb addView: f  enablingXResizing: NO];
+			DESTROY(f);
+
+			pop = [[NSPopUpButton alloc] init];
+			[pop setPullsDown:NO];
+			NSDictionary *charsets = [CWCharset allCharsets];
+			NSEnumerator *en = [[charsets allValues] objectEnumerator];
+			NSString *encoding;
+			while((encoding = [en nextObject]))
+			  {
+			    [pop addItemWithTitle:encoding];
+			  }
+			[pop selectItemWithTitle:
+			       [charsets 
+				 objectForKey:
+				   [sd objectForKey:@"DefaultEncoding"]]];
+			[pop synchronizeTitleAndSelectedItem];
+			[pop setTarget: self];
+			[pop setAction: @selector(changeEncoding:)];
+			[pop sizeToFit];
+			[hb addView: pop  enablingXResizing: NO];
+			DESTROY(pop);
+
+
+			[top addView: hb enablingYResizing: NO];
+			DESTROY(hb);
+
 		}
 
 		[self revert];
@@ -334,5 +381,23 @@
 	[f_cur setFont: f];
 }
 
+-(void) changeEncoding:(id)sender
+{
+  NSDictionary *charsets = [CWCharset allCharsets];
+  sd=[NSUserDefaults standardUserDefaults];
+
+  [sender selectItemWithTitle:[sender titleOfSelectedItem]];
+  [sender synchronizeTitleAndSelectedItem];
+  
+  [sd setObject:
+	[[charsets allKeysForObject:[sender titleOfSelectedItem]] objectAtIndex:0] 
+      forKey:@"DefaultEncoding"];
+}
+
++(NSString *) defaultEncoding
+{
+  return [sd stringForKey:@"DefaultEncoding"];
+}
+
 @end
 
diff -urNad lusernet.app-0.4.2~/main.h main.h
--- lusernet.app-0.4.2~/main.h	2004-03-03 01:58:37.000000000 +0200
+++ main.h	2006-09-27 00:13:21.000000000 +0300
@@ -11,6 +11,8 @@
 @class FolderListController,LogWindowController,PreferencesWindowController;
 @class Message;
 
+extern NSString *DefaultEncodingChangedNotification;
+
 @interface AppDelegate : NSObject
 {
 	NSApplication *app;
@@ -37,7 +39,7 @@
 @interface AppDelegate (prefs)
 -(void) openPreferences: (id)sender;
 @end
-
+	     
 
 extern AppDelegate *app_delegate;
 
diff -urNad lusernet.app-0.4.2~/main.m main.m
--- lusernet.app-0.4.2~/main.m	2004-03-03 01:58:37.000000000 +0200
+++ main.m	2006-09-27 00:13:21.000000000 +0300
@@ -8,9 +8,12 @@
 #include <Foundation/NSPathUtilities.h>
 #include <Foundation/NSBundle.h>
 #include <AppKit/NSApplication.h>
+#include <AppKit/NSGraphics.h>
 #include <AppKit/NSMenu.h>
 #include <AppKit/NSWindow.h>
 
+#include <Pantomime/CWCharset.h>
+
 #include "MsgDB.h"
 
 #include "LogWindowController.h"
@@ -36,6 +38,7 @@
 
 #define LocationKey @"MessageDatabaseLocation"
 
+NSString *DefaultEncodingChangedNotification = @"DefaultEncodingChangedNotification";
 
 @interface NSMenu (im_lazy)
 -(id <NSMenuItem>) addItemWithTitle: (NSString *)s;
@@ -209,6 +212,21 @@
 #endif
 }
 
+-(void) changeEncoding:(id)sender
+{
+  NSDictionary *charsets = [CWCharset allCharsets];
+
+  //  [sender selectItemWithTitle:[sender title]];
+  //  [sender synchronizeTitleAndSelectedItem];
+  
+  [[NSUserDefaults standardUserDefaults] setObject:
+	[[charsets allKeysForObject:[sender title]] objectAtIndex:0] 
+      forKey:@"DefaultEncoding"];
+
+  [[NSNotificationCenter defaultCenter]
+    postNotificationName: DefaultEncodingChangedNotification
+    object: nil];
+}
 
 -(void) applicationWillFinishLaunching: (NSNotification *)n
 {
@@ -307,6 +325,18 @@
 	m=[[NSMenu alloc] init];
 /*	[m addItemWithTitle: _(@"Open")
 		action: @selector(openMessage:)];*/
+	m2=[[NSMenu alloc] init];
+	
+	NSDictionary *charsets = [CWCharset allCharsets];
+	NSEnumerator *en = [[charsets allValues] objectEnumerator];
+	NSString *encoding;
+	while((encoding = [en nextObject]))
+	  {
+	    [m2 addItemWithTitle: encoding
+		action: @selector(changeEncoding:)];
+	  }
+
+	[m setSubmenu: m2 forItem: [m addItemWithTitle: _(@"Change encoding...")]];
 	[m addItemWithTitle: _(@"Toggle read/unread")
 		action: @selector(messageToggleRead:)
 		keyEquivalent: @"m"];
