Changeset 4

User picture

Author: Frederik Heremans

(2009/03/02 19:16) About 3 years ago

Major commit for 0.0.2 release

Affected files

Updated trunk/Traffide/META-INF/MANIFEST.MF Download diff

34
2
Bundle-ManifestVersion: 2
2
Bundle-ManifestVersion: 2
3
Bundle-Name: Traffide Plug-in
3
Bundle-Name: Traffide Plug-in
4
Bundle-SymbolicName: be.stacktrace.traffide;singleton:=true
4
Bundle-SymbolicName: be.stacktrace.traffide;singleton:=true
5
Bundle-Version: 0.0.1
5
Bundle-Version: 0.0.2
6
Bundle-Activator: be.stacktrace.traffide.TraffideActivator
6
Bundle-Activator: be.stacktrace.traffide.TraffideActivator
7
Bundle-Vendor: www.stacktrace.be
7
Bundle-Vendor: www.stacktrace.be
8
Require-Bundle: org.eclipse.ui,
8
Require-Bundle: org.eclipse.ui,

Updated trunk/Traffide/resources/configuration.properties Download diff

34
10
config.http.trafficJamLength.startRegex=h>
10
config.http.trafficJamLength.startRegex=h>
11
config.http.trafficJamLength.endRegex=km
11
config.http.trafficJamLength.endRegex=km
12
config.mapRegion.default=vlaanderen
12
config.mapRegion.default=vlaanderen
13
14
config.http.mapImage.backgroundLayer.regex=map_layer
15
config.http.mapImage.trafficJamLayer.regex=congestions_layer\\\\"
16
config.http.mapImage.incidentsLayer.regex=incidents_layer\\\\"
17
config.http.mapImage.layer.startRegex=getTransparentBackgroundStyleUrl\\(\\'
18
config.http.mapImage.layer.endRegex=\\'\\)

Updated trunk/Traffide/src/be/stacktrace/traffide/config/ConfigConstantsHttp.java Download diff

34
4
4
5
	public static final String CONFIG_HTTP_MAIN_CAMERA_HOSTNAME = "config.http.mainCameraHostName";
5
	public static final String CONFIG_HTTP_MAIN_CAMERA_HOSTNAME = "config.http.mainCameraHostName";
6
	public static final String CONFIG_HTTP_MAIN_MAP_HOSTNAME = "config.http.mainMapHostName";
6
	public static final String CONFIG_HTTP_MAIN_MAP_HOSTNAME = "config.http.mainMapHostName";
7
	public static final String CONFIG_HTTP_MAP_IMAGE_BACKGROUND_LAYER_REGEX = "config.http.mapImage.backgroundLayer.regex";
8
	public static final String CONFIG_HTTP_MAP_IMAGE_TRAFFIC_JAMS_LAYER_REGEX = "config.http.mapImage.trafficJamLayer.regex";
9
	public static final String CONFIG_HTTP_MAP_IMAGE_INCIDENTS_LAYER_REGEX = "config.http.mapImage.incidentsLayer.regex";
10
	   public static final String CONFIG_HTTP_MAP_IMAGE_START_REGEX = "config.http.mapImage.layer.startRegex";
11
	    public static final String CONFIG_HTTP_MAP_IMAGE_END_REGEX = "config.http.mapImage.layer.endRegex";
7
	
12
	
8
	
13
	
9
	public static final String CONFIG_HTTP_PASSKEY_CAMERA_URI = "config.http.passkeyCamera.uri";
14
	public static final String CONFIG_HTTP_PASSKEY_CAMERA_URI = "config.http.passkeyCamera.uri";

Updated trunk/Traffide/src/be/stacktrace/traffide/context/TraffideContext.java Download diff

34
1
package be.stacktrace.traffide.context;
1
package be.stacktrace.traffide.context;
2
2
3
import org.apache.commons.configuration.Configuration;
3
import org.apache.commons.configuration.Configuration;
4
import org.eclipse.core.runtime.IStatus;
4
import org.eclipse.jface.preference.IPreferenceStore;
5
import org.eclipse.jface.preference.IPreferenceStore;
5
6
6
import be.stacktrace.traffide.event.GlobalEventRegistry;
7
import be.stacktrace.traffide.event.GlobalEventRegistry;
7
import be.stacktrace.traffide.http.HttpClientWrapper;
8
import be.stacktrace.traffide.http.HttpClientWrapper;
8
9
9
// TODO: Auto-generated Javadoc
10
/**
10
/**
11
 * The Interface TraffideContext contains all beans and services which are
11
 * The Interface TraffideContext contains all beans and services which are
12
 * exposed by the Traffide plugin.
12
 * exposed by the Traffide plugin.
...
...
73
     * @return the preference store
73
     * @return the preference store
74
     */
74
     */
75
    IPreferenceStore getPreferenceStore();
75
    IPreferenceStore getPreferenceStore();
76
    
77
    /**
78
     * Log to the global log.
79
     * 
80
     * @param severity the severity. See {@link IStatus}
81
     * @param errorCode the error code
82
     * @param message the human readable message
83
     * @param exception the exception. Null if not applicable
84
     */
85
    void logGlobal(int severity, int errorCode, String message, Throwable exception);
86
    
76
}
87
}

Updated trunk/Traffide/src/be/stacktrace/traffide/context/TraffideContextImpl.java Download diff

34
4
4
5
import org.apache.commons.configuration.Configuration;
5
import org.apache.commons.configuration.Configuration;
6
import org.eclipse.core.runtime.Assert;
6
import org.eclipse.core.runtime.Assert;
7
import org.eclipse.core.runtime.Status;
7
import org.eclipse.jface.preference.IPreferenceStore;
8
import org.eclipse.jface.preference.IPreferenceStore;
8
9
10
import be.stacktrace.traffide.TraffideActivator;
9
import be.stacktrace.traffide.event.GlobalEventRegistry;
11
import be.stacktrace.traffide.event.GlobalEventRegistry;
10
import be.stacktrace.traffide.http.HttpClientWrapper;
12
import be.stacktrace.traffide.http.HttpClientWrapper;
11
13
14
// TODO: Auto-generated Javadoc
12
/**
15
/**
13
 * The Class TraffideContextImpl is a default implementation of a
16
 * The Class TraffideContextImpl is a default implementation of a
14
 * {@link TraffideContext}.
17
 * {@link TraffideContext}.
...
...
36
    /** The preference store. */
39
    /** The preference store. */
37
    private IPreferenceStore preferenceStore;
40
    private IPreferenceStore preferenceStore;
38
41
39
 
40
41
    /**
42
    /**
42
     * Instantiates a TraffideContextImpl.
43
     * Instantiates a TraffideContextImpl.
43
     */
44
     */
...
...
67
    public void setPreferenceStore(IPreferenceStore preferenceStore) {
68
    public void setPreferenceStore(IPreferenceStore preferenceStore) {
68
        this.preferenceStore = preferenceStore;
69
        this.preferenceStore = preferenceStore;
69
    }
70
    }
70
    
71
71
    /**
72
    /**
72
     * Sets the config.
73
     * Sets the config.
73
     * 
74
     * 
...
...
144
        return (T) result;
145
        return (T) result;
145
    }
146
    }
146
147
147
    /** 
148
    /**
148
     * {@inheritDoc}
149
     * {@inheritDoc}
149
     */
150
     */
150
    public IPreferenceStore getPreferenceStore() {
151
    public IPreferenceStore getPreferenceStore() {
151
       return preferenceStore;
152
        return preferenceStore;
152
    }
153
    }
154
155
    /** 
156
     * {@inheritDoc}
157
     */
158
    public void logGlobal(int severity, int errorCode, String message, Throwable exception) {
159
        TraffideActivator.getDefault().getLog().log(
160
                new Status(severity, TraffideActivator.PLUGIN_ID, errorCode, message, exception));
161
    }
