- return name.rsplit(" ", 1)[0]
-
- @staticmethod
- def guess_lastname(name):
- if ", " in name:
- return name.split(", ", 1)[0]
- else:
- return name.rsplit(" ", 1)[-1]
-
- @classmethod
- def advanced_firstname_sorter(cls, contacts):
- contactsWithKey = [
- (cls.guess_firstname(contactName), (contactId, contactName))
- for (contactId, contactName) in contacts
- ]
- contactsWithKey.sort()
- return (contactData for (lastName, contactData) in contactsWithKey)
-
- @classmethod
- def advanced_lastname_sorter(cls, contacts):
- contactsWithKey = [
- (cls.guess_lastname(contactName), (contactId, contactName))
- for (contactId, contactName) in contacts
- ]
- contactsWithKey.sort()
- return (contactData for (lastName, contactData) in contactsWithKey)
-
-
-class PhoneTypeSelector(object):
-
- ACTION_CANCEL = "cancel"
- ACTION_SELECT = "select"
- ACTION_DIAL = "dial"
- ACTION_SEND_SMS = "sms"
-
- def __init__(self, widgetTree, gcBackend):
- self._gcBackend = gcBackend
- self._widgetTree = widgetTree
-
- self._dialog = self._widgetTree.get_widget("phonetype_dialog")
- self._smsDialog = SmsEntryDialog(self._widgetTree)
-
- self._smsButton = self._widgetTree.get_widget("sms_button")
- self._smsButton.connect("clicked", self._on_phonetype_send_sms)
-
- self._dialButton = self._widgetTree.get_widget("dial_button")
- self._dialButton.connect("clicked", self._on_phonetype_dial)
-
- self._selectButton = self._widgetTree.get_widget("select_button")
- self._selectButton.connect("clicked", self._on_phonetype_select)
-
- self._cancelButton = self._widgetTree.get_widget("cancel_button")
- self._cancelButton.connect("clicked", self._on_phonetype_cancel)
-
- self._messagemodel = gtk.ListStore(gobject.TYPE_STRING)
- self._messagesView = self._widgetTree.get_widget("phoneSelectionMessages")
- self._scrollWindow = self._messagesView.get_parent()
-
- self._typemodel = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
- self._typeviewselection = None
- self._typeview = self._widgetTree.get_widget("phonetypes")
- self._typeview.connect("row-activated", self._on_phonetype_select)
-
- self._action = self.ACTION_CANCEL
-
- def run(self, contactDetails, messages = (), parent = None):
- self._action = self.ACTION_CANCEL
-
- # Add the column to the phone selection tree view
- self._typemodel.clear()
- self._typeview.set_model(self._typemodel)
-
- textrenderer = gtk.CellRendererText()
- numberColumn = gtk.TreeViewColumn("Phone Numbers", textrenderer, text=0)
- self._typeview.append_column(numberColumn)
-
- textrenderer = gtk.CellRendererText()
- typeColumn = gtk.TreeViewColumn("Phone Type", textrenderer, text=1)
- self._typeview.append_column(typeColumn)
-
- for phoneType, phoneNumber in contactDetails:
- display = " - ".join((phoneNumber, phoneType))
- display = phoneType
- row = (phoneNumber, display)
- self._typemodel.append(row)
-
- self._typeviewselection = self._typeview.get_selection()
- self._typeviewselection.set_mode(gtk.SELECTION_SINGLE)
- self._typeviewselection.select_iter(self._typemodel.get_iter_first())
-
- # Add the column to the messages tree view
- self._messagemodel.clear()
- self._messagesView.set_model(self._messagemodel)
-
- textrenderer = gtk.CellRendererText()
- textrenderer.set_property("wrap-mode", pango.WRAP_WORD)
- textrenderer.set_property("wrap-width", 450)
- messageColumn = gtk.TreeViewColumn("")
- messageColumn.pack_start(textrenderer, expand=True)
- messageColumn.add_attribute(textrenderer, "markup", 0)
- messageColumn.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
- self._messagesView.append_column(messageColumn)
- self._messagesView.set_headers_visible(False)
-
- if messages:
- for message in messages:
- row = (message, )
- self._messagemodel.append(row)
- self._messagesView.show()
- self._scrollWindow.show()
- messagesSelection = self._messagesView.get_selection()
- messagesSelection.select_path((len(messages)-1, ))
- else:
- self._messagesView.hide()
- self._scrollWindow.hide()
-
- if parent is not None:
- self._dialog.set_transient_for(parent)
-
- try:
- self._dialog.show()
- if messages:
- self._messagesView.scroll_to_cell((len(messages)-1, ))
-
- userResponse = self._dialog.run()
- finally:
- self._dialog.hide()
-
- if userResponse == gtk.RESPONSE_OK:
- phoneNumber = self._get_number()
- phoneNumber = make_ugly(phoneNumber)
- else:
- phoneNumber = ""
- if not phoneNumber:
- self._action = self.ACTION_CANCEL
-
- if self._action == self.ACTION_SEND_SMS:
- smsMessage = self._smsDialog.run(phoneNumber, messages, parent)
- if not smsMessage:
- phoneNumber = ""
- self._action = self.ACTION_CANCEL
- else:
- smsMessage = ""
-
- self._messagesView.remove_column(messageColumn)
- self._messagesView.set_model(None)
-
- self._typeviewselection.unselect_all()
- self._typeview.remove_column(numberColumn)
- self._typeview.remove_column(typeColumn)
- self._typeview.set_model(None)
-
- return self._action, phoneNumber, smsMessage
-
- def _get_number(self):
- model, itr = self._typeviewselection.get_selected()
- if not itr:
- return ""
-
- phoneNumber = self._typemodel.get_value(itr, 0)
- return phoneNumber
-
- def _on_phonetype_dial(self, *args):
- self._dialog.response(gtk.RESPONSE_OK)
- self._action = self.ACTION_DIAL
-
- def _on_phonetype_send_sms(self, *args):
- self._dialog.response(gtk.RESPONSE_OK)
- self._action = self.ACTION_SEND_SMS
-
- def _on_phonetype_select(self, *args):
- self._dialog.response(gtk.RESPONSE_OK)
- self._action = self.ACTION_SELECT
-
- def _on_phonetype_cancel(self, *args):
- self._dialog.response(gtk.RESPONSE_CANCEL)
- self._action = self.ACTION_CANCEL
+ acceptedChars = len(line) # eh, might as well complete the line
+ suffix = ""
+ abbrevMessage = "%s%s" % (line[0:acceptedChars], suffix)
+ yield abbrevMessage
+
+ lines += acceptedLines
+ if maxLines <= lines:
+ break
+
+
+def collapse_message(message, maxCharsPerLine, maxLines):
+ r"""
+ >>> collapse_message("Hello", 60, 2)
+ 'Hello'
+ >>> collapse_message("Hello world how are you doing today? 01234567890123456789012345678901234567890123456789012345678901234567890123456789", 60, 2)
+ 'Hello world how are you doing today? 01234567890123456789012...'
+ >>> collapse_message('''Hello world how are you doing today?
+ ... 01234567890123456789
+ ... 01234567890123456789
+ ... 01234567890123456789
+ ... 01234567890123456789''', 60, 2)
+ 'Hello world how are you doing today?\n01234567890123456789'
+ >>> collapse_message('''
+ ... Hello world how are you doing today? 01234567890123456789012345678901234567890123456789012345678901234567890123456789
+ ... Hello world how are you doing today? 01234567890123456789012345678901234567890123456789012345678901234567890123456789
+ ... Hello world how are you doing today? 01234567890123456789012345678901234567890123456789012345678901234567890123456789
+ ... Hello world how are you doing today? 01234567890123456789012345678901234567890123456789012345678901234567890123456789
+ ... Hello world how are you doing today? 01234567890123456789012345678901234567890123456789012345678901234567890123456789
+ ... Hello world how are you doing today? 01234567890123456789012345678901234567890123456789012345678901234567890123456789''', 60, 2)
+ '\nHello world how are you doing today? 01234567890123456789012...'
+ """
+ messageLines = message.split("\n")
+ return "\n".join(_collapse_message(messageLines, maxCharsPerLine, maxLines))