/* Copyright (C) 2008 Christian Schneider
*
* This file is part of Nomad.
*
* Nomad is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Nomad 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Nomad; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.sf.nmedit.nordmodular;
import java.awt.Image;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import net.sf.nmedit.jpatch.PModule;
import net.sf.nmedit.jpatch.PModuleDescriptor;
import net.sf.nmedit.jpatch.impl.PBasicModule;
import net.sf.nmedit.jtheme.JTContext;
import net.sf.nmedit.jtheme.JTException;
import net.sf.nmedit.jtheme.component.JTModule;
import net.sf.nmedit.jtheme.help.HelpHandler;
import net.sf.nmedit.jtheme.help.ModuleHelpPage;
import net.sf.nmedit.jtheme.store2.ModuleElement;
import net.sf.nmedit.jtheme.util.ModuleImageRenderer;
import net.sf.nmedit.nomad.core.Nomad;
import net.sf.nmedit.nomad.core.jpf.TempDir;
import net.sf.nmedit.nomad.core.swing.document.Document;
public class NMHelpHandler implements HelpHandler
{
private static final Log log = LogFactory.getLog(NMHelpHandler.class);
private ImageIcon helpIcon = getIcon("help.png");
private static ImageIcon getIcon(String name)
{
name = "/icons/tango/16x16/"+name;
URL url = Nomad.sharedInstance().getClass().getResource(name);
if (url == null)
return null;
return new ImageIcon(url);
}
public boolean hasHelpFor(Object o)
{
if (o instanceof PModuleDescriptor)
return true;
else if (o instanceof PModule)
return true;
return false;
}
public void showHelpFor(Object o)
{
PModuleDescriptor dmodule = null;
if (o instanceof PModuleDescriptor)
{
dmodule = (PModuleDescriptor) o;
}
else if (o instanceof PModule)
{
dmodule = ((PModule)o).getDescriptor();
}
if (dmodule == null)
return;
// render image
ModuleHelpPage helpPage = new ModuleHelpPage(
NMContextData.sharedInstance().getJTContext(),
dmodule, getModuleImageURL(dmodule));
Nomad.sharedInstance().getDocumentManager().add(new HelpDoc(helpPage));
}
private URL getModuleImageURL(PModuleDescriptor dmodule)
{
if (dmodule.getComponentId() == null)
{
if (log.isWarnEnabled())
{
log.warn("module has no componentid "+dmodule);
}
return null;
}
String name = dmodule.getComponentId()+".png";
TempDir tempdir = TempDir.forObject(this);
if (tempdir == null)
{
if (log.isWarnEnabled())
{
log.warn("TempDir.forObject(this) returned null");
}
return null;
}
File dir = tempdir.getTempFile("help/modules");
if (!dir.exists())
{
try
{
dir.mkdirs();
}
catch (Throwable t)
{
if (log.isErrorEnabled())
{
log.error("could not create dir for module images", t);
}
return null;
}
}
File imgFile = new File(dir, name);
if (!imgFile.exists())
{
// create image
JTContext context = NMContextData.sharedInstance().getJTContext();
ModuleElement mstore = context.getStorageContext().getModuleStoreById(dmodule.getComponentId());
JTModule component;
try
{
component = mstore.createModule(context, new PBasicModule(dmodule));
}
catch (JTException e)
{
if (log.isErrorEnabled())
{
log.error("could not create module component for "+dmodule, e);
}
return null;
}
ModuleImageRenderer mir = new ModuleImageRenderer();
mir.add(component);
mir.setForDragAndDrop(false);
mir.setPaintExtraBorder(false);
mir.setRenderCablesEnabled(false);
Image image = mir.render();
if (image == null)
{
if (log.isWarnEnabled())
{
log.warn("rendering image failed");
}
return null;
}
if (!(image instanceof RenderedImage))
{
if (log.isWarnEnabled())
{
log.warn("rendered image not instanceof "+RenderedImage.class);
}
}
// store image
try
{
ImageIO.write((RenderedImage)image, "PNG", imgFile);
}
catch (IOException e)
{
if (log.isErrorEnabled())
{
log.error("could not write image "+imgFile, e);
}
return null;
}
}
try
{
return imgFile.toURI().toURL();
}
catch (Throwable t)
{
if (log.isErrorEnabled())
{
log.error("could not resolve URL "+imgFile, t);
}
return null;
}
}
private class HelpDoc implements Document
{
private ModuleHelpPage helpPage;
private Icon icon;
public HelpDoc(ModuleHelpPage helpPage)
{
this.helpPage = helpPage;
}
public void dispose()
{
// no op
}
public JComponent getComponent()
{
return helpPage;
}
public <T> T getFeature(Class<T> featureClass)
{
return null;
}
public File getFile()
{
return null;
}
public Icon getIcon()
{
if (icon == null)
{
icon = helpPage.getIcon();
if (icon == null)
icon = helpIcon;
}
return icon;
}
public Object getProperty(String name)
{
// TODO Auto-generated method stub
return null;
}
public String getTitle()
{
return helpPage.getTitle();
}
public String getTitleExtended()
{
return getTitle();
}
public boolean isModified()
{
return false;
}
}
}