private boolean hideAutopopupIfMeaningless() { if (!myLookup.isLookupDisposed() && isAutopopupCompletion() && !myLookup.isSelectionTouched() && !myLookup.isCalculating()) { myLookup.refreshUi(true); final List<LookupElement> items = myLookup.getItems(); for (LookupElement item : items) { if (!myLookup.itemPattern(item).equals(item.getLookupString())) { return false; } if (item.isValid()) { final LookupElementPresentation presentation = new LookupElementPresentation(); item.renderElement(presentation); if (StringUtil.isNotEmpty(presentation.getTailText())) { return false; } } } myLookup.hideLookup(false); LOG.assertTrue(CompletionServiceImpl.getCompletionService().getCurrentCompletion() == null); CompletionServiceImpl.setCompletionPhase(new CompletionPhase.EmptyAutoPopup(this)); return true; } return false; }
@Override public void renderElement(LookupElementPresentation presentation) { myTypeItems.get(0).renderElement(presentation); presentation.setItemText(getLookupString()); presentation.setTailText(null); presentation.setTypeText(null); }
@Nullable Font getFontAbleToDisplay(LookupElementPresentation p) { String sampleString = p.getItemText() + p.getTailText() + p.getTypeText(); // assume a single font can display all lookup item chars Set<Font> fonts = ContainerUtil.newHashSet(); for (int i = 0; i < sampleString.length(); i++) { fonts.add( EditorUtil.fontForChar(sampleString.charAt(i), Font.PLAIN, myLookup.getEditor()) .getFont()); } eachFont: for (Font font : fonts) { if (font.equals(myNormalFont)) continue; for (int i = 0; i < sampleString.length(); i++) { if (!font.canDisplay(sampleString.charAt(i))) { continue eachFont; } } return font; } return null; }
public void testPointerSpecType() { myFixture.configureByText( "foo.go", "package main; type a struct{};" + "func main() {q1, q2:=&a{};q<caret>}"); myFixture.completeBasic(); LookupElement first = ArrayUtil.getFirstElement(myFixture.getLookupElements()); assertNotNull(first); LookupElementPresentation presentation = new LookupElementPresentation(); first.renderElement(presentation); assertEquals("*main.a", presentation.getTypeText()); }
public void renderElement(LookupElementPresentation presentation) { presentation.setItemText(getLookupString()); presentation.setTypeText(parameter.getType().toString()); if (!parameter.getValue().isEmpty()) presentation.appendTailText("(" + parameter.getValue() + ")", true); presentation.setIcon(SilexIcons.Parameter); }
public void setItemPresentation(LookupElement item, LookupElementPresentation presentation) { final String invariant = presentation.getItemText() + "###" + presentation.getTailText() + "###" + presentation.getTypeText(); synchronized (lock) { myItemPresentations.put(item, invariant); } }
public void testCreate() { DoctrineRepositoryLookupElement element = DoctrineRepositoryLookupElement.create( PhpElementsUtil.getClass(getProject(), "\\Foo\\Bar\\BarRepository")); LookupElementPresentation presentation = new LookupElementPresentation(); element.renderElement(presentation); assertEquals("Foo\\Bar\\BarRepository", element.getLookupString()); assertEquals(Symfony2Icons.DOCTRINE, presentation.getIcon()); assertEquals("BarRepository", presentation.getItemText()); assertEquals("Foo\\Bar\\BarRepository", presentation.getTypeText()); assertTrue(presentation.isTypeGrayed()); }
@Override public void renderElement(LookupElementPresentation presentation) { myClassItem.renderElement(presentation); String tailText = StringUtil.notNullize(presentation.getTailText()); int genericsEnd = tailText.lastIndexOf('>') + 1; presentation.clearTail(); presentation.appendTailText(tailText.substring(0, genericsEnd), false); presentation.appendTailText( MemberLookupHelper.getMethodParameterString(getObject(), getSubstitutor()), false); presentation.appendTailText(tailText.substring(genericsEnd), true); }
public boolean addItem(LookupElement item, PrefixMatcher matcher) { LookupElementPresentation presentation = renderItemApproximately(item); if (containsDummyIdentifier(presentation.getItemText()) || containsDummyIdentifier(presentation.getTailText()) || containsDummyIdentifier(presentation.getTypeText())) { return false; } myMatchers.put(item, matcher); updateLookupWidth(item, presentation); synchronized (myList) { myArranger.addElement(this, item, presentation); } return true; }
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; }
private int setItemTextLabel( LookupElement item, final Color foreground, final boolean selected, LookupElementPresentation presentation, int allowedWidth) { boolean bold = presentation.isItemTextBold(); Font customItemFont = myLookup.getCustomFont(item, bold); myNameComponent.setFont( customItemFont != null ? customItemFont : bold ? myBoldFont : myNormalFont); int style = getStyle(bold, presentation.isStrikeout(), presentation.isItemTextUnderlined()); final FontMetrics metrics = getRealFontMetrics(item, bold); final String name = trimLabelText(presentation.getItemText(), allowedWidth, metrics); int used = RealLookupElementPresentation.getStringWidth(name, metrics); renderItemName(item, foreground, selected, style, name, myNameComponent); return used; }
@Override public void addElement( Lookup lookup, LookupElement element, LookupElementPresentation presentation) { StatisticsWeigher.clearBaseStatisticsInfo(element); final String invariant = presentation.getItemText() + "###" + getTailTextOrSpace(presentation) + "###" + presentation.getTypeText(); element.putUserData(PRESENTATION_INVARIANT, invariant); CompletionSorterImpl sorter = obtainSorter(element); Classifier<LookupElement> classifier = myClassifiers.get(sorter); if (classifier == null) { myClassifiers.put(sorter, classifier = sorter.buildClassifier(new AlphaClassifier(lookup))); } classifier.addElement(element); super.addElement(lookup, element, presentation); }
private void doTestTagNameIcons(String fileName) throws IOException { VirtualFile file = copyFileToProject(fileName); myFixture.configureFromExistingVirtualFile(file); final LookupElement[] elements = myFixture.complete(CompletionType.BASIC); final Set<String> elementsToCheck = new HashSet<String>(Arrays.asList("view", "include", "requestFocus", "fragment", "Button")); for (LookupElement element : elements) { final String s = element.getLookupString(); final Object obj = element.getObject(); if (elementsToCheck.contains(s)) { LookupElementPresentation presentation = new LookupElementPresentation(); element.renderElement(presentation); assertNotNull("no icon for element: " + element, presentation.getIcon()); if ("Button".equals(s)) { assertInstanceOf(obj, PsiClass.class); } } } }
private void setTailTextLabel( boolean isSelected, LookupElementPresentation presentation, Color foreground, int allowedWidth, boolean nonFocusedSelection, FontMetrics fontMetrics) { int style = getStyle(false, presentation.isStrikeout(), false); for (LookupElementPresentation.TextFragment fragment : presentation.getTailFragments()) { if (allowedWidth < 0) { return; } String trimmed = trimLabelText(fragment.text, allowedWidth, fontMetrics); myTailComponent.append( trimmed, new SimpleTextAttributes( style, getTailTextColor(isSelected, fragment, foreground, nonFocusedSelection))); allowedWidth -= RealLookupElementPresentation.getStringWidth(trimmed, fontMetrics); } }
private static Color getTypeTextColor( LookupElement item, Color foreground, LookupElementPresentation presentation, boolean selected, boolean nonFocusedSelection) { if (nonFocusedSelection) { return foreground; } return presentation.isTypeGrayed() ? getGrayedForeground(selected) : item instanceof EmptyLookupItem ? JBColor.foreground() : foreground; }
int updateMaximumWidth(final LookupElementPresentation p, LookupElement item) { final Icon icon = p.getIcon(); if (icon != null && (icon.getIconWidth() > myEmptyIcon.getIconWidth() || icon.getIconHeight() > myEmptyIcon.getIconHeight())) { myEmptyIcon = new EmptyIcon( Math.max(icon.getIconWidth(), myEmptyIcon.getIconWidth()), Math.max(icon.getIconHeight(), myEmptyIcon.getIconHeight())); } return RealLookupElementPresentation.calculateWidth( p, getRealFontMetrics(item, false), getRealFontMetrics(item, true)) + AFTER_TAIL + AFTER_TYPE; }
@Override public void renderElement(LookupElementPresentation presentation) { super.renderElement(presentation); final LookupElementPresentation qualifierPresentation = new LookupElementPresentation(); myQualifier.renderElement(qualifierPresentation); String name = maybeAddParentheses(qualifierPresentation.getItemText()); final String qualifierText = myQualifier.as(CastingLookupElementDecorator.CLASS_CONDITION_KEY) != null ? "(" + name + ")" : name; presentation.setItemText(qualifierText + "." + presentation.getItemText()); if (myQualifier instanceof LookupItem && getQualifierObject() instanceof PsiClass) { String locationString = JavaPsiClassReferenceElement.getLocationString((LookupItem) myQualifier); presentation.setTailText(StringUtil.notNullize(presentation.getTailText()) + locationString); } }
public static void renderClassItem( LookupElementPresentation presentation, LookupItem item, PsiClass psiClass, boolean diamond) { if (!(psiClass instanceof PsiTypeParameter)) { presentation.setIcon(DefaultLookupItemRenderer.getRawIcon(item, presentation.isReal())); } final boolean bold = item.getAttribute(LookupItem.HIGHLIGHTED_ATTR) != null; boolean strikeout = JavaElementLookupRenderer.isToStrikeout(item); presentation.setItemText(getName(psiClass, item, diamond)); presentation.setStrikeout(strikeout); presentation.setItemTextBold(bold); String tailText = StringUtil.notNullize((String) item.getAttribute(LookupItem.TAIL_TEXT_ATTR)); PsiSubstitutor substitutor = (PsiSubstitutor) item.getAttribute(LookupItem.SUBSTITUTOR); if (item instanceof PsiTypeLookupItem && ((PsiTypeLookupItem) item).isIndicateAnonymous() && (psiClass.isInterface() || psiClass.hasModifierProperty(PsiModifier.ABSTRACT))) { tailText = "{...}" + tailText; } if (substitutor == null && !diamond && psiClass.getTypeParameters().length > 0) { tailText = "<" + StringUtil.join( psiClass.getTypeParameters(), new Function<PsiTypeParameter, String>() { @Override public String fun(PsiTypeParameter psiTypeParameter) { return psiTypeParameter.getName(); } }, "," + (showSpaceAfterComma(psiClass) ? " " : "")) + ">" + tailText; } presentation.setTailText(tailText, true); }
@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; }
@Override public void renderElement(LookupElementPresentation presentation) { super.renderElement(presentation); presentation.setTypeText(myTypeText); presentation.setIcon(PlatformIcons.METHOD_ICON); }
@NotNull private static String getTailTextOrSpace(LookupElementPresentation presentation) { String tailText = presentation.getTailText(); return tailText == null || tailText.isEmpty() ? " " : tailText; }