/*
* CommandLineHistory.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.client.common;
import com.google.gwt.user.client.ui.HasText;
import org.rstudio.core.client.StringUtil;
import java.util.ArrayList;
public class CommandLineHistory
{
public CommandLineHistory(HasText input)
{
input_ = input;
}
public void setHistory(ArrayList<String> history)
{
history_.clear();
for (String entry : history)
addToHistory(entry);
resetPosition();
}
public void addToHistory(String command)
{
if (StringUtil.isNullOrEmpty(command))
return;
if (history_.size() > 0
&& command.equals(history_.get(history_.size() - 1)))
{
// do not allow dupes
return;
}
history_.add(command);
}
public void navigateHistory(int offset)
{
int newPos = getPositionAtOffset(offset);
if (newPos == historyPos_)
return; // no-op due to boundary limits
if (historyPos_ == history_.size())
{
historyTail_ = input_.getText();
}
input_.setText(
newPos < history_.size() ? history_.get(newPos) :
historyTail_ != null ? historyTail_ :
"");
historyPos_ = newPos;
}
public String getHistoryEntry(int offset)
{
int pos = getPositionAtOffset(offset);
return history_.get(pos);
}
public void resetPosition()
{
historyPos_ = history_.size();
historyTail_ = "";
}
private int getPositionAtOffset(int offset)
{
int pos = historyPos_ + offset;
return Math.max(0, Math.min(pos, history_.size()));
}
private final ArrayList<String> history_ = new ArrayList<String>() ;
private int historyPos_ ;
// If you start typing a command, then go up in history, then go down,
// then what you had previously typed should still be there. This is
// that value--it is loaded/saved whenever history nagivation takes you
// into/out of that final history position (history_.size()).
private String historyTail_;
private final HasText input_;
}