SF patch #961387:  Make IDLE's paragraph reformatting width configurable
diff --git a/Lib/idlelib/FormatParagraph.py b/Lib/idlelib/FormatParagraph.py
index eb0e693..80c654e 100644
--- a/Lib/idlelib/FormatParagraph.py
+++ b/Lib/idlelib/FormatParagraph.py
@@ -15,6 +15,7 @@
 # * Fancy comments, like this bulleted list, arent handled :-)
 
 import re
+from configHandler import idleConf
 
 class FormatParagraph:
 
@@ -31,6 +32,7 @@
         self.editwin = None
 
     def format_paragraph_event(self, event):
+        maxformatwidth = int(idleConf.GetOption('main','FormatParagraph','paragraph'))
         text = self.editwin.text
         first, last = self.editwin.get_selection_indices()
         if first and last:
@@ -44,8 +46,8 @@
             lines = data.split("\n")
             lines = map(lambda st, l=len(comment_header): st[l:], lines)
             data = "\n".join(lines)
-            # Reformat to 70 chars or a 20 char width, whichever is greater.
-            format_width = max(70-len(comment_header), 20)
+            # Reformat to maxformatwidth chars or a 20 char width, whichever is greater.
+            format_width = max(maxformatwidth, len(comment_header), 20)
             newdata = reformat_paragraph(data, format_width)
             # re-split and re-insert the comment header.
             newdata = newdata.split("\n")
@@ -62,7 +64,7 @@
             newdata = '\n'.join(map(builder, newdata)) + block_suffix
         else:
             # Just a normal text format
-            newdata = reformat_paragraph(data)
+            newdata = reformat_paragraph(data, maxformatwidth)
         text.tag_remove("sel", "1.0", "end")
         if newdata != data:
             text.mark_set("insert", first)
@@ -99,7 +101,7 @@
     first = "%d.0" % (lineno+1)
     return first, last, comment_header, text.get(first, last)
 
-def reformat_paragraph(data, limit=70):
+def reformat_paragraph(data, limit):
     lines = data.split("\n")
     i = 0
     n = len(lines)
diff --git a/Lib/idlelib/config-main.def b/Lib/idlelib/config-main.def
index e06234b..b8667b8 100644
--- a/Lib/idlelib/config-main.def
+++ b/Lib/idlelib/config-main.def
@@ -58,6 +58,9 @@
 font-bold= 0
 encoding= none
 
+[FormatParagraph]
+paragraph=70
+
 [Indent]
 use-spaces= 1
 num-spaces= 4
diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py
index 2645943..35ef9ae 100644
--- a/Lib/idlelib/configDialog.py
+++ b/Lib/idlelib/configDialog.py
@@ -337,6 +337,7 @@
         #tkVars
         self.winWidth=StringVar(self)
         self.winHeight=StringVar(self)
+        self.paraWidth=StringVar(self)
         self.startupEdit=IntVar(self)
         self.autoSave=IntVar(self)
         self.encoding=StringVar(self)
@@ -349,6 +350,7 @@
         frameRun=Frame(frame,borderwidth=2,relief=GROOVE)
         frameSave=Frame(frame,borderwidth=2,relief=GROOVE)
         frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
+        frameParaSize=Frame(frame,borderwidth=2,relief=GROOVE)
         frameEncoding=Frame(frame,borderwidth=2,relief=GROOVE)
         frameHelp=Frame(frame,borderwidth=2,relief=GROOVE)
         #frameRun
@@ -374,6 +376,11 @@
         labelWinHeightTitle=Label(frameWinSize,text='Height')
         entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
                 width=3)
+        #paragraphFormatWidth
+        labelParaWidthTitle=Label(frameParaSize,text='Paragraph reformat'+
+                ' width (in characters)')
+        entryParaWidth=Entry(frameParaSize,textvariable=self.paraWidth,
+                width=3)
         #frameEncoding
         labelEncodingTitle=Label(frameEncoding,text="Default Source Encoding")
         radioEncLocale=Radiobutton(frameEncoding,variable=self.encoding,
@@ -411,6 +418,7 @@
         frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
         frameSave.pack(side=TOP,padx=5,pady=5,fill=X)
         frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
+        frameParaSize.pack(side=TOP,padx=5,pady=5,fill=X)
         frameEncoding.pack(side=TOP,padx=5,pady=5,fill=X)
         frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
         #frameRun
@@ -429,6 +437,9 @@
         labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5)
         entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
         labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5)
+        #paragraphFormatWidth
+        labelParaWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
+        entryParaWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
         #frameEncoding
         labelEncodingTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
         radioEncNone.pack(side=RIGHT,anchor=E,pady=5)
@@ -466,6 +477,7 @@
         self.keysAreBuiltin.trace_variable('w',self.VarChanged_keysAreBuiltin)
         self.winWidth.trace_variable('w',self.VarChanged_winWidth)
         self.winHeight.trace_variable('w',self.VarChanged_winHeight)
+        self.paraWidth.trace_variable('w',self.VarChanged_paraWidth)
         self.startupEdit.trace_variable('w',self.VarChanged_startupEdit)
         self.autoSave.trace_variable('w',self.VarChanged_autoSave)
         self.encoding.trace_variable('w',self.VarChanged_encoding)
@@ -558,6 +570,10 @@
         value=self.winHeight.get()
         self.AddChangedItem('main','EditorWindow','height',value)
 
+    def VarChanged_paraWidth(self,*params):
+        value=self.paraWidth.get()
+        self.AddChangedItem('main','FormatParagraph','paragraph',value)
+
     def VarChanged_startupEdit(self,*params):
         value=self.startupEdit.get()
         self.AddChangedItem('main','General','editor-on-startup',value)
@@ -1070,6 +1086,8 @@
         #initial window size
         self.winWidth.set(idleConf.GetOption('main','EditorWindow','width'))
         self.winHeight.set(idleConf.GetOption('main','EditorWindow','height'))
+        #initial paragraph reformat size
+        self.paraWidth.set(idleConf.GetOption('main','FormatParagraph','paragraph'))
         # default source encoding
         self.encoding.set(idleConf.GetOption('main', 'EditorWindow',
                                              'encoding', default='none'))