/*
* Created on Sep 10, 2007
*
* Copyright 2004, Projity Inc.
*/
package com.projity.help;
import java.awt.Component;
import java.awt.Container;
import java.awt.Frame;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.table.JTableHeader;
import com.projity.configuration.Settings;
import com.projity.field.Field;
import com.projity.pm.graphic.IconManager;
import com.projity.pm.graphic.spreadsheet.SpreadSheet;
import com.projity.pm.graphic.spreadsheet.SpreadSheetModel;
import com.projity.util.BrowserControl;
import com.projity.util.Environment;
public class HelpUtil implements KeyEventDispatcher {
private HashMap<Component,String> map = new HashMap<Component,String>();
private static HelpUtil instance = null;
private static final int DELAY_BETWEEN_HELPS = 5000;
private long lastHelpTime = 0L;
public boolean noHelp = false;
private synchronized static HelpUtil getInstance() {
if (instance == null)
instance = new HelpUtil();
return instance;
}
private HelpUtil() {
noHelp=Environment.getOs()==Environment.MAC&&Environment.isApplet();
if (noHelp) System.out.print("no help");
if (noHelp) return;
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
}
public static String helpTipImg = "<img src=\"" + IconManager.class.getResource("/toolbarButtonGraphics/general/Information16.gif")
+ "\"> F1";
// a tooltip with a help icon and F1
public static String helpTipHtml = "<html><img src=\"" + IconManager.class.getResource("/toolbarButtonGraphics/general/Information16.gif")
+ "\"> F1</html>";
public static void addHelp(Component c, String address) {
if (getInstance().noHelp) return;
if (c instanceof JComponent && ((JComponent)c).getToolTipText() == null)
((JComponent)c).setToolTipText(helpTipHtml);
getInstance().map.put(c,address);
}
public static String getHelpURL(String address) {
return Settings.HELP_HOME+address;
}
public static void addDocHelp(Component c, String address) {
addHelp(c,getHelpURL(address));
}
public static String findHelp(Component c) {
if (getInstance().noHelp) return null;
String result = null;
while (c != null) {
if ((result = getInstance().map.get(c)) != null)
break;
c = c.getParent();
}
return result;
}
public static boolean doHelp(Component c) {
if (getInstance().noHelp) return false;
String help = findHelp(c);
if (help != null) {
long time = System.currentTimeMillis();
boolean doHelp = time - getInstance().lastHelpTime > DELAY_BETWEEN_HELPS;
getInstance().lastHelpTime = time;
if (doHelp) { // prevents doubles which arrive for some reason
BrowserControl.displayURL(help);
return true;
}
}
return false;
}
public static boolean doHelp() {
if (getInstance().noHelp) return false;
Point pt = MouseInfo.getPointerInfo().getLocation();
Component owner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
while (owner != null) { // get dialog or frame which is focus owner
if (owner instanceof JDialog || owner instanceof Frame) {
break;
}
owner = owner.getParent();
}
// Get component at point
Component c = null;
Point loc = owner.getLocationOnScreen();
Point offsetPoint = new Point(pt.x- loc.x, pt.y-loc.y);
c = ((Container)owner).findComponentAt(offsetPoint);
if (c == null)
c = owner;
// do help for most detailed item
while(c != null) {
if (c instanceof JTableHeader) { // if clicked on row header, see if there is help for the field
JTableHeader th = (JTableHeader)c;
loc = c.getLocationOnScreen();
offsetPoint = new Point(pt.x- loc.x, pt.y-loc.y);
int col = th.columnAtPoint(offsetPoint);
SpreadSheet ss = (SpreadSheet)th.getTable();
Field f = ((SpreadSheetModel)ss.getModel()).getFieldInColumn(col+1);
if (f.getHelp()!=null) {
BrowserControl.displayURL(Settings.HELP_HOME+f.getHelp());
return true;
}
}
if (doHelp(c))
return true;
c = c.getParent();
}
return false;
}
public boolean dispatchKeyEvent(KeyEvent e) {
if (noHelp) return false;
if (e.getKeyCode() == KeyEvent.VK_F1 && !e.isConsumed())
if (doHelp()) {
e.consume();
return true;
}
return false;
}
}