//# 0 errors, 75 messages
//#
/*
    //#MircStyle.java:1:1: class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#MircStyle.java:1:1: method: com.dmdirc.addons.tabcompletion_mirc.MircStyle.com.dmdirc.addons.tabcompletion_mirc.MircStyle__static_init
 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.addons.tabcompletion_mirc;

import com.dmdirc.Channel;
import com.dmdirc.ui.input.AdditionalTabTargets;
import com.dmdirc.ui.input.TabCompleter;
import com.dmdirc.ui.input.TabCompleterResult;
import com.dmdirc.ui.input.tabstyles.TabCompletionResult;
import com.dmdirc.ui.input.tabstyles.TabCompletionStyle;
import com.dmdirc.ui.interfaces.InputWindow;

import java.awt.Toolkit;
import java.util.List;

public class MircStyle implements TabCompletionStyle {
    
    /** The last set of results we retrieved. */
    private List<String> lastResult;
    
    /** The last word that was tab completed. */
    private String lastWord;
    
    /** The tab completer that we use. */
    protected final TabCompleter tabCompleter;

    /** The input window that we use. */
    protected final InputWindow window;

    /**
     * Creates a new mIRC-style tab completer.
     *
     * @param completer The tab completer this style is for
     * @param window The window this tab style is for
     */
    public MircStyle(final TabCompleter completer, final InputWindow window) {
    //#MircStyle.java:56: method: void com.dmdirc.addons.tabcompletion_mirc.MircStyle.com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)
    //#input(void com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)): completer
    //#input(void com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)): this
    //#input(void com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)): window
    //#output(void com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)): this.tabCompleter
    //#output(void com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)): this.window
    //#post(void com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)): this.tabCompleter == completer
    //#post(void com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)): init'ed(this.tabCompleter)
    //#post(void com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)): this.window == window
    //#post(void com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)): init'ed(this.window)
        this.tabCompleter = completer;
        this.window = window;
    }
    //#MircStyle.java:59: end of method: void com.dmdirc.addons.tabcompletion_mirc.MircStyle.com.dmdirc.addons.tabcompletion_mirc.MircStyle(TabCompleter, InputWindow)
    
    /** {@inheritDoc} */
    @Override
    public TabCompletionResult getResult(final String original, final int start,
            final int end, final AdditionalTabTargets additional) {
        
        final String word = original.substring(start, end);
    //#MircStyle.java:66: method: TabCompletionResult com.dmdirc.addons.tabcompletion_mirc.MircStyle.getResult(String, int, int, AdditionalTabTargets)
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): ""._tainted
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): additional
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): end
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): original
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): original._tainted
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): start
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): this
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): this.lastResult
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): this.lastWord
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): this.tabCompleter
    //#input(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): this.window
    //#output(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): new TabCompletionResult(getResult#1) num objects
    //#output(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): return_value
    //#output(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): this.lastResult
    //#output(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): this.lastWord
    //#new obj(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): new TabCompletionResult(getResult#1)
    //#pre[4] (TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): init'ed(this.lastWord)
    //#pre[5] (TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): original != null
    //#pre[3] (TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): (soft) this.lastResult != null
    //#pre[9] (TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): (soft) this.tabCompleter != null
    //#pre[10] (TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): (soft) this.window != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): com.dmdirc.Channel:getChannelInfo(...)@80 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): com.dmdirc.Channel:getChannelInfo(...)@83 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): com.dmdirc.parser.irc.ChannelInfo:getName(...)@80 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): com.dmdirc.parser.irc.ChannelInfo:getName(...)@83 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): com.dmdirc.ui.input.TabCompleter:complete(...)@74 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): com.dmdirc.ui.input.TabCompleterResult:getResults(...)@85 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): com.dmdirc.ui.interfaces.InputWindow:getContainer(...)@80 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): com.dmdirc.ui.interfaces.InputWindow:getContainer(...)@83 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): java.awt.Toolkit:getDefaultToolkit(...)@77 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): java.util.List:get(...)@71 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): java.util.List:get(...)@85 != null
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): java.util.List:size(...)@71 != 0
    //#presumption(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): start + java.lang.String:length(...)@93 in {-2_147_483_648..4_294_967_295}
    //#post(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): return_value in Addr_Set{null,&new TabCompletionResult(getResult#1)}
    //#post(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): init'ed(this.lastResult)
    //#post(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): init'ed(this.lastWord)
    //#post(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): new TabCompletionResult(getResult#1) num objects <= 1
    //#test_vector(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): com.dmdirc.ui.input.TabCompleterResult:getResultCount(...)@76: {-2_147_483_648..-1, 1..4_294_967_295}, {0}
    //#test_vector(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): java.lang.String:equals(...)@69: {0}, {1}
    //#test_vector(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): java.lang.String:length(...)@80: {0}, {1..4_294_967_295}
    //#test_vector(TabCompletionResult getResult(String, int, int, AdditionalTabTargets)): java.lang.String:startsWith(...)@80: {0}, {1}
        String target = "";
    //#MircStyle.java:67: Warning: unused assignment
    //#    Unused assignment into target
    //#    severity: LOW
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
        
        if (word.equals(lastWord)) {
            // We're continuing to tab through
            target = lastResult.get((lastResult.indexOf(lastWord) + 1) % lastResult.size());
        } else {
            // New tab target
            final TabCompleterResult res = tabCompleter.complete(word, additional);
    //#MircStyle.java:74: Warning: method not available - call not analyzed
    //#    call on TabCompleterResult com.dmdirc.ui.input.TabCompleter:complete(String, AdditionalTabTargets)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: TabCompleterResult com.dmdirc.ui.input.TabCompleter:complete(String, AdditionalTabTargets)
            
            if (res.getResultCount() == 0) {
    //#MircStyle.java:76: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.ui.input.TabCompleterResult:getResultCount()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: int com.dmdirc.ui.input.TabCompleterResult:getResultCount()
                Toolkit.getDefaultToolkit().beep();
                return null;
            } else {
                if (word.length() > 0 && window.getContainer() instanceof Channel
    //#MircStyle.java:80: Warning: method not available - call not analyzed
    //#    call on WritableFrameContainer com.dmdirc.ui.interfaces.InputWindow:getContainer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: WritableFrameContainer com.dmdirc.ui.interfaces.InputWindow:getContainer()
    //#MircStyle.java:80: Warning: method not available - call not analyzed
    //#    call on ChannelInfo com.dmdirc.Channel:getChannelInfo()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: ChannelInfo com.dmdirc.Channel:getChannelInfo()
    //#MircStyle.java:80: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
                        && ((Channel) window.getContainer())
                        .getChannelInfo().getName().startsWith(word)) {
                    target = ((Channel) window.getContainer()).getChannelInfo().getName();
    //#MircStyle.java:83: Warning: method not available - call not analyzed
    //#    call on WritableFrameContainer com.dmdirc.ui.interfaces.InputWindow:getContainer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: WritableFrameContainer com.dmdirc.ui.interfaces.InputWindow:getContainer()
    //#MircStyle.java:83: Warning: method not available - call not analyzed
    //#    call on ChannelInfo com.dmdirc.Channel:getChannelInfo()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: ChannelInfo com.dmdirc.Channel:getChannelInfo()
    //#MircStyle.java:83: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
                } else {
                    target = res.getResults().get(0);
    //#MircStyle.java:85: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.ui.input.TabCompleterResult:getResults()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: List com.dmdirc.ui.input.TabCompleterResult:getResults()
                }
                lastResult = res.getResults();
    //#MircStyle.java:87: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.ui.input.TabCompleterResult:getResults()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: List com.dmdirc.ui.input.TabCompleterResult:getResults()
            }
        }
        
        lastWord = target;
        
        return new TabCompletionResult(original.substring(0, start) + target
    //#MircStyle.java:93: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.tabstyles.TabCompletionResult(String, int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
    //#    method: TabCompletionResult getResult(String, int, int, AdditionalTabTargets)
    //#    unanalyzed callee: void com.dmdirc.ui.input.tabstyles.TabCompletionResult(String, int)
    //#MircStyle.java:93: end of method: TabCompletionResult com.dmdirc.addons.tabcompletion_mirc.MircStyle.getResult(String, int, int, AdditionalTabTargets)
                + original.substring(end), start + target.length());
    }

}    //#output(com.dmdirc.addons.tabcompletion_mirc.MircStyle__static_init): __Descendant_Table[com/dmdirc/addons/tabcompletion_mirc/MircStyle]
    //#output(com.dmdirc.addons.tabcompletion_mirc.MircStyle__static_init): __Dispatch_Table.getResult(Ljava/lang/String;IILcom/dmdirc/ui/input/AdditionalTabTargets;)Lcom/dmdirc/ui/input/tabstyles/TabCompletionResult;
    //#post(com.dmdirc.addons.tabcompletion_mirc.MircStyle__static_init): __Descendant_Table[com/dmdirc/addons/tabcompletion_mirc/MircStyle] == &__Dispatch_Table
    //#post(com.dmdirc.addons.tabcompletion_mirc.MircStyle__static_init): __Dispatch_Table.getResult(Ljava/lang/String;IILcom/dmdirc/ui/input/AdditionalTabTargets;)Lcom/dmdirc/ui/input/tabstyles/TabCompletionResult; == &getResult
    //#MircStyle.java:: end of method: com.dmdirc.addons.tabcompletion_mirc.MircStyle.com.dmdirc.addons.tabcompletion_mirc.MircStyle__static_init
    //#MircStyle.java:: end of class: com.dmdirc.addons.tabcompletion_mirc.MircStyle
