package com.egantt.swing.cell.editor.state; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.EventObject; import javax.swing.JComponent; import com.egantt.model.drawing.ContextConstants; import com.egantt.model.drawing.ContextResources; import com.egantt.model.drawing.DrawingContext; import com.egantt.model.drawing.DrawingState; import com.egantt.swing.cell.CellState; import com.egantt.swing.cell.editor.AbstractCellEditor; import com.egantt.swing.cell.renderer.state.ManagedStateRenderer; import com.egantt.swing.component.repaint.RepaintManager; public class ManagedStateEditor extends AbstractCellEditor { protected final ManagedStateRenderer renderer; protected final DrawingContext context; protected final RepaintManager manager; protected transient MouseListener mouseListener; protected transient MouseMotionListener motionListener; protected transient StateEditor stateEditor; protected DrawingState drawing; protected JComponent parent; protected CellState cellState; protected Rectangle bounds; public ManagedStateEditor(ManagedStateRenderer renderer, RepaintManager manager, DrawingContext context) { this.context = context; this.manager = manager; this.renderer = renderer; } // ________________________________________________________________________ public Object getValue() { return drawing; } public boolean isCellEditable(EventObject eo) { return getAxisKey(context) != null; } // ________________________________________________________________________ public JComponent getComponent(CellState cellState, JComponent parent) { this.cellState = cellState; this.drawing = (DrawingState) cellState.getValue(); this.parent = parent; if (mouseListener == null) { mouseListener = new LocalMouseListener(); motionListener = new LocalMotionListener(); parent.addMouseListener(mouseListener); parent.addMouseMotionListener(motionListener); } return renderer.getComponent(cellState, parent); } public void cancelEditing() { if (parent != null) { parent.removeMouseListener(mouseListener); parent.removeMouseMotionListener(motionListener); mouseListener = null; motionListener = null; } this.parent = null; } public void stopEditing() { if (parent != null) { parent.removeMouseListener(mouseListener); parent.removeMouseMotionListener(motionListener); mouseListener = null; motionListener = null; } this.parent = null; } // ________________________________________________________________________ protected class LocalMotionListener implements MouseMotionListener { public void mouseDragged(MouseEvent e) { Object axisKey = context.get(ContextConstants.EDITING_AXIS, ContextResources.OTHER_PROPERTY); if (stateEditor != null) stateEditor.mouseDragged(e, cellState.getBounds(), drawing, axisKey, context); manager.repaint(); } /** * Invoked when the mouse button has been moved on a component (with no * buttons down). */ public void mouseMoved(MouseEvent e) { Object axisKey = context.get(ContextConstants.EDITING_AXIS, ContextResources.OTHER_PROPERTY); if (stateEditor != null) stateEditor.mouseMoved(e, cellState.getBounds(), drawing, axisKey, context); } } // ________________________________________________________________________ protected StateEditor getAxisKey(DrawingContext context) { Object modeKey = context.get(ContextConstants.EDITING_MODE, ContextResources.OTHER_PROPERTY); return modeKey != null ? (StateEditor) context.get(modeKey, ContextResources.STATE_EDITOR) : null; } // ________________________________________________________________________ protected class LocalMouseListener extends MouseAdapter { /** * Invoked when the mouse button has been clicked (pressed and released) * on a component. */ public void mousePressed(MouseEvent e) { stateEditor = getAxisKey(context); Object axisKey = context.get(ContextConstants.EDITING_AXIS, ContextResources.OTHER_PROPERTY); if (stateEditor != null) stateEditor.mousePressed(e, cellState.getBounds(), drawing, axisKey, context); else stopEditing(); } public void mouseReleased(MouseEvent e) { Object axisKey = context.get(ContextConstants.EDITING_AXIS, ContextResources.OTHER_PROPERTY); if (stateEditor != null) stateEditor.mouseReleased(e, cellState.getBounds(), drawing, axisKey, context); manager.repaint(); } } }