blob: 37f39cbcc10a43c493bf51ee272e1e3d8d6900c9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2016 THALES GLOBAL SERVICES.
* 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
*
* Contributors:
* Thales - initial API and implementation
*******************************************************************************/
package org.eclipse.amalgam.explorer.activity.ui.api.editor;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
import org.eclipse.amalgam.explorer.activity.ui.ActivityExplorerActivator;
import org.eclipse.amalgam.explorer.activity.ui.api.editor.input.ActivityExplorerEditorInput;
import org.eclipse.amalgam.explorer.activity.ui.api.editor.pages.CommonActivityExplorerPage;
import org.eclipse.amalgam.explorer.activity.ui.api.editor.pages.DocumentationActivityExplorerPage;
import org.eclipse.amalgam.explorer.activity.ui.api.editor.pages.OverviewActivityExplorerPage;
import org.eclipse.amalgam.explorer.activity.ui.api.manager.ActivityExplorerManager;
import org.eclipse.amalgam.explorer.activity.ui.internal.extension.point.manager.ActivityExplorerExtensionManager;
import org.eclipse.amalgam.explorer.activity.ui.internal.intf.IActivityExplorerEditorSessionListener;
import org.eclipse.amalgam.explorer.activity.ui.internal.intf.IVisibility;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.sirius.business.api.session.Session;
import org.eclipse.sirius.business.api.session.SessionListener;
import org.eclipse.sirius.business.api.session.SessionStatus;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.IFormPage;
import org.eclipse.ui.forms.editor.SharedHeaderFormEditor;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
/**
* Base class to implement Activity Explorer.
*/
public class ActivityExplorerEditor extends SharedHeaderFormEditor implements ITabbedPropertySheetPageContributor,
IPropertyChangeListener, IActivityExplorerEditorSessionListener {
/**
* Editor ID.
*/
public static final String ID = "org.eclipse.amalgam.explorer.activity.ui.editor.activityExplorerEditor"; //$NON-NLS-1$
/**
* Part listener to detect editor activation.
*/
private IPartListener _partListener;
/**
* Property Sheet page.
*/
private TabbedPropertySheetPage _propertySheetPage;
public ActivityExplorerEditor() {
ActivityExplorerManager.INSTANCE.setEditor(this);
ActivityExplorerManager.INSTANCE.addActivityExplorerEditorListener(this);
_partListener = new ActivityExplorerEditorPartListener(this);
}
@Override
public void setFocus() {
super.setFocus();
ActivityExplorerManager.INSTANCE.setEditor(this);
}
/**
* @see org.eclipse.ui.forms.editor.FormEditor#addPages()
*/
@Override
protected void addPages() {
try {
// set editor in the Activity Explorer Manager
ActivityExplorerManager.INSTANCE.setEditor(this);
// Add other Pages (plug-ins contribution)
createContributedPages();
} catch (PartInitException exception) {
StringBuilder loggerMessage = new StringBuilder("ActivityExplorerEditor.addPages(..) _ "); //$NON-NLS-1$
loggerMessage.append(exception.getMessage());
Status status = new Status(IStatus.ERROR, ActivityExplorerActivator.ID, loggerMessage.toString(), exception);
ActivityExplorerActivator.getDefault().getLog().log(status);
} catch (Exception exception) {
StringBuilder loggerMessage = new StringBuilder("ActivityExplorerEditor.addPages(..) _ "); //$NON-NLS-1$
loggerMessage.append(exception.getMessage());
Status status = new Status(IStatus.WARNING, ActivityExplorerActivator.ID, loggerMessage.toString(), exception);
ActivityExplorerActivator.getDefault().getLog().log(status);
}
// Add a control listener to force reflow
getContainer().addControlListener(new ControlListener() {
public void controlMoved(ControlEvent cevent) {
// Do nothing.
}
public void controlResized(ControlEvent cevent) {
IFormPage activePageInstance = ActivityExplorerEditor.this.getActivePageInstance();
IManagedForm managedForm = activePageInstance.getManagedForm();
managedForm.reflow(true);
}
});
// Refresh dirty state when the part is activated : open time for
// instance.
getHeaderForm().dirtyStateChanged();
ActivityExplorerActivator.getDefault().getPreferenceStore().addPropertyChangeListener(this);
// because the pages is update later
pages.remove(null);
}
/**
* Returns all pages in the Editor
*
* @return Vector<AbstractActivityExplorerPage>
*/
@SuppressWarnings("unchecked")
public Vector<CommonActivityExplorerPage> getPages() {
return pages;
}
/**
* Remove all Pages contained in this editor.
*/
public void removeAllPages() {
int count = super.getPageCount();
for (int i = 0; i < count; i++) {
this.removePage(0);
}
}
/**
* Create and Insert Contributed pages in the editor
*/
private void createContributedPages() throws PartInitException {
List<CommonActivityExplorerPage> contributedPages = ActivityExplorerExtensionManager.getAllPages();
Collections.sort(contributedPages);
addOverviewPage(contributedPages);
addContributedPages(contributedPages);
}
private void addContributedPages(List<CommonActivityExplorerPage> contributedPages) {
for (CommonActivityExplorerPage page : contributedPages) {
if ((page instanceof IVisibility) && !(page.getPosition() == 0)) {
if (page.isVisible()) {
addNewPage(page);
}
}
}
}
/**
* Find a first visible overview page which it index is 0
*
* @param contributedPages
* @throws PartInitException
*/
private void addOverviewPage(List<CommonActivityExplorerPage> contributedPages) throws PartInitException {
OverviewActivityExplorerPage overviewPage = null;
for (CommonActivityExplorerPage page : contributedPages) {
//Force to accept only overview page at the index 0.
if (page.getPosition() == 0){
//bug 485652: Visibility of overview page. Overview page is always visible event
//it is predicated
if ((page instanceof OverviewActivityExplorerPage)){
overviewPage = (OverviewActivityExplorerPage) page;
break;
} else {
//Log visibile pages with index 0 which are not Overview pages
if (page.isVisible()){
StringBuilder loggerMessage = new StringBuilder("ActivityExplorerEditor.addOverviewPage(..) _ "); //$NON-NLS-1$
loggerMessage.append("Page ").append(page.getId()); //$NON-NLS-1$
loggerMessage.append(" is not an overview page"); //$NON-NLS-1$
Status status = new Status(IStatus.WARNING, ActivityExplorerActivator.ID, loggerMessage.toString());
ActivityExplorerActivator.getDefault().getLog().log(status);
}
}
} else {
//Focus only on pages with index 0.
//The list is sorted, if the first page has an index different from 0, we stop.
break;
}
}
//Add the overview page
if (overviewPage != null){
overviewPage.initialize(this);
} else {
//default page
overviewPage = new OverviewActivityExplorerPage(this);
}
addPage(overviewPage);
}
/**
* Create a documentation page.
*
* @return a not <code>null</code> instance.
*/
protected IFormPage createDocumentationPage() {
return new DocumentationActivityExplorerPage(this);
}
/**
* Get or create the main Overview page
*
* @return a not <code>null</code> instance.
*/
@Deprecated
protected OverviewActivityExplorerPage getOrCreateOverviewActivityExplorerPage() {
List<CommonActivityExplorerPage> contributedPages = ActivityExplorerExtensionManager.getAllPages();
Collections.sort(contributedPages);
if (!contributedPages.isEmpty()) {
CommonActivityExplorerPage page = contributedPages.get(0);
if ((page instanceof OverviewActivityExplorerPage) && (page.getPosition() == 0)) {
page.initialize(this);
return (OverviewActivityExplorerPage) page;
}
}
return new OverviewActivityExplorerPage(this);
}
/**
* @see org.eclipse.ui.forms.editor.FormEditor#dispose()
*/
@Override
public void dispose() {
ActivityExplorerManager.INSTANCE.removeActivityExplorerEditorListener(this);
// Dispose the property sheet page.
if (null != _propertySheetPage) {
_propertySheetPage.dispose();
_propertySheetPage = null;
}
// Unregister Sirius session listener.
unregisterSession();
// Remove part listener.
if (null != _partListener) {
((ActivityExplorerEditorPartListener)_partListener).dispose();
getEditorSite().getPage().removePartListener(_partListener);
_partListener = null;
}
// Remove preference listener
ActivityExplorerActivator.getDefault().getPreferenceStore().removePropertyChangeListener(this);
super.dispose();
if (null != getEditorInput()) {
getEditorInput().dispose();
}
}
/**
* @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void doSave(IProgressMonitor monitor) {
if (isDirty()) {
getEditorInput().getSession().save(new NullProgressMonitor());
}
}
/**
* @see org.eclipse.ui.part.EditorPart#doSaveAs()
*/
@Override
public void doSaveAs() {
// Do nothing.
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("rawtypes")
@Override
public Object getAdapter(Class adapter) {
if (IPropertySheetPage.class.equals(adapter)) {
return getOrCreatePropertySheetPage();
}
return super.getAdapter(adapter);
}
public static final String PROPERTIES_CONTRIBUTOR = "org.eclipse.amalgam.explorer.activity.ui.editor.properties"; //$NON-NLS-1$
/**
* {@inheritDoc}
*/
public String getContributorId() {
return getSite().getId();// PROPERTIES_CONTRIBUTOR;
}
/**
* @see org.eclipse.ui.part.EditorPart#getEditorInput()
*/
@Override
public ActivityExplorerEditorInput getEditorInput() {
return (ActivityExplorerEditorInput) super.getEditorInput();
}
/**
* Get or create (first call) the property sheet page.
*/
private IPropertySheetPage getOrCreatePropertySheetPage() {
if ((null == _propertySheetPage)) {
_propertySheetPage = new TabbedPropertySheetPage(this) {
/**
* {@inheritDoc}
*/
@SuppressWarnings("synthetic-access")
@Override
public void dispose() {
super.dispose();
_propertySheetPage = null;
}
/**
* {@inheritDoc}
*/
@Override
public void init(IPageSite pageSite) {
super.init(pageSite);
pageSite.setSelectionProvider(ActivityExplorerEditor.this.getEditorSite().getSelectionProvider());
}
};
}
return _propertySheetPage;
}
/**
* @see org.eclipse.ui.part.WorkbenchPart#getPartName()
*/
@Override
public String getPartName() {
return getEditorInput().getName() + Messages.ActivityExplorerEditor_Title_Suffix;
}
/**
* Get property sheet page accessor.
*
* @return <code>null</code> if the property sheet view is not displayed.
*/
public TabbedPropertySheetPage getPropertySheetPage() {
return _propertySheetPage;
}
/**
* @see org.eclipse.ui.forms.editor.FormEditor#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
*/
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
IStatus status = ((ActivityExplorerEditorInput) input).getStatus();
if (!status.isOK()) {
throw new PartInitException(status);
}
super.init(site, input);
getEditorSite().getPage().addPartListener(_partListener);
}
/**
* {@inheritDoc}
*/
@Override
public boolean isDirty() {
final Session session = getEditorInput().getSession();
if (null != session) {
return SessionStatus.DIRTY.equals(session.getStatus());
}
return false;
}
/**
* @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
*/
@Override
public boolean isSaveAsAllowed() {
// Not applicable in this editor.
return false;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isSaveOnCloseNeeded() {
// See with SBo, we don't want to save on close.
return false;
}
/**
* Unregister the session listener and set the session to <code>null</code>.
*/
private void unregisterSession() {
ActivityExplorerEditorInput editorInput = getEditorInput();
if (null != editorInput) {
Session session = editorInput.getSession();
if (null != session) {
session = null;
}
}
}
/**
* {@inheritDoc}
*/
@Override
public Image getTitleImage() {
ILabelDecorator decorator = PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator();
Image decoratedImage = decorator.decorateImage(super.getTitleImage(), getEditorInput().getSession());
return decoratedImage;
}
/**
* {@inheritDoc}
*/
@Override
protected void setTitleImage(Image titleImage) {
super.setTitleImage(titleImage);
}
private int addNewPage(IFormPage page) {
int index = 0;
page.initialize(this);
try {
index = addPage(page);
} catch (PartInitException e) {
StringBuilder loggerMessage = new StringBuilder("ActivityExplorerEditor.addNewPage(..) _ "); //$NON-NLS-1$
loggerMessage.append(e.getMessage());
Status status = new Status(IStatus.ERROR, ActivityExplorerActivator.ID, loggerMessage.toString(), e);
ActivityExplorerActivator.getDefault().getLog().log(status);
}
return index;
}
/**
* Get the previous page
*
* @param current
* @return the previous page or null
*/
@SuppressWarnings("unchecked")
public IFormPage getPreviousPage(IFormPage current) {
IFormPage previousPage = null;
int i = pages.indexOf(current);
if (i > -1) {
ListIterator<CommonActivityExplorerPage> it = pages.listIterator(i);
if (it.hasPrevious()) {
previousPage = it.previous();
}
}
return previousPage;
}
/**
* Get the next page
*
* @param current
* @return the next page or null
*/
@SuppressWarnings("unchecked")
public IFormPage getNextPage(IFormPage current) {
IFormPage nextPage = null;
int i = pages.indexOf(current);
if (i > -1) {
ListIterator<CommonActivityExplorerPage> it = pages.listIterator(i + 1);
if (it.hasNext()) {
nextPage = it.next();
}
}
return nextPage;
}
/**
* Update the editor Remove and Create pages
*/
public void updateEditorPages(int activatedPage) {
removeAllPages();
addPages();
setActivePage(activatedPage); // we set the page ProcessMap activate
setPartName(getPartName());
}
/**
* Handle property change.<br>
*
* @param event
* @param value
* @param property
* @return boolean
*/
protected boolean doPropertyChange(PropertyChangeEvent event, boolean value, String property) {
boolean result = false;
if (ActivityExplorerExtensionManager.isPage(property)) {
this.updateEditorPages(0);
result = true;
}
return result;
}
@Override
public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
String property = event.getProperty();
boolean value = (Boolean.valueOf(event.getNewValue().toString()));
if (doPropertyChange(event, value, property)) {
if (ActivityExplorerManager.INSTANCE.getEditor() != null) {
ActivityExplorerManager.INSTANCE.getEditor().getActivePageInstance().getManagedForm().reflow(true);
}
}
}
@Override
public void executeRequest(int request, Session session) {
Session session2 = getEditorInput().getSession();
switch (request) {
case SessionListener.CLOSING:
if (session2 != null && session2.equals(session)){
Runnable runnable = new Runnable() {
public void run() {
close(false);
}
};
run(runnable);
}
break;
case SessionListener.SELECTED_VIEWS_CHANGE_KIND:
if (session2 != null && session2.equals(session) && session.isOpen()){
Runnable runnable = new Runnable() {
public void run() {
updateEditorPages(0);
}
};
run(runnable);
}
break;
case SessionListener.REPRESENTATION_CHANGE:
if (session2 != null && session2.equals(session) && session.isOpen()){
_editorDirtyStateChanged();
}
break;
case SessionListener.OPENED:
break;
case SessionListener.DIRTY:
case SessionListener.SYNC:
case SessionListener.SEMANTIC_CHANGE: // Listening to changes to mark
if (session2 != null && session2.equals(session) && session.isOpen()){
_editorDirtyStateChanged();
}
break;
case SessionListener.REPLACED:
if (session2 != null && session2.equals(session) && session.isOpen()){
_editorDirtyStateChanged();
}
break;
}
}
private void _editorDirtyStateChanged() {
Runnable runnable = new Runnable() {
public void run() {
IManagedForm headerForm = getHeaderForm();
if (headerForm != null)
headerForm.dirtyStateChanged();
}
};
run(runnable);
}
protected void run(Runnable runnable) {
if (null != runnable) {
Display display = Display.getCurrent();
if (null == display) {
PlatformUI.getWorkbench().getDisplay().asyncExec(runnable);
} else {
runnable.run();
}
}
}
}