/*******************************************************************************
* 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.extensions.wizard.view;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.util.Collections;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;
import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jubula.extensions.wizard.edit.ParameterNameEditingSupport;
import org.eclipse.jubula.extensions.wizard.edit.ParameterTypeEditingSupport;
import org.eclipse.jubula.extensions.wizard.edit.ParameterValueSetEditingSupport;
import org.eclipse.jubula.extensions.wizard.i18n.Messages;
import org.eclipse.jubula.extensions.wizard.model.Action;
import org.eclipse.jubula.extensions.wizard.model.Parameter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Label;
/**
* The method properties window in which the user can specify the action's
* parameters.
*
* @author BREDEX GmbH
*/
final class ActionParametersWindow {
/** The window's title */
private static final String WINDOW_TITLE =
Messages.ParametersWindow_WindowTitle;
/** The tableviewer */
private TableViewer m_tableViewer;
/** The "New" button */
private Button m_newButton;
/** The "Remove" button */
private Button m_removeButton;
/** The "Down" button */
private Button m_downButton;
/** The "Up" button */
private Button m_upButton;
/** The shell */
private Shell m_shell;
/** The method whose properties are being edited */
private Action m_method;
/**
* The constructor.
* @param parent the parent shell
* @param method the method whose parameters should be made visible and
* editable
* @param page the instance of the fourth page
*/
public ActionParametersWindow(Shell parent, final Action method,
final NewJubulaExtensionWizardPageFour page) {
m_method = method;
m_shell = new Shell(parent, parent.getStyle() | SWT.APPLICATION_MODAL);
m_shell.setText(WINDOW_TITLE);
m_shell.setLayout(new FormLayout());
m_shell.setSize(500, 300);
m_shell.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
page.updateMethodData(method);
}
});
createNewButton();
createTable();
createRemoveButton();
createUpButton();
createDownButton();
createOkButton();
createSeparatorLine();
setCenterPosition(m_shell);
m_shell.open();
m_shell.setActive();
}
/**
* Creates the "New" button and its controls.
*/
private void createNewButton() {
m_newButton = new Button(m_shell, SWT.NONE);
FormData fdNewButton = new FormData();
fdNewButton.width = 75;
fdNewButton.height = 25;
fdNewButton.top = new FormAttachment(0, 10);
fdNewButton.right = new FormAttachment(100, -10);
m_newButton.setLayoutData(fdNewButton);
m_newButton.setText(Messages.ParametersWindow_NewBtn);
m_newButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int lastIndex = m_tableViewer.getTable().getItems().length;
m_method.addParameter(
new Parameter("Parameter " + (lastIndex + 1), "String")); //$NON-NLS-1$ //$NON-NLS-2$
refreshTableData();
m_tableViewer.getTable().select(lastIndex);
}
});
}
/**
* Creates the table and initializes it with the method's parameters.
*/
private void createTable() {
m_tableViewer = new TableViewer(m_shell, SWT.BORDER | SWT.SINGLE
| SWT.FULL_SELECTION | SWT.V_SCROLL);
createColumns(m_tableViewer);
Table table = m_tableViewer.getTable();
table.setLayoutData(new FormData());
table.setLinesVisible(true);
table.setHeaderVisible(true);
FormData fdTableViewer = new FormData();
fdTableViewer.left = new FormAttachment(0, 10);
fdTableViewer.top = new FormAttachment(m_newButton, 0, SWT.TOP);
fdTableViewer.bottom = new FormAttachment(100, -10);
fdTableViewer.right = new FormAttachment(m_newButton, -10, SWT.LEFT);
m_tableViewer.getControl().setLayoutData(fdTableViewer);
ArrayContentProvider provider = new ArrayContentProvider();
m_tableViewer.setContentProvider(provider);
m_tableViewer.getColumnViewerEditor().addEditorActivationListener(
new ColumnViewerEditorActivationListener() {
@Override
public void beforeEditorDeactivated(
ColumnViewerEditorDeactivationEvent event) {
// Not needed
}
@Override
public void beforeEditorActivated(
ColumnViewerEditorActivationEvent event) {
// Not needed
}
@Override
public void afterEditorDeactivated(
ColumnViewerEditorDeactivationEvent event) {
refreshTableData();
}
@Override
public void afterEditorActivated(
ColumnViewerEditorActivationEvent event) {
// Not needed
}
});
refreshTableData();
}
/**
* Creates the table's name and type column.
* @param tableViewer the table's TableViewer
*/
private void createColumns(TableViewer tableViewer) {
TableViewerColumn name = new TableViewerColumn(tableViewer, SWT.NONE);
name.getColumn().setWidth(140);
name.getColumn().setText(Messages.ParametersWindow_NameColumnLbl);
name.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof Parameter) {
Parameter p = (Parameter) element;
return p.getName();
}
return null;
}
});
name.setEditingSupport(new ParameterNameEditingSupport(tableViewer));
TableViewerColumn type = new TableViewerColumn(tableViewer, SWT.NONE);
type.getColumn().setWidth(80);
type.getColumn().setText(Messages.ParametersWindow_TypeColumnLbl);
type.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof Parameter) {
Parameter p = (Parameter) element;
return p.getType().toString();
}
return null;
}
});
type.setEditingSupport(new ParameterTypeEditingSupport(tableViewer));
TableViewerColumn valueset =
new TableViewerColumn(tableViewer, SWT.NONE);
valueset.getColumn()
.setText(Messages.ParametersWindow_ValueSetColumnLbl);
valueset.getColumn().setWidth(150);
valueset.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof Parameter) {
Parameter p = (Parameter) element;
return p.getValueSet().toString();
}
return null;
}
});
valueset.setEditingSupport(
new ParameterValueSetEditingSupport(tableViewer));
}
/**
* Creates the "Remove" button and its controls.
*/
private void createRemoveButton() {
m_removeButton = new Button(m_shell, SWT.NONE);
m_removeButton.setText(Messages.ParametersWindow_RemoveBtn);
FormData fdRemoveButton = new FormData();
fdRemoveButton.top = new FormAttachment(m_newButton, 6);
fdRemoveButton.left = new FormAttachment(m_newButton, 0, SWT.LEFT);
fdRemoveButton.right = new FormAttachment(m_newButton, 0, SWT.RIGHT);
m_removeButton.setLayoutData(fdRemoveButton);
m_removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
removeSelectedItems();
refreshTableData();
selectLastItem();
}
});
}
/**
* Creates the "Up" button and its controls.
*/
private void createUpButton() {
m_upButton = new Button(m_shell, SWT.NONE);
m_upButton.setText(Messages.ParametersWindow_UpBtn);
FormData fdUpButton = new FormData();
fdUpButton.top = new FormAttachment(m_removeButton, 16);
fdUpButton.left = new FormAttachment(m_newButton, 0, SWT.LEFT);
fdUpButton.right = new FormAttachment(m_newButton, 0, SWT.RIGHT);
m_upButton.setLayoutData(fdUpButton);
m_upButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int index = m_tableViewer.getTable().getSelectionIndex();
if (index > 0) {
Collections.swap(m_method.getParameters(),
index, index - 1);
refreshTableData();
m_tableViewer.getTable().select(index - 1);
}
}
});
}
/**
* Creates the "Down" button and its controls.
*/
private void createDownButton() {
m_downButton = new Button(m_shell, SWT.NONE);
m_downButton.setText(Messages.ParametersWindow_DownBtn);
FormData fdDownButton = new FormData();
fdDownButton.left = new FormAttachment(m_newButton, 0, SWT.LEFT);
fdDownButton.right = new FormAttachment(m_newButton, 0, SWT.RIGHT);
fdDownButton.top = new FormAttachment(m_upButton, 6);
m_downButton.setLayoutData(fdDownButton);
m_downButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int index = m_tableViewer.getTable().getSelectionIndex();
Table table = m_tableViewer.getTable();
if (index > -1 && index < (table.getItemCount() - 1)) {
Collections.swap(m_method.getParameters(),
index, index + 1);
refreshTableData();
m_tableViewer.getTable().select(index + 1);
}
}
});
}
/**
* Creates the "Ok" button and its controls.
*/
private void createOkButton() {
Button okButton = new Button(m_shell, SWT.NONE);
okButton.setText(Messages.ParametersWindow_OkBtn);
FormData fdOkButton = new FormData();
fdOkButton.right = new FormAttachment(m_newButton, 0, SWT.RIGHT);
fdOkButton.bottom = new FormAttachment(100, -10);
fdOkButton.left = new FormAttachment(m_newButton, 0, SWT.LEFT);
okButton.setLayoutData(fdOkButton);
okButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
m_shell.close();
}
});
}
/**
* Creates the horizontal separator line between the "Remove" and "Up"
* button.
*/
private void createSeparatorLine() {
Label label = new Label(m_shell, SWT.SEPARATOR | SWT.HORIZONTAL);
FormData fdLabel = new FormData();
fdLabel.bottom = new FormAttachment(m_upButton, -7);
fdLabel.top = new FormAttachment(m_removeButton, 7);
fdLabel.left = new FormAttachment(m_newButton, 0, SWT.LEFT);
fdLabel.right = new FormAttachment(100, -10);
label.setLayoutData(fdLabel);
}
/**
* Moves the window to the display's center position.
* @param shell the shell
*/
private void setCenterPosition(Shell shell) {
GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice();
int width = gd.getDisplayMode().getWidth();
int height = gd.getDisplayMode().getHeight();
shell.setLocation((width / 2) - (shell.getSize().x / 2),
(height / 2) - (shell.getSize().y / 2));
}
/**
* Fills the table with the method's properties.
*/
private void refreshTableData() {
m_tableViewer.setInput(m_method.getParameters());
}
/** Selects the last item of the list */
private void selectLastItem() {
m_tableViewer.getTable()
.select(m_method.getParametersCount() - 1);
}
/** Removes the selected items */
private void removeSelectedItems() {
int[] selectionIndices =
m_tableViewer.getTable().getSelectionIndices();
if (selectionIndices.length > 0) {
m_method.removeParameters(selectionIndices);
}
}
}