Package org.adoptopenjdk.jitwatch.ui

Source Code of org.adoptopenjdk.jitwatch.ui.ClassMemberList$MetaMethodCell

/*
* Copyright (c) 2013, 2014 Chris Newland.
* Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD
* Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki
*/
package org.adoptopenjdk.jitwatch.ui;

import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.*;

import java.util.List;
import java.util.Map;

import org.adoptopenjdk.jitwatch.core.IntrinsicFinder;
import org.adoptopenjdk.jitwatch.core.JITWatchConfig;
import org.adoptopenjdk.jitwatch.model.IMetaMember;
import org.adoptopenjdk.jitwatch.model.Journal;
import org.adoptopenjdk.jitwatch.model.MetaClass;
import org.adoptopenjdk.jitwatch.util.UserInterfaceUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tooltip;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.util.Callback;

public class ClassMemberList extends VBox
{
  private CheckBox cbOnlyCompiled;
  private ListView<IMetaMember> memberList;
  private MetaClass metaClass = null;
  private JITWatchConfig config;

  private static final Logger logger = LoggerFactory.getLogger(ClassMemberList.class);

  public ClassMemberList(final JITWatchUI parent, final JITWatchConfig config)
  {
    this.config = config;

    cbOnlyCompiled = new CheckBox("Hide non JIT-compiled class members");
    cbOnlyCompiled.setTooltip(new Tooltip("Hide class members (methods and constructors) that were not JIT-compiled."));

    cbOnlyCompiled.setSelected(config.isShowOnlyCompiledMembers());

    cbOnlyCompiled.selectedProperty().addListener(new ChangeListener<Boolean>()
    {
      @Override
      public void changed(ObservableValue<? extends Boolean> ov, Boolean oldVal, Boolean newVal)
      {
        config.setShowOnlyCompiledMembers(newVal);
        config.saveConfig();
        refresh();
      }
    });

    cbOnlyCompiled.setStyle("-fx-background-color:#dddddd; -fx-padding:4px");
    cbOnlyCompiled.prefWidthProperty().bind(widthProperty());

    memberList = new ListView<IMetaMember>();
    memberList.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<IMetaMember>()
    {
      @Override
      public void changed(ObservableValue<? extends IMetaMember> arg0, IMetaMember oldVal, IMetaMember newVal)
      {
        parent.setSelectedMetaMember(newVal);
      }
    });

    memberList.setCellFactory(new Callback<ListView<IMetaMember>, ListCell<IMetaMember>>()
    {
      @Override
      public ListCell<IMetaMember> call(ListView<IMetaMember> arg0)
      {
        return new MetaMethodCell();
      }
    });
   
    final ContextMenu menuCompiled = buildContextMenuCompiledMember(parent);
    final ContextMenu menuUncompiled = buildContextMenuUncompiledMember(parent);
   
    memberList.addEventHandler(MouseEvent.MOUSE_CLICKED, getEventHandlerContextMenu(menuCompiled, menuUncompiled));


