/*************************************************************************************
* Copyright (c) 2008-2012 Red Hat, Inc. 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:
* JBoss by Red Hat - Initial implementation.
************************************************************************************/
package org.jboss.tools.arquillian.ui.internal.dialogs;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.m2e.core.internal.IMavenConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import org.jboss.forge.arquillian.container.Container;
import org.jboss.tools.arquillian.core.internal.container.ContainerParser;
import org.jboss.tools.arquillian.core.internal.util.ArquillianUtility;
import org.jboss.tools.arquillian.ui.ArquillianUIActivator;
import org.jboss.tools.arquillian.ui.internal.utils.ArquillianUIUtil;
/**
* @author snjeza
*
*/
public class AddArquillianProfilesDialog extends TitleAreaDialog {
private CheckboxTableViewer viewer;
private IProject project;
private Image dialogImage;
private List<Container> containers;
private List<String> profiles;
public AddArquillianProfilesDialog(Shell parentShell, IProject project) {
super(parentShell);
Assert.isNotNull(project);
setShellStyle(SWT.CLOSE | SWT.MAX | SWT.TITLE | SWT.BORDER
| SWT.RESIZE | getDefaultOrientation());
this.project = project;
}
@Override
protected Control createDialogArea(Composite parent) {
getShell().setText("Add Arquillian Profiles");
setTitle("Add Arquillian Profiles");
setMessage("Select profiles to add to the '" + project.getName() + "' project.");
setTitleImage(getDialogImage());
Composite area = (Composite) super.createDialogArea(parent);
Composite contents = new Composite(area, SWT.NONE);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
contents.setLayoutData(gd);
contents.setLayout(new GridLayout(1, false));
applyDialogFont(contents);
initializeDialogUnits(area);
Group profilesGroup = new Group(contents, SWT.NONE);
profilesGroup.setLayout(new GridLayout(1, false));
gd = new GridData(SWT.FILL, SWT.FILL,true,false);
profilesGroup.setLayoutData(gd);
profilesGroup.setText("Profiles");
containers = ContainerParser.getContainers();
viewer = ArquillianUIUtil.createProfilesViewer(profilesGroup, containers, 400);
profiles = ArquillianUtility.getProfiles(project);
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
initializeViewer();
validate();
}
});
initializeViewer();
return area;
}
private void initializeViewer() {
TableItem[] items = viewer.getTable().getItems();
for (TableItem item:items) {
Object data = item.getData();
if (data instanceof Container) {
Container container = (Container) data;
if (profiles.contains(container.getId())) {
item.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
viewer.setChecked(container, false);
}
}
}
}
private Image getDialogImage() {
if (dialogImage == null) {
dialogImage = ArquillianUIActivator.imageDescriptorFromPlugin(ArquillianUIActivator.PLUGIN_ID, "icons/arquillian_icon64.png").createImage(); //$NON-NLS-1$
}
return dialogImage;
}
@Override
public boolean close() {
if (dialogImage != null) {
dialogImage.dispose();
}
return super.close();
}
@Override
protected void okPressed() {
IFile pomFile = project.getFile(IMavenConstants.POM_FILE_NAME);
Object[] checkedElements = viewer.getCheckedElements();
List<Container> checkedContainers = new ArrayList<Container>();
for (Object element:checkedElements) {
if (element instanceof Container) {
Container container = (Container) element;
if (!profiles.contains(container.getId())) {
checkedContainers.add(container);
}
}
}
if (pomFile != null && checkedContainers.size() > 0) {
try {
ArquillianUtility.addProfiles(pomFile, checkedContainers);
} catch (CoreException e) {
ArquillianUIActivator.log(e);
}
}
super.okPressed();
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
createButton(parent, IDialogConstants.SELECT_ALL_ID, "Select All", false);
createButton(parent, IDialogConstants.DESELECT_ALL_ID, "Deselect All", false);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
validate();
}
protected void validate() {
Object[] checkedElements = viewer.getCheckedElements();
getButton(IDialogConstants.OK_ID).setEnabled(checkedElements.length != 0);
getButton(IDialogConstants.SELECT_ALL_ID).setEnabled(checkedElements.length < containers.size());
getButton(IDialogConstants.DESELECT_ALL_ID).setEnabled(checkedElements.length > 0);
}
@Override
protected void buttonPressed(int buttonId) {
super.buttonPressed(buttonId);
if (IDialogConstants.SELECT_ALL_ID == buttonId) {
selectAllPressed();
} else if (IDialogConstants.DESELECT_ALL_ID == buttonId) {
deselectAllPressed();
}
if (!viewer.getTable().isDisposed()) {
validate();
}
}
private void deselectAllPressed() {
setChecked(false);
}
private void setChecked(boolean checked) {
for (Container container:containers) {
viewer.setChecked(container, checked);
}
viewer.refresh();
}
private void selectAllPressed() {
setChecked(true);
}
}