/**
* Copyright (C) 2015 Valkyrie RCP
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.valkyriercp.component;
import org.valkyriercp.core.Message;
import org.valkyriercp.core.Severity;
import org.valkyriercp.image.IconSource;
import org.valkyriercp.util.ValkyrieRepository;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.List;
/**
* @author Jan Hoskens
* @author Geoffrey De Smet
*/
public class MessagableTabbedPane extends JTabbedPane implements MessagableTab {
private List<TabMetaData> tabMetaDatas = new ArrayList<TabMetaData>();
public MessagableTabbedPane() {
super();
}
public MessagableTabbedPane(int tabPlacement) {
super(tabPlacement);
}
public MessagableTabbedPane(int tabPlacement, int tabPolicy) {
super(tabPlacement, tabPolicy);
}
@Override
public void insertTab(String title, Icon icon, Component component, String tip, int index) {
super.insertTab(title, icon, component, tip, index);
tabMetaDatas.add(index, new TabMetaData());
}
@Override
public void setIconAt(int index, Icon icon) {
// Hack to allow the error icon to overwrite the real icon
TabMetaData tabMetaData = tabMetaDatas.get(index);
tabMetaData.setIcon(icon);
if (!tabMetaData.hasErrors()) {
super.setIconAt(index, icon);
}
}
@Override
public void setToolTipTextAt(int index, String toolTipText) {
// Hack to allow the error toolTipText to overwrite the real toolTipText
TabMetaData tabMetaData = tabMetaDatas.get(index);
tabMetaData.setToolTipText(toolTipText);
if (!tabMetaData.hasErrors()) {
super.setToolTipTextAt(index, toolTipText);
}
}
public void setMessage(Object source, Message message, int index) {
TabMetaData tabMetaData = tabMetaDatas.get(index);
tabMetaData.put(source, message);
if (tabMetaData.hasErrors()) {
// Calling super to avoid the error icon/toolTipText overwrite hack
super.setIconAt(index, loadIcon(Severity.ERROR.getLabel()));
super.setToolTipTextAt(index, tabMetaData.getFirstErrorMessage());
} else {
// Calling super to avoid the error icon/toolTipText overwrite hack
super.setIconAt(index, tabMetaData.getIcon());
super.setToolTipTextAt(index, tabMetaData.getToolTipText());
}
}
private Icon loadIcon(String severityLabel) {
return getIconSource().getIcon("severity." + severityLabel + ".overlay");
}
private static class TabMetaData {
private Map<Object, Message> messageMap = new HashMap<Object, Message>();
private Stack<Message> errorMessageStack = new Stack<Message>();
private Icon icon = null;
private String toolTipText = null;
public void put(Object key, Message message) {
Message oldMessage = messageMap.get(key);
if (oldMessage != message) {
// Update errorMessageStack
if ((oldMessage != null) && (oldMessage.getSeverity() == Severity.ERROR)) {
errorMessageStack.remove(oldMessage);
}
if ((message != null) && (message.getSeverity() == Severity.ERROR)) {
errorMessageStack.add(message);
}
// Update messageMap
if (message != null) {
messageMap.put(key, message);
} else {
messageMap.remove(key);
}
}
}
public Message get(Object key) {
return messageMap.get(key);
}
public String getFirstErrorMessage() {
if (!hasErrors()) {
return null;
}
return errorMessageStack.firstElement().getMessage();
}
public boolean hasErrors() {
return errorMessageStack.size() > 0;
}
public Icon getIcon() {
return icon;
}
public void setIcon(Icon icon) {
this.icon = icon;
}
public String getToolTipText() {
return toolTipText;
}
public void setToolTipText(String toolTipText) {
this.toolTipText = toolTipText;
}
}
public IconSource getIconSource() {
return ValkyrieRepository.getInstance().getApplicationConfig().iconSource();
}
}