package org.nightlabs.jfire.issuetracking.trade.ui.issuelink;
import java.util.Collection;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.IFormPage;
import org.nightlabs.base.ui.entity.editor.EntityEditor;
import org.nightlabs.base.ui.entity.editor.EntityEditorPageControllerModifyEvent;
import org.nightlabs.base.ui.entity.editor.EntityEditorPageWithProgress;
import org.nightlabs.base.ui.entity.editor.IEntityEditorPageController;
import org.nightlabs.base.ui.entity.editor.IEntityEditorPageFactory;
import org.nightlabs.base.ui.resource.SharedImages;
import org.nightlabs.base.ui.wizard.DynamicPathWizardDialog;
import org.nightlabs.jfire.issue.Issue;
import org.nightlabs.jfire.issuetracking.trade.ui.IssueTrackingTradePlugin;
import org.nightlabs.jfire.issuetracking.trade.ui.resource.Messages;
import org.nightlabs.jfire.issuetracking.ui.issue.IssueTable;
import org.nightlabs.jfire.issuetracking.ui.issuelink.attach.AttachIssueToObjectWizard;
/**
* @author Chairat Kongarayawetchakun - chairat at nightlabs dot de
*
*/
public class ShowLinkedIssuePage
extends EntityEditorPageWithProgress
{
public static class Factory implements IEntityEditorPageFactory {
@Override
public IFormPage createPage(FormEditor formEditor) {
return new ShowLinkedIssuePage(formEditor);
}
@Override
public IEntityEditorPageController createPageController(EntityEditor editor) {
return new ShowLinkedIssuePageController(editor);
}
}
private ShowLinkedIssueSection showLinkedIssueSection;
public static final String PAGE_ID = ShowLinkedIssuePage.class.getName();
/**
* @param editor
*/
public ShowLinkedIssuePage(FormEditor editor) {
super(editor, PAGE_ID, Messages.getString("org.nightlabs.jfire.issuetracking.trade.ui.issuelink.ShowLinkedIssuePage.title")); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.nightlabs.base.ui.entity.editor.EntityEditorPageWithProgress#addSections(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void addSections(Composite parent) {
final ShowLinkedIssuePageController controller = (ShowLinkedIssuePageController) getPageController();
showLinkedIssueSection = new ShowLinkedIssueSection(this, parent, controller);
showLinkedIssueSection.getSection().setLayoutData(new GridData(GridData.FILL_BOTH));
getManagedForm().addPart(showLinkedIssueSection);
createContextMenu();
if (controller.isLoaded()) {
showLinkedIssueSection.setLinkedIssues(controller.getLinkedIssues());
}
}
private MenuManager menuMgr;
private IssueLinkActionRemove issueLinkActionRemove;
private void createContextMenu() {
issueLinkActionRemove = new IssueLinkActionRemove(showLinkedIssueSection.getIssueTable(), (ShowLinkedIssuePageController)getPageController(), this);
menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager m) {
menuMgr.add(new LinkToIssueAction(getController().getArticleContainer()));
menuMgr.add(issueLinkActionRemove);
}
});
Menu menu = menuMgr.createContextMenu(showLinkedIssueSection.getIssueTable());
showLinkedIssueSection.getIssueTable().setMenu(menu);
getSite().registerContextMenu(menuMgr, showLinkedIssueSection.getIssueTable());
showLinkedIssueSection.getIssueTable().addSelectionChangedListener(new ISelectionChangedListener(){
@Override
public void selectionChanged(SelectionChangedEvent event) {
handleRemoveAction();
}
});
}
protected void handleRemoveAction() {
assert issueLinkActionRemove != null;
issueLinkActionRemove.setEnabled( showLinkedIssueSection.getIssueTable().getSelectionIndex() >= 0 );
}
@Override
protected void handleControllerObjectModified(EntityEditorPageControllerModifyEvent modifyEvent) {
switchToContent();
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
if (showLinkedIssueSection != null && !showLinkedIssueSection.getSection().isDisposed()) {
// Update the IssueTable.
Collection<Issue> issues = getController().getLinkedIssues();
showLinkedIssueSection.setLinkedIssues( issues );
// Now highlight the entry if a selectedIssue exists.
if (selectedIssue != null) {
IssueTable issueTable = showLinkedIssueSection.getIssueTable();
int index = -1;
issueTable.refresh(true);
issueTable.getTableViewer().getTable().setSelection(index);
issues = issueTable.getElements(); // <-- Doesnt seem to return the correct values here; retrieved them from cache... So how??
for(Issue issueElem : issues) {
index++;
if ( issueElem.equals(selectedIssue) ) {
issueTable.getTableViewer().getTable().setSelection(index);
break;
}
}
selectedIssue = null;
}
}
handleRemoveAction();
}
});
}
@Override
protected String getPageFormTitle() {
return Messages.getString("org.nightlabs.jfire.issuetracking.trade.ui.issuelink.ShowLinkedIssuePage.pageFormTitle"); //$NON-NLS-1$
}
protected ShowLinkedIssuePageController getController() {
return (ShowLinkedIssuePageController)getPageController();
}
private Issue selectedIssue = null;
public void setHighlightIssueEntry(Issue issue) { selectedIssue = issue; }
// -----------------------------------------------------------------------------------------------------------------------------------|
private class LinkToIssueAction extends Action {
private Object linkedObject;
public LinkToIssueAction(Object linkedObject) {
this.linkedObject = linkedObject;
setId(LinkToIssueAction.class.getName());
setImageDescriptor(SharedImages.getSharedImageDescriptor(
IssueTrackingTradePlugin.getDefault(),
ShowLinkedIssueSection.class,
"Link")); //$NON-NLS-1$
setToolTipText(Messages.getString("org.nightlabs.jfire.issuetracking.trade.ui.issuelink.ShowLinkedIssuePage.linkAction.tooltip")); //$NON-NLS-1$
setText(Messages.getString("org.nightlabs.jfire.issuetracking.trade.ui.issuelink.ShowLinkedIssuePage.linkAction.text")); //$NON-NLS-1$
}
@Override
public void run() {
AttachIssueToObjectWizard attachIssueToObjectWizard = new AttachIssueToObjectWizard(linkedObject);
DynamicPathWizardDialog dialog = new DynamicPathWizardDialog(getSite().getShell(), attachIssueToObjectWizard)
{
@Override
protected Point getInitialSize()
{
return new Point(convertHorizontalDLUsToPixels(600), convertVerticalDLUsToPixels(450));
}
};
dialog.open();
// Update the table in the Section.
// --> See also: ShowLinkedIssueSection.AddIssueLinkAction, and IssueAttachAction.
// --> These should all somehow be unified, since ALL of their behaviours are the same. Kai.
// --> On second thoughts, maybe not. Since they are, erm, different, even though they are the same. Kai. <-- Hääää??? WTF does this mean?? Kai.
if (dialog.getReturnCode() == Window.OK) { // != Window.CANCEL) {
setHighlightIssueEntry( attachIssueToObjectWizard.getSelectedIssue() ); // <-- Attempt to highlight the latest entry in the table.
// getPageController().doLoad(new NullProgressMonitor()); // <-- This shall be delegated to the issueLinksLifeCycleListener.
}
}
}
}