/*
 * ShellDisplay.java
 *
 * Copyright (C) 2022 by Posit Software, PBC
 *
 * Unless you have received this program directly from Posit Software pursuant
 * to the terms of a commercial license agreement with Posit Software, 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.shell;

import org.rstudio.core.client.ConsoleOutputWriter;
import org.rstudio.core.client.jsonrpc.RpcObjectList;
import org.rstudio.core.client.widget.CanFocus;
import org.rstudio.studio.client.workbench.model.ConsoleAction;
import org.rstudio.studio.client.workbench.views.console.shell.editor.InputEditorDisplay;

import com.google.gwt.event.dom.client.HasKeyPressHandlers;
import com.google.gwt.event.dom.client.HasKeyUpHandlers;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Widget;

public interface ShellDisplay extends ShellOutputWriter, 
                                      CanFocus, 
                                      HasKeyPressHandlers,
                                      HasKeyUpHandlers
{
   void consoleWriteInput(String input, String console, boolean agent);
   void consolePrompt(String prompt, boolean showInput);
   void ensureInputVisible();
   InputEditorDisplay getInputEditorDisplay();
   ConsoleOutputWriter getConsoleOutputWriter();
   void clearOutput();
   String processCommandEntry();
   int getCharacterWidth();
   boolean isPromptEmpty();
   String getPromptText();
   
   void setBusy(boolean busy);

   // Indicates R is blocked waiting for interactive input from the user (e.g.
   // readline(), menu(), scan()) rather than at the normal REPL prompt. Such a
   // prompt clears the busy state, so the two are tracked separately.
   void setWaitingForInput(boolean waiting);

   void setReadOnly(boolean readOnly);
   void setSuppressPendingInput(boolean suppressPendingInput);

   void playbackActions(RpcObjectList<ConsoleAction> actions);

   int getMaxOutputLines();
   void setMaxOutputLines(int maxLines);
   void setTextInputAriaLabel(String label);

   HandlerRegistration addCapturingKeyDownHandler(KeyDownHandler handler);
   HandlerRegistration addCapturingKeyUpHandler(KeyUpHandler handler);
   
   Widget getShellWidget();
   
   void enableLiveReporting();
   void clearLiveRegion();
}