153
}
162
}

Updated trunk/Traffide/src/be/stacktrace/traffide/DefaultView.java Download diff

34
3
import java.text.DateFormat;
3
import java.text.DateFormat;
4
import java.util.Calendar;
4
import java.util.Calendar;
5
5
6
import org.apache.commons.configuration.Configuration;
7
import org.eclipse.jface.action.Action;
6
import org.eclipse.jface.action.Action;
8
import org.eclipse.jface.dialogs.MessageDialog;
9
import org.eclipse.jface.viewers.ISelectionChangedListener;
7
import org.eclipse.jface.viewers.ISelectionChangedListener;
10
import org.eclipse.jface.viewers.IStructuredContentProvider;
8
import org.eclipse.jface.viewers.IStructuredContentProvider;
11
import org.eclipse.jface.viewers.SelectionChangedEvent;
9
import org.eclipse.jface.viewers.SelectionChangedEvent;
...
...
38
import be.stacktrace.traffide.ui.image.DefaultTrafficJamTextProvider;
36
import be.stacktrace.traffide.ui.image.DefaultTrafficJamTextProvider;
39
import be.stacktrace.traffide.ui.image.TrafficJamImageGenerator;
37
import be.stacktrace.traffide.ui.image.TrafficJamImageGenerator;
40
import be.stacktrace.traffide.ui.repository.CameraImageRepository;
38
import be.stacktrace.traffide.ui.repository.CameraImageRepository;
41
import be.stacktrace.traffide.ui.repository.impl.CameraImageWrapper;
39
import be.stacktrace.traffide.update.UpdatableResource;
42
import be.stacktrace.traffide.ui.repository.impl.CameraImageWrapper.CameraImageWrapperState;
40
import be.stacktrace.traffide.update.UpdatableResourceStatus;
43
41
44
/**
42
/**
45
 * This sample class demonstrates how to plug-in a new workbench view. The view
43
 * This sample class demonstrates how to plug-in a new workbench view. The view
...
...
65
    private Label imageWidget;
63
    private Label imageWidget;
66
64
67
    private Camera currentCamera;
65
    private Camera currentCamera;
68
66
    
69
    private CameraImageRepository imageRepo;
67
    private CameraImageRepository imageRepo;
70
68
69
71
    private CameraRepositoryCSVImpl service;
70
    private CameraRepositoryCSVImpl service;
72
71
73
    private TrafficJamImageGenerator jamImageGenerator;
72
    private TrafficJamImageGenerator jamImageGenerator;
...
...
96
95
97
    @Override
96
    @Override
98
    public void dispose() {
97
    public void dispose() {
99
        System.out.println("Disposing view");
100
        TraffideActivator.getContext().getGlobalEventRegistry().unregisterEventHandler(
98
        TraffideActivator.getContext().getGlobalEventRegistry().unregisterEventHandler(
101
                TrafficJamLengthChangeEvent.class, myListener);
99
                TrafficJamLengthChangeEvent.class, myListener);
102
    }
100
    }
...
...
108
        service = new CameraRepositoryCSVImpl();
106
        service = new CameraRepositoryCSVImpl();
109
        TraffideContext ctx = TraffideActivator.getContext();
107
        TraffideContext ctx = TraffideActivator.getContext();
110
        // Add self to eventlistener for cameraImage-change events
108
        // Add self to eventlistener for cameraImage-change events
111
        imageRepo = ctx.getService(CameraImageRepository.class);
112
        
109
        
113
        ctx.getGlobalEventRegistry().registerEventHandler(CameraImageChangeEvent.class, new GlobalEventHandler<CameraImageChangeEvent>() {
110
        ctx.getGlobalEventRegistry().registerEventHandler(CameraImageChangeEvent.class, new GlobalEventHandler<CameraImageChangeEvent>() {
114
            public void handleEvent(CameraImageChangeEvent event) {
111
            public void handleEvent(CameraImageChangeEvent event) {
...
...
121
        myListener = new TrafficJamLengthChangeEventListener();
118
        myListener = new TrafficJamLengthChangeEventListener();
122
        TraffideActivator.getContext().getGlobalEventRegistry().registerEventHandler(TrafficJamLengthChangeEvent.class,
119
        TraffideActivator.getContext().getGlobalEventRegistry().registerEventHandler(TrafficJamLengthChangeEvent.class,
123
                myListener);
120
                myListener);
121
        
122
        imageRepo = ctx.getService(CameraImageRepository.class);
124
    }
123
    }
125
124
126
    /**
125
    /**
...
...
168
167
169
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
168
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
170
            public void selectionChanged(SelectionChangedEvent event) {
169
            public void selectionChanged(SelectionChangedEvent event) {
171
                Configuration config = TraffideActivator.getContext().getConfig();
172
173
                if (event.getSelection() instanceof StructuredSelection) {
170
                if (event.getSelection() instanceof StructuredSelection) {
174
                    StructuredSelection sel = (StructuredSelection) event.getSelection();
171
                    StructuredSelection sel = (StructuredSelection) event.getSelection();
175
                    if (sel.getFirstElement() != null) {
172
                    if (sel.getFirstElement() != null) {
176
                        Camera selectedCamera = (Camera) sel.getFirstElement();
173
                        Camera selectedCamera = (Camera) sel.getFirstElement();
177
                        currentCamera = selectedCamera;
174
                        currentCamera = selectedCamera;
178
                        CameraImageWrapper wrapper = imageRepo.getCameraImageWrapper(selectedCamera.getId());
175
                        UpdatableResource<Image> wrapper = imageRepo.getCameraImage(currentCamera.getId());
179
                        myImage = wrapper.getImage();
176
                        myImage = wrapper.getResource();
180
177
181
                        imageWidget.setImage(myImage);
178
                        imageWidget.setImage(myImage);
182
                        nameLabel.setText(selectedCamera.getName());
179
                        nameLabel.setText(selectedCamera.getName());
183
                        directionLabel.setText(selectedCamera.getViewDirection());
180
                        directionLabel.setText(selectedCamera.getViewDirection());
184
                        imageRepo.getCameraImageWrapper(selectedCamera.getId());
181
185
                        String updateTime = null;
182
                        String updateTime = null;
186
183
187
                        if (wrapper.getState() == CameraImageWrapperState.ERROR) {
184
                        if (wrapper.getStatus() == UpdatableResourceStatus.ERROR) {
188
                            updateTime = "Error";
185
                            updateTime = "Error";
189
                        } else {
186
                        } else {
190
                            if (wrapper.getLastUpdate() == null
187
                            if (wrapper.getLastUpdateTime() == null
191
                                    || wrapper.getState() == CameraImageWrapperState.UPDATING) {
188
                                    || wrapper.getStatus() == UpdatableResourceStatus.UPDATING) {
192
                                updateTime = "Updating...";
189
                                updateTime = "Updating...";
193
                            } else {
190
                            } else {
194
                                updateTime = DateFormat.getTimeInstance().format(wrapper.getLastUpdate().getTime());
191
                                updateTime = DateFormat.getTimeInstance().format(wrapper.getLastUpdateTime().getTime());
195
                            }
192
                            }
196
                        }
193
                        }
197
                        timeLabel.setText(updateTime);
194
                        timeLabel.setText(updateTime);
...
...
222
        setTitleImage(getTitleImage());
219
        setTitleImage(getTitleImage());
223
220
224
    }
221
    }
225
226
    private void showMessage(String message) {
227
        MessageDialog.openInformation(viewer.getControl().getShell(), "DefaultView", message);
228
    }
229
230
    /**
222
    /**
231
     * Passing the focus request to the viewer's control.
223
     * Passing the focus request to the viewer's control.
232
     */
224
     */
...
...
234
        viewer.getControl().setFocus();
