blob: 042be58bf765d713d9190b551ead2eae7e744f5c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 SpringSource, a divison of VMware, Inc.
* 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:
* SpringSource, a division of VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.virgo.ide.runtime.internal.ui.editor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.DateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Set;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
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.Display;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
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.navigator.CommonViewer;
import org.eclipse.ui.progress.IProgressConstants;
import org.eclipse.virgo.ide.runtime.core.IServerWorkingCopy;
import org.eclipse.virgo.ide.runtime.core.ServerCorePlugin;
import org.eclipse.virgo.ide.runtime.core.artefacts.Artefact;
import org.eclipse.virgo.ide.runtime.core.artefacts.ArtefactRepository;
import org.eclipse.virgo.ide.runtime.core.artefacts.ArtefactRepositoryManager;
import org.eclipse.virgo.ide.runtime.core.artefacts.BundleArtefact;
import org.eclipse.virgo.ide.runtime.core.artefacts.IArtefact;
import org.eclipse.virgo.ide.runtime.core.artefacts.IArtefactTyped;
import org.eclipse.virgo.ide.runtime.core.artefacts.LibraryArtefact;
import org.eclipse.virgo.ide.runtime.core.artefacts.LocalBundleArtefact;
import org.eclipse.virgo.ide.runtime.core.provisioning.IBundleRepositoryChangeListener;
import org.eclipse.virgo.ide.runtime.core.provisioning.RepositoryProvisioningJob;
import org.eclipse.virgo.ide.runtime.core.provisioning.RepositorySourceProvisiongJob;
import org.eclipse.virgo.ide.runtime.core.provisioning.RepositoryUtils;
import org.eclipse.virgo.ide.runtime.internal.ui.ServerUiImages;
import org.eclipse.virgo.ide.runtime.internal.ui.ServerUiPlugin;
import org.eclipse.virgo.ide.runtime.internal.ui.providers.RepositorySearchResultContentProvider;
import org.eclipse.virgo.ide.runtime.internal.ui.providers.RuntimeLabelProvider;
import org.eclipse.virgo.ide.runtime.internal.ui.repository.RefreshBundleJob;
import org.eclipse.virgo.ide.runtime.internal.ui.sorters.RepositoryViewerSorter;
import org.eclipse.virgo.ide.ui.editors.BundleManifestEditor;
import org.eclipse.wst.server.core.IRuntime;
import org.eclipse.wst.server.ui.editor.ServerEditorPart;
/**
* {@link ServerEditorPart} that allows to browse the local and remote bundle repository.
*
* @author Christian Dupuis
* @author Miles Parker
* @since 1.0.0
*/
public class RepositoryBrowserEditorPage extends ServerEditorPart implements ISelectionChangedListener {
private static final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault());
private Button anaylseButton;
private Button downloadButton;
private Button downloadSourcesCheckbox;
private final IJobChangeListener jobListener = new ArtefactOperationJobListener();
private IServerWorkingCopy serverWC;
private Button refreshButton;
private PropertyChangeListener propertyListener;
private final RepositorySearchResultContentProvider searchResultContentProvider = new RepositorySearchResultContentProvider();
private final ColoredRespositoryLabelProvider coloredRespositoryLabelProvider = new ColoredRespositoryLabelProvider();
// private Tree repositoryTable;
private CommonViewer repositoryTableViewer;
private Button searchButton;
private Button downloadSourcesButton;
private Tree searchResultTable;
private CheckboxTreeViewer searchResultTableViewer;
private Text searchText;
private Shell shell;
private Button licenseButton;
private Button openManifestButton;
private Link update;
private IBundleRepositoryChangeListener repositoryListener;
private static String PROXY_PREF_PAGE_ID = Messages.RepositoryBrowserEditorPage_0;
@Override
public void createPartControl(Composite parent) {
shell = parent.getShell();
FormToolkit toolkit = getFormToolkit(parent.getDisplay());
ScrolledForm form = toolkit.createScrolledForm(parent);
toolkit.decorateFormHeading(form.getForm());
form.setText(Messages.RepositoryBrowserEditorPage_BundleBrowserLabel);
form.setImage(getFormImage());
GridLayout layout = new GridLayout(2, true);
layout.marginTop = 6;
layout.marginLeft = 6;
form.getBody().setLayout(layout);
Section leftSection = createLeftSection(toolkit, form);
createRightSection(toolkit, form);
form.setContent(leftSection);
// This reflow breaks the TableWrapLayout around the repository
// hyperlink
// form.reflow(true);
initialize();
}
protected Image getFormImage() {
return ServerUiImages.getImage(ServerUiImages.IMG_OBJ_VIRGO);
}
@Override
public void dispose() {
super.dispose();
if (serverWC != null) {
serverWC.removeConfigurationChangeListener(propertyListener);
}
Job.getJobManager().removeJobChangeListener(jobListener);
ServerCorePlugin.getArtefactRepositoryManager().removeBundleRepositoryChangeListener(repositoryListener);
}
@Override
public void init(IEditorSite site, IEditorInput input) {
super.init(site, input);
IServerWorkingCopy ts = (IServerWorkingCopy) server.loadAdapter(IServerWorkingCopy.class, null);
serverWC = ts;
addListeners();
initialize();
}
@Override
public void setFocus() {
if (searchResultTable != null) {
searchResultTable.setFocus();
}
}
private Section createLeftSection(FormToolkit toolkit, ScrolledForm form) {
GridLayout layout;
Section leftSection = toolkit.createSection(form.getBody(), ExpandableComposite.TITLE_BAR | Section.DESCRIPTION);
leftSection.setText(Messages.RepositoryBrowserEditorPage_SearchBundlesAndLibraries);
leftSection.setDescription(Messages.RepositoryBrowserEditorPage_SearchBundlesAndLibrariesByName);
leftSection.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite leftComposite = toolkit.createComposite(leftSection);
layout = new GridLayout();
layout.numColumns = 2;
leftComposite.setLayout(layout);
leftComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
toolkit.paintBordersFor(leftComposite);
leftSection.setClient(leftComposite);
searchText = toolkit.createText(leftComposite, Messages.RepositoryBrowserEditorPage_4);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
searchText.setLayoutData(data);
searchText.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if (e.character == SWT.CR || e.character == SWT.LF) {
handleSearch();
}
}
public void keyReleased(KeyEvent e) {
}
});
Composite searchButtonComposite = new Composite(leftComposite, SWT.NONE);
searchButtonComposite.setLayout(new GridLayout(1, true));
data = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
searchButtonComposite.setLayoutData(data);
searchButton = toolkit.createButton(searchButtonComposite, Messages.RepositoryBrowserEditorPage_Search,
SWT.PUSH);
searchButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleSearch();
}
});
data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 100;
searchButton.setLayoutData(data);
searchResultTable = toolkit.createTree(leftComposite, SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION | SWT.CHECK);
searchResultTableViewer = new CheckboxTreeViewer(searchResultTable);
searchResultTableViewer.setContentProvider(searchResultContentProvider);
searchResultTableViewer.setLabelProvider(coloredRespositoryLabelProvider);
searchResultTableViewer.setInput(this); // activate content provider
searchResultTableViewer.setSorter(new RepositoryViewerSorter());
searchResultTableViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
handleCheckStateChange(event);
downloadButton.setEnabled(searchResultTableViewer.getCheckedElements().length > 0);
}
});
searchResultTableViewer.addTreeListener(new ITreeViewerListener() {
public void treeCollapsed(TreeExpansionEvent event) {
}
public void treeExpanded(TreeExpansionEvent event) {
final Object element = event.getElement();
if (searchResultTableViewer.getGrayed(element) == false) {
BusyIndicator.showWhile(shell.getDisplay(), new Runnable() {
public void run() {
setSubtreeChecked(element, searchResultTableViewer.getChecked(element), false);
}
});
}
}
});
registerContextMenu(searchResultTableViewer);
data = new GridData(GridData.FILL_BOTH);
data.heightHint = 120;
searchResultTable.setLayoutData(data);
searchResultTable.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ISelection selection = searchResultTableViewer.getSelection();
if (selection instanceof IStructuredSelection) {
Object element = ((IStructuredSelection) selection).getFirstElement();
if (element instanceof IArtefact) {
anaylseButton.setEnabled(true);
licenseButton.setEnabled(true);
} else {
anaylseButton.setEnabled(false);
licenseButton.setEnabled(false);
}
}
}
});
Composite buttonComposite = new Composite(leftComposite, SWT.NONE);
buttonComposite.setLayout(new GridLayout(1, true));
data = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
buttonComposite.setLayoutData(data);
data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 100;
Button selectAllButton = toolkit.createButton(buttonComposite, Messages.RepositoryBrowserEditorPage_SelectAll,
SWT.PUSH);
selectAllButton.setLayoutData(data);
selectAllButton.setToolTipText(Messages.RepositoryBrowserEditorPage_SelectAllBundlesAndLibraries);
selectAllButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
searchResultTableViewer.setCheckedElements(searchResultContentProvider.getElements(searchResultTableViewer.getInput()));
}
});
Button deselectAllButton = toolkit.createButton(buttonComposite,
Messages.RepositoryBrowserEditorPage_DeselectAllBundlesAndLibraries, SWT.PUSH);
deselectAllButton.setToolTipText(Messages.RepositoryBrowserEditorPage_9);
deselectAllButton.setLayoutData(data);
deselectAllButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
searchResultTableViewer.setCheckedElements(new Object[0]);
}
});
// insert vertical space to make the download button stand out
toolkit.createLabel(buttonComposite, Messages.RepositoryBrowserEditorPage_10);
anaylseButton = toolkit.createButton(buttonComposite, Messages.RepositoryBrowserEditorPage_Analyse, SWT.PUSH);
anaylseButton.setEnabled(false);
anaylseButton.setLayoutData(data);
anaylseButton.setToolTipText(Messages.RepositoryBrowserEditorPage_AnalyseSelected);
anaylseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
ISelection selection = searchResultTableViewer.getSelection();
if (selection instanceof IStructuredSelection) {
Object element = ((IStructuredSelection) selection).getFirstElement();
if (element instanceof IArtefact) {
WebUiUtils.openUrl(RepositoryUtils.getRepositoryUrl((IArtefact) element));
}
}
}
});
licenseButton = toolkit.createButton(buttonComposite, Messages.RepositoryBrowserEditorPage_ViewLicense,
SWT.PUSH);
licenseButton.setEnabled(false);
licenseButton.setLayoutData(data);
licenseButton.setToolTipText(Messages.RepositoryBrowserEditorPage_OpenLicense);
licenseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
ISelection selection = searchResultTableViewer.getSelection();
if (selection instanceof IStructuredSelection) {
Object element = ((IStructuredSelection) selection).getFirstElement();
if (element instanceof LibraryArtefact) {
WebUiUtils.openUrl(RepositoryUtils.getResourceUrl((LibraryArtefact) element,
RepositoryUtils.DOWNLOAD_TYPE_LICENSE));
} else if (element instanceof BundleArtefact) {
WebUiUtils.openUrl(RepositoryUtils.getResourceUrl((BundleArtefact) element,
RepositoryUtils.DOWNLOAD_TYPE_LICENSE));
}
}
}
});
// insert vertical space to make the download button stand out
toolkit.createLabel(buttonComposite, ""); //$NON-NLS-1$
downloadButton = toolkit.createButton(buttonComposite, Messages.RepositoryBrowserEditorPage_Download, SWT.PUSH);
downloadButton.setEnabled(false);
downloadButton.setLayoutData(data);
downloadButton.setToolTipText(Messages.RepositoryBrowserEditorPage_DownloadSelected);
downloadButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
Set<Artefact> artifacts = new LinkedHashSet<Artefact>();
Object[] selections = searchResultTableViewer.getCheckedElements();
for (Object selection : selections) {
if (selection instanceof IArtefact) {
artifacts.add((Artefact) selection);
}
}
boolean showDialog = ServerUiPlugin.getDefault()
.getPreferenceStore()
.getBoolean(ServerUiPlugin.PLUGIN_ID + ".download.message"); //$NON-NLS-1$
if (!showDialog) {
MessageDialogWithToggle dialog = MessageDialogWithToggle.openOkCancelConfirm(shell,
Messages.RepositoryBrowserEditorPage_DownloadBundlesAndLibraries,
Messages.RepositoryBrowserEditorPage_DownloadTriggerMessage,
Messages.RepositoryBrowserEditorPage_DontShowDialog, false, ServerUiPlugin.getDefault()
.getPreferenceStore(), ServerUiPlugin.PLUGIN_ID + ".download.message"); //$NON-NLS-1$
if (dialog.getReturnCode() != Window.OK) {
return;
} else {
ServerUiPlugin.getDefault()
.getPreferenceStore()
.setValue(ServerUiPlugin.PLUGIN_ID + ".download.message", //$NON-NLS-1$
new Boolean(dialog.getToggleState()));
}
}
Set<IRuntime> runtimes = new HashSet<IRuntime>();
runtimes.add(getServer().getRuntime());
RepositoryProvisioningJob operation = new RepositoryProvisioningJob(runtimes,
RepositoryUtils.resolveDependencies(artifacts, false), downloadSourcesCheckbox.getSelection());
operation.setProperty(IProgressConstants.ICON_PROPERTY, ServerUiImages.DESC_OBJ_BUNDLE);
operation.schedule();
// reset checked state
searchResultTableViewer.setCheckedElements(new Object[0]);
downloadButton.setEnabled(false);
}
});
TableWrapLayout twLayout = new TableWrapLayout();
twLayout.bottomMargin = 0;
twLayout.topMargin = 0;
twLayout.leftMargin = 0;
twLayout.rightMargin = 0;
Composite wrappedComposite = toolkit.createComposite(leftComposite);
wrappedComposite.setLayout(twLayout);
GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(wrappedComposite);
downloadSourcesCheckbox = toolkit.createButton(wrappedComposite,
Messages.RepositoryBrowserEditorPage_DownloadSourceJars, SWT.CHECK | SWT.WRAP);
downloadSourcesCheckbox.setSelection(true);
downloadSourcesCheckbox.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.TOP));
Link repoLink = new Link(wrappedComposite, SWT.WRAP);
repoLink.setText(Messages.RepositoryBrowserEditorPage_SourceReposMessage);
repoLink.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
WebUiUtils.openUrl(Messages.RepositoryBrowserEditorPage_SourceRepos);
}
});
repoLink.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.TOP));
update = new Link(wrappedComposite, SWT.WRAP);
update.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (MessageDialog.openQuestion(shell, Messages.RepositoryBrowserEditorPage_UpdateLocalBundles,
Messages.RepositoryBrowserEditorPage_ConfirmIndexMessage)) {
ServerCorePlugin.getArtefactRepositoryManager().update();
}
}
});
setRepositoryDateString();
update.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.TOP));
Hyperlink disclaimer = toolkit.createHyperlink(wrappedComposite,
Messages.RepositoryBrowserEditorPage_FirewallConfigureMessage, SWT.WRAP);
disclaimer.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(null, PROXY_PREF_PAGE_ID, null, null);
dialog.open();
}
});
disclaimer.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.TOP));
return leftSection;
}
protected void registerContextMenu(StructuredViewer viewer) {
MenuManager searchResultManager = new MenuManager();
Menu searchResultPopup = searchResultManager.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(searchResultPopup);
getSite().registerContextMenu(searchResultManager, viewer);
}
private void setRepositoryDateString() {
Date date = ServerCorePlugin.getArtefactRepositoryManager().getArtefactRepositoryDate();
String dateString = dateFormat.format(date);
update.setText(Messages.RepositoryBrowserEditorPage_UpdateURL + dateString + ")"); //$NON-NLS-1$
}
protected String getServerName() {
return Messages.RepositoryBrowserEditorPage_ServerName;
}
private Section createRightSection(FormToolkit toolkit, ScrolledForm form) {
GridLayout layout;
Section rightSection = toolkit.createSection(form.getBody(), ExpandableComposite.TITLE_BAR | Section.DESCRIPTION);
rightSection.setText(Messages.RepositoryBrowserEditorPage_BundlesAndLibraries);
rightSection.setDescription(Messages.RepositoryBrowserEditorPage_BundlesAndLibrariesMessage + getServerName()
+ ". " //$NON-NLS-1$
+ Messages.RepositoryBrowserEditorPage_BundlesAndLibrariesProviso);
rightSection.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite leftComposite = toolkit.createComposite(rightSection);
layout = new GridLayout();
layout.numColumns = 1;
leftComposite.setLayout(layout);
leftComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
toolkit.paintBordersFor(leftComposite);
rightSection.setClient(leftComposite);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
Composite composite2 = toolkit.createComposite(leftComposite);
layout = new GridLayout();
layout.numColumns = 2;
layout.marginHeight = 5;
composite2.setLayout(layout);
composite2.setLayoutData(new GridData(GridData.FILL_BOTH));
toolkit.paintBordersFor(composite2);
repositoryTableViewer = new CommonViewer(ServerUiPlugin.ARTEFACTS_BROWSER_VIEW_ID, composite2, SWT.BORDER
| SWT.SINGLE);
repositoryTableViewer.setSorter(new RepositoryViewerSorter());
registerContextMenu(repositoryTableViewer);
data = new GridData(GridData.FILL_BOTH);
data.heightHint = 120;
repositoryTableViewer.getControl().setLayoutData(data);
Composite buttonComposite = new Composite(composite2, SWT.NONE);
buttonComposite.setLayout(new GridLayout(1, true));
data = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
buttonComposite.setLayoutData(data);
data = new GridData(GridData.FILL_HORIZONTAL);
data.widthHint = 100;
refreshButton = toolkit.createButton(buttonComposite, Messages.RepositoryBrowserEditorPage_Refresh, SWT.PUSH);
refreshButton.setLayoutData(data);
refreshButton.setToolTipText(Messages.RepositoryBrowserEditorPage_RefreshMessage);
refreshButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
refreshBundleRepository();
}
});
downloadSourcesButton = toolkit.createButton(buttonComposite,
Messages.RepositoryBrowserEditorPage_InstallSources, SWT.PUSH);
downloadSourcesButton.setLayoutData(data);
downloadSourcesButton.setToolTipText(Messages.RepositoryBrowserEditorPage_InstallSourcesMessage);
downloadSourcesButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
downloadSources();
}
});
// insert vertical space to make the download button stand out
toolkit.createLabel(buttonComposite, Messages.RepositoryBrowserEditorPage_40);
openManifestButton = toolkit.createButton(buttonComposite, Messages.RepositoryBrowserEditorPage_OpenManifest,
SWT.PUSH);
openManifestButton.setLayoutData(data);
openManifestButton.setToolTipText(Messages.RepositoryBrowserEditorPage_OpenManifestMessage);
openManifestButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionEvent) {
ISelection selection = repositoryTableViewer.getSelection();
if (selection instanceof IStructuredSelection) {
Object element = ((IStructuredSelection) selection).getFirstElement();
if (element instanceof IPackageFragmentRoot) {
IPackageFragmentRoot fragment = (IPackageFragmentRoot) element;
BundleManifestEditor.openExternalPlugin(fragment.getPath().toFile(), "META-INF/MANIFEST.MF"); //$NON-NLS-1$
}
}
}
});
openManifestButton.setEnabled(false);
repositoryTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection) {
Object element = ((IStructuredSelection) selection).getFirstElement();
if (element instanceof IPackageFragmentRoot) {
openManifestButton.setEnabled(true);
} else {
openManifestButton.setEnabled(false);
}
}
}
});
TableWrapLayout twLayout = new TableWrapLayout();
twLayout.bottomMargin = 0;
twLayout.topMargin = 0;
twLayout.leftMargin = 0;
twLayout.rightMargin = 0;
Composite wrappedComposite = toolkit.createComposite(leftComposite);
wrappedComposite.setLayout(twLayout);
GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(wrappedComposite);
Link repoLink = new Link(wrappedComposite, SWT.WRAP);
repoLink.setText(Messages.RepositoryBrowserEditorPage_NewBundlesMessage);
repoLink.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
refreshBundleRepository();
}
});
repoLink.setLayoutData(new TableWrapData(TableWrapData.LEFT, TableWrapData.TOP));
return rightSection;
}
private void refreshBundleRepository() {
RefreshBundleJob.execute(shell, getServer().getRuntime());
}
protected void downloadSources() {
Set<Artefact> artifacts = new LinkedHashSet<Artefact>();
ArtefactRepository repository = RepositoryUtils.getRepositoryContents(server.getRuntime());
for (IArtefactTyped bundle : repository.getBundles()) {
if (bundle instanceof LocalBundleArtefact) {
if (!((LocalBundleArtefact) bundle).isSourceDownloaded()) {
artifacts.add((LocalBundleArtefact) bundle);
}
}
}
Set<IRuntime> runtimes = new HashSet<IRuntime>();
runtimes.add(getServer().getRuntime());
RepositorySourceProvisiongJob operation = new RepositorySourceProvisiongJob(runtimes, artifacts);
operation.setProperty(IProgressConstants.ICON_PROPERTY, ServerUiImages.DESC_OBJ_BUNDLE);
operation.schedule();
}
private void handleCheckStateChange(final CheckStateChangedEvent event) {
BusyIndicator.showWhile(shell.getDisplay(), new Runnable() {
public void run() {
boolean state = event.getChecked();
setSubtreeChecked(event.getElement(), state, true);
updateParentState(event.getElement());
}
});
}
private void setSubtreeChecked(Object container, boolean state, boolean checkExpandedState) {
// checked state is set lazily on expand, don't set it if container is
// collapsed
Object[] members = searchResultContentProvider.getChildren(container);
for (int i = members.length - 1; i >= 0; i--) {
Object element = members[i];
boolean elementGrayChecked = searchResultTableViewer.getGrayed(element)
|| searchResultTableViewer.getChecked(element);
if (state) {
searchResultTableViewer.setChecked(element, true);
searchResultTableViewer.setGrayed(element, false);
} else {
searchResultTableViewer.setGrayChecked(element, false);
} // unchecked state only
// needs
if ((state || elementGrayChecked)) {
setSubtreeChecked(element, state, true);
}
}
}
private void updateParentState(Object child) {
if (child == null || searchResultContentProvider.getParent(child) == null) {
return;
}
Object parent = searchResultContentProvider.getParent(child);
boolean childChecked = false;
Object[] members = searchResultContentProvider.getChildren(parent);
for (int i = members.length - 1; i >= 0; i--) {
if (searchResultTableViewer.getChecked(members[i]) || searchResultTableViewer.getGrayed(members[i])) {
childChecked = true;
break;
}
}
searchResultTableViewer.setGrayChecked(parent, childChecked);
updateParentState(parent);
}
protected void addListeners() {
propertyListener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
}
};
serverWC.addConfigurationChangeListener(propertyListener);
Job.getJobManager().addJobChangeListener(jobListener);
repositoryListener = new IBundleRepositoryChangeListener() {
public void bundleRepositoryChanged(IRuntime runtime) {
refreshViewers();
}
};
ServerCorePlugin.getArtefactRepositoryManager().addBundleRepositoryChangeListener(repositoryListener);
}
protected void handleSearch() {
String search = searchText.getText();
searchResultTableViewer.setInput(RepositoryUtils.searchForArtifacts(search));
searchResultTableViewer.expandToLevel(2);
}
protected void initialize() {
if (searchResultTable == null) {
return;
}
searchResultTable.removeAll();
setErrorMessage(null);
intializeViewers();
}
protected void intializeViewers() {
shell.getDisplay().asyncExec(new Runnable() {
public void run() {
repositoryTableViewer.setInput(getServer());
repositoryTableViewer.expandToLevel(2);
searchResultTableViewer.refresh(true);
searchResultTableViewer.expandToLevel(2);
}
});
}
protected void refreshViewers() {
shell.getDisplay().asyncExec(new Runnable() {
public void run() {
ISelection selection = repositoryTableViewer.getSelection();
repositoryTableViewer.refresh();
repositoryTableViewer.setSelection(selection);
searchResultTableViewer.refresh(true);
}
});
}
private final class ArtefactOperationJobListener extends JobChangeAdapter {
@Override
public void done(IJobChangeEvent event) {
if (event.getJob() instanceof RepositoryProvisioningJob) {
if (((RepositoryProvisioningJob) event.getJob()).getRuntimes().contains(getServer().getRuntime())) {
refreshViewers();
}
} else if (event.getJob() instanceof ArtefactRepositoryManager.ArtefactRepositoryUpdateJob) {
shell.getDisplay().asyncExec(new Runnable() {
public void run() {
setRepositoryDateString();
}
});
}
}
}
@Override
public Object getAdapter(Class adapter) {
if (adapter == ISelectionChangedListener.class) {
return this;
}
return super.getAdapter(adapter);
}
/**
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
repositoryTableViewer.setSelection(sel, true);
repositoryTableViewer.expandToLevel(sel.getFirstElement(), AbstractTreeViewer.ALL_LEVELS);
}
private class ColoredRespositoryLabelProvider extends RuntimeLabelProvider implements IColorProvider {
public Color getBackground(Object element) {
return null;
}
public Color getForeground(Object element) {
ArtefactRepository repository = RepositoryUtils.getRepositoryContents(server.getRuntime());
if (repository != null && element instanceof Artefact && repository.contains((IArtefact) element)) {
return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY);
}
return null;
}
}
}