/******************************************************************************* * Copyright (c) 2012 AGETO Service GmbH and others. * 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: * Peter Grube - initial API and implementation *******************************************************************************/ package org.eclipse.gyrex.admin.ui.p2.internal; import org.eclipse.gyrex.admin.ui.internal.application.AdminUiUtil; import org.eclipse.gyrex.admin.ui.internal.helper.SwtUtil; import org.eclipse.gyrex.admin.ui.internal.widgets.NonBlockingMessageDialogs; import org.eclipse.gyrex.admin.ui.internal.widgets.NonBlockingStatusDialog; import org.eclipse.gyrex.admin.ui.pages.AdminPage; import org.eclipse.gyrex.admin.ui.pages.FilteredAdminPage; import org.eclipse.gyrex.p2.internal.repositories.IRepositoryDefinitionManager; import org.eclipse.gyrex.p2.internal.repositories.RepositoryDefinition; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.rap.rwt.widgets.DialogCallback; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Control; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Shell; public class RepositoriesListDialog extends NonBlockingStatusDialog { /** serialVersionUID */ private static final long serialVersionUID = 1L; private ListViewer reposViewer; private Button addButton; private Button removeButton; private Button editButton; private ISelectionChangedListener updateButtonsListener; private final IRepositoryDefinitionManager repoManager; /** * Creates a new instance. * * @param parent * the shell parent * @param repoManager * the repository manager to be used */ public RepositoriesListDialog(final Shell parent, final IRepositoryDefinitionManager repoManager) { super(parent); this.repoManager = repoManager; setTitle("Edit Repositorylist"); setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL); } /** * Used the same way as {@link AdminPage#activate()} from {@link AdminPage} * or {@link FilteredAdminPage} but called during * {@link RepositoriesListDialog#createDialogArea(Composite)} */ private void activate() { if (reposViewer != null) { reposViewer.setInput(repoManager); updateButtonsListener = new ISelectionChangedListener() { @Override public void selectionChanged(final SelectionChangedEvent event) { updateButtons(); } }; reposViewer.addSelectionChangedListener(updateButtonsListener); reposViewer.getControl().getDisplay(); } } private void addNewRepository() { final EditRepositoryDialog dialog = new EditRepositoryDialog(getParentShell(), null, repoManager); dialog.openNonBlocking(new DialogCallback() { /** serialVersionUID */ private static final long serialVersionUID = 1L; @Override public void dialogClosed(final int returnCode) { if (returnCode == Window.OK) { refresh(); } } }); } private Button createButton(final Composite buttons, final String buttonLabel) { final Button b = new Button(buttons, SWT.NONE); b.setText(buttonLabel); b.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); return b; } protected void createButtons(final Composite buttonsPanel) { addButton = createButton(buttonsPanel, "Add..."); addButton.addSelectionListener(new SelectionAdapter() { /** serialVersionUID */ private static final long serialVersionUID = 1L; @Override public void widgetSelected(final SelectionEvent e) { addNewRepository(); } }); removeButton = createButton(buttonsPanel, "Remove..."); removeButton.addSelectionListener(new SelectionAdapter() { /** serialVersionUID */ private static final long serialVersionUID = 1L; @Override public void widgetSelected(final SelectionEvent e) { removeRepository(); } }); editButton = createButton(buttonsPanel, "Edit..."); editButton.addSelectionListener(new SelectionAdapter() { /** serialVersionUID */ private static final long serialVersionUID = 1L; @Override public void widgetSelected(final SelectionEvent e) { editSelectedRepository(); } }); } @Override protected Control createDialogArea(final Composite parent) { final Composite composite = (Composite) super.createDialogArea(parent); final GridData gd = (GridData) composite.getLayoutData(); gd.minimumHeight = convertVerticalDLUsToPixels(200); gd.minimumWidth = convertHorizontalDLUsToPixels(400); composite.setLayout(AdminUiUtil.createGridLayoutWithoutMargin(2, false)); reposViewer = new ListViewer(composite, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL); final List list = reposViewer.getList(); list.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create()); reposViewer.setContentProvider(new RepositoryContentProvider()); reposViewer.setLabelProvider(new P2UiLabelProvider()); reposViewer.addOpenListener(new IOpenListener() { @Override public void open(final OpenEvent event) { editSelectedRepository(); } }); final Composite buttons = new Composite(composite, SWT.NONE); buttons.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, false, true)); buttons.setLayout(new GridLayout()); createButtons(buttons); updateButtons(); activate(); return composite; } /** * Used the same way as {@link AdminPage#deactivate()} from * {@link AdminPage} or {@link FilteredAdminPage} but called in * {@link SoftwareLandingPage#editRepositoriesList()} */ public void deactivate() { if (reposViewer != null) { if (updateButtonsListener != null) { reposViewer.removeSelectionChangedListener(updateButtonsListener); updateButtonsListener = null; } if (!reposViewer.getList().isDisposed()) { reposViewer.setInput(null); } } } private void editSelectedRepository() { final EditRepositoryDialog dialog = new EditRepositoryDialog(getParentShell(), getSelectedRepo(), repoManager); dialog.openNonBlocking(new DialogCallback() { /** serialVersionUID */ private static final long serialVersionUID = 1L; @Override public void dialogClosed(final int returnCode) { if (returnCode == Window.OK) { refresh(); } } }); } private RepositoryDefinition getSelectedRepo() { final StructuredSelection selection = (StructuredSelection) reposViewer.getSelection(); if (!selection.isEmpty() && selection.getFirstElement() instanceof RepositoryDefinition) { return (RepositoryDefinition) selection.getFirstElement(); } return null; } public void refresh() { reposViewer.refresh(); } void removeRepository() { final RepositoryDefinition repo = getSelectedRepo(); if (repo == null) { return; } NonBlockingMessageDialogs.openQuestion(SwtUtil.getShell(removeButton), "Remove Repository", "Do you really want to delete the repository?", new DialogCallback() { /** serialVersionUID */ private static final long serialVersionUID = 1L; @Override public void dialogClosed(final int returnCode) { if (returnCode == Window.OK) { repoManager.removeRepository(repo.getId()); refresh(); } } }); } protected void updateButtons() { final int selectedElementsCount = ((IStructuredSelection) reposViewer.getSelection()).size(); if (selectedElementsCount == 0) { removeButton.setEnabled(false); editButton.setEnabled(false); } else { removeButton.setEnabled(true); editButton.setEnabled(true); } } }