/**
*
*/
package org.goko.gcode.rs274ngcv3.ui.workspace;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.goko.core.common.exception.GkException;
import org.goko.core.common.service.AbstractGokoService;
import org.goko.core.gcode.element.IGCodeProvider;
import org.goko.core.gcode.rs274ngcv3.IRS274NGCService;
import org.goko.core.gcode.rs274ngcv3.RenderingFormat;
import org.goko.core.gcode.rs274ngcv3.element.GCodeProvider;
import org.goko.core.gcode.rs274ngcv3.element.IModifier;
import org.goko.core.gcode.rs274ngcv3.modifier.IModifierListener;
import org.goko.core.gcode.service.IExecutionService;
import org.goko.core.gcode.service.IGCodeProviderRepositoryListener;
import org.goko.core.log.GkLog;
import org.goko.core.workspace.service.IWorkspaceService;
import org.goko.core.workspace.service.IWorkspaceUIService;
import org.goko.gcode.rs274ngcv3.ui.workspace.modifierbuilder.TranslateModifierBuilder;
import org.goko.gcode.rs274ngcv3.ui.workspace.modifierbuilder.array.ArrayModifierBuilder;
import org.goko.gcode.rs274ngcv3.ui.workspace.modifierbuilder.rotate.RotateModifierBuilder;
import org.goko.gcode.rs274ngcv3.ui.workspace.modifierbuilder.scale.ScaleModifierBuilder;
import org.goko.gcode.rs274ngcv3.ui.workspace.modifierbuilder.segmentize.SegmentizeModifierBuilder;
import org.goko.gcode.rs274ngcv3.ui.workspace.modifierbuilder.wrap.WrapModifierBuilder;
import org.goko.gcode.rs274ngcv3.ui.workspace.preferences.renderingformat.RenderingFormatPreference;
import org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.IModifierUiProvider;
/**
* @author PsyKo
* @date 31 oct. 2015
*/
/**
* @author Psyko
*
*/
public class RS274WorkspaceService extends AbstractGokoService implements IRS274WorkspaceService, IGCodeProviderRepositoryListener, IModifierListener, IPropertyChangeListener{
/** LOG */
private static final GkLog LOG = GkLog.getLogger(RS274WorkspaceService.class);
/** Service ID */
private static final String SERVICE_ID = "org.goko.gcode.rs274ngcv3.ui.workspace.RS274WorkspaceService";
/** Workspace UI service */
private IWorkspaceUIService workspaceUIService;
/** Workspace service */
private IWorkspaceService workspaceService;
/** Workspace UI service */
private IExecutionService<?,?> executionService;
/** Workspace UI service */
private IRS274NGCService gcodeService;
/** The list of existing IModifierUiProvider*/
private List<IModifierUiProvider<?>> lstModifierUiProvider;
/**
* Constructor
*/
public RS274WorkspaceService() {
lstModifierUiProvider = new ArrayList<IModifierUiProvider<?>>();
}
/** (inheritDoc)
* @see org.goko.core.common.service.IGokoService#getServiceId()
*/
@Override
public String getServiceId() throws GkException {
return SERVICE_ID;
}
/** (inheritDoc)
* @see org.goko.core.common.service.IGokoService#start()
*/
@Override
public void startService() throws GkException {
// Create the RS274 project container
//getWorkspaceUIService().addProjectContainerUiProvider(new GCodeContainerUiProvider(getGcodeService(), this, executionService, workspaceService));
getGcodeService().addListener(this);
getGcodeService().addModifierListener(this);
RenderingFormatPreference.getInstance().addPropertyChangeListener(this);
initModifierUiProvider();
updateRenderingFormat();
}
/**
* Initialization of the default modifiers
* @throws GkException GkException
*/
private void initModifierUiProvider() throws GkException {
//addModifierBuilder(new TestModifierBuilder());
addModifierBuilder(new TranslateModifierBuilder());
addModifierBuilder(new SegmentizeModifierBuilder());
addModifierBuilder(new ScaleModifierBuilder());
addModifierBuilder(new WrapModifierBuilder());
addModifierBuilder(new RotateModifierBuilder());
addModifierBuilder(new ArrayModifierBuilder());
//addModifierBuilder(new TruncateDecimalsModifierBuilder());
}
/** (inheritDoc)
* @see org.goko.core.common.service.IGokoService#stop()
*/
@Override
public void stopService() throws GkException {
}
/**
* @return the workspaceUiService
*/
public IWorkspaceUIService getWorkspaceUIService() {
return workspaceUIService;
}
/**
* @param workspaceUiService the workspaceUiService to set
*/
public void setWorkspaceUIService(IWorkspaceUIService workspaceUiService) {
this.workspaceUIService = workspaceUiService;
}
/**
* @return the gcodeService
*/
public IRS274NGCService getGcodeService() {
return gcodeService;
}
/**
* @param gcodeService the gcodeService to set
*/
public void setGcodeService(IRS274NGCService gcodeService) {
this.gcodeService = gcodeService;
}
/** (inheritDoc)
* @see org.goko.gcode.rs274ngcv3.ui.workspace.IRS274WorkspaceService#getModifierBuilder()
*/
@Override
public List<IModifierUiProvider<?>> getModifierBuilder() throws GkException{
return lstModifierUiProvider;
}
/** (inheritDoc)
* @see org.goko.gcode.rs274ngcv3.ui.workspace.IRS274WorkspaceService#addModifierBuilder(org.goko.gcode.rs274ngcv3.ui.workspace.uiprovider.IModifierUiProvider)
*/
@Override
public void addModifierBuilder(IModifierUiProvider<?> modifierBuilder) throws GkException {
lstModifierUiProvider.add(modifierBuilder);
}
/**
* @return the executionService
*/
public IExecutionService<?, ?> getExecutionService() {
return executionService;
}
/**
* @param executionService the executionService to set
*/
public void setExecutionService(IExecutionService<?, ?> executionService) {
this.executionService = executionService;
}
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#onGCodeProviderCreate(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void onGCodeProviderCreate(IGCodeProvider provider) throws GkException {
workspaceUIService.refreshWorkspaceUi();
workspaceUIService.select(provider);
markProjectDirty();
}
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#onGCodeProviderUpdate(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void onGCodeProviderUpdate(IGCodeProvider provider) throws GkException {
workspaceUIService.refreshWorkspaceUi();
markProjectDirty();
}
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#beforeGCodeProviderDelete(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void beforeGCodeProviderDelete(IGCodeProvider provider) throws GkException {
// Nothing yet
}
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#afterGCodeProviderDelete(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void afterGCodeProviderDelete(IGCodeProvider provider) throws GkException {
workspaceUIService.refreshWorkspaceUi();
markProjectDirty();
}
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#onGCodeProviderLocked(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void onGCodeProviderLocked(IGCodeProvider provider) throws GkException {
workspaceUIService.refreshWorkspaceUi();
}
/** (inheritDoc)
* @see org.goko.core.gcode.service.IGCodeProviderRepositoryListener#onGCodeProviderUnlocked(org.goko.core.gcode.element.IGCodeProvider)
*/
@Override
public void onGCodeProviderUnlocked(IGCodeProvider provider) throws GkException {
workspaceUIService.refreshWorkspaceUi();
}
protected void markProjectDirty() throws GkException{
workspaceService.markProjectDirty();
}
/**
* @return the workspaceService
*/
public IWorkspaceService getWorkspaceService() {
return workspaceService;
}
/**
* @param workspaceService the workspaceService to set
*/
public void setWorkspaceService(IWorkspaceService workspaceService) {
this.workspaceService = workspaceService;
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.modifier.IModifierListener#onModifierCreate(java.lang.Integer)
*/
@Override
public void onModifierCreate(Integer idModifier) throws GkException {
workspaceUIService.refreshWorkspaceUi();
workspaceUIService.select(gcodeService.getModifier(idModifier));
markProjectDirty();
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.modifier.IModifierListener#onModifierUpdate(java.lang.Integer)
*/
@Override
public void onModifierUpdate(Integer idModifier) throws GkException {
workspaceUIService.refreshWorkspaceUi();
workspaceUIService.select(gcodeService.getModifier(idModifier));
markProjectDirty();
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.modifier.IModifierListener#onModifierDelete(java.lang.Integer)
*/
@Override
public void onModifierDelete(IModifier<?> modifier) throws GkException {
workspaceUIService.refreshWorkspaceUi();
List<IModifier<GCodeProvider>> modifiers = gcodeService.getModifierByGCodeProvider(modifier.getIdGCodeProvider());
if(CollectionUtils.isNotEmpty(modifiers)){
workspaceUIService.select(modifiers.get(0));
}else{
IGCodeProvider provider = gcodeService.getGCodeProvider(modifier.getIdGCodeProvider());
workspaceUIService.select(provider);
}
markProjectDirty();
}
/** (inheritDoc)
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent event) {
updateRenderingFormat();
}
/**
* Update the rendering format using preferences
*/
private void updateRenderingFormat(){
RenderingFormat format = new RenderingFormat( RenderingFormatPreference.getInstance().isSkipComment(),
RenderingFormatPreference.getInstance().isSkipLineNumber(),
RenderingFormatPreference.getInstance().isTruncateDecimal(),
RenderingFormatPreference.getInstance().getDecimalDigitCount());
gcodeService.setRenderingFormat(format);
}
}