/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.tvl.goworks.editor.go.quicksearch;
import java.util.HashSet;
import java.util.Set;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ui.OpenProjects;
import org.netbeans.spi.quicksearch.SearchProvider;
import org.netbeans.spi.quicksearch.SearchRequest;
import org.netbeans.spi.quicksearch.SearchResponse;
import org.tvl.goworks.editor.go.codemodel.CodeElementModel;
import org.tvl.goworks.editor.go.codemodel.PackageModel;
import org.tvl.goworks.editor.go.codemodel.TypeModel;
import org.tvl.goworks.editor.go.codemodel.impl.CodeModelCacheImpl;
import org.tvl.goworks.editor.go.codemodel.impl.CodeModelProjectCache;
import org.tvl.goworks.project.GoProject;
public class GoToTypeSearchProvider implements SearchProvider {
@Override
public void evaluate(SearchRequest request, SearchResponse response) {
Set<GoProject> projects = new HashSet<>();
for (Project project : OpenProjects.getDefault().getOpenProjects()) {
if (project instanceof GoProject) {
projects.add((GoProject)project);
}
}
while (true) {
boolean updated = false;
for (GoProject project : projects.toArray(new GoProject[projects.size()])) {
updated |= projects.addAll(project.getLibraryProjects());
}
if (!updated) {
break;
}
}
for (GoProject project : projects) {
CodeModelProjectCache projectCache = CodeModelCacheImpl.getInstance().getProjectCache(project, false);
if (projectCache == null) {
continue;
}
for (PackageModel packageModel : projectCache.getPackages()) {
for (TypeModel typeModel : packageModel.getTypes()) {
if (!examineModel(request, response, typeModel)) {
return;
}
}
}
}
}
private boolean examineModel(SearchRequest request, SearchResponse response, TypeModel model) {
if (!model.getName().toLowerCase().contains(request.getText().toLowerCase())) {
return true;
}
String displayName = QuickSearchFormatter.INSTANCE.format(model);
if (displayName == null || displayName.isEmpty()) {
return true;
}
return response.addResult(new Handler(model), displayName);
}
private static final class Handler implements Runnable {
private final CodeElementModel model;
public Handler(CodeElementModel model) {
this.model = model;
}
@Override
public void run() {
model.navigateTo();
}
}
}