in src/main/java/org/adoptopenjdk/jitwatch/ui/main/JITWatchUI.java [344:584]
public void start()
{
mainPanel = new JPanel(new BorderLayout());
parserChooser = new ParserChooser(this);
ComboBox<ParserType> comboParser = parserChooser.getCombo();
String parserProperty = System.getProperty("jitwatch.parser", ParserType.HOTSPOT.toString());
comboParser.setSelectedItem(ParserType.fromString(parserProperty));
AnAction openLogAction = new AnAction("Open the JIT log file for analysis", "Open Log", AllIcons.Actions.Menu_open)
{
@Override
public void actionPerformed(@NotNull AnActionEvent e)
{
stopParsing();
SwingUtilities.invokeLater(() ->
{
if (chooseJITLog(project))
{
readLogFile();
}
});
}
};
AnAction stopAction = new AnAction("Stop loading", "Stop", AllIcons.Actions.Suspend)
{
@Override
public void actionPerformed(@NotNull AnActionEvent e)
{
stopParsing();
}
@Override
public void update(@NotNull AnActionEvent e)
{
Presentation presentation = e.getPresentation();
presentation.setEnabled(isReadingLogFile);
}
};
AnAction resetAction = new AnAction("Reset", "Reset", AllIcons.Actions.Restart)
{
@Override
public void actionPerformed(@NotNull AnActionEvent e)
{
logParser.reset();
JitWatchModelService.getInstance(project).setParserResult(null);
clear();
}
};
DefaultActionGroup actionGroup = new DefaultActionGroup();
actionGroup.add(openLogAction);
actionGroup.add(stopAction);
actionGroup.add(resetAction);
DefaultActionGroup popupGroup = new DefaultActionGroup("Options", true);
popupGroup.add(new ToggleAction("Hide Interfaces")
{
@Override
public boolean isSelected(@NotNull AnActionEvent e)
{
return getConfig().isHideInterfaces();
}
@Override
public void setSelected(@NotNull AnActionEvent e, boolean state)
{
getConfig().setHideInterfaces(state);
getConfig().saveConfig();
clearAndRefreshTreeView(true);
}
});
popupGroup.add(new ToggleAction("Hide Uncompiled Classes")
{
@Override
public boolean isSelected(@NotNull AnActionEvent e)
{
return getConfig().isShowOnlyCompiledClasses();
}
@Override
public void setSelected(@NotNull AnActionEvent e, boolean state)
{
getConfig().setShowOnlyCompiledClasses(state);
getConfig().saveConfig();
clearAndRefreshTreeView(true);
}
});
popupGroup.add(new ToggleAction("Hide Uncompiled Members")
{
@Override
public boolean isSelected(@NotNull AnActionEvent e)
{
return getConfig().isShowOnlyCompiledMembers();
}
@Override
public void setSelected(@NotNull AnActionEvent e, boolean state)
{
getConfig().setShowOnlyCompiledMembers(state);
getConfig().saveConfig();
if (classMemberList != null)
{
classMemberList.refresh();
}
}
});
AnAction showPopupAction = new AnAction(null, "Options", AllIcons.Actions.Show)
{
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
Component component = e.getInputEvent().getComponent();
if (component instanceof JComponent) {
ActionPopupMenu popupMenu = ActionManager.getInstance().createActionPopupMenu(
ActionPlaces.UNKNOWN, popupGroup);
popupMenu.getComponent().show((JComponent) component, 0, 0);
}
}
};
actionGroup.add(showPopupAction);
actionToolbar = ActionManager.getInstance().createActionToolbar("SideToolbar", actionGroup, false);
actionToolbar.setOrientation(SwingConstants.VERTICAL);
actionToolbar.setTargetComponent(mainPanel);
JComponent toolbarComponent = actionToolbar.getComponent();
mainPanel.add(toolbarComponent, BorderLayout.WEST);
lblHeap = new JLabel();
lblVmVersion = new JLabel();
StringBuilder vmBuilder = new StringBuilder();
vmBuilder.append("VM: ");
vmBuilder.append(System.getProperty("java.vendor"));
vmBuilder.append(" JDK");
vmBuilder.append(System.getProperty("java.version"));
vmBuilder.append(" build ");
vmBuilder.append(System.getProperty("java.runtime.version"));
lblVmVersion.setText(vmBuilder.toString());
compilationTableModel = new DefaultTableModel(compilationTableColumnNames, 0);
compilationTable = new JBTable(compilationTableModel);
compilationTable.setFillsViewportHeight(true);
compilationTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
compilationTable.getSelectionModel().addListSelectionListener(new ListSelectionListener()
{
@Override
public void valueChanged(ListSelectionEvent e)
{
if (!selectedProgrammatically)
{
if (selectedMember != null && !e.getValueIsAdjusting())
{
int selectedIndex = compilationTable.getSelectedRow();
if (selectedIndex >= 0)
{
selectedMember.setSelectedCompilation(selectedIndex);
setSelectedMetaMemberFromCompilationTable();
}
}
}
}
});
JBSplitter spMethodInfo = new JBSplitter(true); // true for vertical split
spMethodInfo.setProportion(0.5f); // Set initial proportion (0.0f to 1.0f)
spMethodInfo.setDividerWidth(5); // Optional: set divider width
classMemberList = new ClassMemberListPanel(this, getConfig());
classMemberList.registerListener(this);
spMethodInfo.setFirstComponent(classMemberList);
spMethodInfo.setSecondComponent(new JBScrollPane(compilationTable));
classTree = new ClassTreePanel(this, getConfig());
JBSplitter spMain = new JBSplitter(false); // false for horizontal split
spMain.setProportion(0.3f); // Adjust proportion as needed
spMain.setDividerWidth(5);
spMain.setFirstComponent(classTree);
spMain.setSecondComponent(spMethodInfo);
log("Welcome to JITWatch by Chris Newland (@chriswhocodes on Twitter) and the AdoptOpenJDK project.\n");
log("Please report issues via GitHub (https://github.com/AdoptOpenJDK/jitwatch).\n");
log("Includes an assembly reference from x86asm.net licenced under http://ref.x86asm.net/index.html#License\n");
if (jitLogFile == null)
{
log("Choose a JIT log file");
}
else
{
log("Using JIT log file: " + jitLogFile.getAbsolutePath());
}
JPanel hboxBottom = new JPanel();
hboxBottom.setLayout(new FlowLayout(FlowLayout.LEFT, 4, 4));
JLabel labelParser = new JLabel("Select Parser");
hboxBottom.add(labelParser);
hboxBottom.add(comboParser);
hboxBottom.add(lblHeap);
hboxBottom.add(Box.createHorizontalGlue());
hboxBottom.add(lblVmVersion);
mainPanel.add(spMain, BorderLayout.CENTER);
mainPanel.add(hboxBottom, BorderLayout.SOUTH);
mainContent = contentManager.getFactory().createContent(this.mainPanel, "Main", false);
contentManager.addContent(mainContent, 0);
logPanel = new LogPanel();
logContent = contentManager.getFactory().createContent(logPanel, "Log", false);
contentManager.addContent(logContent);
int refreshMillis = 1000;
Timer timer = new Timer(refreshMillis, new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
refresh();
}
});
timer.start();
updateButtons();
}