private int setTypeTextLabel( LookupElement item, final Color background, Color foreground, final LookupElementPresentation presentation, int allowedWidth, boolean selected, boolean nonFocusedSelection, FontMetrics normalMetrics) { final String givenText = presentation.getTypeText(); final String labelText = trimLabelText( StringUtil.isEmpty(givenText) ? "" : " " + givenText, allowedWidth, normalMetrics); int used = RealLookupElementPresentation.getStringWidth(labelText, normalMetrics); final Icon icon = presentation.getTypeIcon(); if (icon != null) { myTypeLabel.setIcon(icon); used += icon.getIconWidth(); } Color sampleBackground = background; Object o = item.isValid() ? item.getObject() : null; //noinspection deprecation if (o instanceof LookupValueWithUIHint && StringUtil.isEmpty(labelText)) { //noinspection deprecation Color proposedBackground = ((LookupValueWithUIHint) o).getColorHint(); if (proposedBackground != null) { sampleBackground = proposedBackground; } myTypeLabel.append(" "); used += normalMetrics.stringWidth("WW"); } else { myTypeLabel.append(labelText); } myTypeLabel.setBackground(sampleBackground); myTypeLabel.setForeground( getTypeTextColor(item, foreground, presentation, selected, nonFocusedSelection)); return used; }
@Override public Component getListCellRendererComponent( final JList list, Object value, int index, boolean isSelected, boolean hasFocus) { boolean nonFocusedSelection = isSelected && myLookup.getFocusDegree() == LookupImpl.FocusDegree.SEMI_FOCUSED; if (!myLookup.isFocused()) { isSelected = false; } myIsSelected = isSelected; final LookupElement item = (LookupElement) value; final Color foreground = getForegroundColor(isSelected); final Color background = nonFocusedSelection ? SELECTED_NON_FOCUSED_BACKGROUND_COLOR : isSelected ? SELECTED_BACKGROUND_COLOR : BACKGROUND_COLOR; int allowedWidth = list.getWidth() - AFTER_TAIL - AFTER_TYPE - getIconIndent(); FontMetrics normalMetrics = getRealFontMetrics(item, false); FontMetrics boldMetrics = getRealFontMetrics(item, true); final LookupElementPresentation presentation = new RealLookupElementPresentation( isSelected ? getMaxWidth() : allowedWidth, normalMetrics, boldMetrics, myLookup); AccessToken token = ReadAction.start(); try { if (item.isValid()) { try { item.renderElement(presentation); } catch (Exception e) { LOG.error(e); } catch (Error e) { LOG.error(e); } } else { presentation.setItemTextForeground(JBColor.RED); presentation.setItemText("Invalid"); } } finally { token.finish(); } myNameComponent.clear(); myNameComponent.setIcon(augmentIcon(presentation.getIcon(), myEmptyIcon)); myNameComponent.setBackground(background); allowedWidth -= setItemTextLabel( item, new JBColor( isSelected ? SELECTED_FOREGROUND_COLOR : presentation.getItemTextForeground(), foreground), isSelected, presentation, allowedWidth); Font customFont = myLookup.getCustomFont(item, false); myTailComponent.setFont(customFont != null ? customFont : myNormalFont); myTypeLabel.setFont(customFont != null ? customFont : myNormalFont); myTypeLabel.clear(); if (allowedWidth > 0) { allowedWidth -= setTypeTextLabel( item, background, foreground, presentation, isSelected ? getMaxWidth() : allowedWidth, isSelected, nonFocusedSelection, normalMetrics); } myTailComponent.clear(); myTailComponent.setBackground(background); if (isSelected || allowedWidth >= 0) { setTailTextLabel( isSelected, presentation, foreground, isSelected ? getMaxWidth() : allowedWidth, nonFocusedSelection, normalMetrics); } if (mySelected.containsKey(index)) { if (!isSelected && mySelected.get(index)) { myPanel.setUpdateExtender(true); } } mySelected.put(index, isSelected); final double w = myNameComponent.getPreferredSize().getWidth() + myTailComponent.getPreferredSize().getWidth() + myTypeLabel.getPreferredSize().getWidth(); boolean useBoxLayout = isSelected && w > list.getWidth() && ((JBList) list).getExpandableItemsHandler().isEnabled(); if (useBoxLayout != myPanel.getLayout() instanceof BoxLayout) { myPanel.removeAll(); if (useBoxLayout) { myPanel.setLayout(new BoxLayout(myPanel, BoxLayout.X_AXIS)); myPanel.add(myNameComponent); myPanel.add(myTailComponent); myPanel.add(myTypeLabel); } else { myPanel.setLayout(new BorderLayout()); myPanel.add(myNameComponent, BorderLayout.WEST); myPanel.add(myTailComponent, BorderLayout.CENTER); myPanel.add(myTypeLabel, BorderLayout.EAST); } } return myPanel; }