| /******************************************************************************* |
| * Copyright (c) 2011 BSI Business Systems Integration AG. |
| * 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: |
| * BSI Business Systems Integration AG - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.scout.rt.ui.rap.form.fields.tablefield; |
| |
| import org.eclipse.rap.rwt.lifecycle.WidgetUtil; |
| import org.eclipse.scout.commons.exception.IProcessingStatus; |
| import org.eclipse.scout.rt.client.ui.desktop.outline.IOutlineTableForm; |
| import org.eclipse.scout.rt.client.ui.form.IForm; |
| import org.eclipse.scout.rt.client.ui.form.fields.tablefield.ITableField; |
| import org.eclipse.scout.rt.ui.rap.IRwtEnvironment; |
| import org.eclipse.scout.rt.ui.rap.LogicalGridData; |
| import org.eclipse.scout.rt.ui.rap.form.fields.LogicalGridDataBuilder; |
| import org.eclipse.scout.rt.ui.rap.util.RwtLayoutUtility; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Label; |
| |
| /** |
| * Default implementation using a target label |
| */ |
| public class RwtTableStatus implements IRwtTableStatus { |
| protected static final String VARIANT_OUTLINE_TABLE_STATUS = "outlineTableStatus"; |
| protected static final String VARIANT_TABLE_STATUS = "tableStatus"; |
| |
| static final String VARIANT_POSTFIX_ERROR = "_error"; |
| static final String VARIANT_POSTFIX_WARNING = "_warning"; |
| |
| private final Composite m_parent; |
| private final IRwtEnvironment m_uiEnvironment; |
| |
| private final Composite m_labelContainer; |
| private final Label m_populateLabel; |
| private final Label m_selectionLabel; |
| private boolean m_layoutNeeded; |
| |
| private String m_statusVariant = ""; |
| |
| public RwtTableStatus(Composite parent, IRwtEnvironment uiEnvironment, ITableField<?> model) { |
| m_parent = parent; |
| m_uiEnvironment = uiEnvironment; |
| m_statusVariant = getVariant(model); |
| |
| m_labelContainer = getUiEnvironment().getFormToolkit().createComposite(m_parent); |
| m_labelContainer.setData(WidgetUtil.CUSTOM_VARIANT, m_statusVariant); |
| //Label 1 |
| m_populateLabel = getUiEnvironment().getFormToolkit().createLabel(m_labelContainer, "", SWT.NONE); |
| m_populateLabel.setData(WidgetUtil.CUSTOM_VARIANT, m_statusVariant); |
| m_populateLabel.setVisible(false); |
| |
| //Label 2 |
| m_selectionLabel = getUiEnvironment().getFormToolkit().createLabel(m_labelContainer, "", SWT.NONE); |
| m_selectionLabel.setData(WidgetUtil.CUSTOM_VARIANT, m_statusVariant); |
| m_selectionLabel.setVisible(false); |
| |
| //Layout |
| LogicalGridData tableGridData = LogicalGridDataBuilder.createField(model.getGridData()); |
| LogicalGridData gd = new LogicalGridData(); |
| gd.gridx = tableGridData.gridx; |
| gd.gridy = tableGridData.gridy + tableGridData.gridh; |
| gd.gridw = tableGridData.gridw; |
| gd.topInset = 2; |
| gd.gridh = 1; |
| gd.weightx = tableGridData.weightx; |
| gd.weighty = 0.0; |
| gd.fillHorizontal = true; |
| m_labelContainer.setLayoutData(gd); |
| |
| GridLayout groupCompLayout = RwtLayoutUtility.createGridLayoutNoSpacing(1, false); |
| m_labelContainer.setLayout(groupCompLayout); |
| |
| GridData popLabelLayoutData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); |
| popLabelLayoutData.exclude = true; |
| popLabelLayoutData.verticalAlignment = SWT.CENTER; |
| popLabelLayoutData.horizontalAlignment = getLabelHorizontalAlignment(); |
| m_populateLabel.setLayoutData(popLabelLayoutData); |
| |
| GridData selLabelLayoutData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); |
| selLabelLayoutData.exclude = true; |
| selLabelLayoutData.verticalAlignment = SWT.CENTER; |
| selLabelLayoutData.horizontalAlignment = getLabelHorizontalAlignment(); |
| m_selectionLabel.setLayoutData(selLabelLayoutData); |
| } |
| |
| protected String getVariant(ITableField<?> table) { |
| IForm form = table.getForm(); |
| if (form instanceof IOutlineTableForm) { |
| return VARIANT_OUTLINE_TABLE_STATUS; |
| } |
| |
| return VARIANT_TABLE_STATUS; |
| } |
| |
| protected int getLabelHorizontalAlignment() { |
| return SWT.LEFT; |
| } |
| |
| @Override |
| public void dispose() { |
| if (!m_populateLabel.isDisposed()) { |
| m_populateLabel.dispose(); |
| } |
| if (!m_selectionLabel.isDisposed()) { |
| m_selectionLabel.dispose(); |
| } |
| if (!m_labelContainer.isDisposed()) { |
| m_labelContainer.dispose(); |
| } |
| } |
| |
| private IRwtEnvironment getUiEnvironment() { |
| return m_uiEnvironment; |
| } |
| |
| @Override |
| public void setStatus(IProcessingStatus populateStatus, IProcessingStatus selectionStatus) { |
| setStatusImpl(m_populateLabel, populateStatus, true); |
| setStatusImpl(m_selectionLabel, selectionStatus, true); |
| |
| if (!m_populateLabel.getVisible() && !m_selectionLabel.getVisible() && m_labelContainer.getVisible()) { |
| m_layoutNeeded = true; |
| m_labelContainer.setVisible(false); |
| } |
| else if ((m_populateLabel.getVisible() || m_selectionLabel.getVisible()) && !m_labelContainer.getVisible()) { |
| m_layoutNeeded = true; |
| m_labelContainer.setVisible(true); |
| } |
| |
| if (m_layoutNeeded) { |
| if (m_populateLabel.getVisible() && m_selectionLabel.getVisible() && m_labelContainer.getVisible()) { |
| ((LogicalGridData) m_labelContainer.getLayoutData()).gridh = 2; |
| } |
| else if ((m_populateLabel.getVisible() || m_selectionLabel.getVisible()) && m_labelContainer.getVisible()) { |
| ((LogicalGridData) m_labelContainer.getLayoutData()).gridh = 1; |
| } |
| else { |
| ((LogicalGridData) m_labelContainer.getLayoutData()).gridh = 0; |
| } |
| |
| m_layoutNeeded = false; |
| m_parent.layout(true, true); |
| } |
| } |
| |
| private void setStatusImpl(Label field, IProcessingStatus status, boolean hideWhenNullStatus) { |
| if (status == null) { |
| field.setText(""); |
| if (hideWhenNullStatus) { |
| if (field.getVisible()) { |
| m_layoutNeeded = true; |
| field.setVisible(false); |
| ((GridData) field.getLayoutData()).exclude = true; |
| } |
| } |
| return; |
| } |
| // |
| if (!field.getVisible()) { |
| m_layoutNeeded = true; |
| field.setVisible(true); |
| ((GridData) field.getLayoutData()).exclude = false; |
| } |
| String text = status.getMessage(); |
| //bsi ticket 95826: eliminate newlines |
| if (text != null) { |
| text = text.replaceAll("[\\s]+", " "); |
| } |
| field.setText(text != null ? " " + text : ""); |
| //style |
| switch (status.getSeverity()) { |
| case IProcessingStatus.ERROR: |
| case IProcessingStatus.FATAL: { |
| field.setData(WidgetUtil.CUSTOM_VARIANT, m_statusVariant + VARIANT_POSTFIX_ERROR); |
| break; |
| } |
| case IProcessingStatus.WARNING: |
| case IProcessingStatus.CANCEL: { |
| field.setData(WidgetUtil.CUSTOM_VARIANT, m_statusVariant + VARIANT_POSTFIX_WARNING); |
| break; |
| } |
| default: { |
| field.setData(WidgetUtil.CUSTOM_VARIANT, m_statusVariant); |
| } |
| } |
| } |
| } |