/** * Copyright (C) 2001-2017 by RapidMiner and the contributors * * Complete list of developers available at our web site: * * http://rapidminer.com * * This program is free software: you can redistribute it and/or modify it under the terms of the * GNU Affero General Public License as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License along with this program. * If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.gui.flow.processrendering.view.components; import java.awt.Component; import java.awt.Point; import java.util.List; import com.rapidminer.gui.flow.processrendering.model.ProcessRendererModel; import com.rapidminer.gui.flow.processrendering.view.ProcessRendererView; import com.rapidminer.gui.metadata.MetaDataRendererFactoryRegistry; import com.rapidminer.gui.tools.components.ToolTipWindow.TipProvider; import com.rapidminer.operator.IOObject; import com.rapidminer.operator.ProcessRootOperator; import com.rapidminer.operator.ProcessSetupError.Severity; import com.rapidminer.operator.ports.Port; import com.rapidminer.operator.ports.metadata.ExampleSetMetaData; import com.rapidminer.operator.ports.metadata.MetaData; import com.rapidminer.operator.ports.metadata.MetaDataError; /** * Provides tooltips for the {@link ProcessRendererView}. * * @author Marco Boeck * @since 6.4.0 * */ public class ProcessRendererTooltipProvider implements TipProvider { private ProcessRendererModel model; public ProcessRendererTooltipProvider(ProcessRendererModel model) { this.model = model; } @Override public Object getIdUnder(final Point point) { if (model.getConnectingPortSource() == null) { return model.getHoveringPort(); } else { return null; } } @SuppressWarnings("deprecation") @Override public String getTip(final Object o) { Port port = (Port) o; StringBuilder tip = new StringBuilder(); if (model.getDisplayedChain() instanceof ProcessRootOperator) { if (port.getPorts() == model.getDisplayedChain().getSubprocess(0).getInnerSources()) { int index = model.getDisplayedChain().getSubprocess(0).getInnerSources().getAllPorts().indexOf(port); List<String> locations = model.getDisplayedChain().getProcess().getContext().getInputRepositoryLocations(); if (index >= 0 && index < locations.size()) { String dest = locations.get(index); tip.append("Loaded from: ").append(dest).append("<br/>"); } } else if (port.getPorts() == model.getDisplayedChain().getSubprocess(0).getInnerSinks()) { int index = model.getDisplayedChain().getSubprocess(0).getInnerSinks().getAllPorts().indexOf(port); List<String> locations = model.getDisplayedChain().getProcess().getContext().getOutputRepositoryLocations(); if (index >= 0 && index < locations.size()) { String dest = locations.get(index); tip.append("Stored at: ").append(dest).append("<br/>"); } } } tip.append("<strong>"); tip.append(port.getSpec()); tip.append("</strong> ("); tip.append(port.getName()); tip.append(")<br/>"); tip.append("<em>Meta data:</em> "); MetaData metaData = port.getMetaData(); if (metaData != null) { if (metaData instanceof ExampleSetMetaData) { tip.append(((ExampleSetMetaData) metaData).getShortDescription()); } else { tip.append(metaData.getDescription()); } tip.append("<br/><em>Generated by:</em> "); tip.append(metaData.getGenerationHistoryAsHTML()); tip.append("<br>"); } else { tip.append("-<br/>"); } IOObject data = port.getAnyDataOrNull(); if (data != null) { tip.append("</br><em>Data:</em> "); tip.append(data.toString()); tip.append("<br/>"); } tip.append(port.getDescription()); if (!port.getErrors().isEmpty()) { boolean hasErrors = false; boolean hasWarnings = false; for (MetaDataError error : port.getErrors()) { if (error.getSeverity() == Severity.ERROR) { hasErrors = true; } if (error.getSeverity() == Severity.WARNING) { hasWarnings = true; } } if (hasErrors) { tip.append("<br/><strong style=\"color:red\">"); tip.append(port.getErrors().size()); tip.append(" error(s):</strong>"); for (MetaDataError error : port.getErrors()) { if (error.getSeverity() == Severity.ERROR) { tip.append("<br/> "); tip.append(error.getMessage()); } } } if (hasWarnings) { tip.append("<br/><strong style=\"color:#FFA500\">"); tip.append(port.getErrors().size()); tip.append(" warnings(s):</strong>"); for (MetaDataError error : port.getErrors()) { if (error.getSeverity() == Severity.WARNING) { tip.append("<br/> "); tip.append(error.getMessage()); } } } } return tip.toString(); } @SuppressWarnings("deprecation") @Override public Component getCustomComponent(final Object o) { Port hoveringPort = (Port) o; MetaData metaData = hoveringPort.getMetaData(); return MetaDataRendererFactoryRegistry.getInstance().createRenderer(metaData); } }