/*******************************************************************************
 * Copyright (c) 2012 Rushan R. Gilmullin 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:
 *     Rushan R. Gilmullin - initial API and implementation
 *******************************************************************************/

package org.eclipse.osbp.e4extension.service;

import org.eclipse.e4.ui.model.application.descriptor.basic.MPartDescriptor;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.basic.MInputPart;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;

import e4modelextension.EditorPartDescriptor;

/**
 * @author rushan
 *
 */
public interface EPartServiceExt {
	public static interface PartAddLogic {
		void addMPart(MPart mpart);
	}

	/**
	 * Creates a new input part of the given id.
	 * 
	 * @param id
	 *            the identifier of the part, must not be <code>null</code>
	 * @return a new part of the given id, or <code>null</code> if no part
	 *         descriptors can be found that match the specified id
	 */
	MInputPart createInputPart(String id);

	MPartDescriptor findDescriptor(String id);

	EditorPartDescriptor findEditorPartDescriptorUsingId(String id);

	EditorPartDescriptor findEditorPartDescriptor(String inputUri);

	/**
	 * Open the given uri in area with id = org.eclipse.ui.editorss (eclipse
	 * conditions)
	 * 
	 * @param inputUri
	 *            given uri
	 * @return part that was opened or finded with this uri
	 */
	MInputPart openUri(String inputUri);

	/**
	 * Open the given uri in area with id = org.eclipse.ui.editorss (eclipse
	 * conditions) in editor with given descriptor
	 */
	MInputPart openUri(String inputUri, EditorPartDescriptor descriptor);

	MInputPart openUri(String inputUri, String editorDescriptorId);

	/**
	 * Open given uri in given are
	 * 
	 * @param area
	 * @param inputUri
	 * @return
	 */
	MInputPart openUri(MElementContainer<?> area, String inputUri);

	MInputPart openUri(String inputUri,
			EditorPartDescriptor editorPartDescriptor, MElementContainer<?> area);

	void closeUri(String inputUri, boolean saveBeforeClose);

	MInputPart openNewEditor(EditorPartDescriptor descriptor);

	MInputPart openNewEditor(String descriptorId);

	/**
	 * Fixed method EPartService.showPart. Current method search any opened
	 * shared part and if allowMultiples == false (default) it create
	 * placeholder on this part rather creating new. The differences from
	 * original showPart is that it search shared part in any perspective, the
	 * original showPart search shared part in active perspective. I can not say
	 * is this bug or general contract of this method...
	 * 
	 * @param id
	 * @param partState
	 * @return
	 */
	MPart showPart(String id, PartState partState);
}
