package com.digiarea.closure.model.validation; import java.util.ArrayList; import java.util.Iterator; import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; import javafx.scene.control.Control; import javafx.scene.control.Label; import javafx.scene.control.ListView; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.Tooltip; import javafx.scene.control.TreeView; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import com.digiarea.closurefx.ResourceUtils; public class MessageManager implements IMessageManager { private String ERROR_CHECK_BOX = "error-check-box"; private String ERROR_TEXT_FIELD = "error-text-field"; private String ERROR_COMBO_BOX = "error-combo-box"; private String ERROR_TABLE_VIEW = "error-table-view"; private String WARNING_CHECK_BOX = "warning-check-box"; private String WARNING_TEXT_FIELD = "warning-text-field"; private String WARNING_COMBO_BOX = "warning-combo-box"; private String WARNING_TABLE_VIEW = "warning-table-view"; private String DEFAULT_TABLE_VIEW = "default-table-view"; private String ERROR_TITLE = "error-label"; private String WARNING_TITLE = "warning-label"; private ArrayList<MessageCategory> categories = new ArrayList<MessageCategory>(); private ArrayList<MessageManager.Message> messages = new ArrayList<MessageManager.Message>(); public MessageManager() { } public ArrayList<MessageCategory> getCategories() { return categories; } private Control getCategoryControl(String categoryKey) { for (MessageCategory category : categories) { if (category.getKey().equals(categoryKey)) { return category.getControl(); } } return null; } private void updateResult(String categoryKey) { if (categoryKey != null) { StringBuilder builder = new StringBuilder(); int errors = 0; int warnings = 0; for (MessageManager.Message message : messages) { if (message.getCategory().equals(categoryKey)) { builder.append(message.getMessage() + "\n"); if (message.getMessageType() == IMessageProvider.ERROR) { errors++; } else if (message.getMessageType() == IMessageProvider.WARNING) { warnings++; } } } Control control = getCategoryControl(categoryKey); if (control != null && control instanceof Label) { Label resultLabel = (Label) control; if (errors != 0) { resultLabel.setVisible(true); resultLabel.setText(errors + " errors detected!"); resultLabel.getStyleClass().remove(WARNING_TITLE); resultLabel.getStyleClass().add(ERROR_TITLE); resultLabel.setGraphic(new ImageView(ResourceUtils.MARK_ERROR)); resultLabel.setTooltip(new Tooltip(builder.toString())); } else if (warnings != 0) { resultLabel.setVisible(true); resultLabel.setText(warnings + " warnings detected!"); resultLabel.getStyleClass().remove(ERROR_TITLE); resultLabel.getStyleClass().add(WARNING_TITLE); resultLabel.setGraphic(new ImageView(ResourceUtils.MARK_WARNING)); resultLabel.setTooltip(new Tooltip(builder.toString())); } else { resultLabel.setVisible(false); resultLabel.setText(""); resultLabel.getStyleClass().remove(WARNING_TITLE); resultLabel.getStyleClass().remove(ERROR_TITLE); resultLabel.setGraphic(null); resultLabel.setTooltip(null); } } } } @Override public void addMessage(String categoryKey, Object key, String messageText, Object data, int type, Control control) { addMessage(new MessageManager.Message(categoryKey, key, messageText, type, data, control)); updateResult(categoryKey); } private void addMessage(MessageManager.Message message) { if (!messages.contains(message)) { messages.add(message); } if (message.getControl() != null) { Control control = message.getControl(); control.getStyleClass().remove(DEFAULT_TABLE_VIEW); control.setTooltip(new Tooltip(message.getMessage())); if (control instanceof CheckBox) { CheckBox checkBox = (CheckBox) control; if (message.getMessageType() == IMessageProvider.ERROR) { checkBox.getStyleClass().add(ERROR_CHECK_BOX); } else if (message.getMessageType() == IMessageProvider.WARNING) { checkBox.getStyleClass().add(WARNING_CHECK_BOX); } } else if (control instanceof TextField) { TextField textField = (TextField) control; if (message.getMessageType() == IMessageProvider.ERROR) { textField.getStyleClass().add(ERROR_TEXT_FIELD); } else if (message.getMessageType() == IMessageProvider.WARNING) { textField.getStyleClass().add(WARNING_TEXT_FIELD); } } else if (control instanceof ComboBox<?>) { ComboBox<?> comboBox = (ComboBox<?>) control; if (message.getMessageType() == IMessageProvider.ERROR) { comboBox.getStyleClass().add(ERROR_COMBO_BOX); } else if (message.getMessageType() == IMessageProvider.WARNING) { comboBox.getStyleClass().add(WARNING_COMBO_BOX); } } else if (control instanceof TreeView<?> || control instanceof TableView<?> || control instanceof ListView<?>) { if (message.getMessageType() == IMessageProvider.ERROR) { control.getStyleClass().add(ERROR_TABLE_VIEW); } else if (message.getMessageType() == IMessageProvider.WARNING) { control.getStyleClass().add(WARNING_TABLE_VIEW); } } } } @Override public void removeMessage(Object key) { } @Override public void removeMessages() { for (MessageManager.Message message : messages) { removeMessage(message); } updateResult(null); } @Override public void removeMessage(Object key, Control control) { } @Override public void removeMessages(Control control) { Iterator<MessageManager.Message> iterator = messages.iterator(); while (iterator.hasNext()) { IMessage message = iterator.next(); if (message.getControl() != null) { if (message.getControl().equals(control)) { clearControl(message); iterator.remove(); updateResult(message.getCategory()); } } } } private void removeMessage(IMessage message) { } @Override public void removeAllMessages() { Iterator<MessageManager.Message> iterator = messages.iterator(); while (iterator.hasNext()) { clearControl(iterator.next()); iterator.remove(); } updateResult(null); } private void clearControl(IMessage message) { if (message.getControl() != null) { Control control = message.getControl(); control.setTooltip(null); control.getStyleClass().removeAll(ERROR_CHECK_BOX, WARNING_CHECK_BOX, ERROR_TEXT_FIELD, WARNING_TEXT_FIELD, ERROR_COMBO_BOX, WARNING_COMBO_BOX, ERROR_TABLE_VIEW, WARNING_TABLE_VIEW); control.getStyleClass().add(DEFAULT_TABLE_VIEW); } } @Override public void update() { } @Override public void setAutoUpdate(boolean enabled) { } @Override public boolean isAutoUpdate() { return false; } @Override public String createSummary(IMessage[] messages) { return null; } static class Message implements IMessage { String category; Control control; Object data; Object key; String message; int type; String prefix; public Message(String category, Object key, String message, int type, Object data) { this(category, key, message, type, data, null); } public Message(String category, Object key, String message, int type, Object data, Control control) { this.category = category; this.key = key; this.message = message; this.type = type; this.data = data; this.control = control; } public Image getDecorator() { if (type == IMessageProvider.ERROR) { return ResourceUtils.DECORATOR_ERROR; } else if (type == IMessageProvider.WARNING) { return ResourceUtils.DECORATOR_WARNING; } else if (type == IMessageProvider.INFORMATION) { return ResourceUtils.DECORATOR_INFO; } return null; } public Object getKey() { return key; } public String getMessage() { return message; } public int getMessageType() { return type; } public Control getControl() { return control; } public Object getData() { return data; } public String getPrefix() { return prefix; } @Override public String getCategory() { return category; } public boolean equals(Object obj) { if (!(obj instanceof com.digiarea.closure.model.validation.MessageManager.Message)) return false; com.digiarea.closure.model.validation.MessageManager.Message msg = (com.digiarea.closure.model.validation.MessageManager.Message) obj; return (msg.getPrefix() == null ? getPrefix() == null : msg.getPrefix().equals(getPrefix())) && (msg.getControl() == null ? getControl() == null : msg.getControl().equals(getControl())) && (msg.getMessageType() == getMessageType()) && (msg.getMessage() == null ? getMessage() == null : msg.getMessage().equals(getMessage())) && msg.getKey().equals(getKey()); } @Override public void setControl(Control control) { this.control = control; } } }