private void recalculateIconRenderersWidth() { myLineToRenderersMap.clear(); for (EditorMessageIconRenderer renderer : myIconRenderers) { int yCoordinate = getIconCoordinate(renderer); if (yCoordinate < 0) { continue; } List<IconRendererLayoutConstraint> renderersForLine = myLineToRenderersMap.get(yCoordinate); if (renderersForLine == null) { renderersForLine = new SortedList(myIconRenderersComparator); myLineToRenderersMap.put(yCoordinate, renderersForLine); } renderersForLine.add(new IconRendererLayoutConstraint(renderer)); } myIconRenderersWidth = MIN_ICON_RENDERERS_WIDTH; myMaxIconHeight = 0; int[] sortedYCoordinates = myLineToRenderersMap.keys(); Arrays.sort(sortedYCoordinates); int initialOffset = getIconRenderersOffset(); for (int y : sortedYCoordinates) { List<IconRendererLayoutConstraint> row = myLineToRenderersMap.get(y); assert row.size() != 0; int maxIconHeight = 0; for (IconRendererLayoutConstraint rendererConstraint : row) { maxIconHeight = Math.max(maxIconHeight, rendererConstraint.getIconRenderer().getIcon().getIconHeight()); } myMaxIconHeight = Math.max(myMaxIconHeight, maxIconHeight); int offset = initialOffset + LEFT_GAP; for (Iterator<IconRendererLayoutConstraint> it = row.iterator(); it.hasNext(); ) { IconRendererLayoutConstraint rendererConstraint = it.next(); rendererConstraint.setX(offset); offset += rendererConstraint.getIconRenderer().getIcon().getIconWidth(); if (it.hasNext()) { offset += GAP_BETWEEN_ICONS; } } myIconRenderersWidth = Math.max(myIconRenderersWidth, offset - initialOffset); } }