Skip to content

Commit

Permalink
Merge pull request #29 from Grigory-Rylov/flame_chart_for_all
Browse files Browse the repository at this point in the history
Flame chart for all
  • Loading branch information
Grigory-Rylov committed Oct 31, 2020
2 parents 2fa28e7 + 3cdf312 commit b000852
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 9 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ plugins {
}

group 'com.github.grishberg'
version '20.10.29.1'
version '20.10.31.0'
def use_jdk8 = project.hasProperty("use_jdk8")

if (use_jdk8) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,37 @@
import com.github.grishberg.profiler.common.SimpleMouseListener;
import com.github.grishberg.profiler.common.TraceContainer;
import com.github.grishberg.profiler.common.settings.SettingsRepository;
import com.github.grishberg.profiler.ui.*;
import com.github.grishberg.profiler.ui.BookMarkInfo;
import com.github.grishberg.profiler.ui.Main;
import com.github.grishberg.profiler.ui.SimpleComponentListener;
import com.github.grishberg.profiler.ui.TimeFormatter;
import com.github.grishberg.profiler.ui.ZoomAndPanDelegate;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import java.awt.*;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.*;
import java.util.Map;

public class ProfilerPanel extends JPanel implements ProfileDataDimensionDelegate, ChartPaintDelegate, RepaintDelegate {
public static final int TOP_OFFSET = 20;
Expand Down Expand Up @@ -1021,6 +1038,14 @@ public void updateBookmark(BookmarksRectangle selectedBookmark, BookMarkInfo res
repaint();
}

@NotNull
public List<ProfileData> getCurrentThreadMethods() {
if (result == null) {
return Collections.emptyList();
}
return result.getData().get(currentThreadId);
}

public interface FoundInfoListener {
void onFound(int count, int selectedIndex);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.github.grishberg.profiler.chart.flame

import com.github.grishberg.profiler.common.createControlAccelerator
import javax.swing.JMenuItem
import javax.swing.JPopupMenu

class ElementPopupMenu(
controller: FlameChartController
) : JPopupMenu() {
val copyItem = JMenuItem("Copy").apply {
accelerator = createControlAccelerator('C')
}

init {
add(copyItem)
copyItem.addActionListener {
controller.copySelectedToClipboard()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@ import kotlinx.coroutines.launch
import java.awt.Color
import java.awt.FontMetrics
import java.awt.Graphics2D
import java.awt.Toolkit
import java.awt.datatransfer.StringSelection
import java.awt.geom.Point2D
import java.awt.geom.Rectangle2D
import kotlin.math.min

interface View {
var levelHeight: Double
Expand Down Expand Up @@ -112,8 +115,10 @@ class FlameChartController(
settings.getBoolValueOrDefault(SETTINGS_THREAD_TIME_MODE),
levelHeight
)
val rootSource = selectedElements.first()
return@async calculator.calculateFlame(rootSource)
if (selectedElements.size == 1) {
return@async calculator.calculateFlame(selectedElements.first())
}
return@async calculator.calculateFlame(selectedElements)
}
return data.await()
}
Expand All @@ -128,6 +133,36 @@ class FlameChartController(
var topOffset = 0.0
private set

fun calculateFlame(threadMethods: List<ProfileData>): Result {
result.clear()
rootLevel = threadMethods.first().level
val rootsSource = threadMethods.filter { it.level == rootLevel }

var left = 0.0

for (rootSource in rootsSource) {
val currenLeft = calculateStartXForTime(rootSource)
left = min(left, currenLeft)
}

processChildren(rootsSource, left)

var maxX = Double.MIN_VALUE
var minX = Double.MAX_VALUE

for (rect in result) {
rect.y -= topOffset
if (rect.maxX > maxX) {
maxX = rect.maxX
}
if (rect.minX < minX) {
minX = rect.minX
}
rect.color = methodsColor.getColorForMethod(rect.name)
}
return Result(result, minX, -topOffset - levelHeight, maxX)
}

fun calculateFlame(rootSource: ProfileData): Result {
result.clear()
rootLevel = rootSource.level
Expand Down Expand Up @@ -268,6 +303,14 @@ class FlameChartController(
view?.redraw()
}

fun copySelectedToClipboard() {
currentSelectedElement?.let {
val stringSelection = StringSelection(it.name)
val clipboard = Toolkit.getDefaultToolkit().systemClipboard
clipboard.setContents(stringSelection, null)
}
}

data class ChildHolder(
var totalDuration: Double = 0.0,
val children: MutableList<ProfileData> = mutableListOf()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ class FlameChartDialog(
override fun mouseLeftClicked(e: MouseEvent) {
selectElement(e)
}

override fun mouseRightClicked(e: MouseEvent) {
selectElement(e)
}
})
controller.view = flameChart
mainPanel.add(flameChart, BorderLayout.CENTER)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,22 @@ import java.awt.Point
import java.awt.Rectangle
import java.awt.RenderingHints
import java.awt.Shape
import java.awt.Toolkit
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import java.awt.event.KeyEvent
import java.awt.geom.AffineTransform
import java.awt.geom.Rectangle2D
import javax.swing.JComponent
import javax.swing.JPanel
import javax.swing.KeyStroke

private const val MINIMUM_WIDTH_IN_PX = 1.0
private const val FIT_PADDING = 8

class FlameChartPanel(
private val parentDialog: Component,
private val controller: FlameChartController
private val parentDialog: Component,
private val controller: FlameChartController
) : JPanel(), View {
private val bgColor = Color(65, 65, 65)

Expand All @@ -40,6 +46,9 @@ class FlameChartPanel(

init {
background = bgColor
val copyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().menuShortcutKeyMask, false)
registerKeyboardAction(CopyAction(), "Copy", copyStroke, JComponent.WHEN_FOCUSED)
componentPopupMenu = ElementPopupMenu(controller)
}

override fun showDialog() {
Expand Down Expand Up @@ -193,4 +202,13 @@ class FlameChartPanel(
val transformedPoint = zoomAndPanDelegate.transformPoint(point)
return controller.findDataByPosition(transformedPoint)
}

private inner class CopyAction : ActionListener {
override fun actionPerformed(e: ActionEvent) {
if (e.actionCommand.compareTo("Copy") != 0) {
return
}
controller.copySelectedToClipboard()
}
}
}
1 change: 1 addition & 0 deletions src/main/java/com/github/grishberg/profiler/ui/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,7 @@ public void showFlameChartDialog() {

flameChartController.showDialog();
if (selected == null) {
flameChartController.showFlameChart(chart.getCurrentThreadMethods());
return;
}
flameChartController.showFlameChart(selected);
Expand Down

0 comments on commit b000852

Please sign in to comment.