package org.erlide.cover.ui.views.util; import java.io.File; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.LocationEvent; import org.eclipse.swt.browser.LocationListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.erlide.cover.core.Logger; import org.erlide.cover.ui.Activator; import org.erlide.cover.ui.Images; import org.erlide.cover.views.model.ICoverageObject; import org.erlide.cover.views.model.StatsTreeModel; /** * Dialog for HTML browser * * @author Aleksandra Lipiec <aleksandra.lipiec@erlang-solutions.com> * */ public class BrowserDialog extends Dialog { private Shell dialogShell; private Composite comp; private Button home; private Button up; private Button next; private Button prev; private Browser browser; private ICoverageObject object; private String url; private final Logger log; // logger public BrowserDialog(final Shell parent) { this(parent, SWT.NULL); } public BrowserDialog(final Shell parent, final int style) { super(parent, style); log = Activator.getDefault(); } public void open() { createContent(); dialogShell.open(); final Display display = dialogShell.getDisplay(); while (!dialogShell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } public void setBrowserText(final String html) { browser.setText(html); } /** * Sets object connected with current path * * @param path */ public void setObject(final ICoverageObject obj) { object = obj; url = "file://" + obj.getHtmlPath(); } private void createContent() { final Shell parent = getParent(); dialogShell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); final GridLayout dialogShellLayout = new GridLayout(); dialogShellLayout.makeColumnsEqualWidth = true; dialogShell.setText("Html Report browser"); dialogShell.setLayout(dialogShellLayout); dialogShell.layout(); dialogShell.pack(); dialogShell.setSize(800, 600); browser = new Browser(dialogShell, SWT.NONE | SWT.BORDER); final GridData browserLData = new GridData(); browserLData.widthHint = 784; browserLData.heightHint = 500; browser.setLayoutData(browserLData); browser.setUrl(object.getHtmlPath()); browser.addLocationListener(locationListener); comp = new Composite(dialogShell, SWT.NONE); final GridLayout compLayout = new GridLayout(); compLayout.makeColumnsEqualWidth = true; compLayout.numColumns = 4; compLayout.marginLeft = 330; compLayout.marginRight = 330; final GridData compLData = new GridData(); compLData.widthHint = 521; compLData.heightHint = 33; comp.setLayoutData(compLData); comp.setLayout(compLayout); prev = new Button(comp, SWT.PUSH | SWT.CENTER | SWT.FILL); final GridData prevLData = new GridData(); prev.setLayoutData(prevLData); prev.addSelectionListener(prevListener); prev.setImage(Activator.getImageDescriptor(Images.PREV).createImage()); next = new Button(comp, SWT.PUSH | SWT.CENTER | SWT.FILL); final GridData nextLData = new GridData(); next.setLayoutData(nextLData); next.addSelectionListener(nextListener); next.setImage(Activator.getImageDescriptor(Images.NEXT).createImage()); if (object.getParent() != null) { if (object.getParent().getNextSiblingTo(object.getLabel()) == null) { next.setEnabled(false); } if (object.getParent().getPrevSiblingTo(object.getLabel()) == null) { prev.setEnabled(false); } } else { next.setEnabled(false); prev.setEnabled(false); } home = new Button(comp, SWT.PUSH | SWT.CENTER | SWT.FILL); final GridData homeLData = new GridData(); home.setLayoutData(homeLData); home.addSelectionListener(homeListener); home.setImage(Activator.getImageDescriptor(Images.HOME).createImage()); up = new Button(comp, SWT.PUSH | SWT.CENTER | SWT.FILL); final GridData upLData = new GridData(); up.setLayoutData(upLData); up.addSelectionListener(upListener); up.setImage(Activator.getImageDescriptor(Images.UP).createImage()); dialogShell.setLocation(getParent().toDisplay(100, 100)); } private final SelectionListener prevListener = new SelectionListener() { @Override public void widgetSelected(final SelectionEvent e) { if (object.getParent() != null) { final ICoverageObject sib = object.getParent() .getPrevSiblingTo(object.getLabel()); if (sib == null) { return; } setObject(sib); browser.setUrl(url); // disable buttons next.setEnabled(true); if (object.getParent().getPrevSiblingTo(object.getLabel()) == null) { prev.setEnabled(false); } } } @Override public void widgetDefaultSelected(final SelectionEvent e) { } }; private final SelectionListener nextListener = new SelectionListener() { @Override public void widgetSelected(final SelectionEvent e) { if (object.getParent() != null) { final ICoverageObject sib = object.getParent() .getNextSiblingTo(object.getLabel()); if (sib == null) { return; } setObject(sib); browser.setUrl(url); prev.setEnabled(true); if (object.getParent().getNextSiblingTo(object.getLabel()) == null) { next.setEnabled(false); } } } @Override public void widgetDefaultSelected(final SelectionEvent e) { } }; private final SelectionListener upListener = new SelectionListener() { @Override public void widgetSelected(final SelectionEvent e) { if (object.getParent() != null) { setObject(object.getParent()); browser.setUrl(url); if (object.getParent().getNextSiblingTo(object.getLabel()) == null) { next.setEnabled(false); } if (object.getParent().getPrevSiblingTo(object.getLabel()) == null) { prev.setEnabled(false); } } } @Override public void widgetDefaultSelected(final SelectionEvent e) { } }; private final SelectionListener homeListener = new SelectionListener() { @Override public void widgetSelected(final SelectionEvent e) { setObject(StatsTreeModel.getInstance().getRoot()); browser.setUrl(url); next.setEnabled(false); prev.setEnabled(false); } @Override public void widgetDefaultSelected(final SelectionEvent e) { } }; private final LocationListener locationListener = new LocationListener() { @Override public void changing(final LocationEvent event) { } @Override public void changed(final LocationEvent event) { if (object == null) { return; } log.info(event.getSource()); final String newUrl = browser.getUrl(); String name = newUrl.substring(newUrl.lastIndexOf(File.separator) + 1, newUrl.length() - 5); log.info(name); if (name.startsWith("mod_")) { name = name.substring(4); } ICoverageObject newObj; if ((newObj = object.treeSearch(name)) != null) { // TODO -> findChild setObject(newObj); if (object.getParent() == null) { up.setEnabled(false); next.setEnabled(false); prev.setEnabled(false); } else { up.setEnabled(true); if (object.getParent().getNextSiblingTo(object.getLabel()) == null) { next.setEnabled(false); } else { next.setEnabled(true); } if (object.getParent().getPrevSiblingTo(object.getLabel()) == null) { prev.setEnabled(false); } else { prev.setEnabled(true); } } } } }; }