Package com.dubture.composer.ui.wizard.project.template

Source Code of com.dubture.composer.ui.wizard.project.template.PackageFilterViewer

package com.dubture.composer.ui.wizard.project.template;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.equinox.internal.p2.ui.discovery.util.ControlListItem;
import org.eclipse.equinox.internal.p2.ui.discovery.util.ControlListViewer;
import org.eclipse.equinox.internal.p2.ui.discovery.util.FilteredViewer;
import org.eclipse.equinox.internal.p2.ui.discovery.wizards.DiscoveryResources;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;

import com.dubture.composer.core.log.Logger;
import com.dubture.getcomposer.core.MinimalPackage;
import com.dubture.getcomposer.packages.AsyncPackagistSearch;
import com.dubture.getcomposer.packages.PackageSearchListenerInterface;
import com.dubture.getcomposer.packages.SearchResult;

/**
*
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
@SuppressWarnings("restriction")
public class PackageFilterViewer extends FilteredViewer implements PackageFilterChangedListener {

  protected final static Object[] EMTPY = new Object[0];
  private DiscoveryResources resources;
  private Button showProjectsCheckbox;
  private PackagistContentProvider contentProvider;
  private PackageFilterItem currentSelection = null;
  private List<PackageFilterChangedListener> listeners = new ArrayList<PackageFilterChangedListener>();
  private Label searchResultCount;
 
  @Override
  public void createControl(Composite parent) {
    super.createControl(parent);
    doFind("");
   
  }
 
  public void addChangeListener(PackageFilterChangedListener listener) {
    if (!listeners.contains(listener)) {
      listeners.add(listener);
    }
  }
 
  @Override
  protected StructuredViewer doCreateViewer(Composite container) {
   
    resources = new DiscoveryResources(getControl().getDisplay());
    StructuredViewer viewer = new ControlListViewer(container, SWT.BORDER) {
      @Override
      protected ControlListItem<?> doCreateItem(Composite parent, Object element) {
        return doCreateViewerItem(parent, element);
      }
    };
   
    viewer.setContentProvider(contentProvider = new PackagistContentProvider());
   
    searchResultCount = new Label(container, SWT.NONE);
    searchResultCount.setText("asdfasdf");
    GridDataFactory.fillDefaults().grab(true, false).span(3,1).align(SWT.BEGINNING, SWT.CENTER).hint(400, SWT.DEFAULT).applyTo(searchResultCount);
   
    return viewer;
  }
 
  @Override
  protected void doCreateHeaderControls(Composite parent) {
   
    showProjectsCheckbox = new Button(parent, SWT.CHECK);
    showProjectsCheckbox.setSelection(true);
    showProjectsCheckbox.setText("Show projects only");
    showProjectsCheckbox.addSelectionListener(new SelectionListener() {

      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        doFind(getFilterText());
      }
    });
  }
 
  protected ControlListItem<?> doCreateViewerItem(Composite parent, Object element) {
    if (element instanceof PackageFilterItem) {
      PackagistItem packagistItem = new PackagistItem(parent, SWT.NONE, resources, (PackageFilterItem) element);
      packagistItem.addFilterChangedListener(this);
      return packagistItem;
    }
   
    return null;
  }
 
 
  @Override
  protected void doFind(String text) {
    try {

      contentProvider.clear();
      viewer.setInput(contentProvider.packages);
      viewer.refresh();
     
      AsyncPackagistSearch search = new AsyncPackagistSearch();
      search.addPackageSearchListener(new PackageSearchListenerInterface() {
        @Override
        public void errorOccured(Exception e) {
         
        }
        @Override
        public void aborted(String url) {
         
        }
        @Override
        public void packagesFound(List<MinimalPackage> packages, String query, final SearchResult result) {
          if (packages != null) {
            final List<PackageFilterItem> items = new ArrayList<PackageFilterItem>();
            for (MinimalPackage pkg : packages) {
              items.add(new PackageFilterItem(pkg));
            }
           
            getControl().getDisplay().asyncExec(new Runnable() {
              @Override
              public void run() {
                contentProvider.add(items);
                viewer.refresh();
                searchResultCount.setText("Found " + result.total + " packages.");
              }
            });
          }
        }
      });
     
      if (showProjectsCheckbox.getSelection()) {
        search.setFilter("project");
      }
      search.search(text);
     
    } catch (Exception e) {
      Logger.logException(e);
    }
  }
 
  protected static class PackagistContentProvider implements ITreeContentProvider {

    private List<PackageFilterItem> packages;
   
    public void dispose() {
      packages = null;
    }

    public Object[] getChildren(Object parentElement) {
      return null;
    }

    public Object[] getElements(Object inputElement) {
      if (packages != null) {
        List<Object> elements = new ArrayList<Object>();
        elements.addAll(packages);
        return elements.toArray(new Object[elements.size()]);
      }
     
      return EMTPY;
    }

    public Object getParent(Object element) {
      if (element instanceof PackageFilterItem) {
        return packages;
      }
     
      return null;
    }

    public boolean hasChildren(Object element) {
      if (element instanceof PackageFilterItem) {
        return false;
      }
     
      if (packages != null) {
        return packages.size() > 0;
      }
     
      return false;
    }
   
    public void add(List<PackageFilterItem> items) {
      packages.addAll(items);
    }
   
    public void clear() {
      packages = new ArrayList<PackageFilterItem>();
    }

    @SuppressWarnings("unchecked")
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
      packages = (List<PackageFilterItem>) newInput;
    }
  }

  public PackageFilterItem getSelectedPackage() {

    for (PackageFilterItem item : contentProvider.packages) {
      if (item.isChecked()) {
        return item;
      }
    }
   
    return  null;
  }

  @Override
  public void filterChanged(PackageFilterItem item) {

    if (currentSelection != null) {
      if (item == currentSelection) {
        fireEvent(item);
        return;
      }
    }
   
    List<PackageFilterItem> input = (List<PackageFilterItem>) viewer.getInput();
    if (!item.isChecked()) {
      return;
    }
   
    for (PackageFilterItem filterItem : input) {
      if (filterItem == item) {
        continue;
      }
      filterItem.setChecked(false);
    }
   
    ScrolledComposite control = (ScrolledComposite) viewer.getControl();
    Point origin = control.getOrigin();
    viewer.refresh();
    control.setOrigin(origin);
    fireEvent(item);
  }
 
  protected void fireEvent(PackageFilterItem item) {
    for (PackageFilterChangedListener listener : listeners) {
      listener.filterChanged(item);
    }
   
    currentSelection = item;
  }
}
TOP

Related Classes of com.dubture.composer.ui.wizard.project.template.PackageFilterViewer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.