226
        viewer.getControl().setFocus();
235
    }
227
    }
236
228
237
    public void cameraImageChanged(final CameraImageWrapper changed) {
229
    public void cameraImageChanged(final UpdatableResource<Image> changed) {
238
        if (currentCamera != null) {
230
        if (currentCamera != null) {
239
            if (currentCamera.getId().equals(changed.getCameraId())) {
231
            if (currentCamera.getId().equals(changed.getResourceKey())) {
240
                // The current image needs to be updated aswel
232
                // The current image needs to be updated aswel
241
233
242
                getSite().getShell().getDisplay().asyncExec(new Runnable() {
234
                getSite().getShell().getDisplay().asyncExec(new Runnable() {
243
244
                    public void run() {
235
                    public void run() {
245
                        myImage = changed.getImage();
236
                        myImage = changed.getResource();
246
                        viewer.setSelection(viewer.getSelection());
237
                        viewer.setSelection(viewer.getSelection());
247
                    }
238
                    }
248
239

Updated trunk/Traffide/src/be/stacktrace/traffide/event/CameraImageChangeEvent.java Download diff

34
1
package be.stacktrace.traffide.event;
1
package be.stacktrace.traffide.event;
2
2
3
import be.stacktrace.traffide.ui.repository.impl.CameraImageWrapper;
3
import org.eclipse.swt.graphics.Image;
4
4
5
import be.stacktrace.traffide.update.UpdatableResource;
6
5
/**
7
/**
6
 * The Class CameraImageChangeEvent is an event signaling the containing
8
 * The Class CameraImageChangeEvent is an event signaling the containing
7
 * {@link CameraImageWrapper} changed.
9
 * {@link CameraImageWrapper} changed.
...
...
11
public class CameraImageChangeEvent {
13
public class CameraImageChangeEvent {
12
14
13
    /** The changed. */
15
    /** The changed. */
14
    private CameraImageWrapper changed;
16
    private UpdatableResource<Image> changed;
15
17
16
    /**
18
    /**
17
     * Instantiates a new camera image change event.
19
     * Instantiates a new camera image change event.
18
     * 
20
     * 
19
     * @param changed the changed
21
     * @param changed the changed
20
     */
22
     */
21
    public CameraImageChangeEvent(CameraImageWrapper changed) {
23
    public CameraImageChangeEvent(UpdatableResource<Image> changed) {
22
        this.changed = changed;
24
        this.changed = changed;
23
    }
25
    }
24
26
...
...
27
     * 
29
     * 
28
     * @return the changed
30
     * @return the changed
29
     */
31
     */
30
    public CameraImageWrapper getChanged() {
32
    public UpdatableResource<Image> getChanged() {
31
        return changed;
33
        return changed;
32
    }
34
    }
33
    
35
    

Updated trunk/Traffide/src/be/stacktrace/traffide/event/MapImageChangeEvent.java Download diff

34
1
package be.stacktrace.traffide.event;
1
package be.stacktrace.traffide.event;
2
2
3
import be.stacktrace.traffide.ui.model.MapImageWrapper;
4
import be.stacktrace.traffide.update.UpdatableResource;
5
6
/**
7
 * The Class MapImageChangeEvent is a class indicating a MapImage has changed.
8
 * 
9
 * @author Frederik Heremans
10
 * @since 0.0.2
11
 */
3
public class MapImageChangeEvent {
12
public class MapImageChangeEvent {
4
13
14
    /** The map image. */
15
    private UpdatableResource<MapImageWrapper> mapImage;
16
17
    /**
18
     * Gets the map image.
19
     * 
20
     * @return the map image
21
     */
22
    public UpdatableResource<MapImageWrapper> getMapImage() {
23
        return mapImage;
24
    }
25
26
    /**
27
     * Instantiates a new map image change event.
28
     * 
29
     * @param mapImage
30
     *            the map image
31
     */
32
    public MapImageChangeEvent(UpdatableResource<MapImageWrapper> mapImage) {
33
        super();
34
        this.mapImage = mapImage;
35
    }
5
}
36
}

Updated trunk/Traffide/src/be/stacktrace/traffide/http/CameraPassCodeFetcher.java Download diff

34
4
import java.util.regex.Matcher;
4
import java.util.regex.Matcher;
5
import java.util.regex.Pattern;
5
import java.util.regex.Pattern;
6
6
7
import org.apache.commons.configuration.Configuration;
8
import org.apache.commons.httpclient.methods.GetMethod;
7
import org.apache.commons.httpclient.methods.GetMethod;
9
import org.eclipse.core.runtime.IStatus;
8
import org.eclipse.core.runtime.IStatus;
10
import org.eclipse.core.runtime.Status;
11
9
12
import be.stacktrace.traffide.TraffideActivator;
13
import be.stacktrace.traffide.config.ConfigConstantsHttp;
10
import be.stacktrace.traffide.config.ConfigConstantsHttp;
11
import be.stacktrace.traffide.context.TraffideContext;
14
import be.stacktrace.traffide.io.GrepStreamReader;
12
import be.stacktrace.traffide.io.GrepStreamReader;
15
import be.stacktrace.traffide.io.GrepStringHandler;
13
import be.stacktrace.traffide.io.GrepStringHandler;
16
14
...
...
27
 */
25
 */
28
public class CameraPassCodeFetcher {
26
public class CameraPassCodeFetcher {
29
27
30
	/** The grep stream reader. */
28
    /** The grep stream reader. */
31
	private GrepStreamReader grepStreamReader;
29
    private GrepStreamReader grepStreamReader;
32
30
33
	/** The grep string handler. */
31
    /** The grep string handler. */
34
	private PassKeyForCameraStringHandler grepStringHandler;
32
    private PassKeyForCameraStringHandler grepStringHandler;
35
33
36
	/** The http client wrapper. */
34
    private TraffideContext context;
37
	private HttpClientWrapper httpClientWrapper;
38
35
39
	/** The config. */
36
    /**
40
	private Configuration config;
37
     * Instantiates a new CameraPassCodeFetcher.
38
     * 
39
     * @param httpClientWrapper
40
     *            the http client wrapper
41
     * @param config
42
     *            the config
43
     */
44
    public CameraPassCodeFetcher(TraffideContext context) {
45
        this.context = context;
46
        // Initialize the reader
47
        grepStreamReader = new GrepStreamReader();
48
        // initialize the handler
49
        grepStringHandler = new PassKeyForCameraStringHandler();
50
    }
41
51
42
	/**
52
    /**
43
	 * Instantiates a new CameraPassCodeFetcher.
53
     * Gets the pass key for camera using HTTP-request.
44
	 * 
54
     * 
45
	 * @param httpClientWrapper
55
     * @return the pass key for camera
46
	 *            the http client wrapper
56
     */
47
	 * @param config
57
    public String getPassKeyForCamera() {
48
	 *            the config
58
        // Do the request
49
	 */
59
        GetMethod method = new GetMethod(context.getConfig().getString(
50
	public CameraPassCodeFetcher(HttpClientWrapper httpClientWrapper,
60
                ConfigConstantsHttp.CONFIG_HTTP_PASSKEY_CAMERA_URI));
51
			Configuration config) {
61
        String hostName = context.getConfig().getString(ConfigConstantsHttp.CONFIG_HTTP_MAIN_CAMERA_HOSTNAME);
52
		this.httpClientWrapper = httpClientWrapper;
53
		this.config = config;
54
62
55
		// Initialize the reader
63
        try {
56
		grepStreamReader = new GrepStreamReader();
64
            context.getHttpClientWrapper().doRequest(hostName, method);
57
		// initialize the handler
65
            // Handle the response
58
		grepStringHandler = new PassKeyForCameraStringHandler();
66
            grepStreamReader.processStream(method.getResponseBodyAsStream(), grepStringHandler);
59
	}
67
        } catch (IOException e) {
68
            context.logGlobal(IStatus.ERROR, 0, "Cannot get passkey from HTTP-call: " + e.getMessage(), e);
69
        } finally {
70
            method.releaseConnection();
71
        }
72
        // Check the handler for the passcode
73
        String passKey = grepStringHandler.getPassKey();
60
74
61
	/**
75
        if (passKey == null) {
62
	 * Gets the pass key for camera using HTTP-request.
76
            context.logGlobal(IStatus.ERROR, 0, "No passkey could be extracted from HTTP-call", null);
63
	 * 
77
        }
64
	 * @return the pass key for camera
78
        // Finally, reset the handler
65
	 */
79
        grepStringHandler.reset();
66
	public String getPassKeyForCamera() {
80
        return passKey;
67
		// Do the request
81
    }
68
		GetMethod method = new GetMethod(config
69
				.getString(ConfigConstantsHttp.CONFIG_HTTP_PASSKEY_CAMERA_URI));
70
		String hostName = config
71
				.getString(ConfigConstantsHttp.CONFIG_HTTP_MAIN_CAMERA_HOSTNAME);
72
82
73
		try {
83
    /**
74
			httpClientWrapper.doRequest(hostName, method);
84
     * The Class PassKeyForCameraStringHandler is an internal classed used to
75
			// Handle the response
85
     * get the passkey for camera images using <code>GrepStreamReader</code>
76
			grepStreamReader.processStream(method.getResponseBodyAsStream(),
86
     * result, using regex to find exact passkey inside the line.
77
					grepStringHandler);
87
     * 
78
		} catch (IOException e) {
88
     * @author Frederik Heremans
79
			// TODO Auto-generated catch block
89
     * @since 1.0
80
			e.printStackTrace();
90
     */
81
			TraffideActivator.getDefault().getLog().log(new Status (IStatus.ERROR, 
91
    private class PassKeyForCameraStringHandler extends GrepStringHandler {
82
                    "Woops", 
83
                    0,
84
                    "Errow while fetching passcode: " + e.getMessage(), 
85
                    e));
86
92
87
		} finally {
93
        /** The Constant NUMBER_REGEX. */
88
		    method.releaseConnection();
94
        private static final String NUMBER_REGEX = "[0-9]+";
89
		}
90
		// Check the handler for the passcode
91
		String passKey = grepStringHandler.getPassKey();
92
95
93
		if (passKey == null) {
96
        /** The pass key. */
94
			// TODO: Log that no passkey could be retrieved from the HTTP-Call
97
        private String passKey;
95
		}
96
		// Finally, reset the handler
97
		grepStringHandler.reset();
98
		return passKey;
99
	}
100
98
101
	/**
99
        /** The numbers pattern. */
102
	 * The Class PassKeyForCameraStringHandler is an internal classed used to
100
        private Pattern numbersPattern;
103
	 * get the passkey for camera images using <code>GrepStreamReader</code>
104
	 * result, using regex to find exact passkey inside the line.
105
	 * 
106
	 * @author Frederik Heremans
107
	 * @since 1.0
108
	 */
109
	private class PassKeyForCameraStringHandler extends GrepStringHandler {
110
101
111
		/** The Constant NUMBER_REGEX. */
102
        /**
112
		private static final String NUMBER_REGEX = "[0-9]+";
103
         * Instantiates a new PassKeyForCameraStringHandler.
104
         */
105
        public PassKeyForCameraStringHandler() {
106
            super(Pattern.compile(context.getConfig().getString(ConfigConstantsHttp.CONFIG_HTTP_PASSKEY_CAMERA_REGEX)));
107
            numbersPattern = Pattern.compile(NUMBER_REGEX);
108
        }
113
109
114
		/** The pass key. */
110
        /**
115
		private String passKey;
111
         * {@inheritDoc}
112
         */
113
        public boolean handleString(String line) {
114
            // Locate the matched string and extract the numbers behind it
115
            Matcher m = getRegexPattern().matcher(line);
116
            if (m.find()) {
117
                // Look for first digit starting from end-pos of matcher
118
                Matcher numberM = numbersPattern.matcher(line);
119
                if (numberM.find(m.end())) {
120
                    // Found the passKey
121
                    this.passKey = line.substring(numberM.start(), numberM.end());
122
                    // Stop processing, found a match
123
                    return false;
124
                }
125
            }
126
            return true;
127
        }
116
128
117
		/** The numbers pattern. */
129
        /**
118
		private Pattern numbersPattern;
130
         * Gets the pass key.
131
         * 
132
         * @return the pass key
133
         */
134
        public String getPassKey() {
135
            return passKey;
136
        }
119
137
120
		/**
138
        /**
121
		 * Instantiates a new PassKeyForCameraStringHandler.
139
         * Reset the handler.
122
		 */
140
         */
123
		public PassKeyForCameraStringHandler() {
141
        public void reset() {
124
			super(Pattern
142
            passKey = null;
125
					.compile(config
143
        }
126
							.getString(ConfigConstantsHttp.CONFIG_HTTP_PASSKEY_CAMERA_REGEX)));
144
    }
127
			numbersPattern = Pattern.compile(NUMBER_REGEX);
128
		}
129
130
		/**
131
		 * {@inheritDoc}
132
		 */
133
		public boolean handleString(String line) {
134
			// Locate the matched string and extract the numbers behind it
135
			Matcher m = getRegexPattern().matcher(line);
136
			if (m.find()) {
137
				// Look for first digit starting from end-pos of matcher
138
				Matcher numberM = numbersPattern.matcher(line);
139
				if (numberM.find(m.end())) {
140
					// Found the passKey
141
					this.passKey = line.substring(numberM.start(), numberM
142
							.end());
143
					// Stop processing, found a match
144
					return false;
145
				}
146
			}
147
			return true;
148
		}
149
150
		/**
151
		 * Gets the pass key.
152
		 * 
153
		 * @return the pass key
154
		 */
155
		public String getPassKey() {
156
			return passKey;
157
		}
158
159
		/**
160
		 * Reset the handler.
161
		 */
162
		public void reset() {
163
			passKey = null;
164
		}
165
	}
166
}
145
}

Added trunk/Traffide/src/be/stacktrace/traffide/http/HttpImageBuilder.java

Show contents

Updated trunk/Traffide/src/be/stacktrace/traffide/job/CameraPassCodeFetchJob.java Download diff

34
51
        this.context = context;
51
        this.context = context;
52
52
53
        // Create the fetcher
53
        // Create the fetcher
54
        fetcher = new CameraPassCodeFetcher(context.getHttpClientWrapper(), context.getConfig());
54
        fetcher = new CameraPassCodeFetcher(context);
55
        firstRun = true;
55
        firstRun = true;
56
    }
56
    }
57
57

Added trunk/Traffide/src/be/stacktrace/traffide/job/UpdateMapViewJob.java

Show contents

Updated trunk/Traffide/src/be/stacktrace/traffide/preferences/PreferenceConstants.java Download diff

34
23
    
23
    
24
    public static final String P_MAP_DEFAULT_REGION = "preference.mapRegion.default";
24
    public static final String P_MAP_DEFAULT_REGION = "preference.mapRegion.default";
25
    
25
    
26
    public static final String P_MAP_IMAGE_REFRESH_TIME = "preference.mapRegionFetchTimeout";
27
    
28
    public static final String P_MAP_AUTO_UPDATE = "preference.map.autoUpdate";
29
    
26
    // Other constants
30
    // Other constants
27
    /** The Constant USER_DIR_NAME, name of settings-polder in the user-dir. */
31
    /** The Constant USER_DIR_NAME, name of settings-polder in the user-dir. */
28
    public static final String USER_DIR_NAME = ".traffide";
32
    public static final String USER_DIR_NAME = ".traffide";
29
33
34
   
35
30
    
36
    
31
    
37
    
32
    
38
    

Updated trunk/Traffide/src/be/stacktrace/traffide/preferences/PreferenceInitializer.java Download diff

34
35
35
36
        store.setDefault(PreferenceConstants.P_TRAFFIC_JAM_LENGTH_REFRESH_TIME, "60000");
36
        store.setDefault(PreferenceConstants.P_TRAFFIC_JAM_LENGTH_REFRESH_TIME, "60000");
37
        store.setDefault(PreferenceConstants.P_CAMERA_IMAGE_REFRESH_TIME, "60000");
37
        store.setDefault(PreferenceConstants.P_CAMERA_IMAGE_REFRESH_TIME, "60000");
38
38
        store.setDefault(PreferenceConstants.P_MAP_IMAGE_REFRESH_TIME, "60000");
39
        
40
        // Map view defaults
39
        store.setDefault(PreferenceConstants.P_MAP_DEFAULT_REGION, getDefaultMapRegion());
41
        store.setDefault(PreferenceConstants.P_MAP_DEFAULT_REGION, getDefaultMapRegion());
42
        store.setDefault(PreferenceConstants.P_MAP_AUTO_UPDATE, true);
40
43
41
    }
44
    }
42
45

Updated trunk/Traffide/src/be/stacktrace/traffide/preferences/TraffidePreferences.java Download diff

34
1
package be.stacktrace.traffide.preferences;
1
package be.stacktrace.traffide.preferences;
2
2
3
import java.util.Collection;
4
5
import org.eclipse.jface.preference.ComboFieldEditor;
3
import org.eclipse.jface.preference.ComboFieldEditor;
6
import org.eclipse.jface.preference.DirectoryFieldEditor;
4
import org.eclipse.jface.preference.DirectoryFieldEditor;
7
import org.eclipse.jface.preference.FieldEditorPreferencePage;
5
import org.eclipse.jface.preference.FieldEditorPreferencePage;
...
...
9
import org.eclipse.ui.IWorkbenchPreferencePage;
7
import org.eclipse.ui.IWorkbenchPreferencePage;
10
8
11
import be.stacktrace.traffide.TraffideActivator;
9
import be.stacktrace.traffide.TraffideActivator;
12
import be.stacktrace.traffide.model.MapRegion;
13
import be.stacktrace.traffide.model.repository.MapRegionRepository;
14
10
15
/**
11
/**
16
 * The Class TraffidePreferences is a {@link IWorkbenchPreferencePage} that
12
 * The Class TraffidePreferences is a {@link IWorkbenchPreferencePage} that
...
...
50
                getTrafficJamLengtTimeoutValues(), getFieldEditorParent());
46
                getTrafficJamLengtTimeoutValues(), getFieldEditorParent());
51
        addField(cameraImageTimeOutEditor);
47
        addField(cameraImageTimeOutEditor);
52
48
53
        DirectoryFieldEditor homeDirEditor = new DirectoryFieldEditor(PreferenceConstants.P_USER_DIR_LOCATION,
49
        // DirectoryFieldEditor homeDirEditor = new
54
                "&Traffide preference directory:", getFieldEditorParent());
50
        // DirectoryFieldEditor(PreferenceConstants.P_USER_DIR_LOCATION,
55
        homeDirEditor.setEmptyStringAllowed(false);
51
        // "&Traffide preference directory:", getFieldEditorParent());
56
        homeDirEditor.setValidateStrategy(DirectoryFieldEditor.VALIDATE_ON_FOCUS_LOST);
52
        // homeDirEditor.setEmptyStringAllowed(false);
57
        addField(homeDirEditor);
53
        // homeDirEditor.setValidateStrategy(DirectoryFieldEditor.VALIDATE_ON_FOCUS_LOST);
54
        // addField(homeDirEditor);
58
55
59
        ComboFieldEditor mapRegionDefaultEditor = new ComboFieldEditor(PreferenceConstants.P_MAP_DEFAULT_REGION,
56
//        ComboFieldEditor mapRegionDefaultEditor = new ComboFieldEditor(PreferenceConstants.P_MAP_DEFAULT_REGION,
60
                "&Default map region", getMapRegionValues(), getFieldEditorParent());
57
//                "&Default map region", getMapRegionValues(), getFieldEditorParent());
58
//
59
//        addField(mapRegionDefaultEditor);
61
60
62
        addField(mapRegionDefaultEditor);
63
64
    }
61
    }
65
62
66
    private String[][] getTrafficJamLengtTimeoutValues() {
63
    private String[][] getTrafficJamLengtTimeoutValues() {
...
...
69
                { "Every 2 minutes", "120000" }, { "Every 5 minutes", "300000" }, { "Every 10 minutes",
"600000" } };
66
                { "Every 2 minutes", "120000" }, { "Every 5 minutes", "300000" }, { "Every 10 minutes",
"600000" } };
70
    }
67
    }
71
68
72
    private String[][] getMapRegionValues() {
69
//    private String[][] getMapRegionValues() {
73
        MapRegionRepository repo = TraffideActivator.getContext().getService(MapRegionRepository.class);
70
//        MapRegionRepository repo = TraffideActivator.getContext().getService(MapRegionRepository.class);
74
        Collection<MapRegion> regions = repo.getAllMapRegions();
71
//        Collection<MapRegion> regions = repo.getAllMapRegions();
72
//
73
//        String[][] regArray = new String[regions.size()][];
74
//        int i = 0;
75
//        for (MapRegion reg : regions) {
76
//            regArray[i] = new String[] { reg.getName(), reg.getId() };
77
//            i++;
78
//        }
79
//        return regArray;
80
//    }
75
81
76
        String[][] regArray = new String[regions.size()][];
77
        int i = 0;
78
        for (MapRegion reg : regions) {
79
            regArray[i] = new String[] { reg.getName(), reg.getId() };
80
            i++;
81
        }
82
        return regArray;
83
    }
84
85
    /**
82
    /**
86
     * {@inheritDoc}
83
     * {@inheritDoc}
87
     */
84
     */

Updated trunk/Traffide/src/be/stacktrace/traffide/service/impl/CameraPassCodeServiceImpl.java Download diff

34
40
        context.getGlobalEventRegistry().registerEventHandler(CameraPassCodeChangeEvent.class, new GlobalEventHandler<CameraPassCodeChangeEvent>() {
40
        context.getGlobalEventRegistry().registerEventHandler(CameraPassCodeChangeEvent.class, new GlobalEventHandler<CameraPassCodeChangeEvent>() {
41
            public void handleEvent(CameraPassCodeChangeEvent event) {
41
            public void handleEvent(CameraPassCodeChangeEvent event) {
42
                passCode = event.getPassCode();
42
                passCode = event.getPassCode();
43
                System.out.println("Got passkey update: " + passCode);
44
            }
43
            }
45
        });
44
        });
46
    }
45
    }
...
...
60
    public void updatePassCode() {
59
    public void updatePassCode() {
61
        if (fetchJob != null) {
60
        if (fetchJob != null) {
62
            fetchJob.wakeUp();
61
            fetchJob.wakeUp();
63
            System.out.println("jaja");
64
        }
62
        }
65
    }
63
    }
66
64

Updated trunk/Traffide/src/be/stacktrace/traffide/TraffideActivator.java Download diff

34
17
import be.stacktrace.traffide.http.HttpClientWrapper;
17
import be.stacktrace.traffide.http.HttpClientWrapper;
18
import be.stacktrace.traffide.job.CameraPassCodeFetchJob;
18
import be.stacktrace.traffide.job.CameraPassCodeFetchJob;
19
import be.stacktrace.traffide.job.TrafficJamLengthJob;
19
import be.stacktrace.traffide.job.TrafficJamLengthJob;
20
import be.stacktrace.traffide.job.UpdateMapViewJob;
20
import be.stacktrace.traffide.model.repository.CameraRepository;
21
import be.stacktrace.traffide.model.repository.CameraRepository;
21
import be.stacktrace.traffide.model.repository.MapRegionRepository;
22
import be.stacktrace.traffide.model.repository.MapRegionRepository;
22
import be.stacktrace.traffide.model.repository.impl.CameraRepositoryCSVImpl;
23
import be.stacktrace.traffide.model.repository.impl.CameraRepositoryCSVImpl;
...
...
25
import be.stacktrace.traffide.service.impl.CameraPassCodeServiceImpl;
26
import be.stacktrace.traffide.service.impl.CameraPassCodeServiceImpl;
26
import be.stacktrace.traffide.ui.constants.ImageConstants;
27
import be.stacktrace.traffide.ui.constants.ImageConstants;
27
import be.stacktrace.traffide.ui.repository.CameraImageRepository;
28
import be.stacktrace.traffide.ui.repository.CameraImageRepository;
29
import be.stacktrace.traffide.ui.repository.MapImageRepository;
28
import be.stacktrace.traffide.ui.repository.impl.CameraImageRepositoryImpl;
30
import be.stacktrace.traffide.ui.repository.impl.CameraImageRepositoryImpl;
31
import be.stacktrace.traffide.ui.repository.impl.MapImageRepositoryImpl;
29
32
30
// TODO: Auto-generated Javadoc
33
// TODO: Auto-generated Javadoc
31
/**
34
/**
...
...
51
    private TrafficJamLengthJob trafJamLength;
54
    private TrafficJamLengthJob trafJamLength;
52
55
53
    private CameraPassCodeFetchJob cameraPassCodeFetchJob;
56
    private CameraPassCodeFetchJob cameraPassCodeFetchJob;
57
    
58
    
54
59
55
    /**
60
    /**
56
     * The constructor.
61
     * The constructor.
...
...
67
        // Set shared plugin instance
72
        // Set shared plugin instance
68
        plugin = this;
73
        plugin = this;
69
74
75
       
76
        
70
        // Set up the proxy
77
        // Set up the proxy
71
        proxyTracker = new ServiceTracker(getBundle().getBundleContext(), IProxyService.class.getName(), null);
78
        proxyTracker = new ServiceTracker(getBundle().getBundleContext(), IProxyService.class.getName(), null);
72
        proxyTracker.open();
79
        proxyTracker.open();
73
80
74
        contextImpl = new TraffideContextImpl();
81
        contextImpl = new TraffideContextImpl();
82
        // Set the preference store
83
        contextImpl.setPreferenceStore(getPreferenceStore());
75
        
84
        
76
        // Set up the HTTPClientWrapper
85
        // Set up the HTTPClientWrapper
77
        HttpClientWrapper httpClientWrapper = new HttpClientWrapper(getProxyService());
86
        HttpClientWrapper httpClientWrapper = new HttpClientWrapper(getProxyService());
...
...
90
        // Register all repo's
99
        // Register all repo's
91
        registerServices();
100
        registerServices();
92
        
101
        
93
        // Set the preference store
102
        
94
        contextImpl.setPreferenceStore(getPreferenceStore());
103
        
104
      
95
105
96
        // Finally, scedule all jobs
106
        // Finally, scedule all jobs
97
        startJobs();
107
        startJobs();
...
...
131
141
132
        contextImpl.addService(CameraPassCodeService.class, passCodeImpl);
142
        contextImpl.addService(CameraPassCodeService.class, passCodeImpl);
133
        
143
        
144
        // Add map services
134
        MapRegionRepository mapRepo = new MapRegionRepositoryCSVImpl(contextImpl);
145
        MapRegionRepository mapRepo = new MapRegionRepositoryCSVImpl(contextImpl);
135
        contextImpl.addService(MapRegionRepository.class, mapRepo);
146
        contextImpl.addService(MapRegionRepository.class, mapRepo);
136
        
147
        
148
        MapImageRepository mapImageRepo = new MapImageRepositoryImpl(contextImpl);
149
        contextImpl.addService(MapImageRepository.class, mapImageRepo);
150
        
137
    }
151
    }
138
152
139
    /**
153
    /**

Updated trunk/Traffide/src/be/stacktrace/traffide/ui/constants/ImageConstants.java Download diff

34
1
package be.stacktrace.traffide.ui.constants;
1
package be.stacktrace.traffide.ui.constants;
2
2
3
// TODO: Auto-generated Javadoc
4
/**
3
/**
5
 * The Class ImageConstants contains constants related to images and icons.
4
 * The Class ImageConstants contains constants related to images and icons.
6
 * 
5
 * 
...
...
21
    /** The Constant ICON_REFRESH_PASSKEY. */
20
    /** The Constant ICON_REFRESH_PASSKEY. */
22
    public static final String ICON_REFRESH_PASSKEY = "icons/key-go.png";
21
    public static final String ICON_REFRESH_PASSKEY = "icons/key-go.png";
23
22
23
    /** The Constant ICON_REFRESH. */
24
    public static final String ICON_REFRESH = "icons/refresh.gif";
25
24
    /**
26
    /**
25
     * Instantiates a new image constants, private.
27
     * Instantiates a new image constants, private.
26
     */
28
     */

Added trunk/Traffide/src/be/stacktrace/traffide/ui/image/BorderImageDecorator.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/ui/image/ImageDecorator.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/ui/model/MapImageWrapper.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/ui/repository/CameraImageRepository.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/ui/repository/impl/CameraImageRepositoryImpl.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/ui/repository/impl/CameraImageResourceCallback.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/ui/repository/impl/MapImageRepositoryImpl.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/ui/repository/impl/MapImageResourceCallback.java

Show contents

Updated trunk/Traffide/src/be/stacktrace/traffide/ui/repository/MapImageRepository.java Download diff

34
1
package be.stacktrace.traffide.ui.repository;
1
package be.stacktrace.traffide.ui.repository;
2
2
3
public class MapImageRepository {
3
import be.stacktrace.traffide.model.MapRegion;
4
import be.stacktrace.traffide.ui.model.MapImageWrapper;
5
import be.stacktrace.traffide.update.UpdatableResource;
4
6
7
/**
8
 * The Interface MapImageRepository contains methods related to MapImages.
9
 * 
10
 * @author Frederik Heremans
11
 */
12
public interface MapImageRepository {
13
14
    /**
15
     * Gets the {@MapImageWrapper} for the given region.
16
     * 
17
     * @param region
18
     *            the region
19
     * 
20
     * @return the map image
21
     */
22
    UpdatableResource<MapImageWrapper> getMapImage(MapRegion region);
23
24
    /**
25
     * Force update of the wrapper for the given region.
26
     * 
27
     * @param selected
28
     *            the selected
29
     */
30
    void forceUpdate(MapRegion selected);
5
}
31
}

Added trunk/Traffide/src/be/stacktrace/traffide/update/event/GlobalEventUpdatableResourceChangeAdapter.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/FixedTimeoutUpToDateChecker.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/http/HttpUpdateResourceCallback.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/job/JobBasedUpdatableResourceRepository.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/job/ResourceUpdateJob.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/job/UpdateResourceCallback.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/UpdatableResource.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/UpdatableResourceChangeListener.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/UpdatableResourceFactory.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/UpdatableResourceRepository.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/UpdatableResourceStatus.java

Show contents

Added trunk/Traffide/src/be/stacktrace/traffide/update/UpToDateChecker.java

Show contents

Updated trunk/Traffide/src/be/stacktrace/traffide/views/MapView.java Download diff

34
1
package be.stacktrace.traffide.views;
1
package be.stacktrace.traffide.views;
2
2
3
import java.text.DateFormat;
3
import java.util.ArrayList;
4
import java.util.ArrayList;
4
import java.util.List;
5
import java.util.List;
5
6
6
import org.eclipse.jface.action.Action;
7
import org.eclipse.jface.action.Action;
8
import org.eclipse.jface.action.IMenuListener;
7
import org.eclipse.jface.action.IMenuManager;
9
import org.eclipse.jface.action.IMenuManager;
8
import org.eclipse.jface.action.IToolBarManager;
10
import org.eclipse.jface.action.IToolBarManager;
11
import org.eclipse.jface.action.MenuManager;
9
import org.eclipse.jface.action.Separator;
12
import org.eclipse.jface.action.Separator;
13
import org.eclipse.swt.SWT;
14
import org.eclipse.swt.custom.ScrolledComposite;
15
import org.eclipse.swt.events.ControlAdapter;
16
import org.eclipse.swt.events.ControlEvent;
17
import org.eclipse.swt.layout.GridData;
18
import org.eclipse.swt.layout.GridLayout;
10
import org.eclipse.swt.widgets.Composite;
19
import org.eclipse.swt.widgets.Composite;
20
import org.eclipse.swt.widgets.Label;
21
import org.eclipse.swt.widgets.Menu;
11
import org.eclipse.ui.IActionBars;
22
import org.eclipse.ui.IActionBars;
12
import org.eclipse.ui.ISharedImages;
23
import org.eclipse.ui.ISharedImages;
13
import org.eclipse.ui.PlatformUI;
24
import org.eclipse.ui.PlatformUI;
...
...
15
26
16
import be.stacktrace.traffide.TraffideActivator;
27
import be.stacktrace.traffide.TraffideActivator;
17
import be.stacktrace.traffide.context.TraffideContext;
28
import be.stacktrace.traffide.context.TraffideContext;
29
import be.stacktrace.traffide.event.GlobalEventHandler;
30
import be.stacktrace.traffide.event.MapImageChangeEvent;
31
import be.stacktrace.traffide.job.UpdateMapViewJob;
18
import be.stacktrace.traffide.model.MapRegion;
32
import be.stacktrace.traffide.model.MapRegion;
19
import be.stacktrace.traffide.model.repository.MapRegionRepository;
33
import be.stacktrace.traffide.model.repository.MapRegionRepository;
34
import be.stacktrace.traffide.preferences.PreferenceConstants;
35
import be.stacktrace.traffide.ui.constants.ImageConstants;
36
import be.stacktrace.traffide.ui.model.MapImageWrapper;
37
import be.stacktrace.traffide.ui.repository.MapImageRepository;
38
import be.stacktrace.traffide.update.UpdatableResource;
20
39
21
public class MapView extends ViewPart {
40
public class MapView extends ViewPart {
22
    private Action action1;
23
    private Action action2;
24
41
25
    private Action setSelectedAsDefaultAction;
42
    private Action setSelectedAsDefaultAction;
26
43
27
    private List<Action> regionActions;
44
    private Action setAutoUpdateAction;
28
45
46
    private Action refreshAction;
47
48
    private List<SelectMapRegionAction> regionActions;
49
29
    private MapRegion region;
50
    private MapRegion region;
30
51
52
    private MapRegionRepository mapRegionRepo;
53
54
    private MapImageRepository mapImageRepo;
55
56
    private boolean autoUpdate = false;
57
58
    private Label imageLabel;
59
60
    private Label updatelabel;
61
62
    private Composite c;
63
64
    private ScrolledComposite scrolledComposite;
65
66
    private UpdateMapViewJob updateMapJob;
67
68
    private TraffideContext context;
69
31
    /**
70
    /**
32
     * The constructor.
71
     * The constructor.
33
     */
72
     */
34
    public MapView() {
73
    public MapView() {
35
        regionActions = new ArrayList<Action>();
74
        regionActions = new ArrayList<SelectMapRegionAction>();
75
        context = TraffideActivator.getContext();
76
        mapRegionRepo = context.getService(MapRegionRepository.class);
77
        mapImageRepo = context.getService(MapImageRepository.class);
78
79
        // Create the job
80
        updateMapJob = new UpdateMapViewJob(context);
36
    }
81
    }
37
82
38
    private void setMapRegion(MapRegion region) {
83
    private void setMapRegion(MapRegion region) {
39
        this.region = region;
84
        this.region = region;
85
        updateMapJob.setSelectedRegion(region);
86
        refreshMapImage();
40
    }
87
    }
41
88
42
    public void createPartControl(Composite parent) {
89
    public void createPartControl(Composite parent) {
43
90
91
        TraffideContext context = TraffideActivator.getContext();
92
        // Initialise defaults from preferences
93
        autoUpdate = context.getPreferenceStore().getBoolean(PreferenceConstants.P_MAP_AUTO_UPDATE);
94
95
        // Register as MapImageChangeEvent-listener
96
        context.getGlobalEventRegistry().registerEventHandler(MapImageChangeEvent.class,
97
                new GlobalEventHandler<MapImageChangeEvent>() {
98
                    public void handleEvent(MapImageChangeEvent event) {
99
                        // Check if we are interested in this mapImage
100
                        if (region != null && event.getMapImage() != null
101
                                && region.equals(event.getMapImage().getResourceKey())) {
102
                            // The image selected now has been updated, refresh!
103
                            getSite().getShell().getDisplay().asyncExec(new Runnable() {
104
                                public void run() {
105
                                    refreshMapImage();
106
                                }
107
                            });
108
                        }
109
                    }
110
                });
111
112
        // Create view
113
        scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
114
115
        c = new Composite(scrolledComposite, SWT.NONE);
116
        scrolledComposite.setContent(c);
117
        scrolledComposite.setExpandHorizontal(true);
118
        scrolledComposite.setExpandVertical(true);
119
120
        scrolledComposite.addControlListener(new ControlAdapter() {
121
            public void controlResized(ControlEvent e) {
122
                doScroll();
123
            }
124
        });
125
126
        GridLayout rLayout = new GridLayout(1, true);
127
        c.setLayout(rLayout);
128
        updatelabel = new Label(c, SWT.FILL);
129
        updatelabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1));
130
        imageLabel = new Label(c, SWT.FILL);
131
        imageLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1));
132
133
        // Finally, refresh image
134
        setMapRegion(mapRegionRepo.getDefault());
135
44
        makeActions();
136
        makeActions();
45
        hookContextMenu();
46
        contributeToActionBars();
137
        contributeToActionBars();
138
139
        if(autoUpdate) {
140
            // Start update-job, if auto-update is needed.
141
            updateMapJob.schedule(context.getPreferenceStore().getLong(PreferenceConstants.P_MAP_IMAGE_REFRESH_TIME));            
142
        }
47
    }
143
    }
48
144
145
    protected void doScroll() {
146
        scrolledComposite.setMinSize(c.computeSize(SWT.DEFAULT, SWT.DEFAULT));
147
    }
148
149
    @SuppressWarnings("unused")
49
    private void hookContextMenu() {
150
    private void hookContextMenu() {
50
        // MenuManager menuMgr = new MenuManager("#PopupMenu");
151
        MenuManager menuMgr = new MenuManager("#PopupMenu");
51
        // menuMgr.setRemoveAllWhenShown(true);
152
        menuMgr.setRemoveAllWhenShown(true);
52
        // menuMgr.addMenuListener(new IMenuListener() {
153
        menuMgr.addMenuListener(new IMenuListener() {
53
        // public void menuAboutToShow(IMenuManager manager) {
154
            public void menuAboutToShow(IMenuManager manager) {
54
        // MapView.this.fillContextMenu(manager);
155
                MapView.this.fillLocalPullDown(manager);
55
        // }
156
            }
56
        // });
157
        });
57
        // Menu menu = menuMgr.createContextMenu(viewer.getControl());
158
        Menu menu = menuMgr.createContextMenu(c);
58
        // viewer.getControl().setMenu(menu);
159
        c.setMenu(menu);
59
        // getSite().registerContextMenu(menuMgr, viewer);
60
    }
160
    }
61
161
62
    private void contributeToActionBars() {
162
    private void contributeToActionBars() {
...
...
65
        fillLocalToolBar(bars.getToolBarManager());
165
        fillLocalToolBar(bars.getToolBarManager());
66
    }
166
    }
67
167
168
    @Override
169
    public void dispose() {
170
        // Remove selection from imageRepo to prevent auto-updating of image
171
        // when
172
        // not needed.
173
        updateMapJob.cancel();
174
    }
175
68
    private void fillLocalPullDown(IMenuManager manager) {
176
    private void fillLocalPullDown(IMenuManager manager) {
177
69
        // Add all region-actions
178
        // Add all region-actions
70
        for (Action action : regionActions) {
179
        for (Action action : regionActions) {
71
            manager.add(action);
180
            manager.add(action);
72
        }
181
        }
73
        
182
183
        // Add the "set as default" action
74
        manager.add(new Separator());
184
        manager.add(new Separator());
75
        // Finally, add the "set as default" action
76
        manager.add(setSelectedAsDefaultAction);
185
        manager.add(setSelectedAsDefaultAction);
186
187
        manager.add(new Separator());
188
        // Also add the action to indicate auto-updates
189
        manager.add(setAutoUpdateAction);
190
77
    }
191
    }
78
192
79
    // private void fillContextMenu(IMenuManager manager) {
80
    // manager.add(action1);
81
    // manager.add(action2);
82
    // // Other plug-ins can contribute there actions here
83
    // manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
84
    // }
85
86
    private void fillLocalToolBar(IToolBarManager manager) {
193
    private void fillLocalToolBar(IToolBarManager manager) {
87
        manager.add(action1);
194
        manager.add(refreshAction);
88
        manager.add(action2);
89
    }
195
    }
90
196
91
    private void makeActions() {
197
    private void makeActions() {
92
198
93
        // Add all mapregions
199
        // Add all mapregions
94
        TraffideContext context = TraffideActivator.getContext();
95
        MapRegionRepository mapRegionRepo = context.getService(MapRegionRepository.class);
96
        MapRegion defaultRegion = mapRegionRepo.getDefault();
200
        MapRegion defaultRegion = mapRegionRepo.getDefault();
97
        System.out.println(defaultRegion);
98
        SelectMapRegionAction actionToAdd = null;
201
        SelectMapRegionAction actionToAdd = null;
99
        for (MapRegion region : mapRegionRepo.getAllMapRegions()) {
202
        for (MapRegion region : mapRegionRepo.getAllMapRegions()) {
100
            actionToAdd = new SelectMapRegionAction(region);
203
            actionToAdd = new SelectMapRegionAction(region);
...
...
118
        setSelectedAsDefaultAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
221
        setSelectedAsDefaultAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
119
                ISharedImages.IMG_ETOOL_SAVE_EDIT));
222
                ISharedImages.IMG_ETOOL_SAVE_EDIT));
120
223
121
        action1 = new Action() {
224
        // Add the auto-update on/off action
225
        setAutoUpdateAction = new Action(null, Action.AS_CHECK_BOX) {
226
            @Override
122
            public void run() {
227
            public void run() {
123
                System.out.println("Action 1 executed");
228
                setAutoUpdate(!autoUpdate);
124
            }
229
            }
125
        };
230
        };
126
        action1.setText("Action 1");
231
        setAutoUpdateAction.setText("Auto-update");
127
        action1.setToolTipText("Action 1 tooltip");
232
        // Get checked/unchecked value
128
        action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
233
        setAutoUpdateAction.setChecked(autoUpdate);
129
                ISharedImages.IMG_OBJS_INFO_TSK));
