public boolean fillInCommonPrefix(boolean explicitlyInvoked) { if (explicitlyInvoked) { setFocusDegree(FocusDegree.FOCUSED); } if (explicitlyInvoked && myCalculating) return false; if (!explicitlyInvoked && mySelectionTouched) return false; ListModel listModel = getListModel(); if (listModel.getSize() <= 1) return false; if (listModel.getSize() == 0) return false; final LookupElement firstItem = (LookupElement) listModel.getElementAt(0); if (listModel.getSize() == 1 && firstItem instanceof EmptyLookupItem) return false; final PrefixMatcher firstItemMatcher = itemMatcher(firstItem); final String oldPrefix = firstItemMatcher.getPrefix(); final String presentPrefix = oldPrefix + getAdditionalPrefix(); String commonPrefix = getCaseCorrectedLookupString(firstItem); for (int i = 1; i < listModel.getSize(); i++) { LookupElement item = (LookupElement) listModel.getElementAt(i); if (item instanceof EmptyLookupItem) return false; if (!oldPrefix.equals(itemMatcher(item).getPrefix())) return false; final String lookupString = getCaseCorrectedLookupString(item); final int length = Math.min(commonPrefix.length(), lookupString.length()); if (length < commonPrefix.length()) { commonPrefix = commonPrefix.substring(0, length); } for (int j = 0; j < length; j++) { if (commonPrefix.charAt(j) != lookupString.charAt(j)) { commonPrefix = lookupString.substring(0, j); break; } } if (commonPrefix.length() == 0 || commonPrefix.length() < presentPrefix.length()) { return false; } } if (commonPrefix.equals(presentPrefix)) { return false; } for (int i = 0; i < listModel.getSize(); i++) { LookupElement item = (LookupElement) listModel.getElementAt(i); if (!itemMatcher(item).cloneWithPrefix(commonPrefix).prefixMatches(item)) { return false; } } myOffsets.setInitialPrefix(presentPrefix, explicitlyInvoked); replacePrefix(presentPrefix, commonPrefix); return true; }
void appendPrefix(char c) { checkValid(); myOffsets.appendPrefix(c); synchronized (myList) { myPresentableArranger.prefixChanged(this); } requestResize(); refreshUi(false, true); ensureSelectionVisible(true); }
private boolean checkReused() { synchronized (myList) { if (myPresentableArranger != myArranger) { myPresentableArranger = myArranger; myOffsets.clearAdditionalPrefix(); myPresentableArranger.prefixChanged(this); return true; } return false; } }
@Override public void dispose() { assert ApplicationManager.getApplication().isDispatchThread(); assert myHidden; if (myDisposed) { LOG.error(disposeTrace); return; } myOffsets.disposeMarkers(); myDisposed = true; disposeTrace = DebugUtil.currentStackTrace() + "\n============"; //noinspection AssignmentToStaticFieldFromInstanceMethod staticDisposeTrace = disposeTrace; }
private boolean updateList(boolean onExplicitAction, boolean reused) { if (!ApplicationManager.getApplication().isUnitTestMode()) { ApplicationManager.getApplication().assertIsDispatchThread(); } checkValid(); CollectionListModel<LookupElement> listModel = getListModel(); Pair<List<LookupElement>, Integer> pair; synchronized (myList) { pair = myPresentableArranger.arrangeItems(this, onExplicitAction || reused); } List<LookupElement> items = pair.first; Integer toSelect = pair.second; if (toSelect == null || toSelect < 0 || items.size() > 0 && toSelect >= items.size()) { LOG.error( "Arranger " + myPresentableArranger + " returned invalid selection index=" + toSelect + "; items=" + items); toSelect = 0; } myOffsets.checkMinPrefixLengthChanges(items, this); List<LookupElement> oldModel = listModel.toList(); listModel.removeAll(); if (!items.isEmpty()) { listModel.add(items); } else { addEmptyItem(listModel); } updateListHeight(listModel); myList.setSelectedIndex(toSelect); return !ContainerUtil.equalsIdentity(oldModel, items); }
boolean truncatePrefix(boolean preserveSelection) { if (!myOffsets.truncatePrefix()) { return false; } if (preserveSelection) { markSelectionTouched(); } boolean shouldUpdate; synchronized (myList) { shouldUpdate = myPresentableArranger == myArranger; myPresentableArranger.prefixChanged(this); } requestResize(); if (shouldUpdate) { refreshUi(false, true); ensureSelectionVisible(true); } return true; }
public boolean performGuardedChange(Runnable change) { checkValid(); assert !myChangeGuard : "already in change"; myEditor.getDocument().startGuardedBlockChecking(); myChangeGuard = true; boolean result; try { result = myOffsets.performGuardedChange(change); } finally { myEditor.getDocument().stopGuardedBlockChecking(); myChangeGuard = false; } if (!result || myDisposed) { hide(); return false; } if (isVisible()) { HintManagerImpl.updateLocation(this, myEditor, myUi.calculatePosition().getLocation()); } checkValid(); return true; }
public int getLookupOriginalStart() { return myOffsets.getLookupOriginalStart(); }
@Override public int getLookupStart() { return myOffsets.getLookupStart(disposeTrace); }
public int getPrefixLength(LookupElement item) { return myOffsets.getPrefixLength(item, this); }
public String getAdditionalPrefix() { return myOffsets.getAdditionalPrefix(); }
public void restorePrefix() { myOffsets.restorePrefix(); }