Index: cc-align.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-align.el,v
retrieving revision 1.20.2.14
diff -c -r1.20.2.14 cc-align.el
*** cc-align.el	9 Jan 2008 01:19:45 -0000	1.20.2.14
--- cc-align.el	5 Mar 2008 04:57:52 -0000
***************
*** 908,915 ****
  	   )
        (- target-col open-bracket-col extra))))
  
  (defun c-lineup-ObjC-method-args (langelem)
!   "Line up the colons that separate args.
  The colon on the current line is aligned with the one on the first
  line.
  
--- 908,958 ----
  	   )
        (- target-col open-bracket-col extra))))
  
+ (defun c-lineup-ObjC-method-call-colons (langelem)
+   "Line up selector args as Project Builder / XCode: colons of first
+    selector portions on successive lines are aligned.  If no decision can
+    be made return NIL, so that other lineup methods can be tried.  This is
+    typically chained with `c-lineup-ObjC-method-call'.
+ 
+ Works with: objc-method-call-cont."
+   (save-excursion
+     (catch 'no-idea
+       (let* ((method-arg-len (progn
+ 			       (back-to-indentation)
+ 			       (if (search-forward ":" (c-point 'eol) 'move)
+ 				   (- (point) (c-point 'boi))
+ 				 ; no complete argument to indent yet
+ 				 (throw 'no-idea nil))))
+ 
+ 	     (extra (save-excursion 
+                       ; indent parameter to argument if needed
+ 		      (back-to-indentation)
+ 		      (c-backward-syntactic-ws (cdr langelem))
+ 		      (if (eq ?: (char-before))
+ 			  (c-get-offset '(c-objc-method-parameter-offset . nil))
+ 			0)))
+ 
+ 	     (open-bracket-col (c-langelem-col langelem))
+ 
+ 	     (arg-ralign-colon-ofs (progn
+ 			(forward-char) ; skip over '['
+ 			; skip over object/class name
+ 			; and first argument
+ 			(c-forward-sexp 2)
+ 			(if (search-forward ":" (c-point 'eol) 'move)
+ 			    (- (current-column) open-bracket-col
+ 			       method-arg-len extra)
+ 			  ; previous arg has no param
+   			  (c-get-offset
+ 			   '(c-objc-method-arg-unfinished-offset . nil))))))
+ 
+ 	(if (>= arg-ralign-colon-ofs
+ 		(c-get-offset '(c-objc-method-arg-min-delta-to-bracket . nil)))
+ 	    (+ arg-ralign-colon-ofs extra)
+ 	  (throw 'no-idea nil))))))
+ 
  (defun c-lineup-ObjC-method-args (langelem)
!   "Line up the colons that separate args in a method declaration.
  The colon on the current line is aligned with the one on the first
  line.
  
***************
*** 933,939 ****
  	  c-basic-offset)))))
  
  (defun c-lineup-ObjC-method-args-2 (langelem)
!   "Line up the colons that separate args.
  The colon on the current line is aligned with the one on the previous
  line.
  
--- 976,982 ----
  	  c-basic-offset)))))
  
  (defun c-lineup-ObjC-method-args-2 (langelem)
!   "Line up the colons that separate args in a method declaration.
  The colon on the current line is aligned with the one on the previous
  line.
  
Index: cc-fonts.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-fonts.el,v
retrieving revision 1.2.2.19
diff -c -r1.2.2.19 cc-fonts.el
*** cc-fonts.el	9 Jan 2008 01:19:45 -0000	1.2.2.19
--- cc-fonts.el	5 Mar 2008 04:58:08 -0000
***************
*** 1319,1325 ****
  				  nil)))
  		'((c-put-char-property (1- (match-end 1))
  				       'c-type 'c-decl-end)))
! 	      c-font-lock-objc-methods))
  
        ;; Fontify all declarations, casts and normal labels.
        c-font-lock-declarations
--- 1319,1353 ----
  				  nil)))
  		'((c-put-char-property (1- (match-end 1))
  				       'c-type 'c-decl-end)))
! 
! 	      c-font-lock-objc-methods
! 
! 	      ;; Parts of selector name in messages
! 	      ;; PENDING: perhaps should change to only pick up inside brackets
! 	      ("\\sw*:" 0 font-lock-function-name-face keep t)
! 
! 	      ;; get argument-less selectors' highlighting right
! 	      ;; [[foo _bar_] _baz_] -> bar, baz are highlighted
! 	      ("\\(\\sw+\\)[ \t]*[]]"
! 		(1 (let ((non-ws-before-match (char-before 
! 			      (save-excursion
! 				(goto-char (match-beginning 1))
! 				;; expensive!
! 				(c-backward-syntactic-ws (c-point 'bol))
! 				(point)
! 				))))
! 		      (unless (or (eq ?:  non-ws-before-match)
! 				  (eq ?\[ non-ws-before-match)
! 				  (eq ?> non-ws-before-match))
! 			font-lock-function-name-face)))))
! 	  ;; PENDING: unsure if c-nonlabel-token-key or c-opt-extra-label-key
! 	  ;;          should be used here
! 	  (when (c-lang-const c-opt-extra-label-key)
! 	    `(,(c-make-font-lock-search-function
! 		(c-lang-const c-opt-extra-label-key)
! 		'((c-put-char-property (1- (match-end 0))
! 				       'c-type 'c-decl-end)))))
! 	  )
  
        ;; Fontify all declarations, casts and normal labels.
        c-font-lock-declarations
