/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved. * * Oracle and Java are registered trademarks of Oracle and/or its affiliates. * Other names may be trademarks of their respective owners. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common * Development and Distribution License("CDDL") (collectively, the * "License"). You may not use this file except in compliance with the * License. You can obtain a copy of the License at * http://www.netbeans.org/cddl-gplv2.html * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the * specific language governing permissions and limitations under the * License. When distributing the software, include this License Header * Notice in each file and include the License file at * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the GPL Version 2 section of the License file that * accompanied this code. If applicable, add the following below the * License Header, with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * Contributor(s): * * The Original Software is NetBeans. The Initial Developer of the Original * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun * Microsystems, Inc. All Rights Reserved. * * If you wish your version of this file to be governed by only the CDDL * or only the GPL Version 2, indicate your decision by adding * "[Contributor] elects to include this software in this distribution * under the [CDDL or GPL Version 2] license." If you do not indicate a * single choice of license, a recipient has the option to distribute * your version of this file under either the CDDL, the GPL Version 2 or * to extend the choice of license to its licensees as provided above. * However, if you add GPL Version 2 code and therefore, elected the GPL * Version 2 license, then the option applies only if the new code is * made subject to such option by the copyright holder. */ package com.tvl.modules.editor.completion; import com.tvl.spi.editor.completion.CompletionDocumentation; import com.tvl.spi.editor.completion.CompletionItem; import com.tvl.spi.editor.completion.CompletionProvider; import com.tvl.spi.editor.completion.CompletionResultSet; import com.tvl.spi.editor.completion.CompletionTask; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import javax.swing.JToolTip; /** * * @author Miloslav Metelka * @version 1.00 */ public final class CompletionResultSetImpl { static { // Ensure the SPI accessor gets assigned try { Class.forName(CompletionResultSet.class.getName(), true, CompletionResultSetImpl.class.getClassLoader()); } catch (ClassNotFoundException ex) {} } private static final CompletionSpiPackageAccessor spi = CompletionSpiPackageAccessor.get(); private final CompletionImpl completionImpl; private final Object resultId; private final CompletionTask task; private final int queryType; private CompletionResultSet resultSet; private boolean active; private String title; private String waitText; private int anchorOffset; private List<CompletionItem> items; private List<CompletionItem> declarationItems; private boolean hasAdditionalItems; private String hasAdditionalItemsText; private boolean finished; private CompletionDocumentation documentation; private JToolTip toolTip; private int estimatedItemCount; private int estimatedItemWidth; @SuppressWarnings("LeakingThisInConstructor") CompletionResultSetImpl(CompletionImpl completionImpl, Object resultId, CompletionTask task, int queryType) { assert (completionImpl != null); assert (resultId != null); assert (task != null); this.completionImpl = completionImpl; this.resultId = resultId; this.task = task; this.queryType = queryType; this.anchorOffset = -1; // not set this.estimatedItemCount = -1; // not estimated this.active = true; spi.createCompletionResultSet(this); } /** * Get the result set instance associated with this implementation. */ public synchronized CompletionResultSet getResultSet() { return resultSet; } public synchronized void setResultSet(CompletionResultSet resultSet) { assert (resultSet != null); assert (this.resultSet == null); this.resultSet = resultSet; } /** * Get the task associated with this result. */ public CompletionTask getTask() { return task; } /** * Get the query type to which this result set belongs. * The results of other query types will be ignored when * being set into this result set. */ public int getQueryType() { return queryType; } /** * Mark that results from this result set should no longer * be taken into account. */ public synchronized void markInactive() { this.active = false; } public synchronized String getTitle() { return title; } public synchronized void setTitle(String title) { checkNotFinished(); this.title = title; } public synchronized int getAnchorOffset() { return anchorOffset; } public synchronized void setAnchorOffset(int anchorOffset) { checkNotFinished(); this.anchorOffset = anchorOffset; } public synchronized boolean addItem(CompletionItem item) { assert (item != null) : "Added item cannot be null"; checkNotFinished(); if (!active || (queryType & CompletionProvider.COMPLETION_QUERY_TYPE) == 0) { return false; // signal do not add any further results } if (items == null) { int estSize = (estimatedItemCount == -1) ? 10 : estimatedItemCount; items = new ArrayList<>(estSize); } items.add(item); return items.size() < 1000; } public boolean addAllItems(Collection<? extends CompletionItem> items) { boolean cont = true; for (Iterator<? extends CompletionItem> it = items.iterator(); it.hasNext();) { cont = addItem(it.next()); } return cont; } public synchronized void addDeclarationItem(CompletionItem item) { assert (item != null) : "Added item cannot be null"; checkNotFinished(); if (declarationItems == null) { declarationItems = new ArrayList<>(1); } declarationItems.add(item); } public synchronized List<? extends CompletionItem> getDeclarationItems() { assert isFinished() : "Adding not finished"; return (declarationItems != null) ? declarationItems : Collections.<CompletionItem>emptyList(); } /** * @return non-null list of items. */ public synchronized List<? extends CompletionItem> getItems() { assert isFinished() : "Adding not finished"; return (items != null) ? items : Collections.<CompletionItem>emptyList(); } public synchronized void setHasAdditionalItems(boolean value) { checkNotFinished(); if ((queryType & CompletionProvider.COMPLETION_ALL_QUERY_TYPE) == CompletionProvider.COMPLETION_ALL_QUERY_TYPE) { return; } this.hasAdditionalItems = value; } public synchronized boolean hasAdditionalItems() { return hasAdditionalItems; } public synchronized void setHasAdditionalItemsText(String text) { checkNotFinished(); if ((queryType & CompletionProvider.COMPLETION_ALL_QUERY_TYPE) == CompletionProvider.COMPLETION_ALL_QUERY_TYPE) { return; } this.hasAdditionalItemsText = text; } public synchronized String getHasAdditionalItemsText() { return hasAdditionalItemsText; } public synchronized void setDocumentation(CompletionDocumentation documentation) { checkNotFinished(); if (!active || (queryType & CompletionProvider.DOCUMENTATION_QUERY_TYPE) != CompletionProvider.DOCUMENTATION_QUERY_TYPE) { return; } this.documentation = documentation; } public synchronized CompletionDocumentation getDocumentation() { return documentation; } public synchronized JToolTip getToolTip() { return toolTip; } public synchronized void setToolTip(JToolTip toolTip) { checkNotFinished(); if (!active || (queryType & CompletionProvider.TOOLTIP_QUERY_TYPE) != CompletionProvider.TOOLTIP_QUERY_TYPE) { return; } this.toolTip = toolTip; } public synchronized boolean isFinished() { return finished; } public void finish() { synchronized (this) { if (finished) { throw new IllegalStateException("finish() already called"); // NOI18N } finished = true; } completionImpl.finishNotify(this); } public int getSortType() { return completionImpl.getSortType(); } public synchronized void estimateItems(int estimatedItemCount, int estimatedItemWidth) { this.estimatedItemCount = estimatedItemCount; this.estimatedItemWidth = estimatedItemWidth; } CompletionImpl getCompletionImpl() { return completionImpl; } Object getResultId() { return resultId; } private void checkNotFinished() { if (isFinished()) { throw new IllegalStateException("Result set already finished"); // NOI18N } } public synchronized String getWaitText() { return waitText; } public synchronized void setWaitText(String waitText) { this.waitText = waitText; } }