/*******************************************************************************
* Copyright (c) 2005, 2017 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.dltk.tcl.internal.debug.ui.interpreters;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.caching.ArchiveContentCacheProvider;
import org.eclipse.dltk.core.caching.IContentCache;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.dltk.core.environment.IFileHandle;
import org.eclipse.dltk.internal.core.ModelManager;
import org.eclipse.dltk.internal.debug.ui.interpreters.AddScriptInterpreterDialog;
import org.eclipse.dltk.internal.debug.ui.interpreters.InterpretersBlock;
import org.eclipse.dltk.launching.IInterpreterInstall;
import org.eclipse.dltk.launching.ScriptRuntime;
import org.eclipse.dltk.tcl.core.TclNature;
import org.eclipse.dltk.tcl.core.TclPackagesManager;
import org.eclipse.dltk.tcl.core.packages.TclPackageInfo;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
public class TclInterpretersBlock extends InterpretersBlock {
private Button fetchInterpreterInformation;
@Override
protected AddScriptInterpreterDialog createInterpreterDialog(IInterpreterInstall standin) {
AddTclInterpreterDialog dialog = new AddTclInterpreterDialog(this, getShell(),
ScriptRuntime.getInterpreterInstallTypes(getCurrentNature()), standin);
return dialog;
}
@Override
protected String getCurrentNature() {
return TclNature.NATURE_ID;
}
@Override
public void createControl(Composite ancestor) {
super.createControl(ancestor);
fetchInterpreterInformation = createPushButton(buttons, "Fetch information");
fetchInterpreterInformation.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) fInterpreterList.getSelection();
final IInterpreterInstall install = (IInterpreterInstall) selection.getFirstElement();
fetchInterpreterInformation(install);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
enableButtons();
}
@Override
protected void enableButtons() {
super.enableButtons();
if (fetchInterpreterInformation != null) {
IStructuredSelection selection = (IStructuredSelection) fInterpreterList.getSelection();
int selectionCount = selection.size();
if (selectionCount == 1) {
fetchInterpreterInformation.setEnabled(true);
} else {
fetchInterpreterInformation.setEnabled(false);
}
}
}
private void fetchInterpreterInformation(final IInterpreterInstall install) {
ProgressMonitorDialog dialog = new ProgressMonitorDialog(fetchInterpreterInformation.getShell());
try {
dialog.run(true, true, monitor -> {
IContentCache cache = ModelManager.getModelManager().getCoreCache();
monitor.beginTask("Fetching interpreter information", 100);
List<TclPackageInfo> list = null;
try {
TclPackagesManager.markInterprterAsNotFetched(install);
list = TclPackagesManager.getPackageInfos(install);
} catch (Exception e1) {
// Try one more time
list = TclPackagesManager.getPackageInfos(install);
}
monitor.worked(20);
SubProgressMonitor smon0 = new SubProgressMonitor(monitor, 40);
int s = 0;
int lsize = list.size();
smon0.beginTask("Fetch package information", lsize / 50);
while (s < lsize) {
int part = 50;
if (lsize - s < part) {
part = lsize - s;
}
if (smon0.isCanceled()) {
break;
}
smon0.subTask("Processing packages info (" + (lsize - s) + " left)");
Set<String> pkgs = new HashSet<>();
for (int i = s; i < s + part; i++) {
pkgs.add(list.get(i).getName());
}
try {
List<TclPackageInfo> infos = TclPackagesManager.getPackageInfos(install, pkgs, true);
} catch (Exception e2) {
if (DLTKCore.DEBUG) {
e2.printStackTrace();
}
}
s += part;
smon0.worked(1);
}
smon0.done();
SubProgressMonitor smon = new SubProgressMonitor(monitor, 40);
IEnvironment env = install.getEnvironment();
smon.beginTask("Processing packages", lsize);
int index = 1;
for (TclPackageInfo tclPackageInfo : list) {
smon.subTask("Processing package:" + tclPackageInfo.getName() + " (" + (lsize - index) + " left)");
index++;
if (smon.isCanceled()) {
break;
}
boolean processed = false;
try {
TclPackageInfo info = TclPackagesManager.getPackageInfo(install, tclPackageInfo.getName(),
true);
if (info != null) {
List<String> sources = info.getSources();
Set<IPath> parents = new HashSet<>();
for (String source : sources) {
IPath path1 = new Path(source);
IPath parent = path1.removeLastSegments(1);
parents.add(parent);
}
for (IPath path2 : parents) {
IFileHandle file = env.getFile(path2);
if (file.exists()) {
ArchiveContentCacheProvider.processFolderIndexes(file, cache, smon);
processed = true;
}
}
}
} catch (Exception e3) {
if (DLTKCore.DEBUG) {
e3.printStackTrace();
}
}
if (!processed) {
smon.worked(1);
}
}
smon.done();
monitor.done();
});
} catch (Exception e1) {
if (DLTKCore.DEBUG) {
e1.printStackTrace();
}
}
}
}