/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.ch;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Hashtable;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.border.Border;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.view.FlexoFrame;
import org.openflexo.view.controller.FlexoController;
public abstract class TrackComponentCH {
private static final Logger logger = Logger.getLogger(TrackComponentCH.class.getPackage().getName());
private FlexoFrame _frame;
protected JComponent focusedComponent = null;
private Border oldBorder = null;
private Hashtable<JComponent, ComponentCHListener> listeners;
public TrackComponentCH(FlexoFrame frame) {
super();
_frame = frame;
listeners = new Hashtable<JComponent, ComponentCHListener>();
addMouseListener(_frame, null);
}
public FlexoController getController() {
return _frame.getController();
}
private ComponentCHListener addMouseListener(JComponent component) {
listeners.put(component, new ComponentCHListener(component));
return listeners.get(component);
}
private void addMouseListener(Container component, MouseListener listener) {
if (component instanceof JComponent && FCH.getDocForComponent((JComponent) component) != null) {
listener = addMouseListener((JComponent) component);
} else if (listener != null) {
component.addMouseListener(listener);
}
for (int i = 0; i < component.getComponentCount(); i++) {
Component comp = component.getComponent(i);
if (comp instanceof Container) {
addMouseListener((Container) comp, listener);
}
}
}
private ComponentCHListener removeMouseListener(JComponent component) {
component.removeMouseListener(listeners.get(component));
return listeners.get(component);
}
private void removeMouseListener(Container component, ComponentCHListener listener) {
if (component instanceof JComponent) {
if (listeners.get(component) != null) {
listener = removeMouseListener((JComponent) component);
} else if (listener != null) {
component.removeMouseListener(listener);
}
}
for (int i = 0; i < component.getComponentCount(); i++) {
Component comp = component.getComponent(i);
if (comp instanceof Container) {
removeMouseListener((Container) comp, listener);
}
}
}
protected void finalizeTracking() {
focusedComponent.setBorder(oldBorder);
focusedComponent.validate();
focusedComponent.repaint();
removeMouseListener(_frame, null);
_frame.getContentPane().setCursor(Cursor.getDefaultCursor());
listeners.clear();
}
public abstract void applyTracking(JComponent component);
public class ComponentCHListener implements MouseListener {
private JComponent componentWithHelp;
private Border oldBorder;
/**
*
*/
public ComponentCHListener(JComponent componentWithHelp) {
this.componentWithHelp = componentWithHelp;
}
/**
* Overrides mouseClicked
*
* @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
*/
@Override
public void mouseClicked(MouseEvent e) {
if (e.getSource() instanceof JComponent) {
finalizeTracking();
try {
applyTracking(focusedComponent);
} catch (javax.help.BadIDException ex) {
FlexoController.notify(FlexoLocalization.localizedForKey("no_help_for_this_part"));
}
}
}
/**
* Overrides mouseEntered
*
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
@Override
public void mouseEntered(MouseEvent e) {
if (e.getSource() instanceof JComponent) {
focusedComponent = componentWithHelp;
oldBorder = focusedComponent.getBorder();
focusedComponent.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
focusedComponent.validate();
focusedComponent.repaint();
}
}
/**
* Overrides mouseExited
*
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
@Override
public void mouseExited(MouseEvent e) {
if (e.getSource() instanceof JComponent) {
componentWithHelp.setBorder(oldBorder);
componentWithHelp.validate();
componentWithHelp.repaint();
}
}
/**
* Overrides mousePressed
*
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
@Override
public void mousePressed(MouseEvent e) {
}
/**
* Overrides mouseReleased
*
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
@Override
public void mouseReleased(MouseEvent e) {
}
}
}