/******************************************************************************* * Copyright (c) 2008 Pierre-Antoine Grégoire. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Pierre-Antoine Grégoire - initial API and implementation *******************************************************************************/ package org.org.eclipse.dws.ui.internal.views; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.widgets.FormText; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.forms.widgets.TableWrapLayout; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.part.ViewPart; import org.org.eclipse.core.ui.dialogs.ErrorDialog; import org.org.eclipse.dws.core.internal.jobs.ComputeArtifactDetailsJob; import org.org.eclipse.dws.core.internal.jobs.ComputeArtifactVersionDetailsJob; import org.org.eclipse.dws.core.internal.jobs.ComputeGroupDetailsJob; import org.org.eclipse.dws.core.internal.jobs.ComputeRepositoryDetailsJob; import org.org.eclipse.dws.ui.DWSUIPlugin; import org.org.repository.crawler.items.IFileSystemCrawledRepositorySetup; import org.org.repository.crawler.items.IHttpCrawledRepositorySetup; import org.org.repository.crawler.maven2.model.Artifact; import org.org.repository.crawler.maven2.model.ArtifactVersion; import org.org.repository.crawler.maven2.model.CrawledRepository; import org.org.repository.crawler.maven2.model.Group; /** * This view simply mirrors the current selection in the workbench window. It works for both, element and text selection. */ public class DetailsView extends ViewPart { private static final String REPOSITORY_DETAILS_PARSING_PARAMETERS = "Parsing parameters"; private static final String ARTIFACT_VERSION_DETAILS_XML_EXCLUSIONS = "XML declaration with exclusions"; private static final String ARTIFACT_VERSION_DETAILS_XML = "XML declaration"; private static final String ARTIFACT_VERSION_DETAILS = "Artifact Version Details"; private static final String ARTIFACT_DETAILS = "Artifact Details"; private static final String GROUP_DETAILS = "Group Details"; private static final String REPOSITORY_DETAILS = "CrawledRepository Details"; private static final String LOADING = "Loading..."; public static final String VIEW_ID = DetailsView.class.getName(); private static final String EMPTY = ""; private PageBook pagebook; private FormToolkit toolkit; private Map<String, ScrolledForm> forms = new ConcurrentHashMap<String, ScrolledForm>(); private Map<String, FormText> formTexts = new ConcurrentHashMap<String, FormText>(); private Map<String, Text> additionalTexts = new ConcurrentHashMap<String, Text>(); // the listener we register with the selection service private ISelectionListener listener = new ISelectionListener() { public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection) { // we ignore our own selections if (sourcepart != DetailsView.this && sourcepart instanceof MavenRepositoriesView) { showSelection(sourcepart, selection); } } }; /** * Shows the given selection in this view. */ public void showSelection(IWorkbenchPart sourcepart, ISelection selection) { setContentDescription(sourcepart.getTitle() + " (" + selection.getClass().getName() + ")"); if (selection instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection) selection; if (ss.size() == 1) { this.pagebook.showPage(forms.get(LOADING)); final Object firstElement = ss.getFirstElement(); if (firstElement instanceof CrawledRepository) { ComputeRepositoryDetailsJob job = new ComputeRepositoryDetailsJob((CrawledRepository) firstElement); job.addJobChangeListener(new JobDoneListener() { public void done(IJobChangeEvent event) { ComputeRepositoryDetailsJob finishedJob = (ComputeRepositoryDetailsJob) event.getJob(); showRepository(finishedJob); } }); job.schedule(); } else if (firstElement instanceof Group) { ComputeGroupDetailsJob job = new ComputeGroupDetailsJob((Group) firstElement); job.addJobChangeListener(new JobDoneListener() { public void done(IJobChangeEvent event) { ComputeGroupDetailsJob finishedJob = (ComputeGroupDetailsJob) event.getJob(); showGroup(finishedJob); } }); job.schedule(); } else if (firstElement instanceof Artifact) { ComputeArtifactDetailsJob job = new ComputeArtifactDetailsJob((Artifact) firstElement); job.addJobChangeListener(new JobDoneListener() { public void done(IJobChangeEvent event) { ComputeArtifactDetailsJob finishedJob = (ComputeArtifactDetailsJob) event.getJob(); showArtifact(finishedJob); } }); job.schedule(); } else if (firstElement instanceof ArtifactVersion) { ComputeArtifactVersionDetailsJob job = new ComputeArtifactVersionDetailsJob((ArtifactVersion) firstElement); job.addJobChangeListener(new JobDoneListener() { public void done(IJobChangeEvent event) { ComputeArtifactVersionDetailsJob finishedJob = (ComputeArtifactVersionDetailsJob) event.getJob(); showArtifactVersion(finishedJob); } }); job.schedule(); } else { this.pagebook.showPage(forms.get(EMPTY)); } } else { this.pagebook.showPage(forms.get(EMPTY)); } } } private void showArtifactVersion(final ComputeArtifactVersionDetailsJob finishedJob) { final DetailsView detailsView = this; Display.getDefault().asyncExec(new Runnable() { public void run() { if (!formTexts.get(ARTIFACT_VERSION_DETAILS).isDisposed()) { detailsView.formTexts.get(ARTIFACT_VERSION_DETAILS).setText(finishedJob.getFormattedArtifactVersion(), true, false); detailsView.additionalTexts.get(ARTIFACT_VERSION_DETAILS + ARTIFACT_VERSION_DETAILS_XML).setText(finishedJob.getDependencyXML()); detailsView.additionalTexts.get(ARTIFACT_VERSION_DETAILS + ARTIFACT_VERSION_DETAILS_XML_EXCLUSIONS).setText(finishedJob.getTransitiveDependenciesExclusions()); detailsView.forms.get(ARTIFACT_VERSION_DETAILS).reflow(true); detailsView.pagebook.showPage(forms.get(ARTIFACT_VERSION_DETAILS)); } } }); } private void showArtifact(final ComputeArtifactDetailsJob finishedJob) { final DetailsView detailsView = this; Display.getDefault().asyncExec(new Runnable() { public void run() { if (!formTexts.get(ARTIFACT_DETAILS).isDisposed()) { detailsView.formTexts.get(ARTIFACT_DETAILS).setText(finishedJob.getFormattedArtifact().toString(), true, false); detailsView.forms.get(ARTIFACT_DETAILS).reflow(true); detailsView.pagebook.showPage(forms.get(ARTIFACT_DETAILS)); } } }); } private void showGroup(final ComputeGroupDetailsJob finishedJob) { final DetailsView detailsView = this; Display.getDefault().asyncExec(new Runnable() { public void run() { if (!formTexts.get(GROUP_DETAILS).isDisposed()) { detailsView.formTexts.get(GROUP_DETAILS).setText(finishedJob.getFormattedGroup().toString(), true, false); detailsView.forms.get(GROUP_DETAILS).reflow(true); detailsView.pagebook.showPage(forms.get(GROUP_DETAILS)); } } }); } private void showRepository(final ComputeRepositoryDetailsJob finishedJob) { final DetailsView detailsView = this; Display.getDefault().asyncExec(new Runnable() { public void run() { if (!formTexts.get(REPOSITORY_DETAILS).isDisposed()) { detailsView.formTexts.get(REPOSITORY_DETAILS).setText(finishedJob.getFormattedRepository().toString(), true, false); detailsView.additionalTexts.get(REPOSITORY_DETAILS + REPOSITORY_DETAILS_PARSING_PARAMETERS).setText(finishedJob.getFormattedPatterns().toString()); if (IHttpCrawledRepositorySetup.class.isAssignableFrom(finishedJob.getRepositorySetupType())) { detailsView.additionalTexts.get(REPOSITORY_DETAILS + REPOSITORY_DETAILS_PARSING_PARAMETERS).setVisible(true); } if (IFileSystemCrawledRepositorySetup.class.isAssignableFrom(finishedJob.getRepositorySetupType())) { detailsView.additionalTexts.get(REPOSITORY_DETAILS + REPOSITORY_DETAILS_PARSING_PARAMETERS).setVisible(false); } forms.get(REPOSITORY_DETAILS).reflow(true); pagebook.showPage(forms.get(REPOSITORY_DETAILS)); } } }); } @Override public void createPartControl(Composite parent) { // the PageBook allows simple switching between two viewers pagebook = new PageBook(parent, SWT.NONE); toolkit = new FormToolkit(parent.getDisplay()); // create the base form createLoadPart(); createEmptyPart(); createComplexPart(ARTIFACT_VERSION_DETAILS, new String[] { ARTIFACT_VERSION_DETAILS_XML, ARTIFACT_VERSION_DETAILS_XML_EXCLUSIONS }); createBasicPart(ARTIFACT_DETAILS); createBasicPart(GROUP_DETAILS); createBasicPart(REPOSITORY_DETAILS); createComplexPart(REPOSITORY_DETAILS, new String[] { REPOSITORY_DETAILS_PARSING_PARAMETERS }); getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(listener); } private void createLoadPart() { final String title = LOADING; ScrolledForm form = toolkit.createScrolledForm(pagebook); form.setBusy(true); form.setText(title); TableWrapLayout layout = new TableWrapLayout(); form.getBody().setLayout(layout); FormText formText = toolkit.createFormText(form.getBody(), true); formText.setText("", false, true); TableWrapData td = new TableWrapData(TableWrapData.FILL); td.colspan = 1; formText.setLayoutData(td); forms.put(title, form); formTexts.put(title, formText); } private void createEmptyPart() { final String title = EMPTY; ScrolledForm form = toolkit.createScrolledForm(pagebook); TableWrapLayout layout = new TableWrapLayout(); form.getBody().setLayout(layout); FormText formText = toolkit.createFormText(form.getBody(), true); formText.setText("", false, true); TableWrapData td = new TableWrapData(TableWrapData.FILL); td.colspan = 1; formText.setLayoutData(td); forms.put(title, form); formTexts.put(title, formText); } private void createComplexPart(String title, String[] expandTitles) { final ScrolledForm form = toolkit.createScrolledForm(pagebook); form.setText(title); TableWrapLayout layout = new TableWrapLayout(); form.getBody().setLayout(layout); FormText formText = toolkit.createFormText(form.getBody(), true); formText.setText("", false, true); TableWrapData td = new TableWrapData(TableWrapData.FILL); td.colspan = 1; formText.setLayoutData(td); forms.put(title, form); formTexts.put(title, formText); for (String expandTitle : expandTitles) { Section section = toolkit.createSection(form.getBody(), Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED); td = new TableWrapData(TableWrapData.FILL); td.colspan = 1; section.setLayoutData(td); section.addExpansionListener(new ExpansionAdapter() { public void expansionStateChanged(ExpansionEvent e) { form.reflow(true); } }); section.setText(expandTitle); section.setDescription("This is the description that goes " + "below the title"); section.setExpanded(false); Composite sectionClient = toolkit.createComposite(section); td = new TableWrapData(TableWrapData.FILL_GRAB); td.colspan = 1; td.grabVertical = true; sectionClient.setLayoutData(td); sectionClient.setLayout(new GridLayout()); Text text = toolkit.createText(sectionClient, " \n \n \n \n \n \n \n \n", SWT.WRAP | SWT.BORDER | SWT.FLAT); text.setEditable(false); section.setClient(sectionClient); // ExpandableComposite expandableComposite = toolkit.createExpandableComposite(form.getBody(), ExpandableComposite.TREE_NODE); // expandableComposite.setText(expandTitle); // expandableComposite.setExpanded(false); // td = new TableWrapData(TableWrapData.FILL_GRAB); // td.colspan = 1; // td.grabVertical = true; // expandableComposite.setLayoutData(td); // expandableComposite.addExpansionListener(new ExpansionAdapter() { // @Override // public void expansionStateChanged(ExpansionEvent e) { // form.reflow(true); // } // }); additionalTexts.put(title + expandTitle, text); } } private void createBasicPart(String title) { ScrolledForm form = toolkit.createScrolledForm(pagebook); form.setText(title); TableWrapLayout layout = new TableWrapLayout(); form.getBody().setLayout(layout); FormText formText = toolkit.createFormText(form.getBody(), true); formText.setText("", false, true); TableWrapData td = new TableWrapData(TableWrapData.FILL); td.colspan = 1; formText.setLayoutData(td); forms.put(title, form); formTexts.put(title, formText); } @Override public void setFocus() { pagebook.setFocus(); } @Override public void dispose() { // important: We need do unregister our listener when the view is disposed getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(listener); toolkit.dispose(); super.dispose(); } public static IViewPart showView() { try { return DWSUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(DetailsView.VIEW_ID, null, IWorkbenchPage.VIEW_VISIBLE/* view is only opened but not focused */); } catch (PartInitException pie) { ErrorDialog errorDialog = new ErrorDialog("Impossible to open DWS Details view", "Impossible to open DWS Details view", pie); errorDialog.open(); } return null; } }