/*******************************************************************************
 * Copyright (c) 2006, 2021 Wind River Systems, Inc. and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Michael Scharf (Wind River) - initial API and implementation
 * Martin Oberhuber (Wind River) - fixed copyright headers and beautified
 * Martin Oberhuber (Wind River) - [204796] Terminal should allow setting the encoding to use
 * Martin Oberhuber (Wind River) - [265352][api] Allow setting fonts programmatically
 * Davy Landman (CWI) - [475267][api] Allow custom mouse listeners
 ******************************************************************************/
package org.eclipse.tm.internal.terminal.control;

import java.io.UnsupportedEncodingException;

import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Control;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalConnector;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;

/**
 * @author Michael Scharf
 *
 * @noextend This interface is not intended to be extended by clients.
 * @noimplement This interface is not intended to be implemented by clients.
 */
public interface ITerminalViewControl {
	/**
	 * Set the encoding that the Terminal uses to decode byte streams into
	 * characters.
	 *
	 * @see ITerminalControl#setEncoding(String)
	 * @since org.eclipse.tm.terminal 2.0
	 */
	void setEncoding(String encoding) throws UnsupportedEncodingException;

	/**
	 * Get the Terminal's current encoding.
	 *
	 * @return the current Encoding of the Terminal.
	 * @see ITerminalControl#getEncoding()
	 * @since org.eclipse.tm.terminal 2.0
	 */
	String getEncoding();

	boolean isEmpty();

	/**
	 * Sets the Terminal font
	 * @deprecated use {@link #setFont(String)} in order to support bold and italic variants of the given font
	 * @param font
	 */
	@Deprecated
	void setFont(Font font);

	/**
	 * Sets the font for the Terminal, using a JFace symbolic font name, such
	 * that bold and italic variants can be leveraged.
	 * @since 3.2
	 * @param fontName
	 */
	void setFont(String fontName);

	void setInvertedColors(boolean invert);

	/**
	 * @since 5.1
	 */
	boolean isInvertedColors();

	Font getFont();

	/**
	 * @return the text control
	 */
	Control getControl();

	/**
	 * @return the root of all controls
	 */
	Control getRootControl();

	boolean isDisposed();

	void selectAll();

	void clearTerminal();

	void copy();

	void paste();

	String getSelection();

	TerminalState getState();

	Clipboard getClipboard();

	void disconnectTerminal();

	void disposeTerminal();

	String getSettingsSummary();

	ITerminalConnector[] getConnectors();

	void setFocus();

	ITerminalConnector getTerminalConnector();

	void setConnector(ITerminalConnector connector);

	void connectTerminal();

	/**
	 * @param write a single character to terminal
	 */
	void sendKey(char arg0);

	/**
	 * @param string write string to terminal
	 */
	public boolean pasteString(String string);

	boolean isConnected();

	/**
	 * @param inputField null means no input field is shown
	 */
	void setCommandInputField(ICommandInputField inputField);

	/**
	 * @return null or the current input field
	 */
	ICommandInputField getCommandInputField();

	/**
	 * @return the maximum number of lines to display
	 * in the terminal view. -1 means unlimited.
	 */
	public int getBufferLineLimit();

	/**
	 * @param bufferLineLimit the maximum number of lines to show
	 * in the terminal view. -1 means unlimited.
	 */
	public void setBufferLineLimit(int bufferLineLimit);

	boolean isScrollLock();

	void setScrollLock(boolean on);

	/**
	 * @since 4.1
	 */
	void addMouseListener(ITerminalMouseListener listener);

	/**
	 * @since 4.1
	 */
	void removeMouseListener(ITerminalMouseListener listener);

	/**
	 * @since 5.1
	 */
	void setTerminalTitle(String newTitle);
}
