package com.dubture.composer.ui.editor.composer;
import java.io.IOException;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.zest.core.viewers.GraphViewer;
import org.eclipse.zest.core.widgets.ZestStyles;
import org.eclipse.zest.layouts.LayoutAlgorithm;
import org.eclipse.zest.layouts.LayoutStyles;
import org.eclipse.zest.layouts.algorithms.CompositeLayoutAlgorithm;
import org.eclipse.zest.layouts.algorithms.HorizontalShift;
import org.eclipse.zest.layouts.algorithms.TreeLayoutAlgorithm;
import com.dubture.composer.core.ComposerPlugin;
import com.dubture.composer.core.log.Logger;
import com.dubture.composer.core.resources.IComposerProject;
import com.dubture.composer.ui.actions.ToggleDevAction;
import com.dubture.composer.ui.controller.GraphController;
import com.dubture.composer.ui.editor.ComposerFormPage;
import com.dubture.composer.ui.editor.toolbar.SearchControl;
import com.dubture.getcomposer.core.ComposerPackage;
import com.dubture.getcomposer.core.collection.ComposerPackages;
/**
* @author Robert Gruendler <r.gruendler@gmail.com>
*/
public class DependencyGraphPage extends ComposerFormPage implements ModifyListener {
private static final String SEARCH_ID = "composer.dpg.search";
private static final String SEPARATOR_ID = "composer.dpg.separator";
public final static String ID = "com.dubture.composer.ui.editor.composer.DependencyGraphPage";
protected ComposerFormEditor editor;
private GraphController graphController;
private GraphViewer viewer;
private IComposerProject composerProject;
private IProject project;
private SearchControl searchControl;
private IToolBarManager manager;
public DependencyGraphPage(ComposerFormEditor editor, String id, String title) {
super(editor, id, title);
this.editor = editor;
}
@Override
public void setActive(boolean active) {
super.setActive(active);
if (active) {
editor.getHeaderForm().getForm().setText("Dependency Graph");
}
active = active && editor.isValidJson();
// set toolbar contributions visible
manager.find(ToggleDevAction.ID).setVisible(active);
manager.find(SEPARATOR_ID).setVisible(active);
searchControl.setVisible(active);
manager.update(true);
viewer.getControl().setEnabled(active);
if (active) {
update();
}
}
@Override
protected void createFormContent(IManagedForm managedForm) {
try {
createGraph(managedForm);
} catch (IOException e) {
Logger.logException(e);
}
}
private void createGraph(IManagedForm managedForm) throws IOException {
ScrolledForm form = managedForm.getForm();
Composite body = form.getBody();
body.setLayout(new FillLayout());
project = getComposerEditor().getProject();
composerProject = ComposerPlugin.getDefault().getComposerProject(project);
graphController = new GraphController(composerProject);
graphController.setComposerProject(composerProject);
viewer = new GraphViewer(body, SWT.NO_REDRAW_RESIZE);
viewer.setConnectionStyle(ZestStyles.CONNECTIONS_DIRECTED);
viewer.setContentProvider(graphController);
viewer.setLabelProvider(graphController);
viewer.setLayoutAlgorithm(setLayout());
viewer.applyLayout();
DevFilter filter = new DevFilter();
ViewerFilter[] filters = new ViewerFilter[1];
filters[0] = filter;
viewer.setFilters(filters);
update();
}
@Override
public void contributeToToolbar(IToolBarManager manager, IManagedForm headerForm) {
this.manager = manager;
searchControl = new SearchControl(SEARCH_ID, headerForm);
searchControl.setVisible(false);
searchControl.addModifyListener(this);
manager.add(searchControl);
manager.add(new ToggleDevAction(this));
manager.find(ToggleDevAction.ID).setVisible(false);
Separator graphSeparator = new Separator();
graphSeparator.setId(SEPARATOR_ID);
graphSeparator.setVisible(false);
manager.add(graphSeparator);
}
private LayoutAlgorithm setLayout() {
LayoutAlgorithm layout;
layout = new CompositeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING,
new LayoutAlgorithm[] {
new TreeLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING),
new HorizontalShift(LayoutStyles.NO_LAYOUT_NODE_RESIZING) });
return layout;
}
private class DevFilter extends ViewerFilter {
protected boolean showDev = true;
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (showDev == true) {
return true;
}
if (element instanceof ComposerPackage) {
return !composerProject.getComposerPackage().getRequireDev().has((ComposerPackage)element);
}
return true;
}
public void hideDevPackages() {
showDev = false;
}
}
protected void update() {
if (composerProject != null
&& viewer != null
&& !viewer.getControl().isDisposed()
&& editor.isValidJson()) {
ComposerPackages packages = composerProject.getInstalledPackages();
packages.add(composerProject.getComposerPackage());
viewer.setInput(packages);
applyFilter(true);
}
}
public void applyFilter(boolean showDev) {
DevFilter filter = new DevFilter();
if (!showDev) {
filter.hideDevPackages();
}
ViewerFilter[] filters = new ViewerFilter[1];
filters[0] = filter;
viewer.setFilters(filters);
viewer.applyLayout();
}
@Override
public void modifyText(ModifyEvent e) {
long start = System.nanoTime();
graphController.setFilterText(searchControl.getText());
viewer.refresh();
double elapsed = (System.nanoTime() - start) * 1.0e-9;
System.err.println("refresh inaaa " + elapsed);
}
}