package com.dubture.composer.ui.parts.composer;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Twistie;
import com.dubture.getcomposer.core.ComposerPackage;
import com.dubture.getcomposer.core.VersionedPackage;
import com.dubture.getcomposer.core.collection.Dependencies;
public class DependencySearch extends PackageSearch {
protected List<DependencySelectionFinishedListener> dependencyListeners = new ArrayList<DependencySelectionFinishedListener>();
private boolean collapsing = false;
public DependencySearch (Composite parent, ComposerPackage composerPackage, FormToolkit toolkit, String buttonText) {
super(parent, composerPackage, toolkit, buttonText);
}
public DependencySearch (Composite parent, ComposerPackage composerPackage, FormToolkit toolkit) {
super(parent, composerPackage, toolkit);
}
public DependencySearch (Composite parent, ComposerPackage composerPackage, String buttonText) {
super(parent, composerPackage, buttonText);
}
public DependencySearch(Composite parent, ComposerPackage composerPackage) {
super(parent, composerPackage);
}
public void addDependencySelectionFinishedListener(DependencySelectionFinishedListener listener) {
if (!dependencyListeners.contains(listener)) {
dependencyListeners.add(listener);
}
}
public void removeDependencySelectionFinishedListener(DependencySelectionFinishedListener listener) {
dependencyListeners.remove(listener);
}
@Override
protected void create(Composite parent, FormToolkit toolkit, String buttonText) {
super.create(parent, toolkit, buttonText);
if (addButton != null) {
addButton.removeSelectionListener(addButtonListener);
addButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
notifyDependencySelectionFinishedListener();
}
});
}
}
protected void notifyDependencySelectionFinishedListener() {
Dependencies deps = getDependencies();
for (DependencySelectionFinishedListener listener : dependencyListeners) {
listener.dependenciesSelected(deps);
}
clear();
}
public Dependencies getDependencies() {
Dependencies deps = new Dependencies();
for (PackageSearchPart psp : packageControls.values()) {
VersionedPackage pkg = ((DependencySearchPart)psp).getPackage();
if (!pkg.getVersion().isEmpty()) {
deps.add(pkg);
}
}
return deps;
}
@Override
protected DependencySearchPart createPackagePart(Composite parent, String name) {
DependencySearchPart dsp = new DependencySearchPart(parent, composerPackage, toolkit, name);
dsp.addToggleListener(new HyperlinkAdapter() {
public void linkActivated(HyperlinkEvent e) {
if (!collapsing) {
Twistie toggle = (Twistie)e.getSource();
DependencySearchPart dsp = (DependencySearchPart)toggle.getData();
setExpanded(dsp, toggle.isExpanded());
}
}
});
dsp.getVersionControl().addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
Text version = (Text)e.getSource();
DependencySearchPart dsp = (DependencySearchPart)version.getData();
setExpanded(dsp, true);
}
});
dsp.getVersionControl().addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
boolean canFinish = true;
for (PackageSearchPart psp : packageControls.values()) {
canFinish = canFinish
&& !((DependencySearchPart)psp).getVersionControl().getText().isEmpty();
}
addButton.setEnabled(canFinish && enabled);
}
});
return dsp;
}
private void setExpanded(DependencySearchPart dsp, boolean expanded) {
// if it goes expanded
// collapse all dsp's first
if (expanded) {
collapsing = true;
for (PackageSearchPart psp : packageControls.values()) {
((DependencySearchPart)psp).setExpanded(false);
}
collapsing = false;
}
dsp.setExpanded(expanded);
// update layout
getBody().layout(true, true);
}
}