Skip to content

Commit 05a2006

Browse files
Fix pagination for DurationBreakdownInsight
1 parent 61b45f3 commit 05a2006

File tree

5 files changed

+158
-69
lines changed

5 files changed

+158
-69
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.digma.intellij.plugin.editor
2+
3+
private var focusedDocumentName: String = ""
4+
5+
fun setFocusedDocumentName(fileName: String) {
6+
focusedDocumentName = fileName
7+
}
8+
fun getFocusedDocumentName(): String {
9+
return focusedDocumentName
10+
}

ide-common/src/main/kotlin/org/digma/intellij/plugin/editor/GeneralFileEditorListener.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.digma.intellij.plugin.editor
22

33
import com.intellij.openapi.diagnostic.Logger
4+
import com.intellij.openapi.fileEditor.FileEditorManager
45
import com.intellij.openapi.fileEditor.FileEditorManagerEvent
56
import com.intellij.openapi.fileEditor.FileEditorManagerListener
67
import com.intellij.openapi.project.Project
@@ -27,8 +28,13 @@ class GeneralFileEditorListener(val project: Project) : FileEditorManagerListene
2728
override fun selectionChanged(event: FileEditorManagerEvent) {
2829
super.selectionChanged(event)
2930
refreshAllInsightsForActiveFile(event.oldFile, event.newFile)
31+
setFocusedDocument(event.newFile)
3032
}
3133

34+
override fun fileClosed(source: FileEditorManager, file: VirtualFile) {
35+
super.fileClosed(source, file)
36+
removeInsightsPaginationInfoForClosedDocument(file.name)
37+
}
3238

3339
private fun refreshAllInsightsForActiveFile(oldFile: VirtualFile?, newFile: VirtualFile?) {
3440
if (newFile != null) {
@@ -64,4 +70,12 @@ class GeneralFileEditorListener(val project: Project) : FileEditorManagerListene
6470
lifetimeDefinitionMap.remove(oldFile)
6571
}
6672
}
73+
74+
private fun setFocusedDocument(newFile: VirtualFile?) {
75+
if (newFile != null) {
76+
setFocusedDocumentName(newFile.name)
77+
} else {
78+
setFocusedDocumentName("")
79+
}
80+
}
6781
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.digma.intellij.plugin.editor
2+
3+
import java.util.concurrent.ConcurrentHashMap
4+
5+
private val insightsPaginationInfo: ConcurrentHashMap<String, ConcurrentHashMap<String, Int>> = ConcurrentHashMap()
6+
7+
fun addInsightPaginationInfo(focusedDocumentName: String, uniqueInsightId: String, activePage: Int) {
8+
if (activePage > 1) {
9+
val insightsPaginationInfosMapForActualFile = insightsPaginationInfo[focusedDocumentName]
10+
if (insightsPaginationInfosMapForActualFile != null) {
11+
insightsPaginationInfosMapForActualFile[uniqueInsightId] = activePage
12+
} else {
13+
val filesAndInsightsPaginationInfosMap: ConcurrentHashMap<String, Int> = ConcurrentHashMap()
14+
filesAndInsightsPaginationInfosMap[uniqueInsightId] = activePage
15+
insightsPaginationInfo[focusedDocumentName] = filesAndInsightsPaginationInfosMap
16+
}
17+
} else if (insightsPaginationInfo.contains(uniqueInsightId)) {
18+
// remove pagination info for insights which had some page selected before
19+
insightsPaginationInfo.remove(uniqueInsightId)
20+
}
21+
}
22+
23+
fun getInsightPaginationInfo(uniqueInsightId: String): Int? {
24+
return insightsPaginationInfo[getFocusedDocumentName()]?.get(uniqueInsightId)
25+
}
26+
27+
fun removeInsightsPaginationInfoForClosedDocument(documentName: String) {
28+
if (insightsPaginationInfo.isNotEmpty()) {
29+
insightsPaginationInfo.remove(documentName)
30+
}
31+
}

src/main/kotlin/org/digma/intellij/plugin/ui/list/insights/DurationBreakdownPanel.kt

Lines changed: 51 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ package org.digma.intellij.plugin.ui.list.insights
33
import com.intellij.openapi.project.Project
44
import com.intellij.ui.components.ActionLink
55
import com.intellij.ui.components.JBPanel
6-
import com.intellij.util.ui.JBUI
76
import com.intellij.util.ui.JBUI.Borders.empty
87
import org.apache.commons.lang3.StringUtils
98
import 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
1012
import org.digma.intellij.plugin.model.rest.insights.SpanDurationBreakdown
1113
import org.digma.intellij.plugin.model.rest.insights.SpanDurationBreakdownInsight
1214
import org.digma.intellij.plugin.ui.common.Laf
@@ -19,22 +21,34 @@ import javax.swing.*
1921

2022

2123
private 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

3225
fun 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

162144
private fun getDurationBreakdownPanel(): JPanel {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.digma.intellij.plugin.ui.list.insights
2+
3+
import com.intellij.ui.components.ActionLink
4+
import com.intellij.util.ui.JBUI
5+
import org.digma.intellij.plugin.ui.common.asHtml
6+
import java.awt.BorderLayout
7+
import javax.swing.JLabel
8+
import javax.swing.JPanel
9+
import javax.swing.SwingConstants
10+
11+
const val RECORDS_PER_PAGE = 3
12+
13+
fun rebuildPaginationPanel(paginationPanel: JPanel, currPageNum: Int, lastPageNum: Int, prev: ActionLink, next: ActionLink) {
14+
if (lastPageNum > 1) {
15+
paginationPanel.removeAll()
16+
buildPaginationPanel(paginationPanel, currPageNum, lastPageNum, prev, next)
17+
}
18+
}
19+
20+
fun buildPaginationRowPanel(
21+
currPageNum: Int,
22+
lastPageNum: Int,
23+
paginationPanel: JPanel,
24+
prev: ActionLink,
25+
next: ActionLink
26+
): JPanel? {
27+
if (lastPageNum < 2) {
28+
return null
29+
}
30+
buildPaginationPanel(paginationPanel, currPageNum, lastPageNum, prev, next)
31+
return paginationPanel
32+
}
33+
34+
fun buildPaginationPanel(paginationPanel: JPanel, currPageNum: Int, lastPageNum: Int, prev: ActionLink, next: ActionLink) {
35+
paginationPanel.layout = BorderLayout()
36+
paginationPanel.border = JBUI.Borders.empty()
37+
paginationPanel.isOpaque = false
38+
39+
val paginationLabelText = "$currPageNum of $lastPageNum"
40+
val paginationLabel = JLabel(asHtml(paginationLabelText), SwingConstants.LEFT)
41+
paginationLabel.border = JBUI.Borders.emptyLeft(5)
42+
43+
prev.border = JBUI.Borders.emptyRight(3)
44+
paginationPanel.add(prev, BorderLayout.WEST)
45+
paginationPanel.add(next, BorderLayout.CENTER)
46+
paginationPanel.add(paginationLabel, BorderLayout.EAST)
47+
48+
val canGoBack = currPageNum > 1
49+
val canGoFwd = currPageNum != lastPageNum
50+
prev.isEnabled = canGoBack
51+
next.isEnabled = canGoFwd
52+
}

0 commit comments

Comments
 (0)