@@ -3,10 +3,12 @@ package org.digma.intellij.plugin.ui.list.insights
33import com.intellij.openapi.project.Project
44import com.intellij.ui.components.ActionLink
55import com.intellij.ui.components.JBPanel
6- import com.intellij.util.ui.JBUI
76import com.intellij.util.ui.JBUI.Borders.empty
87import org.apache.commons.lang3.StringUtils
98import org.digma.intellij.plugin.document.CodeObjectsUtil
9+ import org.digma.intellij.plugin.editor.addInsightPaginationInfo
10+ import org.digma.intellij.plugin.editor.getFocusedDocumentName
11+ import org.digma.intellij.plugin.editor.getInsightPaginationInfo
1012import org.digma.intellij.plugin.model.rest.insights.SpanDurationBreakdown
1113import org.digma.intellij.plugin.model.rest.insights.SpanDurationBreakdownInsight
1214import org.digma.intellij.plugin.ui.common.Laf
@@ -19,22 +21,34 @@ import javax.swing.*
1921
2022
2123private const val P_50 : Float = 0.5F
22- private const val RECORDS_PER_PAGE = 3
23-
24- private var lastPageNum = 0
25- private var currPageNum = 0
26- private var prev: ActionLink ? = null
27- private var next: ActionLink ? = null
28- private var resultBreakdownPanel: DigmaResettablePanel ? = null
29- private val paginationPanel = JPanel ()
30- val durationBreakdownEntriesToDisplay = ArrayList <SpanDurationBreakdown >()
3124
3225fun spanDurationBreakdownPanel (
3326 project : Project ,
3427 insight : SpanDurationBreakdownInsight ,
3528 moreData : HashMap <String , Any >
3629): JPanel {
3730
31+ val uniqueInsightId = insight.codeObjectId + insight.type
32+ val lastPageNum: Int
33+ var currPageNum = 0
34+ var resultBreakdownPanel: DigmaResettablePanel ? = null
35+ val paginationPanel = JPanel ()
36+ val durationBreakdownEntriesToDisplay = ArrayList <SpanDurationBreakdown >()
37+ val prev = ActionLink (" Prev" )
38+ val next = ActionLink (" Next" )
39+
40+ val validBreakdownEntries = insight.breakdownEntries
41+ .filter { entry -> entry.percentiles.any { breakdown -> breakdown.percentile.equals(P_50 ) } }
42+ .sortedWith(compareByDescending { getValueOfPercentile(it, P_50 ) })
43+
44+ // calculate how many pages there are
45+ lastPageNum = validBreakdownEntries.size / RECORDS_PER_PAGE + if (validBreakdownEntries.size % RECORDS_PER_PAGE != 0 ) 1 else 0
46+ getInsightPaginationInfo(uniqueInsightId)?.let { currPageNum = getInsightPaginationInfo(uniqueInsightId)!! }
47+ if (currPageNum < 1 ) {
48+ currPageNum = if (lastPageNum > 0 ) 1 else 0
49+ }
50+
51+
3852 resultBreakdownPanel = object : DigmaResettablePanel () {
3953 override fun reset () {
4054 buildDurationBreakdownRowPanel(
@@ -43,19 +57,21 @@ fun spanDurationBreakdownPanel(
4357 project,
4458 moreData
4559 )
46- buildPaginationPanel (paginationPanel)
60+ rebuildPaginationPanel (paginationPanel, currPageNum, lastPageNum, prev, next )
4761 }
4862 }
4963
50- val validBreakdownEntries = insight.breakdownEntries
51- .filter { entry -> entry.percentiles.any { breakdown -> breakdown.percentile.equals(P_50 ) } }
52- .sortedWith(compareByDescending { getValueOfPercentile(it, P_50 ) })
53-
54- // calculate how many pages there are
55- lastPageNum = validBreakdownEntries.size / RECORDS_PER_PAGE + if (validBreakdownEntries.size % RECORDS_PER_PAGE != 0 ) 1 else 0
56- currPageNum = if (lastPageNum > 0 ) 1 else 0
64+ prev.addActionListener {
65+ if (-- currPageNum <= 0 ) currPageNum = 1
66+ updateDurationBreakdownPanel(validBreakdownEntries, resultBreakdownPanel, durationBreakdownEntriesToDisplay, uniqueInsightId, currPageNum)
67+ }
68+ next.addActionListener {
69+ if (++ currPageNum > lastPageNum) currPageNum = lastPageNum
70+ updateDurationBreakdownPanel(validBreakdownEntries, resultBreakdownPanel, durationBreakdownEntriesToDisplay, uniqueInsightId, currPageNum)
71+ }
5772
58- updateDurationBreakdownPanel(validBreakdownEntries)
73+ updateDurationBreakdownPanel(validBreakdownEntries, resultBreakdownPanel, durationBreakdownEntriesToDisplay,
74+ uniqueInsightId, currPageNum)
5975 return createInsightPanel(
6076 project = project,
6177 insight = insight,
@@ -64,26 +80,26 @@ fun spanDurationBreakdownPanel(
6480 iconsList = listOf (Laf .Icons .Insight .DURATION ),
6581 bodyPanel = resultBreakdownPanel,
6682 buttons = null ,
67- paginationComponent = paginationRowPanel(validBreakdownEntries ),
83+ paginationComponent = buildPaginationRowPanel(currPageNum, lastPageNum, paginationPanel, prev, next ),
6884 )
6985}
7086
71- fun buildDurationBreakdownRowPanel (
87+ private fun buildDurationBreakdownRowPanel (
7288 durationBreakdownPanel : DigmaResettablePanel ,
7389 durationBreakdownEntries : List <SpanDurationBreakdown >,
7490 project : Project ,
7591 moreData : HashMap <String , Any >
7692) {
7793 durationBreakdownPanel.removeAll()
78- resultBreakdownPanel !! .layout = BoxLayout (durationBreakdownPanel, BoxLayout .Y_AXIS )
79- resultBreakdownPanel !! .isOpaque = false
94+ durationBreakdownPanel .layout = BoxLayout (durationBreakdownPanel, BoxLayout .Y_AXIS )
95+ durationBreakdownPanel .isOpaque = false
8096
8197 durationBreakdownEntries.forEach { durationBreakdown: SpanDurationBreakdown ->
82- resultBreakdownPanel !! .add(durationBreakdownRowPanel(durationBreakdown, project, moreData))
98+ durationBreakdownPanel .add(durationBreakdownRowPanel(durationBreakdown, project, moreData))
8399 }
84100}
85101
86- fun durationBreakdownRowPanel (
102+ private fun durationBreakdownRowPanel (
87103 durationBreakdown : SpanDurationBreakdown ,
88104 project : Project ,
89105 moreData : HashMap <String , Any >
@@ -100,49 +116,15 @@ fun durationBreakdownRowPanel(
100116 return durationBreakdownPanel
101117}
102118
103- fun paginationRowPanel (
104- durationBreakdownEntries : List <SpanDurationBreakdown >
105- ): JPanel ? {
106- if (lastPageNum < 2 ) {
107- return null
108- }
109- prev = ActionLink (" Prev" )
110- prev!! .addActionListener {
111- if (-- currPageNum <= 0 ) currPageNum = 1
112- updateDurationBreakdownPanel(durationBreakdownEntries)
113- }
114- next = ActionLink (" Next" )
115- next!! .addActionListener {
116- if (++ currPageNum > lastPageNum) currPageNum = lastPageNum
117- updateDurationBreakdownPanel(durationBreakdownEntries)
118- }
119- buildPaginationPanel(paginationPanel)
120- return paginationPanel
121- }
122-
123- fun buildPaginationPanel (paginationPanel : JPanel ) {
124- paginationPanel.removeAll()
125-
126- paginationPanel.layout = BorderLayout ()
127- paginationPanel.border = empty()
128- paginationPanel.isOpaque = false
129-
130- val paginationLabelText = " $currPageNum of $lastPageNum "
131- val paginationLabel = JLabel (asHtml(paginationLabelText), SwingConstants .LEFT )
132- paginationLabel.border = JBUI .Borders .emptyLeft(5 )
133-
134- prev?.let { paginationPanel.add(it, BorderLayout .WEST ) }
135- next?.let { paginationPanel.add(it, BorderLayout .CENTER ) }
136- paginationPanel.add(paginationLabel, BorderLayout .EAST )
137-
138- val canGoBack = currPageNum > 1
139- val canGoFwd = currPageNum != lastPageNum
140- prev?.let { it.isEnabled = canGoBack }
141- next?.let { it.isEnabled = canGoFwd }
142- }
143-
144-
145- private fun updateDurationBreakdownPanel (durationBreakdownEntries : List <SpanDurationBreakdown >) {
119+ private fun updateDurationBreakdownPanel (
120+ durationBreakdownEntries : List <SpanDurationBreakdown >,
121+ resultBreakdownPanel : DigmaResettablePanel ,
122+ durationBreakdownEntriesToDisplay : ArrayList <SpanDurationBreakdown >,
123+ uniqueInsightId : String ,
124+ currPageNum : Int
125+ ) {
126+ val focusedDocumentName = getFocusedDocumentName()
127+ addInsightPaginationInfo(focusedDocumentName, uniqueInsightId, currPageNum)
146128 durationBreakdownEntriesToDisplay.clear()
147129
148130 if (durationBreakdownEntries.isNotEmpty()) {
@@ -156,7 +138,7 @@ private fun updateDurationBreakdownPanel(durationBreakdownEntries: List<SpanDura
156138 }
157139 }
158140
159- resultBreakdownPanel!! .reset()
141+ resultBreakdownPanel.reset()
160142}
161143
162144private fun getDurationBreakdownPanel (): JPanel {
0 commit comments