/*
 * Copyright 2000-2013 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.jetbrains.python.projectView;

import com.intellij.ide.projectView.PresentationData;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.projectView.impl.nodes.BasePsiNode;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.project.Project;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.psi.PyFunction;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * @author yole
 */
public class PyElementNode extends BasePsiNode<PyElement> {
  public PyElementNode(Project project, PyElement value, ViewSettings viewSettings) {
    super(project, value, viewSettings);
  }

  @Override
  protected Collection<AbstractTreeNode> getChildrenImpl() {
    PyElement value = getValue();
    // for performance reasons, we don't show nested functions here
    if (value instanceof PyClass) {
      final PyClass pyClass = (PyClass)value;
      List<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>();
      for (PyClass aClass : pyClass.getNestedClasses()) {
        result.add(new PyElementNode(myProject, aClass, getSettings()));
      }
      for (PyFunction function : pyClass.getMethods()) {
        result.add(new PyElementNode(myProject, function, getSettings()));
      }
      return result;
    }
    return Collections.emptyList();       
  }

  @Override
  protected void updateImpl(PresentationData data) {
    PyElement value = getValue();
    final String name = value.getName();
    StringBuilder presentableText = new StringBuilder(name != null ? name : "<unnamed>");
    if (value instanceof PyFunction) {
      presentableText.append(((PyFunction) value).getParameterList().getPresentableText(false));
    }
    data.setPresentableText(presentableText.toString());
    data.setIcon(value.getIcon(0));
  }

  @Override
  public int getTypeSortWeight(boolean sortByType) {
    if (!sortByType) {
      return 0;
    }
    return getValue() instanceof PyClass ? 10 : 20;
  }

  @Override
  public boolean expandOnDoubleClick() {
    return false;
  }
}

@@ -881,31 +881,117 @@
 lij.
-openapi.project.Project
+navigation.ItemPresentation;%0Aimport com.intellij.openapi.project.Project;%0Aimport com.jetbrains.python.PyNames
 ;%0Aim
@@ -1117,16 +1117,38 @@
 ction;%0A%0A
+import javax.swing.*;%0A
 import j
@@ -2211,32 +2211,38 @@
 ata data) %7B%0A    
+final 
 PyElement value 
@@ -2304,229 +2304,469 @@
     
-StringBuilder presentableText = new StringBuilder(name != null ? name : %22%3Cunnamed%3E%22);%0A    if (value instanceof PyFunction) %7B%0A      presentableText.append(((PyFunction) value).getParameterList().getPresentableText(false));
+final ItemPresentation presentation = value.getPresentation();%0A    String presentableText = name != null ? name : PyNames.UNNAMED_ELEMENT;%0A    Icon presentableIcon = value.getIcon(0);%0A    if (presentation != null) %7B%0A      final String text = presentation.getPresentableText();%0A      if (text != null) %7B%0A        presentableText = text;%0A      %7D%0A      final Icon icon = presentation.getIcon(false);%0A      if (icon != null) %7B%0A        presentableIcon = icon;%0A      %7D
 %0A   
@@ -2815,19 +2815,8 @@
 Text
-.toString()
 );%0A 
@@ -2831,32 +2831,31 @@
 setIcon(
-value.get
+presentable
 Icon
-(0)
 );%0A  %7D%0A%0A

Use ItemPresentation.getPresentableText() instead of checking for PyFunction directly