Skip to content

Commit

Permalink
Package searching available.
Browse files Browse the repository at this point in the history
  • Loading branch information
gossi committed Dec 15, 2012
1 parent 7f8ba3f commit 477ee40
Show file tree
Hide file tree
Showing 7 changed files with 143 additions and 68 deletions.
@@ -1,16 +1,12 @@
package com.dubture.composer.ui.controller;

import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.getcomposer.VersionedPackage;
import org.getcomposer.collection.Dependencies;
import org.getcomposer.entities.Dependency;

import com.dubture.composer.ui.ComposerUIPluginImages;

public class DependencyController extends PackageController {

private Dependencies deps;
private Image phpImage = ComposerUIPluginImages.PHP.createImage();

public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
deps = (Dependencies)newInput;
Expand All @@ -20,16 +16,8 @@ public Object[] getElements(Object inputElement) {
return deps.toArray();
}

public Image getColumnImage(Object element, int columnIndex) {
Dependency dep = (Dependency)element;
if (dep.getName() == "php") {
return phpImage;
}
return pkgImage;
}

public String getColumnText(Object element, int columnIndex) {
Dependency dep = (Dependency)element;
VersionedPackage dep = (VersionedPackage)element;
StringBuilder sb = new StringBuilder();
sb.append(dep.getName());
sb.append(": ");
Expand Down
@@ -1,29 +1,52 @@
package com.dubture.composer.ui.controller;

import java.util.List;

import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.getcomposer.ComposerPackage;
import org.getcomposer.MinimalPackage;

import com.dubture.composer.ui.ComposerUIPluginImages;

public class PackageController extends LabelProvider implements ITableController {

private String[] packages;
private List<MinimalPackage> packages;
protected Image pkgImage = ComposerUIPluginImages.PACKAGE.createImage();
protected Image phpImage = ComposerUIPluginImages.PHP.createImage();

@SuppressWarnings("unchecked")
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
packages = (String[])newInput;
if (newInput == null) {
packages = null;
} else {
packages = (List<MinimalPackage>)newInput;
}
}

public Object[] getElements(Object inputElement) {
return packages;
if (packages != null) {
return packages.toArray();
} else {
return null;
}
}

public void addPackages(List<ComposerPackage> packages) {
this.packages.addAll(packages);
}

public Image getColumnImage(Object element, int columnIndex) {
MinimalPackage pkg = (MinimalPackage)element;
if (pkg.getName() == "php") {
return phpImage;
}
return pkgImage;
}

public String getColumnText(Object element, int columnIndex) {
return (String)element;
MinimalPackage pkg = (MinimalPackage)element;
return pkg.getName();
}
}
@@ -1,7 +1,5 @@
package com.dubture.composer.ui.dialogs;

import java.io.IOException;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.value.IObservableValue;
Expand All @@ -19,13 +17,13 @@
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.getcomposer.VersionedPackage;
import org.getcomposer.collection.Versions;
import org.getcomposer.entities.Dependency;
import org.getcomposer.packagist.PackagistDownloader;

public class DependencyDialog extends Dialog {

private Dependency dependency;
private VersionedPackage dependency;
private Text name;
private Text version;
private List list;
Expand All @@ -36,13 +34,13 @@ public class DependencyDialog extends Dialog {
* @param parentShell
* @param dependency
*/
public DependencyDialog(Shell parentShell, Dependency dependency) {
public DependencyDialog(Shell parentShell, VersionedPackage dependency) {
super(parentShell);
this.dependency = dependency;
initialize();
}

public DependencyDialog(IShellProvider parentShell, Dependency dependency) {
public DependencyDialog(IShellProvider parentShell, VersionedPackage dependency) {
super(parentShell);
this.dependency = dependency;
initialize();
Expand All @@ -53,14 +51,14 @@ private void initialize() {
if (name != null && name.trim() != "" && !name.trim().equals("") && !name.trim().equals("php")) {
PackagistDownloader downloader = new PackagistDownloader(name);
try {
versions = downloader.getPackage().getVersions();
} catch (IOException e) {
versions = downloader.loadPackage().getVersions();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Dependency getDependency() {

public VersionedPackage getDependency() {
return dependency;
}

Expand Down
Expand Up @@ -17,8 +17,8 @@
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.getcomposer.VersionedPackage;
import org.getcomposer.collection.Dependencies;
import org.getcomposer.entities.Dependency;

import com.dubture.composer.ui.controller.DependencyController;
import com.dubture.composer.ui.dialogs.DependencyDialog;
Expand Down Expand Up @@ -140,7 +140,7 @@ protected void fillContextMenu(IMenuManager manager) {
}

private void handleEdit() {
Dependency dep = (Dependency)((StructuredSelection)dependencyViewer.getSelection()).getFirstElement();
VersionedPackage dep = (VersionedPackage)((StructuredSelection)dependencyViewer.getSelection()).getFirstElement();
DependencyDialog diag = new DependencyDialog(dependencyViewer.getTable().getShell(), dep.clone());
if (diag.open() == Dialog.OK) {
dep = diag.getDependency();
Expand All @@ -149,7 +149,7 @@ private void handleEdit() {
}

private void handleRemove() {
Dependency dep = (Dependency)((StructuredSelection)dependencyViewer.getSelection()).getFirstElement();
VersionedPackage dep = (VersionedPackage)((StructuredSelection)dependencyViewer.getSelection()).getFirstElement();
MessageDialog diag = new MessageDialog(
dependencyViewer.getTable().getShell(),
"Remove Author",
Expand Down
@@ -1,6 +1,5 @@
package com.dubture.composer.ui.parts.composer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

Expand All @@ -18,20 +17,31 @@
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.getcomposer.ComposerPackage;
import org.getcomposer.packagist.SearchResultDownloader;
import org.getcomposer.packagist.PackageSearchListenerInterface;
import org.getcomposer.packagist.PackagistSearch;
import org.getcomposer.packagist.SearchResult;

import com.dubture.composer.ui.controller.ITableController;
import com.dubture.composer.ui.controller.PackageController;

public class PackageSearch {
public class PackageSearch implements PackageSearchListenerInterface {

protected final static long QUERY_DELAY_MS = 300;

protected Text searchField;
protected CheckboxTableViewer searchResults;
protected PatternFilter searchFilter;
protected ITableController searchController;
protected Composite body;
protected Composite pickedResults;
private Thread worker;

protected PackagistSearch downloader = new PackagistSearch();
protected String currentQuery;
protected String lastQuery;
protected String shownQuery;
protected String foundQuery;
protected Thread resetThread;
protected Thread queryThread;

public PackageSearch (Composite parent, FormToolkit toolkit) {
create(parent, toolkit);
}
Expand Down Expand Up @@ -70,65 +80,120 @@ public void widgetDefaultSelected(SelectionEvent e) {
searchResults = CheckboxTableViewer.newCheckList(body, style);
searchResults.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

ITableController controller = getSearchResultsController();
searchController = getSearchResultsController();
searchFilter = new PatternFilter();
searchFilter.setIncludeLeadingWildcard(true);

searchResults.setContentProvider(controller);
searchResults.setLabelProvider(controller);
searchResults.setContentProvider(searchController);
searchResults.setLabelProvider(searchController);
searchResults.addFilter(searchFilter);
searchResults.setInput(new ArrayList<ComposerPackage>());

pickedResults = createComposite(body, toolkit);

// create downloader
downloader.addPackageSearchListener(this);
}

protected void clearSearchText() {
searchFilter.setPattern(null);
searchResults.setInput(null);
downloader.abort();
// hum, stop all threads
}

protected void setPackages(String[] packages) {
searchResults.setInput(packages);
System.err.println("Packages: " + packages);
// protected void setPackages(String[] packages) {
// searchResults.setInput(packages);
// System.err.println("Packages: " + packages);
// }
//

@Override
public void packagesFound(final List<ComposerPackage> packages, String query, SearchResult result) {
// TODO: why this has to be done in a runnable, obviously yes, results are coming from another thread
foundQuery = query;
Display.getDefault().syncExec(new Runnable() {
public void run() {
boolean change = false;

if (currentQuery.isEmpty()) {
return;
}

if (shownQuery == null ||
(!shownQuery.equals(foundQuery) && currentQuery.equals(foundQuery))) {
searchResults.setInput(packages);
change = true;
}

else if (shownQuery.equals(foundQuery)) {
((PackageController)searchController).addPackages(packages);
searchResults.refresh();
change = true;
}

if (change) {
shownQuery = foundQuery;
}
}
});
}

protected void searchTextChanged() {
final String searchText = searchField.getText();
currentQuery = searchField.getText();
// searchFilter.setPattern(searchText);

// kill previous thread
if (worker != null) {
worker.interrupt();
// kill previous downloader
downloader.abort();

if (currentQuery.isEmpty()) {
clearSearchText();
return;
}

// run a new one
worker = new Thread(new Runnable() {
if (queryThread == null || !queryThread.isAlive() || queryThread.isInterrupted()) {
startQuery();
queryThread = new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(QUERY_DELAY_MS);

startQuery();
queryThread.interrupt();
} catch (InterruptedException e) {
}
}
});
queryThread.start();
}
}

protected void startQuery() {
if (lastQuery == currentQuery) {
return;
}
downloader.searchPackagesAsync(currentQuery);

if (resetThread != null) {
resetThread.interrupt();
}
resetThread = new Thread(new Runnable() {
public void run() {
try {
SearchResultDownloader downloader = new SearchResultDownloader();
List<ComposerPackage> results = downloader.searchPackages(searchText);
List<String> packageNames = new ArrayList<String>();

for (ComposerPackage pkg : results) {
packageNames.add(pkg.getName());
Thread.sleep(1500);

if (shownQuery.equals(currentQuery)) {
shownQuery = null;
}

final String[] packages = packageNames.toArray(new String[]{});

Display.getDefault().asyncExec(new Runnable() {
public void run() {
setPackages(packages);
}
});

} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
}
}
});
worker.start();
resetThread.start();
lastQuery = currentQuery;
}

protected ITableController getSearchResultsController() {
return new PackageController();
}
Expand Down Expand Up @@ -165,4 +230,5 @@ protected Text createText(Composite parent, FormToolkit toolkit, int style) {
return toolkit.createText(parent, "", style);
}
}

}
Expand Up @@ -41,7 +41,7 @@ public IStatus runInUIThread(IProgressMonitor monitor) {

if (!RequirePageOne.this.previousFilterText .equals(text)) {

SearchResultDownloader downloader = new SearchResultDownloader();
PackagistSearch downloader = new PackagistSearch();
items = new ArrayList<InstallableItem>();

try {
Expand Down
Expand Up @@ -90,7 +90,7 @@ public void run(IProgressMonitor monitor)
for (InstallableItem item : rawPackages) {
try {
PackageDownloader downloader = new PackageDownloader(item.getUrl());
RepositoryPackage phpPackage = downloader.getPackage();
RepositoryPackage phpPackage = downloader.loadPackage();
packages.put(new EclipsePHPPackage(phpPackage), phpPackage.getDefaultVersion());
} catch (IOException e) {
Logger.logException(e);
Expand Down

0 comments on commit 477ee40

Please sign in to comment.