130
234
131
        action2 = new Action() {
235
        // The refresh-map action (forced)
236
        refreshAction = new Action() {
237
            @Override
132
            public void run() {
238
            public void run() {
133
                System.out.println("Action 2 executed");
239
                if (region != null) {
240
                    refreshMapImage();
241
                }
134
            }
242
            }
135
        };
243
        };
136
        action2.setText("Action 2");
137
        action2.setToolTipText("Action 2 tooltip");
138
        action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
139
                ISharedImages.IMG_OBJS_INFO_TSK));
140
244
245
        refreshAction.setText("Refresh map");
246
        refreshAction.setImageDescriptor(TraffideActivator.getImageDescriptor(ImageConstants.ICON_REFRESH));
141
    }
247
    }
142
248
143
    @Override
249
    @Override
...
...
146
    }
252
    }
147
253
148
    private class SelectMapRegionAction extends Action {
254
    private class SelectMapRegionAction extends Action {
149
150
        private MapRegion regionToSet;
255
        private MapRegion regionToSet;
151
256
152
        public SelectMapRegionAction(MapRegion regionToSet) {
257
        public SelectMapRegionAction(MapRegion regionToSet) {
...
...
156
            if (regionToSet != null) {
261
            if (regionToSet != null) {
157
                setText(regionToSet.getName());
262
                setText(regionToSet.getName());
158
                setToolTipText("Show region " + regionToSet.getName());
263
                setToolTipText("Show region " + regionToSet.getName());
159
160
            }
264
            }
161
        }
265
        }
162
266
267
        public MapRegion getRegion() {
268
            return regionToSet;
269
        }
270
163
        @Override
271
        @Override
164
        public void run() {
272
        public void run() {
165
            checkAction(this);
273
            checkAction(this);
...
...
167
        }
275
        }
168
    }
276
    }
