/*******************************************************************************
* Copyright (c) 2016 BREDEX GmbH.
* 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:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.ui.rcp.wizards.pages;
import java.awt.Desktop;
import java.net.URI;
import java.util.Map;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jubula.client.core.model.IReusedProjectPO;
import org.eclipse.jubula.client.core.model.ProjectVersion;
import org.eclipse.jubula.client.ui.constants.Constants;
import org.eclipse.jubula.client.ui.constants.ContextHelpIds;
import org.eclipse.jubula.client.ui.constants.IconConstants;
import org.eclipse.jubula.client.ui.rcp.Plugin;
import org.eclipse.jubula.client.ui.rcp.i18n.Messages;
import org.eclipse.jubula.client.ui.utils.LayoutUtil;
import org.eclipse.jubula.client.ui.widgets.UIComponentHelper;
import org.eclipse.jubula.tools.internal.constants.StringConstants;
import org.eclipse.jubula.tools.internal.constants.SwtToolkitConstants;
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.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
/**
* @author BREDEX GmbH
* @created 01.07.2016
*/
public class UpdateReusedProjectsDialog extends TitleAreaDialog
implements ISelectionChangedListener {
/** Title of project name column */
private static final String PROJECT_NAME_COLUMN = "Project Name"; //$NON-NLS-1$
/** Title of current project version column */
private static final String CURRENT_VERSION = "Current version"; //$NON-NLS-1$
/** Title of new project version column */
private static final String NEW_VERSION = "New version"; //$NON-NLS-1$
/** Margin size */
private static final int MARGIN = 20;
/** info about reused projects and newest versions */
private Map<IReusedProjectPO, ProjectVersion> m_oldReusedProjects;
/** don´t ask again */
private Button m_dontAskAgain;
/** Project name label provider */
private ColumnLabelProvider m_nameProvider = new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof Map.Entry) {
Map.Entry project = (Map.Entry) element;
if (project.getKey() instanceof IReusedProjectPO) {
return ((IReusedProjectPO) project.getKey()).getName();
}
}
return StringConstants.EMPTY;
}
};
/** Current version of reused project */
private ColumnLabelProvider m_currentVersionProvider =
new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof Map.Entry) {
Map.Entry project = (Map.Entry) element;
if (project.getKey() instanceof IReusedProjectPO) {
return ((IReusedProjectPO) project.getKey())
.getVersionString();
}
}
return StringConstants.EMPTY;
}
};
/** Newest version of reused project */
private ColumnLabelProvider m_newVersionProvider =
new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof Map.Entry) {
Map.Entry project = (Map.Entry) element;
if (project.getValue() instanceof ProjectVersion) {
return ((ProjectVersion) project.getValue()).toString();
}
}
return StringConstants.EMPTY;
}
};
/**
* @param shell active shell
* @param oldReusedProjects info about reused projects and newest versions
*/
public UpdateReusedProjectsDialog(Shell shell, Map<IReusedProjectPO,
ProjectVersion> oldReusedProjects) {
super(shell);
m_oldReusedProjects = oldReusedProjects;
}
@Override
public Control createDialogArea(Composite parent) {
setTitle(Messages.UpdateReusedProjectsTitle);
setTitleImage(IconConstants.getImage(IconConstants.BIG_PROJECT_STRING));
setMessage(Messages.UpdateReusedProjectsMessage);
GridData gridData;
GridLayout layout = new GridLayout();
layout.numColumns = 1;
layout.makeColumnsEqualWidth = true;
parent.setLayout(layout);
LayoutUtil.createSeparator(createComposite(parent, 0, MARGIN));
TableViewer viewer = new TableViewer(createComposite(parent), SWT.NONE);
viewer.addSelectionChangedListener(this);
viewer.setUseHashlookup(true);
viewer.setContentProvider(new GeneralContentProvider());
createColumns(viewer);
viewer.setInput(m_oldReusedProjects);
Table table = viewer.getTable();
table.setData(SwtToolkitConstants.WIDGET_NAME,
Messages.UpdateReusedProjectsWidgetName);
table.setLinesVisible(true);
table.setHeaderVisible(true);
GridData tableGridData = new GridData(GridData.FILL_BOTH);
tableGridData.grabExcessVerticalSpace = true;
tableGridData.horizontalSpan = 3;
table.setLayoutData(tableGridData);
createComposite(parent, MARGIN, MARGIN);
createDontAskCheckBox(createComposite(parent));
createOkLabel(createComposite(parent));
LayoutUtil.createSeparator(createComposite(parent, MARGIN, 0));
Plugin.getHelpSystem().setHelp(parent,
ContextHelpIds.PROJECT_USED_PROPERTY_PAGE);
return parent;
}
/**
* @param parent parent composite
* @return the new composite
*/
private Composite createComposite(Composite parent) {
return createComposite(parent, 0, 0);
}
/**
* @param parent parent composite
* @param top margin
* @param bottom margin
* @return new composite
*/
private Composite createComposite(Composite parent, int top, int bottom) {
Composite composite = new Composite(parent, SWT.NONE);
GridData gridData = new GridData();
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
composite.setLayoutData(gridData);
GridLayout layout = new GridLayout();
layout.marginTop = top;
layout.marginBottom = bottom;
composite.setLayout(layout);
return composite;
}
/**
* Creates the OK label.
* @param parent the parent composite
*/
private void createOkLabel(Composite parent) {
String text = Messages.UpdateReusedProjectsMessage;
Label nextLabel = UIComponentHelper.createLabelWithText(parent, text);
Link link = new Link(parent, SWT.NONE);
link.setText(Messages.DatabaseMigrationWebsiteLinkLabel);
link.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
openUri(Messages.DatabaseMigrationWebsiteLink);
}
});
GridData gridData = new GridData();
gridData.grabExcessHorizontalSpace = true;
gridData.verticalAlignment = GridData.END;
nextLabel.setLayoutData(gridData);
}
/**
* @param uriString string of url
*/
private void openUri(String uriString) {
Desktop desktop = Desktop.isDesktopSupported()
? Desktop.getDesktop() : null;
if (desktop != null
&& desktop.isSupported(Desktop.Action.BROWSE)) {
try {
URI uri = new URI(uriString);
desktop.browse(uri);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* Column creator
* @param tableViewer parent viewer
*/
private void createColumns(TableViewer tableViewer) {
createTableViewerColumn(tableViewer, PROJECT_NAME_COLUMN, 200)
.setLabelProvider(m_nameProvider);
createTableViewerColumn(tableViewer, CURRENT_VERSION, 150)
.setLabelProvider(m_currentVersionProvider);
createTableViewerColumn(tableViewer, NEW_VERSION, 150)
.setLabelProvider(m_newVersionProvider);
}
/**
* @param tableViewer parent viewer
* @param title of column
* @param bound of column
* @return column
*/
private TableViewerColumn createTableViewerColumn(TableViewer tableViewer,
String title, int bound) {
final TableViewerColumn viewerColumn =
new TableViewerColumn(tableViewer, SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
column.setText(title);
column.setWidth(bound);
column.setResizable(true);
column.setMoveable(true);
return viewerColumn;
}
/** Content provider */
private static class GeneralContentProvider
implements IStructuredContentProvider {
@Override
public void dispose() {
// noting
}
@Override
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
// noting
}
@Override
public Object[] getElements(Object inputElement) {
if (inputElement != null && inputElement instanceof Map) {
return ((Map) inputElement).entrySet().toArray();
}
return null;
}
}
/** Creates the don´t ask again check box
* @param parent
*/
private void createDontAskCheckBox(Composite parent) {
m_dontAskAgain = new Button(parent, SWT.CHECK);
m_dontAskAgain.setText(Messages.InfoNaggerDialogToggleMsg);
m_dontAskAgain.setSelection(Plugin.getDefault().getPreferenceStore()
.getBoolean(Constants.UPDATE_REUSED_PROJECT_KEY));
GridData data = new GridData();
data.grabExcessVerticalSpace = true;
data.verticalAlignment = GridData.END;
m_dontAskAgain.setLayoutData(data);
}
/** Disable the selection */
@Override
public void selectionChanged(final SelectionChangedEvent event) {
if (!event.getSelection().isEmpty()
&& event.getSource() instanceof TableViewer) {
((TableViewer)event.getSource())
.setSelection(StructuredSelection.EMPTY);
}
}
/** Save the check box selection*/
protected void okPressed() {
Plugin.getDefault().getPreferenceStore().setValue(
Constants.UPDATE_REUSED_PROJECT_KEY,
m_dontAskAgain.getSelection());
super.okPressed();
}
}