Index: cc-langs.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-langs.el,v
retrieving revision 1.25.2.23
diff -c -r1.25.2.23 cc-langs.el
*** cc-langs.el	30 Jan 2008 07:56:53 -0000	1.25.2.23
--- cc-langs.el	5 Mar 2008 04:58:24 -0000
***************
*** 2078,2084 ****
    t       nil
    (c c++) '("NULL" ;; Not a keyword, but practically works as one.
  	    "false" "true")		; Defined in C99.
!   objc    '("nil" "Nil")
    idl     '("TRUE" "FALSE")
    java    '("true" "false" "null") ; technically "literals", not keywords
    pike    '("UNDEFINED")) ;; Not a keyword, but practically works as one.
--- 2078,2084 ----
    t       nil
    (c c++) '("NULL" ;; Not a keyword, but practically works as one.
  	    "false" "true")		; Defined in C99.
!   objc    '("nil" "Nil" "YES" "NO" "NS_DURING" "NS_HANDLER" "NS_ENDHANDLER" "ASSIGN" "RELEASE" "AUTORELEASE" "RETAIN" "DESTROY" "CREATE_AUTORELEASE_POOL" "RECREATE_AUTORELEASE_POOL")
    idl     '("TRUE" "FALSE")
    java    '("true" "false" "null") ; technically "literals", not keywords
    pike    '("UNDEFINED")) ;; Not a keyword, but practically works as one.
Index: cc-menus.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-menus.el,v
retrieving revision 1.25.2.11
diff -c -r1.25.2.11 cc-menus.el
*** cc-menus.el	9 Jan 2008 01:19:40 -0000	1.25.2.11
--- cc-menus.el	5 Mar 2008 04:58:24 -0000
***************
*** 331,340 ****
  	     'buffer-substring-no-properties
  	   'buffer-substring)))
      (goto-char (point-max))
-     (imenu-progress-message stupid 0)
      ;;
      (while (re-search-backward cc-imenu-objc-generic-expression nil t)
-       (imenu-progress-message stupid)
        (setq langnum (if (match-beginning OBJC) 
  			OBJC
  		      (cond
--- 331,338 ----
***************
*** 386,392 ****
  					  methodlist) toplist))
  	      methodlist nil))))
      ;; 
-     (imenu-progress-message stupid 100)
      (if (eq (car toplist) nil)
  	(setq toplist (cdr toplist)))
  
--- 384,389 ----
Index: cc-vars.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-vars.el,v
retrieving revision 1.31.2.21
diff -c -r1.31.2.21 cc-vars.el
*** cc-vars.el	30 Jan 2008 07:56:54 -0000	1.31.2.21
--- cc-vars.el	5 Mar 2008 04:58:31 -0000
***************
*** 940,945 ****
--- 940,984 ----
    :type 'integer
    :group 'c)
  
+ (defcustom-c-stylevar c-objc-method-arg-min-delta-to-bracket 2
+   "*Minimum number of chars to the opening bracket.
+ 
+ Consider this ObjC snippet:
+ 
+ 	[foo blahBlah: fred
+ 	|<-x->|barBaz: barney
+ 
+ If `x' is less than this number then `c-lineup-ObjC-method-call-colons'
+ will defer the indentation decision to the next function.  By default
+ this is `c-lineup-ObjC-method-call', which would align it like:
+ 
+ 	[foo blahBlahBlah: fred
+ 	     thisIsTooDamnLong: barney
+ 
+ This behaviour can be overridden by customizing the indentation of
+ `objc-method-call-cont' in the \"objc\" style."
+   :type 'integer
+   :group 'c)
+ 
+ (defcustom-c-stylevar c-objc-method-arg-unfinished-offset 4
+   "*Offset relative to bracket if first selector is on a new line.
+ 
+     [aaaaaaaaa
+     |<-x->|bbbbbbb:  cccccc
+              ddddd: eeee];"
+   :type 'integer
+   :group 'c)
+ 
+ (defcustom-c-stylevar c-objc-method-parameter-offset 4
+   "*Offset for selector parameter on a new line (relative to first selector.
+ 
+     [aaaaaaa bbbbbbbbbb:
+ 	     |<-x->|cccccccc
+                     ddd: eeee
+                    ffff: ggg];"
+   :type 'integer
+   :group 'c)
+ 
  (defcustom c-default-style '((java-mode . "java") (awk-mode . "awk")
  			     (other . "gnu"))
    "*Style which gets installed by default when a file is visited.
***************
*** 1125,1131 ****
         ;; Anchor pos: Boi.
         (objc-method-args-cont . c-lineup-ObjC-method-args)
         ;; Anchor pos: At the method start (always at boi).
!        (objc-method-call-cont . c-lineup-ObjC-method-call)
         ;; Anchor pos: At the open bracket.
         (extern-lang-open      . 0)
         (namespace-open        . 0)
--- 1164,1175 ----
         ;; Anchor pos: Boi.
         (objc-method-args-cont . c-lineup-ObjC-method-args)
         ;; Anchor pos: At the method start (always at boi).
!        (objc-method-call-cont . (c-lineup-ObjC-method-call-colons
! 			        c-lineup-ObjC-method-call +))
!        ;; Anchor pos: (used by c-lineup-method-call-colons)
!        (c-objc-method-arg-min-delta-to-bracket	. *)
!        (c-objc-method-arg-unfinished-offset	. +)
!        (c-objc-method-parameter-offset		. +)
         ;; Anchor pos: At the open bracket.
         (extern-lang-open      . 0)
         (namespace-open        . 0)
