001    /*
002     * Created on Dec 23, 2007
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005     * in compliance with the License. You may obtain a copy of the License at
006     *
007     * http://www.apache.org/licenses/LICENSE-2.0
008     *
009     * Unless required by applicable law or agreed to in writing, software distributed under the License
010     * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011     * or implied. See the License for the specific language governing permissions and limitations under
012     * the License.
013     *
014     * Copyright @2007-2010 the original author or authors.
015     */
016    package org.fest.swing.format;
017    
018    import static java.lang.String.valueOf;
019    import static javax.swing.tree.TreeSelectionModel.*;
020    import static org.fest.util.Strings.concat;
021    import static org.fest.util.Strings.quote;
022    
023    import java.awt.Component;
024    
025    import javax.swing.JTree;
026    import javax.swing.tree.TreePath;
027    import javax.swing.tree.TreeSelectionModel;
028    
029    import org.fest.util.Arrays;
030    
031    /**
032     * Understands a formatter for <code>{@link JTree}</code>s.
033     *
034     * @author Alex Ruiz
035     */
036    public class JTreeFormatter extends ComponentFormatterTemplate {
037    
038      private static final String[] EMPTY = new String[0];
039      
040      private static final IntEnum SELECTION_MODES = new IntEnum();
041      static {
042        SELECTION_MODES.put(SINGLE_TREE_SELECTION,        "SINGLE_TREE_SELECTION")
043                       .put(CONTIGUOUS_TREE_SELECTION,    "CONTIGUOUS_TREE_SELECTION")
044                       .put(DISCONTIGUOUS_TREE_SELECTION, "DISCONTIGUOUS_TREE_SELECTION");
045      }
046    
047      /**
048       * Returns the <code>String</code> representation of the given <code>{@link Component}</code>, which should be a
049       * <code>{@link JTree}</code> (or subclass.)
050       * @param c the given <code>Component</code>.
051       * @return the <code>String</code> representation of the given <code>JTree</code>.
052       */
053      protected String doFormat(Component c) {
054        JTree tree = (JTree)c;
055        return concat(
056            tree.getClass().getName(), "[",
057            "name=",           quote(tree.getName()),               ", ",
058            "selectionCount=", valueOf(tree.getSelectionCount()),   ", ",
059            "selectionPaths=", Arrays.format(selectionPaths(tree)), ", ",
060            "selectionMode=",  selectionMode(tree),                 ", ",
061            "enabled=",        valueOf(tree.isEnabled()),           ", ",
062            "visible=",        valueOf(tree.isVisible()),           ", ",
063            "showing=",        valueOf(tree.isShowing()), 
064            "]"
065        );
066      }
067    
068      private String[] selectionPaths(JTree tree) {
069        TreePath[] paths = tree.getSelectionPaths();
070        if (paths == null) return EMPTY;
071        int count = paths.length;
072        if (count == 0) return EMPTY;
073        String[] pathArray = new String[count];
074        for (int i = 0; i < count; i++) {
075          TreePath path = paths[i];
076          pathArray[i] = path != null ? path.toString() : null;
077        }
078        return pathArray;
079      }
080    
081      private String selectionMode(JTree tree) {
082        TreeSelectionModel model = tree.getSelectionModel();
083        return SELECTION_MODES.get(model.getSelectionMode());
084      }
085    
086      /**
087       * Indicates that this formatter supports <code>{@link JTree}</code> only.
088       * @return <code>JTree.class</code>.
089       */
090      public Class<? extends Component> targetType() {
091        return JTree.class;
092      }
093    }