package org.goko.core.workspace;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.ui.di.UIEventTopic;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.goko.core.common.exception.GkException;
import org.goko.core.log.GkLog;
import org.goko.core.workspace.bean.IPropertiesPanel;
import org.goko.core.workspace.bean.ProjectContainerUiProvider;
import org.goko.core.workspace.service.IWorkspaceUIService;
import org.goko.core.workspace.service.WorkspaceUIEvent;
import org.goko.core.workspace.tree.GkProjectContentProvider;
import org.goko.core.workspace.tree.GkProjectLabelProvider;
public class WorkspacePart implements Listener {
private static final GkLog LOG = GkLog.getLogger(WorkspacePart.class);
@Inject
private IWorkspaceUIService workspaceUiService;
/** The workspace tree viewer */
private TreeViewer workspaceTreeViewer;
/** Composite containing the configuration panel */
private Composite configurationComposite;
/** The currently displayed properties panel */
private IPropertiesPanel currentPropertiesPanel;
private ScrolledComposite scrolledComposite;
/** Previous selection in the tree */
private Object previousSelection;
@Inject
public WorkspacePart() {
}
@PostConstruct
public void postConstruct(Composite parent) throws GkException {
Composite rootComposite = new Composite(parent, SWT.NONE);
rootComposite.setBounds(0, 0, 448, 452);
rootComposite.setLayout(new GridLayout(1, false));
new Label(rootComposite, SWT.NONE);
SashForm sashForm = new SashForm(rootComposite, SWT.VERTICAL);
sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Composite composite = new Composite(sashForm, SWT.NONE);
GridLayout gl_composite = new GridLayout(1, false);
gl_composite.marginWidth = 0;
gl_composite.marginHeight = 0;
gl_composite.horizontalSpacing = 0;
composite.setLayout(gl_composite);
workspaceTreeViewer = new TreeViewer(composite, SWT.BORDER);
Tree tree = workspaceTreeViewer.getTree();
tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Label label = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
workspaceTreeViewer.setContentProvider(new GkProjectContentProvider());
workspaceTreeViewer.setLabelProvider(new DelegatingStyledCellLabelProvider(new GkProjectLabelProvider()));
workspaceTreeViewer.setInput(workspaceUiService.getProjectContainerUiProvider());
scrolledComposite = new ScrolledComposite(sashForm, SWT.BORDER |SWT.V_SCROLL);
scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setAlwaysShowScrollBars(true);
//scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setExpandVertical(true);
scrolledComposite.setLayout(new FillLayout(SWT.HORIZONTAL));
scrolledComposite.addListener(SWT.Resize, this);
configurationComposite = new Composite(scrolledComposite, SWT.NONE);
GridLayout gl_configurationComposite = new GridLayout(1, false);
gl_configurationComposite.marginWidth = 2;
gl_configurationComposite.marginHeight = 0;
configurationComposite.setLayout(gl_configurationComposite);
scrolledComposite.setContent(configurationComposite);
sashForm.setWeights(new int[] {1, 1});
createWorkspaceTreeContextMenu();
createSelectionListener();
}
private void createSelectionListener() {
workspaceTreeViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
try{
Object newSelection = ((StructuredSelection)event.getSelection()).getFirstElement();
if(ObjectUtils.equals(previousSelection, newSelection)){
return;
}
previousSelection = newSelection;
if(currentPropertiesPanel != null){
currentPropertiesPanel.beforeDiscard();
currentPropertiesPanel.discard();
currentPropertiesPanel = null;
}
// Remove any child of the configuration composite just in case
for (Control control : configurationComposite.getChildren()) {
control.dispose();
}
List<ProjectContainerUiProvider> uiProviders = workspaceUiService.getProjectContainerUiProvider();
if(CollectionUtils.isNotEmpty(uiProviders)){
for (ProjectContainerUiProvider projectContainerUiProvider : uiProviders) {
if(projectContainerUiProvider.providesConfigurationPanelFor(workspaceTreeViewer.getSelection())){
currentPropertiesPanel = projectContainerUiProvider.createConfigurationPanelFor(configurationComposite, workspaceTreeViewer.getSelection());
}
}
}
scrolledComposite.setContent(configurationComposite);
Point size = configurationComposite.computeSize(280, SWT.DEFAULT);
configurationComposite.setSize(size);
configurationComposite.layout(true);
configurationComposite.getParent().layout();
scrolledComposite.setMinSize(configurationComposite.computeSize(280, SWT.DEFAULT));
scrolledComposite.layout(true);
}catch(GkException e){
LOG.error(e);
}
}
});
}
public void createWorkspaceTreeContextMenu(){
MenuManager contextMenu = new MenuManager("#ViewerMenu"); //$NON-NLS-1$
contextMenu.setRemoveAllWhenShown(true);
contextMenu.addMenuListener(new IMenuListener() {
/** (inheritDoc)
* @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
*/
@Override
public void menuAboutToShow(IMenuManager mgr) {
try{
List<ProjectContainerUiProvider> uiProviders = workspaceUiService.getProjectContainerUiProvider();
if(CollectionUtils.isNotEmpty(uiProviders)){
for (ProjectContainerUiProvider projectContainerUiProvider : uiProviders) {
if(projectContainerUiProvider.providesMenuFor(workspaceTreeViewer.getSelection())){
projectContainerUiProvider.createMenuFor(mgr, workspaceTreeViewer.getSelection());
}
}
}
}catch(GkException e){
LOG.error(e);
}
}
});
Menu menu = contextMenu.createContextMenu(workspaceTreeViewer.getControl());
workspaceTreeViewer.getControl().setMenu(menu);
}
/**
* Enable subscription to the workspace refresh event
* @param data the data of the event
*/
@Inject
@Optional
private void subscribeWorkspaceRefresh(@UIEventTopic(WorkspaceUIEvent.TOPIC_WORKSPACE_REFRESH) Map<Object, Object> data) {
if(workspaceTreeViewer != null){
workspaceTreeViewer.refresh();
}
}
@Inject
@Optional
private void subscribeWorkspaceSelect(@UIEventTopic(WorkspaceUIEvent.TOPIC_WORKSPACE_SELECT) Object data) {
workspaceTreeViewer.expandAll();
workspaceTreeViewer.setSelection(new StructuredSelection(data), true);
}
/** (inheritDoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
@Override
public void handleEvent(Event event) {
configurationComposite.setSize(configurationComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
scrolledComposite.setMinSize(configurationComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
scrolledComposite.layout(true);
}
}