001    /*
002     * Created on 28.03.2006
003     *
004     */
005    package org.jdesktop.swingx.action;
006    
007    import java.awt.event.ItemEvent;
008    
009    /**
010     * Convenience implementation to simplify {@link org.jdesktop.swingx.JXHyperlink} configuration and
011     * provide minimal api as needed by a {@link org.jdesktop.swingx.LinkRenderer}. <p>
012     * 
013     * PENDING: rename to AbstractLinkAction
014     * 
015     * @author Jeanette Winzenburg
016     */
017    public abstract class LinkAction<T> extends AbstractActionExt {
018    
019        /**
020         * Key for the visited property value.
021         */
022        public static final String VISITED_KEY = "visited";
023        /**
024         * the object the actionPerformed can act on.
025         */
026        protected T target;
027    
028        
029        /**
030         * Instantiates a LinkAction with null target. 
031         * 
032         */
033        public LinkAction () {
034            this(null);    }
035        
036        /**
037         * Instantiates a LinkAction with a target of type targetClass. 
038         * The visited property is initialized as defined by 
039         * {@link LinkAction#installTarget()}
040         * 
041         * @param target the target this action should act on.
042         */
043        public LinkAction(T target) {
044           setTarget(target);
045        }
046    
047        /**
048         * Set the visited property.
049         * 
050         * @param visited
051         */
052        public void setVisited(boolean visited) {
053            putValue(VISITED_KEY, visited);
054        }
055    
056        /**
057         * 
058         * @return visited state
059         */
060        public boolean isVisited() {
061            Boolean visited = (Boolean) getValue(VISITED_KEY);
062            return Boolean.TRUE.equals(visited) ? true : false;
063        }
064    
065        
066        public T getTarget() {
067            return target;
068        }
069    
070        /**
071         * PRE: isTargetable(target)
072         * @param target
073         */
074        public void setTarget(T target) {
075            T oldTarget = getTarget();
076            uninstallTarget();
077            this.target = target;
078            installTarget();
079            firePropertyChange("target", oldTarget, getTarget());
080            
081        }
082    
083        /**
084         * hook for subclasses to update internal state after
085         * a new target has been set. <p>
086         * 
087         * Subclasses are free to decide the details. 
088         * Here: 
089         * <ul>
090         * <li> the text property is set to target.toString or empty String if
091         * the target is null
092         * <li> visited is set to false.
093         * </ul>
094         */
095        protected void installTarget() {
096            setName(target != null ? target.toString() : "" );
097            setVisited(false);
098        }
099    
100        /**
101         * hook for subclasses to cleanup before the old target
102         * is overwritten. <p>
103         * 
104         * Subclasses are free to decide the details. 
105         * Here: does nothing.
106         */
107        protected void uninstallTarget() {
108            
109        }
110        
111        public void itemStateChanged(ItemEvent e) {
112            // do nothing
113        }
114    
115        /**
116         * Set the state property.
117         * Overridden to to nothing.
118         * PENDING: really?
119         * @param state if true then this action will fire ItemEvents
120         */
121        @Override
122        public void setStateAction(boolean state) {
123        }
124    
125        
126    
127    }