/*******************************************************************************
* Copyright (c) 2007, 2014 compeople AG and others.
* 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:
* compeople AG - initial API and implementation
*******************************************************************************/
package org.eclipse.riena.example.client.controllers;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.riena.communication.core.progressmonitor.IRemoteProgressMonitorRegistry;
import org.eclipse.riena.core.injector.Inject;
import org.eclipse.riena.example.client.communication.IInfoService;
import org.eclipse.riena.example.client.communication.InfoServiceFake;
import org.eclipse.riena.example.client.communication.RemoteCallProcess;
import org.eclipse.riena.example.client.communication.ServiceProgressVisualizer;
import org.eclipse.riena.internal.example.client.Activator;
import org.eclipse.riena.navigation.ui.controllers.SubModuleController;
import org.eclipse.riena.ui.core.uiprocess.UISynchronizer;
import org.eclipse.riena.ui.ridgets.IActionListener;
import org.eclipse.riena.ui.ridgets.IActionRidget;
public class RemoteServiceProgressSubModuleController extends SubModuleController {
public static final String SERVICE_CALL_ACTION_MANUAL = "serviceCallActionManual"; //$NON-NLS-1$
public static final String SERVICE_CALL_ACTION_UIPROCESS = "serviceCallActionUIProcess"; //$NON-NLS-1$
private IRemoteProgressMonitorRegistry remoteProgressMonitorRegistry;
private final IInfoService remoteService;
public RemoteServiceProgressSubModuleController() {
remoteService = new InfoServiceFake();
Inject.service(IRemoteProgressMonitorRegistry.class).useRanking().into(this).andStart(Activator.getDefault().getContext());
}
public void bind(final IRemoteProgressMonitorRegistry remoteProgressMonitorRegistry) {
this.remoteProgressMonitorRegistry = remoteProgressMonitorRegistry;
}
public void unbind(final IRemoteProgressMonitorRegistry remoteProgressMonitorRegistry) {
this.remoteProgressMonitorRegistry = null;
}
@Override
public void configureRidgets() {
getActionRidgetManual().setText("[Manual Way]"); //$NON-NLS-1$
registerManualRemoteServiceCallback();
getActionRidgetUIProcess().setText("[UIProcess Way]"); //$NON-NLS-1$
registerUIProcessRemoteServiceCallback();
}
private IActionRidget getActionRidgetManual() {
return getRidget(IActionRidget.class, SERVICE_CALL_ACTION_MANUAL);
}
private IActionRidget getActionRidgetUIProcess() {
return getRidget(IActionRidget.class, SERVICE_CALL_ACTION_UIPROCESS);
}
//
/// The manual way shows that ServiceProgressVisualizer implicit visualizes Service calls with a progress box
private void registerManualRemoteServiceCallback() {
getActionRidgetManual().addListener(new RemoteServiceManualCallbackAdapter());
}
class RemoteServiceManualCallbackAdapter implements IActionListener {
public void callback() {
simulateManualRemoteServiceCall();
}
}
private void simulateManualRemoteServiceCall() {
//fork
new CommunicationSimulator().start();
}
class CommunicationSimulator extends Thread {
@Override
public void run() {
blockSubModule(true);
final ServiceProgressVisualizer serviceProgress = new ServiceProgressVisualizer("remote"); //$NON-NLS-1$
// add monitor
remoteProgressMonitorRegistry.addProgressMonitor(remoteService, serviceProgress, IRemoteProgressMonitorRegistry.RemovalPolicy.AFTER_ALL_CALLS);
remoteService.getInfo("foo"); //$NON-NLS-1$
// remove monitor
remoteProgressMonitorRegistry.removeAllProgressMonitors(remoteService);
blockSubModule(false);
}
private void blockSubModule(final boolean block) {
UISynchronizer.createSynchronizer().syncExec(new Runnable() {
public void run() {
setBlocked(block);
}
});
}
}
//
/// The UIProcess way ..
private void registerUIProcessRemoteServiceCallback() {
getActionRidgetUIProcess().addListener(new RemoteServiceUIProcessCallbackAdapter());
}
class RemoteServiceUIProcessCallbackAdapter implements IActionListener {
public void callback() {
simulateUIProcessRemoteServiceCall();
}
}
private void simulateUIProcessRemoteServiceCall() {
final RemoteCallProcess<IInfoService> process = new RemoteCallProcess<IInfoService>("remote", true, //$NON-NLS-1$
getNavigationNode()) {
@Override
public void initialUpdateUI(final int totalWork) {
super.initialUpdateUI(totalWork);
setBlocked(true);
}
@Override
public boolean runJob(final IProgressMonitor monitor) {
getService().getInfo("foo"); //$NON-NLS-1$
return true;
}
@Override
public void finalUpdateUI() {
super.finalUpdateUI();
setBlocked(false);
}
@Override
protected IInfoService getService() {
return remoteService;
}
};
process.start();
}
}