/******************************************************************************* * Copyright (c) 2013 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.properties; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ColumnViewerEditor; import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent; import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProviderChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TableViewerEditor; import org.eclipse.jface.viewers.TableViewerFocusCellManager; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jubula.client.core.model.ALMReportingRulePO; import org.eclipse.jubula.client.core.model.IALMReportingRulePO; import org.eclipse.jubula.client.core.model.IPersistentObject; import org.eclipse.jubula.client.core.model.IProjectPropertiesPO; import org.eclipse.jubula.client.core.model.PoMaker; import org.eclipse.jubula.client.core.persistence.EditSupport; import org.eclipse.jubula.client.core.utils.ReportRuleType; 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.factory.ControlFactory; import org.eclipse.jubula.client.ui.rcp.i18n.Messages; import org.eclipse.jubula.client.ui.rcp.properties.ProjectGeneralPropertyPage.IOkListener; import org.eclipse.jubula.client.ui.rcp.provider.ControlDecorator; import org.eclipse.jubula.client.ui.rcp.widgets.CheckedText; import org.eclipse.jubula.client.ui.rcp.widgets.CheckedURLText; import org.eclipse.jubula.client.ui.utils.LayoutUtil; import org.eclipse.jubula.client.ui.widgets.DirectCombo; import org.eclipse.jubula.mylyn.utils.MylynAccess; import org.eclipse.jubula.tools.internal.constants.StringConstants; import org.eclipse.jubula.tools.internal.exception.Assert; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; 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.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; /** * This is the class for the test data property page of a project. * * @author BREDEX GmbH * @created 08.02.2005 */ public class ProjectALMPropertyPage extends AbstractProjectPropertyPage implements IOkListener { /** * @author BREDEX GmbH */ private class ConnectionTestListener implements SelectionListener { /** {@inheritDoc} */ public void widgetSelected(SelectionEvent e) { String selectedObject = m_almRepoCombo.getSelectedObject(); if (selectedObject != null) { IStatus connectionStatus = MylynAccess.testConnection( selectedObject); if (connectionStatus.isOK()) { m_connectionTest.setImage(IconConstants.STEP_OK_IMAGE); setErrorMessage(null); } else { m_connectionTest.setImage(IconConstants.ERROR_IMAGE); setErrorMessage(connectionStatus.getMessage()); } } else { m_connectionTest.setImage(null); setErrorMessage(null); } } /** {@inheritDoc} */ public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } } /** * @author BREDEX GmbH */ private class DataUpdateListener implements ModifyListener { /** {@inheritDoc} */ public void modifyText(ModifyEvent e) { updateALMData(); } } /** number of columns = 1 */ private static final int NUM_COLUMNS_1 = 1; /** number of columns = 2 */ private static final int NUM_COLUMNS_2 = 2; /** the Combo to select the connected ALM system */ private DirectCombo<String> m_almRepoCombo; /** the button to test the connection with */ private Button m_connectionTest; /** * Checkbox to decide if a comment should be automatically posted to the ALM * in case of a succeeded test */ private Button m_reportOnSuccess = null; /** group for on success */ private Group m_onSuccessGroup; /** group for on failure */ private Group m_onFailureGroup; /** label advertising the comment writing rules on success*/ private Label m_onSuccessRulesLabel; /** label advertising the comment writing rules on failure*/ private Label m_onFailureRulesLabel; /** table viewer containing rules on success*/ private TableViewer m_onSuccessTableViewer; /** table viewer containing rules on failure*/ private TableViewer m_onFailureTableViewer; /** the add button */ private Button m_onSuccessAddButton = null; /** the delete button */ private Button m_onSuccessRemoveButton = null; /** the add button */ private Button m_onFailureAddButton = null; /** the delete button */ private Button m_onFailureRemoveButton = null; /** list containing on success report rules */ private List<IALMReportingRulePO> m_reportingRules; /** listener to keep the data in sync */ private ModifyListener m_dataUpdater = new DataUpdateListener(); /** * Checkbox to decide if a comment should be automatically posted to the ALM * in case of a failed test */ private Button m_reportOnFailure = null; /** * the dashboards URL text field */ private CheckedText m_dashboardURL; /** * the original / unmodified project properties */ private IProjectPropertiesPO m_origProjectProps; /** the label provider for the reporting rules table */ private ReportingRulesTableLabelProvider m_reportingRulesLabelProvider = new ReportingRulesTableLabelProvider(); /** * @param es * the editSupport */ public ProjectALMPropertyPage(EditSupport es) { super(es); m_origProjectProps = ((IProjectPropertiesPO) es.getOriginal()); } /** * {@inheritDoc} */ protected Control createContents(Composite parent) { Composite composite = createComposite(parent, NUM_COLUMNS_1, GridData.FILL, false); createALMPageDescription(composite); Composite main = createComposite(composite, NUM_COLUMNS_2, GridData.FILL, false); noDefaultAndApplyButton(); createEmptyLabel(main); createEmptyLabel(main); createALMrepositoryChooser(main); createDashboardURL(main); createReportOnSuccess(main); createReportOnFailure(main); Event event = new Event(); event.type = SWT.Selection; event.widget = m_almRepoCombo; m_almRepoCombo.notifyListeners(SWT.Selection, event); Plugin.getHelpSystem().setHelp(parent, ContextHelpIds.PROJECT_ALM_PROPERTY_PAGE); return composite; } /** * @param parent the parent to use */ private void createDashboardURL(Composite parent) { Composite leftComposite = createComposite(parent, NUM_COLUMNS_1, GridData.BEGINNING, false); Composite rightComposite = createComposite(parent, NUM_COLUMNS_1, GridData.FILL, true); createLabel(leftComposite, Messages.ProjectPropertyPageDasboardURLLabel); m_dashboardURL = new CheckedURLText(rightComposite, SWT.BORDER); m_dashboardURL.setText(StringUtils .defaultString(m_origProjectProps.getDashboardURL())); m_dashboardURL.validate(); GridData textGridData = new GridData(GridData.FILL_HORIZONTAL); textGridData.grabExcessHorizontalSpace = true; m_dashboardURL.setLayoutData(textGridData); LayoutUtil.setMaxChar(m_dashboardURL, IPersistentObject.MAX_STRING_LENGTH); m_dashboardURL.addModifyListener(m_dataUpdater); } /** * @param parent the parent to use */ private void createReportOnFailure(Composite parent) { m_onFailureAddButton = new Button(parent, SWT.PUSH); m_onFailureRemoveButton = new Button(parent, SWT.PUSH); Composite leftPart = createComposite(parent, NUM_COLUMNS_1, GridData.FILL, true); m_onFailureGroup = new Group(parent, NONE); m_reportOnFailure = new Button(leftPart, SWT.CHECK); m_reportOnFailure.setSelection( m_origProjectProps.getIsReportOnFailure()); m_onFailureRulesLabel = new Label(leftPart, NONE); m_onFailureTableViewer = new TableViewer(leftPart, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); m_onFailureTableViewer.addFilter( new RuleTypeFilter(ReportRuleType.ONFAILURE)); createRuleGroup(leftPart, m_onFailureGroup, m_reportOnFailure, m_onFailureRulesLabel, m_onFailureTableViewer, Messages.ProjectPropertyPageReportOnFailureLabel, m_onFailureAddButton, m_onFailureRemoveButton); } /** * @param parent the parent to use */ private void createReportOnSuccess(Composite parent) { m_onSuccessAddButton = new Button(parent, SWT.PUSH); m_onSuccessRemoveButton = new Button(parent, SWT.PUSH); Composite leftPart = createComposite(parent, NUM_COLUMNS_1, GridData.FILL, true); m_onSuccessGroup = new Group(parent, NONE); m_reportOnSuccess = new Button(leftPart, SWT.CHECK); m_reportOnSuccess.setSelection( m_origProjectProps.getIsReportOnSuccess()); m_onSuccessRulesLabel = new Label(leftPart, NONE); m_onSuccessTableViewer = new TableViewer(leftPart, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); m_onSuccessTableViewer.addFilter( new RuleTypeFilter(ReportRuleType.ONSUCCESS)); createRuleGroup(leftPart, m_onSuccessGroup, m_reportOnSuccess, m_onSuccessRulesLabel, m_onSuccessTableViewer, Messages.ProjectPropertyPageReportOnSuccessLabel, m_onSuccessAddButton, m_onSuccessRemoveButton); } /** * Creates UI for managing reporting rules for on success / on failure. * Designed to allow creation of identical groups as easy as possible. * @param leftPart composite for layout * @param group composite for layout * @param report button whether results should be reported * @param rulesLabel label * @param tableViewer the table containing the reporting rules * @param groupTitle title of the group * @param addButton add button * @param removeButton remove button */ private void createRuleGroup(Composite leftPart, Group group, Button report, Label rulesLabel, final TableViewer tableViewer, String groupTitle, Button addButton, Button removeButton) { GridData groupGridData = new GridData(SWT.FILL, SWT.TOP, true, false); groupGridData.horizontalSpan = 2; group.setLayout(new GridLayout(2, false)); group.setLayoutData(groupGridData); group.setText(groupTitle); leftPart.setParent(group); report.setText(Messages .ProjectPropertyPageReportWriteCommentLabel); ControlDecorator.createInfo(report, Messages .ProjectPropertyPageReportWriteCommentTooltip, false); GridData labelGridData = new GridData(GridData.FILL_VERTICAL); labelGridData.grabExcessHorizontalSpace = false; report.setLayoutData(labelGridData); report.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { updateALMData(); } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); rulesLabel.setText(Messages .ProjectPropertyPageReportRulesLabel); ControlDecorator.createInfo(rulesLabel, Messages .ProjectPropertyPageReportRulesTooltip, false); GridData rulesLabelGridData = new GridData(GridData.FILL_VERTICAL); rulesLabelGridData.verticalIndent = 15; rulesLabel.setLayoutData(rulesLabelGridData); ArrayContentProvider provider = new ArrayContentProvider(); tableViewer.setContentProvider(provider); m_reportingRules = getProject().getProjectProperties() .getALMReportingRules(); createTableContent(tableViewer); tableViewer.setInput(m_reportingRules); final Table table = tableViewer.getTable(); tableViewer.setLabelProvider(m_reportingRulesLabelProvider); table.setHeaderVisible(true); table.setLinesVisible(true); GridData layoutData = new GridData(600, 150, true, false); layoutData.horizontalAlignment = SWT.FILL; layoutData.heightHint = 150; table.setLayoutData(layoutData); Composite rightPart = new Composite(group, SWT.NONE); GridLayout compositeLayout = new GridLayout(); compositeLayout.numColumns = NUM_COLUMNS_1; rightPart.setLayout(compositeLayout); GridData compositeData = new GridData( SWT.RIGHT, SWT.BOTTOM, false, false); rightPart.setLayoutData(compositeData); WidgetSelectionListener selectionListener = new WidgetSelectionListener(tableViewer); addButton.setParent(rightPart); addButton.setText(Messages.ProjectPropertyPageALMReportRuleAdd); addButton.setLayoutData(buttonGrid()); addButton.addSelectionListener(selectionListener); removeButton.setParent(rightPart); removeButton.setText(Messages.ProjectPropertyPageALMReportRuleRemove); removeButton.setLayoutData(buttonGrid()); removeButton.addSelectionListener(selectionListener); } /** creates the content of the table * @param tableViewer the associated table viewer */ private void createTableContent(final TableViewer tableViewer) { TableViewerColumn nameColumn = new TableViewerColumn(tableViewer, SWT.LEFT); nameColumn.getColumn().setText(Messages.ALMReportRuleDescription); nameColumn.getColumn().setWidth(200); nameColumn.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if (element instanceof IALMReportingRulePO) { return ((IALMReportingRulePO) element).getName(); } return null; } }); nameColumn.setEditingSupport( new ReportingRuleNameEditingSupport(tableViewer)); TableViewerColumn fieldColumn = new TableViewerColumn(tableViewer, SWT.LEFT); fieldColumn.getColumn().setText(Messages.ALMReportRuleField); fieldColumn.getColumn().setWidth(200); fieldColumn.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if (element instanceof IALMReportingRulePO) { return ((IALMReportingRulePO) element).getAttributeID(); } return null; } }); fieldColumn.setEditingSupport( new ReportingRuleFieldIDEditingSupport(tableViewer)); TableViewerColumn valueColumn = new TableViewerColumn(tableViewer, SWT.LEFT); valueColumn.getColumn().setText(Messages.ALMReportRuleValue); valueColumn.getColumn().setWidth(200); valueColumn.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if (element instanceof IALMReportingRulePO) { return ((IALMReportingRulePO) element).getValue(); } return null; } }); valueColumn.setEditingSupport( new ReportingRuleValueEditingSupport(tableViewer)); TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer, new FocusCellOwnerDrawHighlighter(tableViewer)); ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) { protected boolean isEditorActivationEvent( ColumnViewerEditorActivationEvent event) { return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL || event.eventType == ColumnViewerEditorActivationEvent. MOUSE_DOUBLE_CLICK_SELECTION || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; } }; TableViewerEditor.create(tableViewer, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION); } /** * @param parent the parent to use */ private void createALMPageDescription(Composite parent) { createEmptyLabel(parent); Composite composite = createComposite(parent, 1, GridData.FILL, true); createLabel(composite, Messages.ProjectPropertyPageALMLabel); } /** * @param parent the parent to use */ private void createALMrepositoryChooser(Composite parent) { Composite leftComposite = createComposite(parent, NUM_COLUMNS_1, GridData.BEGINNING, false); Composite rightComposite = createComposite(parent, 3, GridData.FILL, true); createLabel(leftComposite, Messages.ProjectPropertyPageALMRepositoryLabel); String configuredRepo = m_origProjectProps .getALMRepositoryName(); m_almRepoCombo = ControlFactory .createALMRepositoryCombo(rightComposite, configuredRepo); m_almRepoCombo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { m_connectionTest.setImage(IconConstants.STEP_TESTING_IMAGE); if (m_almRepoCombo.getSelectedObject() == null) { m_dashboardURL.setEnabled(false); m_dashboardURL.setBackground(null); setEnabledRecursive(m_onSuccessGroup, false); setEnabledRecursive(m_onFailureGroup, false); m_onSuccessTableViewer.setSelection(null); m_onFailureTableViewer.setSelection(null); m_onSuccessTableViewer.getTable().setEnabled(false); m_onFailureTableViewer.getTable().setEnabled(false); } else { m_dashboardURL.setEnabled(true); m_dashboardURL.validate(); setEnabledRecursive(m_onSuccessGroup, true); setEnabledRecursive(m_onFailureGroup, true); m_onSuccessTableViewer.getTable().setEnabled(true); m_onFailureTableViewer.getTable().setEnabled(true); } m_reportingRulesLabelProvider.refresh(); setErrorMessage(null); updateALMData(); } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }); m_almRepoCombo.setSelectedObject(configuredRepo); GridData textGridData = new GridData(); textGridData.grabExcessHorizontalSpace = true; textGridData.horizontalAlignment = GridData.FILL; m_almRepoCombo.setLayoutData(textGridData); m_connectionTest = new Button(rightComposite, SWT.PUSH); m_connectionTest.setText(Messages.ProjectPropertyPageALMConnectionTest); m_connectionTest.setImage(IconConstants.STEP_TESTING_IMAGE); m_connectionTest.addSelectionListener(new ConnectionTestListener()); } /** * recursively dis-/enable control and all its children * @param control the control * @param enabled whether the control should be enabled */ public void setEnabledRecursive(Control control, boolean enabled) { if (control instanceof Composite) { Composite composite = (Composite) control; for (Control c : composite.getChildren()) { setEnabledRecursive(c, enabled); } } else { control.setEnabled(enabled); } } /** * update the data */ private void updateALMData() { IProjectPropertiesPO props = getProject().getProjectProperties(); if (m_almRepoCombo != null) { props.setALMRepositoryName(m_almRepoCombo.getText()); } if (m_reportOnFailure != null) { props.setIsReportOnFailure(m_reportOnFailure.getSelection()); } if (m_reportOnSuccess != null) { props.setIsReportOnSuccess(m_reportOnSuccess.getSelection()); } if (m_dashboardURL != null) { props.setDashboardURL(m_dashboardURL.getText().trim()); } if (m_reportingRules != null) { props.setALMReportingRules(m_reportingRules); } } /** * This private inner class contains a new SelectionListener. * It assigns actions to different button types. * * @author BREDEX GmbH * @created 11.07.2014 */ private class WidgetSelectionListener implements SelectionListener { /** table on which the button action should be performed */ private TableViewer m_tableViewer; /** constructor * @param tableViewer the table on which the button action should be performed */ WidgetSelectionListener(TableViewer tableViewer) { m_tableViewer = tableViewer; } /** * {@inheritDoc} */ public void widgetSelected(SelectionEvent e) { handleSelectionEvent(e); } /** * @param e a SelectionEvent */ private void handleSelectionEvent(SelectionEvent e) { Object o = e.getSource(); if (o.equals(m_onSuccessAddButton) || o.equals(m_onFailureAddButton)) { handleAddButtonEvent((Button) o, m_tableViewer); return; } else if (o.equals(m_onSuccessRemoveButton) || o.equals(m_onFailureRemoveButton)) { handleRemoveButtonEvent(m_tableViewer); return; } Assert.notReached(Messages.EventActivatedUnknownWidget + StringConstants.COLON + StringConstants.SPACE + StringConstants.APOSTROPHE + String.valueOf(e.getSource()) + StringConstants.APOSTROPHE); } /** * Reacts, when an object is double clicked. * {@inheritDoc} */ public void widgetDefaultSelected(SelectionEvent e) { handleSelectionEvent(e); } } /** Handles the add-button event by opening a dialogue to add a * reporting rule to a given table. * @param button the add button * @param tableViewer the table viewer */ void handleAddButtonEvent(Button button, TableViewer tableViewer) { ReportRuleType type = null; if (tableViewer.equals(m_onSuccessTableViewer)) { type = ReportRuleType.ONSUCCESS; } else if (tableViewer.equals(m_onFailureTableViewer)) { type = ReportRuleType.ONFAILURE; } IALMReportingRulePO rule = PoMaker.createALMReportingRulePO( StringUtils.EMPTY, StringUtils.EMPTY, StringUtils.EMPTY, type); m_reportingRules.add(rule); rule.setParentProjectId(getProject().getId()); tableViewer.refresh(); tableViewer.reveal(rule); tableViewer.editElement(rule, 0); } /** Handles the remove-button event of a given table by deleting the selected * reporting rule from the given table. * @param tableViewer the table viewer */ void handleRemoveButtonEvent(TableViewer tableViewer) { StructuredSelection selection = (StructuredSelection) tableViewer.getSelection(); Iterator itr = selection.iterator(); while (itr.hasNext()) { m_reportingRules.remove(itr.next()); } tableViewer.refresh(); } /** * Creates new gridData for the buttons. * @return The new GridData. */ private GridData buttonGrid() { GridData buttonData = new GridData(); buttonData.horizontalAlignment = GridData.FILL; return buttonData; } /** * Viewer filter which only shows ALM reporting rules of a given type * * @author BREDEX GmbH * @created 29.07.2014 */ private class RuleTypeFilter extends ViewerFilter { /** the type of the rules to show */ private ReportRuleType m_type = null; /** * constructor * @param type the type to show */ public RuleTypeFilter(ReportRuleType type) { m_type = type; } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IALMReportingRulePO) { IALMReportingRulePO rule = (IALMReportingRulePO) element; if (rule.getType() == m_type) { return true; } } return false; } } /** * * @author BREDEX GmbH * @created Jul 30, 2014 */ private abstract static class ReportingRuleEditingSupport extends EditingSupport { /** * Constructor * * @param viewer The viewer */ public ReportingRuleEditingSupport(ColumnViewer viewer) { super(viewer); } /** * {@inheritDoc} */ protected boolean canEdit(Object element) { return true; } /** * {@inheritDoc} */ protected CellEditor getCellEditor(Object element) { return new TextCellEditor((Composite)getViewer().getControl()); } } /** * * @author BREDEX GmbH * @created Jul 31, 2014 */ private static class ReportingRuleNameEditingSupport extends ReportingRuleEditingSupport { /** * Constructor * * @param viewer The viewer */ public ReportingRuleNameEditingSupport(ColumnViewer viewer) { super(viewer); } /** * {@inheritDoc} */ protected Object getValue(Object element) { return StringUtils.defaultString( ((IALMReportingRulePO)element).getName()); } /** * {@inheritDoc} */ protected void setValue(Object element, Object value) { String hostNameValue = String.valueOf(value); ((IALMReportingRulePO)element).setName(hostNameValue); getViewer().update(element, null); } } /** * * @author BREDEX GmbH * @created Jul 31, 2014 */ private static class ReportingRuleFieldIDEditingSupport extends ReportingRuleEditingSupport { /** * Constructor * * @param viewer The viewer */ public ReportingRuleFieldIDEditingSupport(ColumnViewer viewer) { super(viewer); } /** * {@inheritDoc} */ protected Object getValue(Object element) { return StringUtils.defaultString( ((IALMReportingRulePO)element).getAttributeID()); } /** * {@inheritDoc} */ protected void setValue(Object element, Object value) { String hostNameValue = String.valueOf(value); ((IALMReportingRulePO)element).setAttributeID(hostNameValue); getViewer().update(element, null); } } /** * * @author BREDEX GmbH * @created Jul 31, 2014 */ private static class ReportingRuleValueEditingSupport extends ReportingRuleEditingSupport { /** * Constructor * * @param viewer The viewer */ public ReportingRuleValueEditingSupport(ColumnViewer viewer) { super(viewer); } /** * {@inheritDoc} */ protected Object getValue(Object element) { return StringUtils.defaultString( ((IALMReportingRulePO)element).getValue()); } /** * {@inheritDoc} */ protected void setValue(Object element, Object value) { String hostNameValue = String.valueOf(value); ((IALMReportingRulePO)element).setValue(hostNameValue); getViewer().update(element, null); } } /** * Label provider for ALM reporting rules table */ private class ReportingRulesTableLabelProvider implements ITableLabelProvider, IColorProvider { /** whether the table is enabled */ private boolean m_enabled = true; /** the listeners */ private List<ILabelProviderListener> m_listeners; /** * The label provider for the table containing ALM reporting rules */ public ReportingRulesTableLabelProvider() { super(); m_listeners = new ArrayList<ILabelProviderListener>(); } /** * refreshes the enabled-state and notifies listeners */ public void refresh() { boolean newState = m_onSuccessTableViewer.getTable().getEnabled(); if (newState != m_enabled) { m_enabled = newState; for (ILabelProviderListener listener : m_listeners) { listener.labelProviderChanged( new LabelProviderChangedEvent(this)); } } } @Override public void addListener(ILabelProviderListener listener) { m_listeners.add(listener); } @Override public void dispose() { // nothing } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { m_listeners.remove(listener); } @Override public Color getForeground(Object element) { int greyTone = m_enabled ? 0 : 128; return new Color(getControl().getDisplay(), greyTone, greyTone, greyTone); } @Override public Color getBackground(Object element) { int greyTone = 250; if (element instanceof ALMReportingRulePO) { ALMReportingRulePO currentRule = (ALMReportingRulePO)element; int i = 0; for (IALMReportingRulePO rule : m_reportingRules) { if (rule.equals(currentRule)) { break; } if (rule.getType().equals(currentRule.getType())) { i++; } } switch (i % 2) { case 0: greyTone = 235; break; case 1: greyTone = 240; break; default: break; } if (!m_enabled) { greyTone += 5; } } return new Color(getControl().getDisplay(), greyTone, greyTone, greyTone); } @Override public Image getColumnImage(Object element, int columnIndex) { return null; } @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof ALMReportingRulePO) { ALMReportingRulePO rule = (ALMReportingRulePO)element; switch (columnIndex) { case 0: return rule.getName(); case 1: return rule.getAttributeID(); case 2: return rule.getValue(); default: break; } } return null; } } /** {@inheritDoc} */ public void okPressed() { IProjectPropertiesPO props = getProject().getProjectProperties(); List<IALMReportingRulePO> invalidRules = new LinkedList<IALMReportingRulePO>(); List<IALMReportingRulePO> almReportingRules = props .getALMReportingRules(); for (IALMReportingRulePO rule : almReportingRules) { if (StringUtils.isEmpty(rule.getAttributeID()) || StringUtils.isEmpty(rule.getValue())) { invalidRules.add(rule); } } almReportingRules.removeAll(invalidRules); } }