blob: 2abeed1fbc8e0bbf4881b08fbe8bd22ddaa517cb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2015 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.internal.preferences;
import java.util.Arrays;
import java.util.List;
import org.eclipse.amalgam.explorer.activity.ui.ActivityExplorerActivator;
import org.eclipse.amalgam.explorer.activity.ui.api.editor.ActivityExplorerEditor;
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.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.ICheckable;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.editor.IFormPage;
public class ActivityExplorerSelectionBlock {
private LabelProvider labelProvider;
private ITreeContentProvider contentProvider;
private ICheckStateProvider checkStateProvider;
public Controller controller;
public ActivityExplorerSelectionBlock() {
this.labelProvider = new ExtensionLabelProvider();
this.contentProvider = new ExtensionTreeContentProvider();
this.checkStateProvider = new CheckStateProvider();
/*
* ActivityExplorerActivator.getDefault().getPreferenceStore().
* addPropertyChangeListener(new IPropertyChangeListener() {
*
*
* public void propertyChange(PropertyChangeEvent event) { //if(even)
* controller.checkStateChanged(new CheckStateChangedEvent(treeArea,
* event.getOldValue(), true));
*
* } });
*/
}
private CheckboxTreeViewer treeArea;
private CheckboxTableViewer listArea;
private StyledText detailsArea;
/**
* Create the Composed Widget
*
* @param parent
* @return the composite result
*/
public Composite createWidget(Composite parent) {
SashForm result = new SashForm(parent, SWT.VERTICAL);
result.setFont(parent.getFont());
SashForm topPart = new SashForm(result, SWT.HORIZONTAL);
createTreeViewer(topPart);
createPageListViewer(topPart);
createDetailsView(result);
return result;
}
/**
* Create the Details Viewer Widget
*
* @param parent
*/
private void createDetailsView(SashForm parent) {
detailsArea = new StyledText(parent, SWT.READ_ONLY | SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
detailsArea.setText(""); //$NON-NLS-1$
}
/**
* Create the Table Viewer Widget
*
* @param parent
*/
private void createPageListViewer(Composite parent) {
Composite form = new Composite(parent, SWT.NONE);
FormLayout layout = new FormLayout();
form.setLayout(layout);
Label prompt = new Label(form, SWT.NONE);
prompt.setText(Messages.ActivityExplorerSelectionBlock_0);
FormData data = new FormData();
data.top = new FormAttachment(0, 0);
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(100, 0);
prompt.setLayoutData(data);
listArea = CheckboxTableViewer.newCheckList(form, SWT.BORDER);
data = new FormData();
data.top = new FormAttachment(prompt, 4);
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(100, 0);
data.bottom = new FormAttachment(100, 0);
listArea.getControl().setLayoutData(data);
listArea.setContentProvider(contentProvider);
listArea.setLabelProvider(labelProvider);
listArea.addSelectionChangedListener(getInstance());
listArea.addCheckStateListener(getInstance());
listArea.setCheckStateProvider(checkStateProvider);
}
/**
* Create the Tree Viewer widget
*
* @param parent
*/
private void createTreeViewer(Composite parent) {
Composite form = new Composite(parent, SWT.NONE);
FormLayout layout = new FormLayout();
form.setLayout(layout);
Label prompt = new Label(form, SWT.NONE);
prompt.setText(Messages.ActivityExplorerSelectionBlock_1);
FormData data = new FormData();
data.top = new FormAttachment(0, 0);
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(100, 0);
prompt.setLayoutData(data);
treeArea = new CheckboxTreeViewer(form);
data = new FormData();
data.top = new FormAttachment(prompt, 4);
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(100, 0);
data.bottom = new FormAttachment(100, 0);
treeArea.getControl().setLayoutData(data);
treeArea.setLabelProvider(labelProvider);
treeArea.setContentProvider(contentProvider);
treeArea.setInput(ActivityExplorerExtensionManager.getExtensionPoint(ActivityExplorerExtensionManager.PROVIDER_PAGES_EXT));
treeArea.addSelectionChangedListener(getInstance());
treeArea.addCheckStateListener(getInstance());
treeArea.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
ISelection iselection = event.getSelection();
if (iselection instanceof IStructuredSelection) {
IStructuredSelection selection = (IStructuredSelection) iselection;
Object obj = selection.getFirstElement();
if (obj instanceof IConfigurationElement) {
IConfigurationElement elt = (IConfigurationElement) obj;
if (elt.getName().equals(ActivityExplorerExtensionManager.PAGE)) {
String id = ActivityExplorerExtensionManager.getId(elt);
ActivityExplorerEditor editor = ActivityExplorerManager.INSTANCE.getEditor();
if (editor != null) {
IFormPage page = editor.findPage(id);
if (page != null) {
ActivityExplorerManager.INSTANCE.getEditor().setActivePage(id);
}
}
}
}
}
}
});
treeArea.setCheckStateProvider(checkStateProvider);
}
/**
* A basic label provider fo {@link IConfigurationElement}I
*
*
*/
private class ExtensionLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
if (element instanceof IConfigurationElement) {
IConfigurationElement elt = (IConfigurationElement) element;
return ActivityExplorerExtensionManager.getName(elt);
}
return super.getText(element);
}
}
/**
* A basic tree content provider for {@link IConfigurationElement}
*
*
*/
private class ExtensionTreeContentProvider implements ITreeContentProvider {
public void dispose() {
// do nothing
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// do nothing
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof IExtensionPoint) {
return ActivityExplorerExtensionManager.getAllProviderExtensions();
}
if (parentElement instanceof IConfigurationElement) {
String category = ActivityExplorerExtensionManager.SECTION;
IConfigurationElement elt = (IConfigurationElement) parentElement;
if (elt.getName().equals(ActivityExplorerExtensionManager.PAGE)) {
category = ActivityExplorerExtensionManager.SECTION;
List<IConfigurationElement> result = ActivityExplorerExtensionManager
.getAllSectionsExtensionForPageId(ActivityExplorerExtensionManager.getId(elt));
result.addAll(Arrays.asList(elt.getChildren(category)));
return result.toArray();
}
if (elt.getName().equals(ActivityExplorerExtensionManager.SECTION)) {
category = ActivityExplorerExtensionManager.ACTIVITY;
List<IConfigurationElement> result = ActivityExplorerExtensionManager
.getAllActivitiesExtensionForSectionId(ActivityExplorerExtensionManager.getId(elt));
result.addAll(Arrays.asList(elt.getChildren(category)));
return result.toArray();
}
}
return null;
}
public Object getParent(Object element) {
Object parent = null;
if (element instanceof IExtensionPoint) {
parent = ((IExtensionPoint) element);
}
if (element instanceof IConfigurationElement) {
parent = ((IConfigurationElement) element).getParent();
}
return parent;
}
public boolean hasChildren(Object element) {
if (element instanceof IConfigurationElement) {
IConfigurationElement elt = (IConfigurationElement) element;
return elt.getName().equals(ActivityExplorerExtensionManager.PAGE) && elt.getChildren().length > 0;
}
return false;
}
}
/**
* Get the Tree Viewer instance
*
* @return {@link Viewer}
*/
public Viewer getTreeViewer() {
return treeArea;
}
/**
* Get the Table Viewer instance
*
* @return {@link Viewer}
*/
public Viewer getTableViewer() {
return listArea;
}
/**
* Get the Singleton controller
*
* @return the Controller
*/
private Controller getInstance() {
if (controller == null)
controller = new Controller();
return controller;
}
/**
* A basic Controller Class It implements {@link ISelectionChangedListener}
* and {@link ICheckStateListener}
*
*
*/
public class Controller implements ISelectionChangedListener, ICheckStateListener {
protected void setDefaultValue(Object element) {
boolean defaultValue = ActivityExplorerActivator.getDefault().getPreferenceStore()
.getDefaultBoolean(ActivityExplorerExtensionManager.getId((IConfigurationElement) element));
checkStateChanged(new CheckStateChangedEvent((ICheckable) getTableViewer(), element, defaultValue));
}
public void checkStateChanged(CheckStateChangedEvent event) {
Object element = event.getElement();
boolean checked = event.getChecked();
ICheckable source = (ICheckable) event.getSource();
if (element instanceof IConfigurationElement) {
IConfigurationElement elt = (IConfigurationElement) element;
String id = ActivityExplorerExtensionManager.getId(elt);
updateCheckedStateChildren(elt, source, checked); // dont move
// the order
ActivityExplorerActivator.getDefault().getPreferenceStore() // dont
// move
// the
// order
.setValue(id, checked);
updateCheckedStateParent(elt, source, checked); // dont move the
// order
refreshVisual();
}
}
private void refreshVisual() {
treeArea.refresh();
listArea.refresh();
}
private void updateCheckedStateChildren(IConfigurationElement elt, ICheckable source, boolean state) {
ITreeContentProvider provider = (ITreeContentProvider) treeArea.getContentProvider();
Object[] children = provider.getElements(elt);
if (null != children) {
for (Object child : children) {
checkStateChanged(new CheckStateChangedEvent(source, child, state));
}
}
}
private void updateCheckedStateParent(IConfigurationElement elt, ICheckable source, boolean state) {
ITreeContentProvider provider = (ITreeContentProvider) treeArea.getContentProvider();
Object parent = provider.getParent(elt);
if (null != parent && !(parent instanceof IExtension) && state) {
IConfigurationElement p = (IConfigurationElement) parent;
String id = ActivityExplorerExtensionManager.getId(p);
ActivityExplorerActivator.getDefault().getPreferenceStore().setValue(id, state);
}
}
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
Object source = event.getSource();
if (null != selection && selection instanceof IStructuredSelection) {
IStructuredSelection selected = (IStructuredSelection) selection;
IConfigurationElement elt = (IConfigurationElement) selected.getFirstElement();
if (source.equals(ActivityExplorerSelectionBlock.this.getTreeViewer())) {
listArea.setInput(elt);
}
String description = ActivityExplorerExtensionManager.getDescription(elt);
if (description == null) {
detailsArea.setText("");//$NON-NLS-1$
} else {
detailsArea.setText(description);
}
}
}
}
/**
* A basic Cheched State Provider Class It implements
* {@link ICheckStateProvider}
*
*
*/
private class CheckStateProvider implements ICheckStateProvider {
public boolean isGrayed(Object element) {
return false;
}
public boolean isChecked(Object element) {
boolean value = false;
IConfigurationElement elt = (IConfigurationElement) element;
String id = ActivityExplorerExtensionManager.getId(elt);
IPreferenceStore prefs = ActivityExplorerActivator.getDefault().getPreferenceStore();
value = prefs.getBoolean(id);
return value;
}
}
}