package org.nightlabs.jfire.issuetracking.ui.issuelink;
import java.util.Set;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.nightlabs.base.ui.message.IErrorMessageDisplayer;
import org.nightlabs.jdo.ObjectID;
import org.nightlabs.jfire.issue.Issue;
import org.nightlabs.jfire.issue.IssueLink;
import org.nightlabs.jfire.issue.IssueLinkType;
import org.nightlabs.progress.ProgressMonitor;
/**
* An interface for all issue link adder things.
*
* <p>
* Implementors are advised not to directly implement this interface but instead subclass {@link AbstractIssueLinkAdder}.
* </p>
*
* @author Chairat Kongarayawetchakun - chairat at nightlabs dot de
*/
public interface IssueLinkAdder extends ISelectionProvider
{
/**
*
* @param handlerFactory
*/
void init(IssueLinkHandlerFactory handlerFactory);
/**
*
* @return
*/
IssueLinkHandlerFactory getIssueLinkHandlerFactory();
/**
* Create the <tt>Composite</tt> which serves the functionality to add
* a {@link org.nightlabs.jfire.base.ui.overview.search.JDOQuerySearchEntryViewer}.
*
* @param parent The parent composite into all GUI elements should be created
* @return The newly created <tt>Composite</tt>
*/
Composite createComposite(Composite parent);
/**
*
* @return The composite of the link adder
*/
Composite getComposite();
/**
* This callback method must be called by a {@link DisposeListener} which is added to your
* composite (created in {@link #createComposite(Composite)}).
*/
void onDispose();
/**
*
* @param listener
*/
void addIssueLinkDoubleClickListener(IssueLinkDoubleClickListener listener);
/**
*
* @param listener
*/
void removeIssueLinkDoubleClickListener(IssueLinkDoubleClickListener listener);
/**
* {@inheritDoc}
*
* <p>
* Since this interface extends {@link ISelectionProvider}, this method needs to be implemented by classes
* implementing <code>IssueLinkAdder</code>. This method is required to return an {@link IStructuredSelection}
* with the same objects as returned by {@link #getLinkedObjectIDs()}.
* </p>
*/
@Override
public IStructuredSelection getSelection();
/**
* Get the selected object ids to be linked to the issue. These objects must be the same as returned by the
* {@link #getSelection()}.
*
* @return the currently selected {@link ObjectID} instances.
*/
Set<ObjectID> getLinkedObjectIDs();
/**
*
* @param issue
* @param issueLinkType
* @param monitor
* @return
*/
Set<IssueLink> createIssueLinks(
Issue issue,
IssueLinkType issueLinkType,
ProgressMonitor monitor);
/**
* Sets the (optional) {@link IErrorMessageDisplayer} to be used by this {@link IssueLinkAdder}.
* IMPORTANT: Implementations can use it for displaying messages or just don't do anything with it,
* if its does not fit for the implementation.
*
* @param errorMessageDisplayer the {@link IErrorMessageDisplayer} to display messages
*/
void setErrorMessageDisplayer(IErrorMessageDisplayer errorMessageDisplayer);
/**
* Returns the (optional) {@link IErrorMessageDisplayer}
* @return the {@link IErrorMessageDisplayer}.
*/
IErrorMessageDisplayer getErrorMessageDisplayer();
}