/*******************************************************************************
 * Copyright (c) 2000, 2017 IBM Corporation and others.
 *
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.custom;

import java.util.function.*;

import org.eclipse.swt.internal.*;

/**
 * Classes which implement this interface provide methods
 * that deal with the events that are generated by the CTabFolder
 * control.
 * <p>
 * After creating an instance of a class that implements
 * this interface it can be added to a CTabFolder using the
 * <code>addCTabFolder2Listener</code> method and removed using
 * the <code>removeCTabFolder2Listener</code> method. When
 * events occurs in a CTabFolder the appropriate method
 * will be invoked.
 * </p>
 *
 * @see CTabFolder2Adapter
 * @see CTabFolderEvent
 *
 * @since 3.0
 */
public interface CTabFolder2Listener extends SWTEventListener {

/**
 * Sent when the user clicks on the close button of an item in the CTabFolder.
 * The item being closed is specified in the event.item field.
 * Setting the event.doit field to false will stop the CTabItem from closing.
 * When the CTabItem is closed, it is disposed.  The contents of the
 * CTabItem (see CTabItem.setControl) will be made not visible when
 * the CTabItem is closed.
 *
 * @param event an event indicating the item being closed
 */
public void close(CTabFolderEvent event);

/**
 * Sent when the user clicks on the minimize button of a CTabFolder.
 * The state of the CTabFolder does not change automatically - it
 * is up to the application to change the state of the CTabFolder
 * in response to this event using CTabFolder.setMinimized(true).
 *
 * @param event an event containing information about the minimize
 *
 * @see CTabFolder#getMinimized()
 * @see CTabFolder#setMinimized(boolean)
 * @see CTabFolder#setMinimizeVisible(boolean)
 */
public void minimize(CTabFolderEvent event);

/**
 * Sent when the user clicks on the maximize button of a CTabFolder.
 * The state of the CTabFolder does not change automatically - it
 * is up to the application to change the state of the CTabFolder
 * in response to this event using CTabFolder.setMaximized(true).
 *
 * @param event an event containing information about the maximize
 *
 * @see CTabFolder#getMaximized()
 * @see CTabFolder#setMaximized(boolean)
 * @see CTabFolder#setMaximizeVisible(boolean)
 */
public void maximize(CTabFolderEvent event);

/**
 * Sent when the user clicks on the restore button of a CTabFolder.
 * This event is sent either to restore the CTabFolder from the
 * minimized state or from the maximized state.  To determine
 * which restore is requested, use CTabFolder.getMinimized() or
 * CTabFolder.getMaximized() to determine the current state.
 * The state of the CTabFolder does not change automatically - it
 * is up to the application to change the state of the CTabFolder
 * in response to this event using CTabFolder.setMaximized(false)
 * or CTabFolder.setMinimized(false).
 *
 * @param event an event containing information about the restore
 *
 * @see CTabFolder#getMinimized()
 * @see CTabFolder#getMaximized()
 * @see CTabFolder#setMinimized(boolean)
 * @see CTabFolder#setMinimizeVisible(boolean)
 * @see CTabFolder#setMaximized(boolean)
 * @see CTabFolder#setMaximizeVisible(boolean)
 */
public void restore(CTabFolderEvent event);

/**
 * Sent when the user clicks on the chevron button of the CTabFolder.
 * A chevron appears in the CTabFolder when there are more tabs
 * than can be displayed at the current widget size.  To select a
 * tab that is not currently visible, the user clicks on the
 * chevron and selects a tab item from a list.  By default, the
 * CTabFolder provides a list of all the items that are not currently
 * visible, however, the application can provide its own list by setting
 * the event.doit field to <code>false</code> and displaying a selection list.
 *
 * @param event an event containing information about the show list
 *
 * @see CTabFolder#setSelection(CTabItem)
 */
public void showList(CTabFolderEvent event);

/**
 * Static helper method to create a <code>CTabFolder2Listener</code> for the
 * {@link #close(CTabFolderEvent e)}) method, given a lambda expression or a method reference.
 *
 * @param c the consumer of the event
 * @return CTabFolder2Listener
 * @since 3.107
 */
public static CTabFolder2Listener closeAdapter(Consumer<CTabFolderEvent> c) {
	return new CTabFolder2Adapter() {
		@Override
		public void close(CTabFolderEvent e) {
			c.accept(e);
		}
	};
}

/**
 * Static helper method to create a <code>CTabFolder2Listener</code> for the
 * {@link #minimize(CTabFolderEvent e)}) method, given a lambda expression or a method reference.
 *
 * @param c the consumer of the event
 * @return CTabFolder2Listener
 * @since 3.107
 */
public static CTabFolder2Listener minimizeAdapter(Consumer<CTabFolderEvent> c) {
	return new CTabFolder2Adapter() {
		@Override
		public void minimize(CTabFolderEvent e) {
			c.accept(e);
		}
	};
}

/**
 * Static helper method to create a <code>CTabFolder2Listener</code> for the
 * {@link #maximize(CTabFolderEvent e)}) method, given a lambda expression or a method reference.
 *
 * @param c the consumer of the event
 * @return CTabFolder2Listener
 * @since 3.107
 */
public static CTabFolder2Listener maximizeAdapter(Consumer<CTabFolderEvent> c) {
	return new CTabFolder2Adapter() {
		@Override
		public void maximize(CTabFolderEvent e) {
			c.accept(e);
		}
	};
}

/**
 * Static helper method to create a <code>CTabFolder2Listener</code> for the
 * {@link #restore(CTabFolderEvent e)}) method, given a lambda expression or a method reference.
 *
 * @param c the consumer of the event
 * @return CTabFolder2Listener
 * @since 3.107
 */
public static CTabFolder2Listener restoreAdapter(Consumer<CTabFolderEvent> c) {
	return new CTabFolder2Adapter() {
		@Override
		public void restore(CTabFolderEvent e) {
			c.accept(e);
		}
	};
}

/**
 * Static helper method to create a <code>CTabFolder2Listener</code> for the
 * {@link #showList(CTabFolderEvent e)}) method, given a lambda expression or a method reference.
 *
 * @param c the consumer of the event
 * @return CTabFolder2Listener
 * @since 3.107
 */
public static CTabFolder2Listener showListAdapter(Consumer<CTabFolderEvent> c) {
	return new CTabFolder2Adapter() {
		@Override
		public void showList(CTabFolderEvent e) {
			c.accept(e);
		}
	};
}
}
