001/**
002 * Copyright 2003-2004 The Apache Software Foundation
003 * Copyright 2005 Stephen McConnell
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package net.dpml.cli.option;
018
019import java.util.Comparator;
020import java.util.Set;
021
022import net.dpml.cli.HelpLine;
023import net.dpml.cli.Option;
024
025/**
026 * Represents a line in the help screen.
027 * @author <a href="@PUBLISHER-URL@">@PUBLISHER-NAME@</a>
028 * @version @PROJECT-VERSION@
029 */
030public class HelpLineImpl implements HelpLine
031{
032    /** The option that this HelpLineImpl describes */
033    private final Option m_option;
034
035    /** The level of indenting for this item */
036    private final int m_indent;
037
038    /** The help settings used to obtain the previous usage */
039    private transient Set m_cachedHelpSettings;
040    
041    /** The comparator used to obtain the previous usage */
042    private transient Comparator m_cachedComparator;
043    
044    /** The previously obtained usage */
045    private transient String m_cachedUsage;
046    
047    /**
048     * Creates a new HelpLineImpl to represent a particular Option in the online
049     * help.
050     * 
051     * @param option the Option that the HelpLineImpl describes
052     * @param indent the level of indentation for this line
053     */
054    public HelpLineImpl( final Option option, final int indent )
055    {
056        m_option = option;
057        m_indent = indent;
058    }
059
060    /**
061     * @return The description of the option
062     */
063    public String getDescription() 
064    {
065        return m_option.getDescription();
066    }
067
068    /**
069     * @return The level of indentation for this line
070     */
071    public int getIndent()
072    {
073        return m_indent;
074    }
075
076    /**
077     * @return The Option that the help line relates to
078     */
079    public Option getOption()
080    {
081        return m_option;
082    }
083    
084    /**
085     * Builds a usage string for the option using the specified settings and 
086     * comparator.
087     * 
088     * @param helpSettings the settings to apply
089     * @param comparator a comparator to sort options when applicable
090     * @return the usage string
091     */
092    public String usage( final Set helpSettings, final Comparator comparator )
093    {
094        if( m_cachedUsage == null
095            || m_cachedHelpSettings != helpSettings
096            || m_cachedComparator != comparator ) 
097        {
098            
099            // cache the arguments to avoid redoing work
100            m_cachedHelpSettings = helpSettings;
101            m_cachedComparator = comparator;
102            
103            // build the new buffer
104            final StringBuffer buffer = new StringBuffer();
105            for( int i = 0; i < m_indent; ++i )
106            {
107                buffer.append( "  " );
108            }
109            m_option.appendUsage( buffer, helpSettings, comparator );
110            
111            // cache the usage string
112            m_cachedUsage = buffer.toString();
113        }
114        return m_cachedUsage;
115    }
116}