package com.intellij.codeInsight.lookup; import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; /** * @author peter */ public class RealLookupElementPresentation extends LookupElementPresentation { private final int myMaximumWidth; private final FontMetrics myNormalMetrics; private final FontMetrics myBoldMetrics; private final Lookup myLookup; public RealLookupElementPresentation(int maximumWidth, FontMetrics normalMetrics, FontMetrics boldMetrics, Lookup lookup) { myMaximumWidth = maximumWidth; myNormalMetrics = normalMetrics; myBoldMetrics = boldMetrics; myLookup = lookup; } public boolean isLookupSelectionTouched() { return myLookup.isSelectionTouched(); } @Override public boolean isReal() { return true; } public boolean hasEnoughSpaceFor(@Nullable String text, boolean bold) { return myMaximumWidth >= calculateWidth(this, myNormalMetrics, myBoldMetrics) + getStringWidth(text, bold ? myBoldMetrics : myNormalMetrics); } public static int calculateWidth(LookupElementPresentation presentation, FontMetrics normalMetrics, FontMetrics boldMetrics) { int result = 0; result += getStringWidth(presentation.getItemText(), presentation.isItemTextBold() ? boldMetrics : normalMetrics); result += getStringWidth(presentation.getTailText(), normalMetrics); final String typeText = presentation.getTypeText(); if (StringUtil.isNotEmpty(typeText)) { result += getStringWidth("W", normalMetrics); // nice tail-type separation result += getStringWidth(typeText, normalMetrics); } result += getStringWidth("W", boldMetrics); //for unforeseen Swing size adjustments final Icon typeIcon = presentation.getTypeIcon(); if (typeIcon != null) { result += typeIcon.getIconWidth(); } return result; } public static int getStringWidth(@Nullable final String text, FontMetrics metrics) { if (text != null) { return metrics.stringWidth(text); } return 0; } }