/*******************************************************************************
* Copyright (c) 2012, 2016, 2017 PDT Extension Group 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:
* PDT Extension Group - initial API and implementation
* Kaloyan Raev - [501269] externalize strings
*******************************************************************************/
package org.eclipse.php.composer.ui.editor.composer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.*;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.php.composer.api.collection.Repositories;
import org.eclipse.php.composer.api.repositories.*;
import org.eclipse.php.composer.ui.ComposerUIPluginImages;
import org.eclipse.php.composer.ui.controller.IController;
import org.eclipse.php.composer.ui.dialogs.RepositoryDialog;
import org.eclipse.php.composer.ui.editor.ComposerFormPage;
import org.eclipse.php.composer.ui.editor.FormLayoutFactory;
import org.eclipse.php.composer.ui.editor.TableSection;
import org.eclipse.php.composer.ui.parts.TablePart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
public class RepositoriesSection extends TableSection implements PropertyChangeListener {
private TableViewer repositoryViewer;
private IAction addAction;
private IAction editAction;
private IAction removeAction;
private static final int ADD_INDEX = 0;
private static final int EDIT_INDEX = 1;
private static final int REMOVE_INDEX = 2;
class RepositoriesController extends LabelProvider implements IController {
private Repositories repositories;
private Map<String, Image> images = new HashMap<String, Image>();
private Map<String, ImageDescriptor> descriptors = new HashMap<String, ImageDescriptor>() {
private static final long serialVersionUID = -2019489473873127982L;
{
put("generic", ComposerUIPluginImages.REPO_GENERIC); //$NON-NLS-1$
put("git", ComposerUIPluginImages.REPO_GIT); //$NON-NLS-1$
put("svn", ComposerUIPluginImages.REPO_SVN); //$NON-NLS-1$
put("mercurial", ComposerUIPluginImages.REPO_MERCURIAL); //$NON-NLS-1$
put("pear", ComposerUIPluginImages.REPO_PEAR); //$NON-NLS-1$
put("composer", ComposerUIPluginImages.REPO_COMPOSER); //$NON-NLS-1$
put("package", ComposerUIPluginImages.REPO_PACKAGE); //$NON-NLS-1$
}
};
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
repositories = (Repositories) newInput;
}
public Object[] getElements(Object inputElement) {
return repositories.toArray();
}
@Override
public String getText(Object element) {
if (element instanceof Repository) {
Repository repo = (Repository) element;
String name;
// name
if (repo.has("name")) { //$NON-NLS-1$
name = repo.getAsString("name"); //$NON-NLS-1$
} else {
name = repo.getUrl();
}
return name;
}
return super.getText(element);
}
private Image createImage(String type) {
if (descriptors.containsKey(type)) {
return descriptors.get(type).createImage();
}
return null;
}
private Image getRepoImage(String type) {
if (!images.containsKey(type)) {
images.put(type, createImage(type));
}
return images.get(type);
}
@Override
public Image getImage(Object element) {
if (element instanceof GitRepository) {
return getRepoImage("git"); //$NON-NLS-1$
} else if (element instanceof SubversionRepository) {
return getRepoImage("svn"); //$NON-NLS-1$
} else if (element instanceof MercurialRepository) {
return getRepoImage("mercurial"); //$NON-NLS-1$
} else if (element instanceof PearRepository) {
return getRepoImage("pear"); //$NON-NLS-1$
} else if (element instanceof PackageRepository) {
return getRepoImage("package"); //$NON-NLS-1$
} else if (element instanceof ComposerRepository) {
return getRepoImage("composer"); //$NON-NLS-1$
} else if (element instanceof Repository) {
return getRepoImage("generic"); //$NON-NLS-1$
}
return null;
}
}
public RepositoriesSection(ComposerFormPage page, Composite parent) {
super(page, parent, Section.DESCRIPTION, new String[] { Messages.RepositoriesSection_AddButton,
Messages.RepositoriesSection_EditButton, Messages.RepositoriesSection_RemoveButton });
createClient(getSection(), page.getManagedForm().getToolkit());
}
@Override
protected void createClient(Section section, FormToolkit toolkit) {
section.setText(Messages.RepositoriesSection_Title);
section.setDescription(Messages.RepositoriesSection_Description);
section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Composite container = createClientContainer(section, 2, toolkit);
createViewerPartControl(container, SWT.MULTI, 2, toolkit);
TablePart tablePart = getTablePart();
RepositoriesController repositoriesController = new RepositoriesController();
repositoryViewer = tablePart.getTableViewer();
repositoryViewer.setContentProvider(repositoriesController);
repositoryViewer.setLabelProvider(repositoriesController);
toolkit.paintBordersFor(container);
section.setClient(container);
section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1));
repositoryViewer.setInput(composerPackage.getRepositories());
composerPackage.addPropertyChangeListener(this);
updateButtons();
makeActions();
updateMenu();
}
protected boolean createCount() {
return true;
}
private void updateButtons() {
ISelection selection = repositoryViewer.getSelection();
TablePart tablePart = getTablePart();
tablePart.setButtonEnabled(ADD_INDEX, enabled);
tablePart.setButtonEnabled(EDIT_INDEX, !selection.isEmpty() && enabled);
tablePart.setButtonEnabled(REMOVE_INDEX, !selection.isEmpty() && enabled);
}
private void updateMenu() {
IStructuredSelection selection = (IStructuredSelection) repositoryViewer.getSelection();
editAction.setEnabled(selection.size() > 0);
removeAction.setEnabled(selection.size() > 0);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
updateButtons();
refresh();
repositoryViewer.getTable().setEnabled(enabled);
}
public void refresh() {
repositoryViewer.refresh();
super.refresh();
}
@Override
public void propertyChange(PropertyChangeEvent e) {
if (e.getPropertyName().startsWith("repositories")) { //$NON-NLS-1$
refresh();
}
}
protected void selectionChanged(IStructuredSelection sel) {
updateButtons();
updateMenu();
}
private void makeActions() {
addAction = new Action(Messages.RepositoriesSection_AddActionTitle) {
public void run() {
handleAdd();
}
};
editAction = new Action(Messages.RepositoriesSection_EditActionTitle) {
public void run() {
handleEdit();
}
};
removeAction = new Action(Messages.RepositoriesSection_RemoveActionTitle) {
public void run() {
handleRemove();
}
};
}
@Override
protected void fillContextMenu(IMenuManager manager) {
manager.add(addAction);
manager.add(editAction);
manager.add(removeAction);
}
private void handleAdd() {
RepositoryDialog diag = new RepositoryDialog(repositoryViewer.getTable().getShell());
if (diag.open() == Dialog.OK && diag.getRepository() != null) {
composerPackage.getRepositories().add(diag.getRepository());
}
}
private void handleEdit() {
Repository repo = (Repository) ((StructuredSelection) repositoryViewer.getSelection()).getFirstElement();
RepositoryDialog diag = new RepositoryDialog(repositoryViewer.getTable().getShell(), repo.clone());
if (diag.open() == Dialog.OK) {
Repository newRepo = diag.getRepository();
repo.setName(newRepo.getName());
repo.setUrl(newRepo.getUrl());
}
}
@SuppressWarnings("unchecked")
private void handleRemove() {
StructuredSelection selection = ((StructuredSelection) repositoryViewer.getSelection());
Iterator<Object> it = selection.iterator();
String[] names = new String[selection.size()];
List<Repository> repos = new ArrayList<Repository>();
for (int i = 0; it.hasNext(); i++) {
Repository repo = (Repository) it.next();
repos.add(repo);
names[i] = repo.getName();
}
String title = selection.size() > 1 ? Messages.RepositoriesSection_RemoveDialogTitlePlural
: Messages.RepositoriesSection_RemoveDialogTitle;
MessageDialog diag = new MessageDialog(repositoryViewer.getTable().getShell(), title, null,
NLS.bind(Messages.RepositoriesSection_RemoveDialogMessage, StringUtils.join(names, ", ")), //$NON-NLS-1$
MessageDialog.WARNING,
new String[] { Messages.RepositoriesSection_YesButton, Messages.RepositoriesSection_NoButton }, 0);
if (diag.open() == Dialog.OK) {
for (Repository repo : repos) {
composerPackage.getRepositories().remove(repo);
}
}
}
@Override
protected void buttonSelected(int index) {
switch (index) {
case ADD_INDEX:
handleAdd();
break;
case EDIT_INDEX:
handleEdit();
break;
case REMOVE_INDEX:
handleRemove();
break;
}
}
}