Index: trac/ticket/notification.py
===================================================================
--- trac/ticket/notification.py	(revision 9949)
+++ trac/ticket/notification.py	(working copy)
@@ -183,18 +183,29 @@
             if fval.find('\n') != -1:
                 continue
             idx = 2 * (i % 2)
-            if len(f['label']) > width[idx]:
-                width[idx] = len(f['label'])
-            if len(fval) > width[idx + 1]:
-                width[idx + 1] = len(fval)
+            width[idx] = max(len(f['label']), width[idx])
+            width[idx + 1] = max(len(fval), width[idx + 1])
             i += 1
-        format = (u'%%%is:  %%-%is  |  ' % (width[0], width[1]),
-                  u' %%%is:  %%-%is%s' % (width[2], width[3], CRLF))
-        l = (width[0] + width[1] + 5)
-        sep = l * '-' + '+' + (self.COLS - l) * '-'
+        width_l = width[0] + width[1] + 5
+        width_r = width[2] + width[3] + 5
+        half_cols = (self.COLS - 1) / 2
+        if width_l + width_r + 1 > self.COLS:
+          if ((width_l > half_cols and width_r > half_cols) or 
+              (width[0] > half_cols / 2 or width[2] > half_cols / 2)):
+            width_l = half_cols
+            width_r = half_cols
+          elif width_l > width_r:
+            width_l = min((self.COLS - 1) * 2 / 3, width_l)
+            width_r = self.COLS - width_l - 1
+          else:
+            width_r = min((self.COLS - 1) * 2 / 3, width_r)         
+            width_l = self.COLS - width_r - 1
+        sep = width_l * '-' + '+' + width_r * '-'
         txt = sep + CRLF
+        cell_tmp = [u'', u'']
         big = []
         i = 0
+        width_lr = [width_l, width_r]
         for f in [f for f in fields if f['name'] != 'description']:
             fname = f['name']
             if not tkt.values.has_key(fname):
@@ -207,10 +218,22 @@
             else:
                 # Note: f['label'] is a Babel's LazyObject, make sure its
                 # __str__ method won't be called.
-                txt += format[i % 2] % (f['label'], unicode(fval))
+                str_tmp = u'%s:  %s' % (f['label'], unicode(fval))
+                idx = i % 2
+                cell_tmp[idx] += wrap(str_tmp, width_lr[idx] - 2 + 2 * idx,
+                    (width[2 * idx] - len(f['label']) + 2 * idx) * ' ',
+                    2 * ' ', CRLF)
+                cell_tmp[idx] += CRLF
                 i += 1
-        if i % 2:
-            txt += CRLF
+        cell_l = cell_tmp[0].splitlines()
+        cell_r = cell_tmp[1].splitlines()
+        format = u'%%-%is|%%s%%s' % (width_l)
+        for i in range(max(len(cell_l), len(cell_r))):
+          if i >= len(cell_l):
+              cell_l.append(width_l * ' ')
+          elif i >= len(cell_r):
+              cell_r.append('')
+          txt += format % (cell_l[i], cell_r[i], CRLF)
         if big:
             txt += sep
             for name, value in big:

