blob: 0305e840475d39e2ef5ff9ac94c5d742f3ee3c45 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 SAP 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:
* Emil Simeonov - initial API and implementation.
* Dimitar Donchev - initial API and implementation.
* Dimitar Tenev - initial API and implementation.
* Nevena Manova - initial API and implementation.
* Georgi Konstantinov - initial API and implementation.
* Richard Birenheide - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.ui.v2.common;
import java.text.MessageFormat;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.internal.forms.widgets.TitleRegion;
import org.eclipse.wst.sse.sieditor.core.common.Logger;
import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
import org.eclipse.wst.sse.sieditor.model.validation.IValidationEvent;
import org.eclipse.wst.sse.sieditor.model.validation.IValidationListener;
import org.eclipse.wst.sse.sieditor.model.validation.IValidationStatus;
import org.eclipse.wst.sse.sieditor.ui.AbstractEditorPage;
import org.eclipse.wst.sse.sieditor.ui.i18n.Messages;
import org.eclipse.wst.sse.sieditor.ui.v2.UIConstants;
import org.eclipse.wst.sse.sieditor.ui.v2.eventing.ISIEvent;
import org.eclipse.wst.sse.sieditor.ui.v2.eventing.SIEvent;
import org.eclipse.wst.sse.sieditor.ui.v2.factory.TreeNodeMapper;
import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode;
public class ValidationListener implements IValidationListener {
private final List<AbstractEditorPage> pages;
private final List<String> errorMessages;
private final List<String> warningMessages;
public ValidationListener(final List<AbstractEditorPage> pages) {
this.pages = pages;
this.errorMessages = new LinkedList<String>();
this.warningMessages = new LinkedList<String>();
}
@Override
public boolean isSupportedModelObject(final Object anObject) {
return anObject instanceof IModelObject;
}
@Override
public void validationPerformed(final IValidationEvent validationEvent) {
resetValidationMessages();
resetPagesFormTitle();
final List<IModelObject> validatedModelObjects = processValidationStatuses(validationEvent);
updatePagesTreeViewers(validationEvent, validatedModelObjects);
updatePagesFormTitle();
}
/**
* Utility method. Registers the error && warning messages from the
* validation event to the manager. Returns a collection of all the model
* objects that are being validated by the given event.
*/
private List<IModelObject> processValidationStatuses(final IValidationEvent validationEvent) {
final List<IModelObject> validatedModelObjects = new LinkedList<IModelObject>();
for (final Object source : validationEvent.getObjects()) {
if (source instanceof IModelObject) {
validatedModelObjects.add((IModelObject) source);
addValidationStatuses(validationEvent.getStatusProvider().getStatus((IModelObject) source));
}
}
return validatedModelObjects;
}
private void updatePagesTreeViewers(final IValidationEvent validationEvent, final List<IModelObject> objects) {
for (final AbstractEditorPage page : pages) {
final TreeNodeMapper treeNodeMapper = page.getController().getTreeNodeMapper();
for (final IModelObject source : objects) {
final List<ITreeNode> treeNodes = treeNodeMapper.getTreeNode(source, ~ITreeNode.CATEGORY_STATIC_ROOT);
page.notifyEvent(new SIEvent(ISIEvent.ID_REFRESH_TREE_NODE, treeNodes.toArray(new Object[treeNodes.size()])));
}
}
}
public void addValidationStatuses(final List<IValidationStatus> statuses) {
for (final IValidationStatus status : statuses) {
if (status.getSeverity() == IStatus.WARNING) {
addWarningMessage(status.getMessage());
} else if (status.getSeverity() == IStatus.ERROR) {
addErrorMessage(status.getMessage());
}
}
}
protected void addWarningMessage(final String message) {
warningMessages.add(message);
}
protected void addErrorMessage(final String message) {
errorMessages.add(message);
}
// =========================================================
// update form titles methods
// =========================================================
public void updatePagesFormTitle() {
final String titleMessageText = createTitleMessageText();
final int titleMessageStatus = createTitleMessageStatus();
final String titleTooltip = createTooltipMessage();
for (final AbstractEditorPage page : pages) {
final ScrolledForm form = page.getManagedForm().getForm();
form.setMessage(titleMessageText, titleMessageStatus);
setTitleTooltip(form, titleTooltip);
page.getManagedForm().refresh();
}
}
protected String createTitleMessageText() {
if (errorMessages.size() == 0) {
switch (warningMessages.size()) {
case 0:
return UIConstants.EMPTY_STRING;
case 1:
return warningMessages.get(0);
default:
return MessageFormat.format(Messages.EditorTitleMessagesManager_X_warnings_detected_page_msg, warningMessages
.size());
}
} else if (warningMessages.size() == 0) {
switch (errorMessages.size()) {
case 0:
return UIConstants.EMPTY_STRING;
case 1:
return errorMessages.get(0);
default:
return MessageFormat.format(Messages.EditorTitleMessagesManager_Y_errors_detected_dlg_msg, errorMessages.size());
}
} else {
if (errorMessages.size() == 1 && warningMessages.size() == 1) {
return MessageFormat.format(Messages.EditorTitleMessagesManager_Y_error_X_warning_detected_dlg_msg, errorMessages
.size(), warningMessages.size());
} else if (errorMessages.size() == 1) {
return MessageFormat.format(Messages.EditorTitleMessagesManager_Y_error_X_warnings_detected_dlg_msg,
errorMessages.size(), warningMessages.size());
} else if (warningMessages.size() == 1) {
return MessageFormat.format(Messages.EditorTitleMessagesManager_X_errors_Y_warning_detected_dlg_msg,
errorMessages.size(), warningMessages.size());
} else {
return MessageFormat.format(Messages.EditorTitleMessagesManager_Y_errors_X_warnings_detected_dlg_msg,
errorMessages.size(), warningMessages.size());
}
}
}
protected int createTitleMessageStatus() {
if (errorMessages.size() == 0) {
if (warningMessages.size() == 0) {
return IMessageProvider.NONE;
}
return IMessageProvider.WARNING;
} else {
return IMessageProvider.ERROR;
}
}
protected String createTooltipMessage() {
final StringBuffer buff = new StringBuffer();
final int errors = errorMessages.size() > 5 ? 5 : errorMessages.size();
if (!errorMessages.isEmpty()) {
buff.append(MessageFormat.format(Messages.EditorTitleMessagesManager_errors_X_of_Y_tooltip_text, errors,
errorMessages.size()));
for (int i = 0; i < errors; i++) {
buff.append(MessageFormat.format("- {0}\n", errorMessages.get(i))); //$NON-NLS-1$
}
}
if (!warningMessages.isEmpty()) {
final int warnings = warningMessages.size() > (5 - errors) ? (5 - errors) : warningMessages.size();
if (warnings != 0) {
buff.append(MessageFormat.format(Messages.EditorTitleMessagesManager_warnings_X_of_Y_tooltip_text, warnings,
warningMessages.size()));
} else {
buff.append(MessageFormat.format(Messages.EditorTitleMessagesManager_warings_X_tooltip_text, warningMessages
.size()));
}
for (int i = 0; i < warnings; i++) {
buff.append(MessageFormat.format("- {0}\n", warningMessages.get(i))); //$NON-NLS-1$
}
}
return buff.toString();
}
/**
* This is a workaround method to set the tooltip text to the title message.
* Any exceptions are ignored so that the editor keeps working if the label
* is not found.
*
*/
protected void setTitleTooltip(final ScrolledForm form, final String tooltip) {
try {
form.getForm().getHead().getChildren()[1].setToolTipText(tooltip);
((TitleRegion) form.getForm().getHead().getChildren()[0]).getChildren()[0].setToolTipText(tooltip);
((TitleRegion) form.getForm().getHead().getChildren()[0]).getChildren()[1].setToolTipText(tooltip);
} catch (final Exception e) {
Logger.logError("Form title tooltip failed to be set. Perhaps the form title layout has changed.", e); //$NON-NLS-1$
}
}
// =========================================================
// reset methods
// =========================================================
protected void resetValidationMessages() {
warningMessages.clear();
errorMessages.clear();
}
private void resetPagesFormTitle() {
for (final AbstractEditorPage page : pages) {
final ScrolledForm form = page.getManagedForm().getForm();
form.setMessage(UIConstants.EMPTY_STRING, IMessageProvider.NONE);
setTitleTooltip(form, UIConstants.EMPTY_STRING);
}
}
public List<String> getErrorMessages() {
return errorMessages;
}
public List<String> getWarningMessages() {
return warningMessages;
}
}