169
277
170
    public void checkAction(SelectMapRegionAction selectMapRegionAction) {
278
    private void checkAction(SelectMapRegionAction selectMapRegionAction) {
171
        for (Action action : regionActions) {
279
        for (Action action : regionActions) {
172
            if (!selectMapRegionAction.equals(action)) {
280
            if (!selectMapRegionAction.equals(action)) {
173
                action.setChecked(false);
281
                action.setChecked(false);
...
...
175
        }
283
        }
176
    }
284
    }
177
285
286
    private void setAutoUpdate(boolean autoUpdate) {
287
        if (autoUpdate != this.autoUpdate) {
288
            this.autoUpdate = autoUpdate;
289
            // Update preference
290
            TraffideActivator.getContext().getPreferenceStore().setValue(PreferenceConstants.P_MAP_AUTO_UPDATE,
291
                    autoUpdate);
292
293
            // Change job state
294
            if (autoUpdate) {
295
                // Start the job
296
                updateMapJob.schedule(context.getPreferenceStore()
297
                        .getLong(PreferenceConstants.P_MAP_IMAGE_REFRESH_TIME));
298
            } else {
299
                // No update needed, cancel job
300
                updateMapJob.cancel();
301
            }
302
        }
303
    }
304
305
    private void refreshMapImage() {
306
        // Reset the map-image and info in the GUI
307
        if (region != null) {
308
            UpdatableResource<MapImageWrapper> image = mapImageRepo.getMapImage(region);
309
            MapImageWrapper wr = image.getResource();
310
            if (wr != null) {
311
                imageLabel.setImage(wr.getTotalImage());
312
            } else {
313
                imageLabel.setImage(null);
314
            }
315
            switch (image.getStatus()) {
316
            case ERROR:
317
                updatelabel.setText("Error while updating");
318
                break;
319
            case UP_TO_DATE:
320
                updatelabel.setText("Last updated on "
321
                        + DateFormat.getTimeInstance().format(image.getLastUpdateTime().getTime()));
322
                break;
323
            case UPDATING:
324
                updatelabel.setText("Updating...");
325
                break;
326
327
            default:
328
                break;
329
            }
330
            c.layout();
331
            doScroll();
332
333
        }
334
335
    }
178
}
336
}