    memberList.addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler<MouseEvent>()
    {
      @Override
      public void handle(MouseEvent e)
      {
        menuCompiled.hide();
        menuUncompiled.hide();
      }
    });
   
   
    getChildren().add(cbOnlyCompiled);
    getChildren().add(memberList);

    memberList.prefHeightProperty().bind(heightProperty());
  }

  private EventHandler<MouseEvent> getEventHandlerContextMenu(final ContextMenu contextMenuCompiled,
      final ContextMenu contextMenuNotCompiled)
  {
    return new EventHandler<MouseEvent>()
    {
      @Override
      public void handle(MouseEvent e)
      {
        if (e.getButton() == MouseButton.SECONDARY)
        {
          IMetaMember selectedMember = memberList.getSelectionModel().getSelectedItem();

          if (selectedMember.isCompiled())
          {
            contextMenuCompiled.show(memberList, e.getScreenX(), e.getScreenY());
          }
          else
          {
            contextMenuNotCompiled.show(memberList, e.getScreenX(), e.getScreenY());
          }
        }
      }
    };
  }

  private ContextMenu buildContextMenuCompiledMember(JITWatchUI parent)
  {
    final ContextMenu menu = new ContextMenu();

    MenuItem menuItemTriView = new MenuItem("Show TriView");
    MenuItem menuItemJournal = new MenuItem("Show JIT journal");
    MenuItem menuItemIntrinsics = new MenuItem("Show intrinsics used");
    MenuItem menuItemCallChain = new MenuItem("Show compile chain");
    MenuItem menuItemOptimizedVCalls = new MenuItem("Show optimized virtual calls");

    menu.getItems().add(menuItemTriView);
    menu.getItems().add(menuItemJournal);
    menu.getItems().add(menuItemIntrinsics);
    menu.getItems().add(menuItemCallChain);
    menu.getItems().add(menuItemOptimizedVCalls);


    menuItemTriView.setOnAction(getEventHandlerMenuItemTriView(parent));

    menuItemJournal.setOnAction(getEventHandlerMenuItemJournal(parent));

    menuItemIntrinsics.setOnAction(getEventHandlerMenuItemIntrinsics(parent));

    menuItemCallChain.setOnAction(getEventHandlerMenuItemCallChain(parent));
   
    menuItemOptimizedVCalls.setOnAction(getEventHandlerMenuItemOptimizedVCall(parent));


    return menu;
  }

  private ContextMenu buildContextMenuUncompiledMember(JITWatchUI parent)
  {
    ContextMenu menu = new ContextMenu();

    MenuItem menuItemTriView = new MenuItem("Show TriView");
    MenuItem menuItemJournal = new MenuItem("Show JIT journal");

    menu.getItems().add(menuItemTriView);
    menu.getItems().add(menuItemJournal);

    menuItemTriView.setOnAction(getEventHandlerMenuItemTriView(parent));

    menuItemJournal.setOnAction(getEventHandlerMenuItemJournal(parent));
   
    return menu;
  }

  private EventHandler<ActionEvent> getEventHandlerMenuItemTriView(final JITWatchUI parent)
  {
    return new EventHandler<ActionEvent>()
    {
      @Override
      public void handle(ActionEvent e)
      {
        parent.openTriView(memberList.getSelectionModel().getSelectedItem(), false);
      }
    };
  }

  private EventHandler<ActionEvent> getEventHandlerMenuItemJournal(final JITWatchUI parent)
  {
    return new EventHandler<ActionEvent>()
    {
      @Override
      public void handle(ActionEvent e)
      {
        IMetaMember member = memberList.getSelectionModel().getSelectedItem();

        Journal journal = member.getJournal();

        parent.openJournalViewer("JIT Journal for " + member.toString(), journal);
      }
    };
  }

  private EventHandler<ActionEvent> getEventHandlerMenuItemIntrinsics(final JITWatchUI parent)
  {
    return new EventHandler<ActionEvent>()
    {
      @Override
      public void handle(ActionEvent e)
      {
        IMetaMember member = memberList.getSelectionModel().getSelectedItem();

        Journal journal = member.getJournal();

        String intrinsicsUsed = processIntrinsicsUsing(journal);

        parent.openTextViewer("Intrinsics used by " + member.toString(), intrinsicsUsed);
      }
    };
  }

  private EventHandler<ActionEvent> getEventHandlerMenuItemCallChain(final JITWatchUI parent)
  {
    return new EventHandler<ActionEvent>()
    {
      @Override
      public void handle(ActionEvent e)
      {
        parent.openCompileChain(memberList.getSelectionModel().getSelectedItem());
      }
    };
  }
 
  private EventHandler<ActionEvent> getEventHandlerMenuItemOptimizedVCall(final JITWatchUI parent)
  {
    return new EventHandler<ActionEvent>()
    {
      @Override
      public void handle(ActionEvent e)
      {
        parent.openOptmizedVCallReport(memberList.getSelectionModel().getSelectedItem());
      }
    };
  }

  private String processIntrinsicsUsing(Journal journal)
  {
    StringBuilder builder = new StringBuilder();

    Map<String, String> intrinsics = IntrinsicFinder.findIntrinsics(journal);

    if (intrinsics.size() > 0)
    {
      addArrowWithNewLineToEachIntrinsicEntry(builder, intrinsics);
    }
    else
    {
      builder.append("No intrinsics used in this method");
    }

    return builder.toString();
  }

  private void addArrowWithNewLineToEachIntrinsicEntry(StringBuilder builder, Map<String, String> intrinsics)
  {
    for (Map.Entry<String, String> entry : intrinsics.entrySet())
    {
      builder.append(entry.getKey()).append(" -> ").append(entry.getValue()).append(C_NEWLINE);
    }
  }

  public void setMetaClass(MetaClass metaClass)
  {
    this.metaClass = metaClass;

    List<IMetaMember> members = metaClass.getMetaMembers();

    if (members.size() > 0)
    {
      selectMember(members.get(0));
    }

    refresh();
  }

  private void refresh()
  {
    clearClassMembers();

    if (metaClass != null)
    {
      List<IMetaMember> metaMembers = metaClass.getMetaMembers();

      for (IMetaMember member : metaMembers)
      {
        if (member.isCompiled() || !config.isShowOnlyCompiledMembers())
        {
          addMember(member);
        }
      }
    }
  }

  private void addMember(IMetaMember member)
  {
    memberList.getItems().add(member);
  }

  public void clearClassMembers()
  {
    memberList.getItems().clear();
  }

  public void selectMember(IMetaMember selected)
  {
    memberList.getSelectionModel().clearSelection();

    for (int i = 0; i < memberList.getItems().size(); i++)
    {
      IMetaMember member = memberList.getItems().get(i);

      if (member.toString().equals(selected.toString()))
      {
        memberList.getSelectionModel().select(i);

        memberList.getFocusModel().focus(i);

        memberList.scrollTo(i);
      }
    }
  }

  static class MetaMethodCell extends ListCell<IMetaMember>
  {
    @Override
    public void updateItem(IMetaMember item, boolean empty)
    {
      super.updateItem(item, empty);

      if (item == null)
      {
        setText(S_EMPTY);
        setGraphic(null);
      }
      else
      {
        setText(item.toStringUnqualifiedMethodName(false));

        if (item.isCompiled())
        {
          setGraphic(new ImageView(UserInterfaceUtil.getTick()));
        }
        else
        {
          setGraphic(null);
        }
      }
    }
  }
}
TOP

Related Classes of org.adoptopenjdk.jitwatch.ui.ClassMemberList$MetaMethodCell

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.