/*
 * Copyright 2000-2010 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.intellij.openapi.vcs.actions;

import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;

/**
 * @author Konstantin Bulenkov
 */
public enum ShortNameType {
  LASTNAME("lastname", "Last Name"),
  FIRSTNAME("firstname", "First Name"),
  NONE("full", "Full name");

  private static final String KEY = "annotate.short.names.type";
  private final String myId;
  private final String myDescription;

  ShortNameType(String id, String description) {
    myId = id;
    myDescription = description;
  }

  public String getDescription() {
    return myDescription;
  }

  boolean isSet() {
    return myId.equals(PropertiesComponent.getInstance().getValue(KEY));
  }

  void set() {
    PropertiesComponent.getInstance().setValue(KEY, myId);
  }

  @Nullable
  public static String shorten(@Nullable String name, @NotNull ShortNameType type) {
    if (type == NONE) return name;
    if (name != null) {
      // Vasya Pupkin <vasya.pupkin@jetbrains.com> -> Vasya Pupkin
      final int[] ind = {name.indexOf('<'), name.indexOf('@'), name.indexOf('>')};
      if (0 < ind[0] && ind[0] < ind[1] && ind[1] < ind[2]) {
        return shorten(name.substring(0, ind[0]).trim(), type);
      }

      // vasya.pupkin@email.com --> vasya pupkin
      if (!name.contains(" ") && name.contains("@")) { //simple e-mail check. john@localhost
        final String firstPart = name.substring(0, name.indexOf('@')).replace('.', ' ').replace('_', ' ').replace('-', ' ');
        if (firstPart.length() < name.length()) {
          return shorten(firstPart, type);
        }
        else {
          return firstPart;
        }
      }

      final List<String> strings = StringUtil.split(name.replace('.', ' ').replace('_', ' ').replace('-', ' '), " ");
      if (strings.size() > 1) {
        //Middle name check: Vasya S. Pupkin
        return StringUtil.capitalize(type == ShortNameType.FIRSTNAME ? strings.get(0) : strings.get(strings.size() - 1));
      }
    }
    return name;
  }
}

@@ -1608,20 +1608,20 @@
 if (
-typ
+nam
 e == 
-NONE
+null
 ) re
@@ -1622,27 +1622,27 @@
 ll) return n
-ame
+ull
 ;%0A    if (na
@@ -1643,26 +1643,36 @@
 if (
-name != null) %7B%0A  
+type == NONE) return name;%0A%0A
     
@@ -1732,26 +1732,24 @@
  Pupkin%0A    
-  
 final int%5B%5D 
@@ -1813,26 +1813,24 @@
 ('%3E')%7D;%0A    
-  
 if (0 %3C ind%5B
@@ -1879,33 +1879,23 @@
 %7B%0A      
-  return shorten(
+name = 
 name.sub
@@ -1922,28 +1922,17 @@
 im()
-, type)
 ;%0A    
-  
 %7D%0A%0A
-  
     
@@ -1974,26 +1974,24 @@
  pupkin%0A    
-  
 if (!name.co
@@ -2075,32 +2075,12 @@
     
-  final String firstPart
+name
  = n
@@ -2114,16 +2114,39 @@
 Of('@'))
+;%0A    %7D%0A    name = name
 .replace
@@ -2197,283 +2197,63 @@
 ');%0A
-        if (firstPart.length() %3C name.length()) %7B%0A          return shorten(firstPart, type);%0A        %7D%0A        else %7B%0A          return firstPart;%0A        %7D%0A      %7D%0A%0A      final List%3CString%3E strings = StringUtil.split(name.replace('.', ' ').replace('_', ' ').replace('-', ' ')
+%0A    final List%3CString%3E strings = StringUtil.split(name
 , %22 
@@ -2260,18 +2260,16 @@
 %22);%0A    
-  
 if (stri
@@ -2283,147 +2283,146 @@
 e() 
-%3E 1) %7B%0A        //Middle name check: Vasya S. Pupkin%0A        return StringUtil.capitalize(type == ShortNameType.FIRSTNAME ? strings.get(0) :
+%3C 2) return name;%0A%0A    String shortName;%0A    if (type == FIRSTNAME) %7B%0A      shortName = strings.get(0);%0A    %7D%0A    else %7B%0A      shortName =
  str
@@ -2453,19 +2453,10 @@
 - 1)
-)
 ;%0A
-      %7D%0A
     
@@ -2468,20 +2468,48 @@
  return 
-n
+StringUtil.capitalize(shortN
 ame
+)
 ;%0A  %7D%0A%7D%0A

simplify - remove recursive method calls