/*******************************************************************************
* Copyright (c) 2009 Andrey Loskutov.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* Contributor: Andrey Loskutov - initial API and implementation
*******************************************************************************/
package de.loskutov.anyedit;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
/**
* A participant in "open file" action, which is capable to guess the file/line and/or
* open appropriated editor based on provided information.
* <p>
* The method of participants would be called in the followed order:
* guessFile->openEditor->guessLine
* <p>
* Because there might be multiple participants with same priority, the order of operation
* might be undefined. If one of participants was successful in guessing the file/opening
* the editor, other participants would be ignored.
*
* @author Andrey
*/
public interface IOpenEditorParticipant {
/** default prio with value 5 */
int PRIO_DEFAULT = 5;
/** low prio with value 0 */
int PRIO_LOW = 0;
/** high prio with value 10 */
int PRIO_HIGH = 10;
/**
* Try to guess file under cursor
*
* @param doc
* document with possible editor/file reference, might be null
* @param selectionProvider
* selection in the document, might be null or empty
* @param currentInput
* document input, might be null
* @param currentPart
* current part, if any (might be null)
* @return null if no file information was found, otherwise the file object
* @throws OperationCanceledException
* if user decided to cancel operation
*/
IFile guessFile(IDocument doc, ISelectionProvider selectionProvider,
IEditorInput currentInput, IWorkbenchPart currentPart)
throws OperationCanceledException;
/**
* Opens editor
* <p>
* There is always at least one default participant which is capable to open file if
* it is not null, therefore it is ok to return null in this case and don't
* reimplement the standart file opening strategy.
*
* @param doc
* document with possible editor/file reference, might be null
* @param selectionProvider
* selection in the document, might be null or empty
* @param currentInput
* document input, might be null
* @param file
* document file, might be null
* @return null if editor part was not opened, otherwise opened editor reference.
* @throws OperationCanceledException
* if user decided to cancel operation
*/
IEditorPart openEditor(IDocument doc, ISelectionProvider selectionProvider,
IEditorInput currentInput, IFile file) throws OperationCanceledException;
/**
* Try to guess the line under cursor. Would be called only if the editor part was
* opened.
*
* @param doc
* document with possible line reference, might be null
* @param selectionProvider
* selection in the document, might be null or empty
* @param currentPart
* might be null, the sourse part from where we trying to guess the line
* information, NOT the target part which is opened before
* @return -1 if operation was not successful, otherwise the line number
* @throws OperationCanceledException
* if user decided to cancel operation
*/
int guessLine(IDocument doc, ISelectionProvider selectionProvider,
IWorkbenchPart currentPart) throws OperationCanceledException;
/**
* Priority defines the order of participation, the range is PRIO_LOW to PRIO_HIGH,
* participant with prio PRIO_HIGH is the first participant. If there are more then
* one participant, then order is not guaranteed. It is recommended to use
* PRIO_DEFAULT as default :)
*
* @return one of PRIO_* constants
*/
int getPriority();
}