/** * */ package org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.apache.commons.collections.CollectionUtils; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StyledString; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.goko.core.common.exception.GkException; import org.goko.core.gcode.element.IGCodeProvider; import org.goko.core.gcode.rs274ngcv3.IRS274NGCService; import org.goko.core.gcode.rs274ngcv3.element.GCodeProvider; import org.goko.core.gcode.rs274ngcv3.element.IModifier; import org.goko.core.gcode.service.IExecutionService; 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.IWorkspaceService; import org.goko.core.workspace.service.IWorkspaceUIService; import org.goko.gcode.rs274ngcv3.ui.workspace.IRS274WorkspaceService; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.menu.gcodeprovider.AddExecutionQueueAction; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.menu.gcodeprovider.DeleteGCodeProviderAction; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.menu.gcodeprovider.IGCodeProviderContributionItem; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.menu.gcodeprovider.ModifierSubMenu; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.menu.gcodeprovider.ReloadGCodeProviderAction; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.menu.gcoderepository.AddAllGCodeInQueueAction; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.menu.modifier.DeleteModifierAction; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.menu.modifier.EnableDisableAction; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.menu.modifier.ModifierMoveDownAction; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.menu.modifier.ModifierMoveUpAction; import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.panel.IModifierPropertiesPanel; import org.osgi.service.event.EventAdmin; /** * @author PsyKo * @date 31 oct. 2015 */ public class GCodeContainerUiProvider extends ProjectContainerUiProvider { /** LOG */ private static final GkLog LOG = GkLog.getLogger(GCodeContainerUiProvider.class); /** GCode service */ private IRS274NGCService rs274Service; private IRS274WorkspaceService rs274WorkspaceService; private IWorkspaceService workspaceService; private IExecutionService<?, ?> executionService; private IStyledLabelProvider labelProvider; private EventAdmin eventAdmin; private List<IGCodeProviderContributionItem> lstGCodeProviderContributionItem; private IWorkspaceUIService workspaceUIService; /** * @param rs274Service * @param type */ public GCodeContainerUiProvider() { super("GCodeContainerUiProvider", 10); this.labelProvider = new GCodeContainerLabelProvider(); this.lstGCodeProviderContributionItem = new CopyOnWriteArrayList<IGCodeProviderContributionItem>(); LOG.info("Creating GCodeContainerUiProvider"); } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#providesLabelFor(java.lang.Object) */ @Override public boolean providesLabelFor(Object content) throws GkException { return this.equals(content) || (content instanceof IGCodeProvider) || (content instanceof IModifier); } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#getStyledText(java.lang.Object) */ @Override public StyledString getStyledText(Object element) { return labelProvider.getStyledText(element); } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#getImage(java.lang.Object) */ @Override public Image getImage(Object element) { return labelProvider.getImage(element); } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#providesContentFor(java.lang.Object) */ @Override public boolean providesContentFor(Object content) throws GkException { return this.equals(content) || content instanceof IGCodeProvider; } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#hasChildren(java.lang.Object) */ @Override public boolean hasChildren(Object content) throws GkException { if(content instanceof IGCodeProvider){ List<IModifier<GCodeProvider>> lst = rs274Service.getModifierByGCodeProvider(((IGCodeProvider) content).getId()); return CollectionUtils.isNotEmpty(lst); }else if(this.equals(content)){ return CollectionUtils.isNotEmpty(rs274Service.getGCodeProvider()); } return false; } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#getChildren(java.lang.Object) */ @Override public Object[] getChildren(Object content) throws GkException { if(content instanceof IGCodeProvider){ return rs274Service.getModifierByGCodeProvider(((IGCodeProvider) content).getId()).toArray(); }else if(this.equals(content)){ return rs274Service.getGCodeProvider().toArray(); } return null; } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#getParent(java.lang.Object) */ @Override public Object getParent(Object content) throws GkException { if(content instanceof IGCodeProvider){ return this; }else if(content instanceof IModifier){ IModifier<?> modifier = (IModifier<?>)content; return rs274Service.getGCodeProvider(modifier.getIdGCodeProvider()); } return null; } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#providesMenuFor(java.lang.Object) */ @Override public boolean providesMenuFor(ISelection selection) throws GkException { IStructuredSelection strSelection = (IStructuredSelection) selection; Object content = strSelection.getFirstElement(); return this.equals(content) || (content instanceof IGCodeProvider) || (content instanceof IModifier); } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#createMenuFor(org.eclipse.jface.action.IMenuManager, java.lang.Object) */ @Override public void createMenuFor(IMenuManager contextMenu, ISelection selection) throws GkException { IStructuredSelection strSelection = (IStructuredSelection) selection; Object content = strSelection.getFirstElement(); if(this.equals(content)){ createMenuForGCodeRepository(contextMenu); }else if(content instanceof IGCodeProvider){ createMenuForGCodeProvider(contextMenu, (IGCodeProvider)content); }else if(content instanceof IModifier<?>){ createMenuForGCodeModifier(contextMenu, (IModifier<?>)content); } } /** * Creates the menu for the GCode repository node of the tree * @param contextMenu the target context menu */ private void createMenuForGCodeRepository(IMenuManager contextMenu) { contextMenu.add(new AddAllGCodeInQueueAction(executionService, rs274Service)); } /** * Creates the menu for a GCode modifier node of the tree * @param contextMenu the target context menu */ private void createMenuForGCodeModifier(IMenuManager contextMenu, IModifier<?> modifier) { contextMenu.add(new EnableDisableAction(rs274Service, modifier.getId())); contextMenu.add(new ModifierMoveUpAction(rs274Service, modifier.getId())); contextMenu.add(new ModifierMoveDownAction(rs274Service, modifier.getId())); contextMenu.add(new Separator()); contextMenu.add(new DeleteModifierAction(rs274Service, modifier.getId())); } /** * Creates the menu for a GCode provider node of the tree * @param contextMenu the target context menu */ protected void createMenuForGCodeProvider(IMenuManager contextMenu, final IGCodeProvider content) throws GkException { // Submenu for a specific user MenuManager subMenu = new ModifierSubMenu(rs274Service, rs274WorkspaceService, content.getId()); contextMenu.add(new AddExecutionQueueAction(rs274Service, executionService, content.getId())); contextMenu.add(new Separator()); contextMenu.add(new ReloadGCodeProviderAction(rs274Service, content.getId())); // contextMenu.add(new ExternalEditAction(rs274Service, workspaceService, content.getId())); contextMenu.add(subMenu); if(CollectionUtils.isNotEmpty(lstGCodeProviderContributionItem)){ contextMenu.add(new Separator()); for (IGCodeProviderContributionItem contributionItem : lstGCodeProviderContributionItem) { contextMenu.add(contributionItem.getItem(content)); } } contextMenu.add(new Separator()); contextMenu.add(new DeleteGCodeProviderAction(rs274Service, content.getId())); } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#providesConfigurationPanelFor(java.lang.Object) */ @Override public boolean providesConfigurationPanelFor(ISelection selection) throws GkException { IStructuredSelection strSelection = (IStructuredSelection) selection; Object content = strSelection.getFirstElement(); if(content instanceof IModifier<?>){ IModifier<?> iModifier = (IModifier<?>) content; List<IModifierUiProvider<?>> lstBuilders = rs274WorkspaceService.getModifierBuilder(); if(CollectionUtils.isNotEmpty(lstBuilders)){ for (IModifierUiProvider<?> iModifierUiProvider : lstBuilders) { if(iModifierUiProvider.providesConfigurationPanelFor(iModifier)){ return true; } } } } return false; } /** (inheritDoc) * @see org.goko.core.workspace.bean.ProjectContainerUiProvider#createConfigurationPanelFor(org.eclipse.swt.widgets.Composite, java.lang.Object) */ @Override public IPropertiesPanel createConfigurationPanelFor(Composite parent, ISelection selection) throws GkException { IStructuredSelection strSelection = (IStructuredSelection) selection; Object content = strSelection.getFirstElement(); if(content instanceof IModifier<?>){ IModifier<?> iModifier = (IModifier<?>) content; List<IModifierUiProvider<?>> lstBuilders = rs274WorkspaceService.getModifierBuilder(); if(CollectionUtils.isNotEmpty(lstBuilders)){ for (IModifierUiProvider<?> iModifierUiProvider : lstBuilders) { if(iModifierUiProvider.providesConfigurationPanelFor(iModifier)){ IModifierPropertiesPanel<?> panel = iModifierUiProvider.createConfigurationPanelFor(parent, iModifier); panel.initializeFromModifier(); return panel; } } } } return null; } /** * @return the rs274Service */ public IRS274NGCService getRs274Service() { return rs274Service; } /** * @param rs274Service the rs274Service to set */ public void setRs274Service(IRS274NGCService rs274Service) { this.rs274Service = rs274Service; } /** * @return the rs274WorkspaceService */ public IRS274WorkspaceService getRs274WorkspaceService() { return rs274WorkspaceService; } /** * @param rs274WorkspaceService the rs274WorkspaceService to set */ public void setRs274WorkspaceService(IRS274WorkspaceService rs274WorkspaceService) { this.rs274WorkspaceService = rs274WorkspaceService; } /** * @return the workspaceService */ public IWorkspaceService getWorkspaceService() { return workspaceService; } /** * @param workspaceService the workspaceService to set */ public void setWorkspaceService(IWorkspaceService workspaceService) { this.workspaceService = workspaceService; } /** * @return the executionService */ public IExecutionService<?, ?> getExecutionService() { return executionService; } /** * @param executionService the executionService to set */ public void setExecutionService(IExecutionService<?, ?> executionService) { this.executionService = executionService; } /** * @return the eventAdmin */ public EventAdmin getEventAdmin() { return eventAdmin; } /** * @param eventAdmin the eventAdmin to set */ public void setEventAdmin(EventAdmin eventAdmin) { this.eventAdmin = eventAdmin; } public void addGCodeProviderContributionItem(IGCodeProviderContributionItem contributionItem){ this.lstGCodeProviderContributionItem.add(contributionItem); } /** * @return the workspaceUIService */ public IWorkspaceUIService getWorkspaceUIService() { return workspaceUIService; } /** * @param workspaceUIService the workspaceUIService to set * @throws GkException */ public void setWorkspaceUIService(IWorkspaceUIService workspaceUIService) throws GkException { this.workspaceUIService = workspaceUIService; this.workspaceUIService.addProjectContainerUiProvider(this); } }