trace/tracebuilder/com.nokia.tracebuilder.eventhandler/src/com/nokia/tracebuilder/eventhandler/TraceBuilderEventHandler.java
changeset 10 ed1c9f64298a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trace/tracebuilder/com.nokia.tracebuilder.eventhandler/src/com/nokia/tracebuilder/eventhandler/TraceBuilderEventHandler.java	Wed Jun 23 14:35:40 2010 +0300
@@ -0,0 +1,385 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+* Content provider for the event view
+*
+*/
+package com.nokia.tracebuilder.eventhandler;
+
+import java.util.Iterator;
+
+import com.nokia.trace.eventrouter.TraceEvent;
+import com.nokia.trace.eventview.EventListEntry;
+import com.nokia.trace.eventview.EventListEntryString;
+import com.nokia.trace.eventview.TraceEventHandler;
+import com.nokia.trace.eventview.TraceEventList;
+import com.nokia.trace.eventview.TraceEventView;
+import com.nokia.tracebuilder.engine.LastKnownLocationList;
+import com.nokia.tracebuilder.engine.TraceBuilderGlobals;
+import com.nokia.tracebuilder.engine.TraceLocationList;
+import com.nokia.tracebuilder.model.Trace;
+import com.nokia.tracebuilder.model.TraceConstantTable;
+import com.nokia.tracebuilder.model.TraceConstantTableEntry;
+import com.nokia.tracebuilder.model.TraceGroup;
+import com.nokia.tracebuilder.model.TraceModel;
+import com.nokia.tracebuilder.model.TraceModelExtension;
+import com.nokia.tracebuilder.model.TraceModelExtensionListener;
+import com.nokia.tracebuilder.model.TraceModelListener;
+import com.nokia.tracebuilder.model.TraceModelResetListener;
+import com.nokia.tracebuilder.model.TraceObject;
+import com.nokia.tracebuilder.model.TraceParameter;
+import com.nokia.tracebuilder.rules.HiddenTraceObjectRule;
+import com.nokia.tracebuilder.source.SourceLocation;
+
+/**
+ * Content provider for the event view
+ * 
+ */
+public final class TraceBuilderEventHandler implements TraceModelListener,
+		TraceModelResetListener, TraceEventHandler, TraceModelExtensionListener {
+
+	/**
+	 * Event list from event view plug-in
+	 */
+	private TraceEventList eventList;
+
+	/**
+	 * Location list listener
+	 */
+	private EventListLocationListListener locationListListener;
+
+	/**
+	 * Selection listener for the event view
+	 */
+	private EventListSelectionListener selectionListener;
+
+	/**
+	 * Constructor
+	 */
+	TraceBuilderEventHandler() {
+		selectionListener = new EventListSelectionListener();
+		eventList = TraceEventView.getEventList();
+		// Adds listeners to model and event list
+		TraceBuilderGlobals.getTraceModel().addModelListener(this);
+		TraceBuilderGlobals.getTraceModel().addResetListener(this);
+		TraceBuilderGlobals.getTraceModel().addExtensionListener(this);
+		eventList.addEventHandler(this);
+		eventList.addSelectionListener(selectionListener);
+		locationListListener = new EventListLocationListListener(this,
+				eventList);
+		// The model may contain multiple location lists, one for each parser
+		Iterator<TraceLocationList> lists = TraceBuilderGlobals.getTraceModel()
+				.getExtensions(TraceLocationList.class);
+		while (lists.hasNext()) {
+			lists.next().addLocationListListener(locationListListener);
+		}
+	}
+
+	/**
+	 * Shutdown
+	 */
+	void shutdown() {
+		// Removes the listeners from model and event list
+		TraceBuilderGlobals.getTraceModel().getExtension(
+				TraceLocationList.class).removeLocationListListener(
+				locationListListener);
+		TraceBuilderGlobals.getTraceModel().removeModelListener(this);
+		TraceBuilderGlobals.getTraceModel().removeResetListener(this);
+		TraceBuilderGlobals.getTraceModel().removeExtensionListener(this);
+		eventList.removeEventHandler(this);
+		eventList.removeSelectionListener(selectionListener);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.model.TraceModelListener#
+	 *      objectAdded(com.nokia.tracebuilder.model.TraceObject,
+	 *      com.nokia.tracebuilder.model.TraceObject)
+	 */
+	public void objectAdded(TraceObject owner, TraceObject object) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.model.TraceModelListener#
+	 *      objectCreationComplete(com.nokia.tracebuilder.model.TraceObject)
+	 */
+	public void objectCreationComplete(TraceObject object) {
+		if (object.getModel().isValid()) {
+			HiddenTraceObjectRule hiddenRule = object
+					.getExtension(HiddenTraceObjectRule.class);
+			if (hiddenRule == null) {
+				String event = getAddEventTitle(object);
+				if (event != null) {
+					addObjectCreationEvent(object, event);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Adds an object creation event
+	 * 
+	 * @param object
+	 *            the object
+	 * @param event
+	 *            the event title
+	 */
+	private void addObjectCreationEvent(TraceObject object, String event) {
+		// If the auto-converter is running, creation events are not
+		// logged. However, an existing trace might have been
+		// re-created due to save operation and thus the new trace
+		// is linked to that
+		if (!TraceBuilderGlobals.getSourceContextManager().isConverting()) {
+			EventListEntry entry = new EventListEntryTraceObject(
+					TraceEvent.INFO, event, object);
+			entry.setCategory(TraceBuilderGlobals.getEvents()
+					.getEventCategory());
+			eventList.addEntry(entry);
+		} else {
+			for (EventListEntry entry : eventList) {
+				if (entry instanceof EventListEntryTraceObject) {
+					EventListEntryTraceObject objEntry = (EventListEntryTraceObject) entry;
+					if (objEntry.getObject() == null) {
+						if (objEntry.getSourceName().equals(object.getName())) {
+							objEntry.setObject(object);
+							break;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Gets the creation event title for given object
+	 * 
+	 * @param object
+	 *            the object
+	 * @return the event title
+	 */
+	private String getAddEventTitle(TraceObject object) {
+		String event = null;
+		if (object instanceof Trace) {
+			event = Messages
+					.getString("EventListContentProvider.TraceAddedEvent"); //$NON-NLS-1$
+		} else if (object instanceof TraceGroup) {
+			event = Messages
+					.getString("EventListContentProvider.GroupAddedEvent"); //$NON-NLS-1$
+		} else if (object instanceof TraceParameter) {
+			event = Messages
+					.getString("EventListContentProvider.ParameterAddedEvent"); //$NON-NLS-1$
+		} else if (object instanceof TraceConstantTable) {
+			event = Messages
+					.getString("EventListContentProvider.ConstantTableAddedEvent"); //$NON-NLS-1$
+		} else if (object instanceof TraceConstantTableEntry) {
+			event = Messages
+					.getString("EventListContentProvider.ConstantTableEntryAddedEvent"); //$NON-NLS-1$
+		}
+		return event;
+	}
+
+	/**
+	 * Gets the creation event title for given object
+	 * 
+	 * @param object
+	 *            the object
+	 * @return the event title
+	 */
+	private String getRemoveEventTitle(TraceObject object) {
+		String event = null;
+		if (object instanceof Trace) {
+			event = Messages
+					.getString("EventListContentProvider.TraceRemovedEvent"); //$NON-NLS-1$
+		} else if (object instanceof TraceGroup) {
+			event = Messages
+					.getString("EventListContentProvider.GroupRemovedEvent"); //$NON-NLS-1$
+		} else if (object instanceof TraceParameter) {
+			event = Messages
+					.getString("EventListContentProvider.ParameterRemovedEvent"); //$NON-NLS-1$
+		} else if (object instanceof TraceConstantTable) {
+			event = Messages
+					.getString("EventListContentProvider.ConstantTableRemovedEvent"); //$NON-NLS-1$
+		} else if (object instanceof TraceConstantTableEntry) {
+			event = Messages
+					.getString("EventListContentProvider.ConstantTableEntryRemovedEvent"); //$NON-NLS-1$
+		}
+		return event;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.model.TraceModelListener#
+	 *      objectRemoved(com.nokia.tracebuilder.model.TraceObject,
+	 *      com.nokia.tracebuilder.model.TraceObject)
+	 */
+	public void objectRemoved(TraceObject owner, TraceObject object) {
+		// If the auto-converter is running, creation events are not logged
+		if (!TraceBuilderGlobals.getSourceContextManager().isConverting()) {
+			HiddenTraceObjectRule hiddenRule = object
+					.getExtension(HiddenTraceObjectRule.class);
+			if (hiddenRule == null) {
+				EventListEntry entry = new EventListEntryString(
+						TraceEvent.INFO, getRemoveEventTitle(object), object
+								.getName());
+				entry.setCategory(TraceBuilderGlobals.getEvents()
+						.getEventCategory());
+				eventList.addEntry(entry);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.model.TraceModelListener#
+	 *      propertyUpdated(com.nokia.tracebuilder.model.TraceObject, int)
+	 */
+	public void propertyUpdated(TraceObject object, int property) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.model.TraceModelResetListener#modelReset()
+	 */
+	public void modelReset() {
+		eventList.removeAll(SourceLocation.class);
+		for (EventListEntry entry : eventList) {
+			if (entry instanceof EventListEntryTraceObject) {
+				((EventListEntryTraceObject) entry).objectDeleted();
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.model.TraceModelResetListener#modelResetting()
+	 */
+	public void modelResetting() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.model.TraceModelResetListener#modelValid(boolean)
+	 */
+	public void modelValid(boolean valid) {
+		if (valid) {
+			Iterator<TraceGroup> groups = TraceBuilderGlobals.getTraceModel()
+					.getGroups();
+			while (groups.hasNext()) {
+				Iterator<Trace> traces = groups.next().getTraces();
+				while (traces.hasNext()) {
+					Trace trace = traces.next();
+					checkTraceValidity(trace);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Checks that trace is referenced in source files
+	 * 
+	 * @param trace
+	 *            the trace
+	 */
+	void checkTraceValidity(Trace trace) {
+		TraceLocationList list = trace.getExtension(TraceLocationList.class);
+		LastKnownLocationList plist = trace
+				.getExtension(LastKnownLocationList.class);
+		int locCount = 0;
+		if (list != null) {
+			locCount = list.getLocationCount();
+		}
+		if (plist != null) {
+			locCount += plist.getLocationCount();
+		}
+		EventListEntryLocationCountError entry = trace
+				.getExtension(EventListEntryLocationCountError.class);
+		if (locCount == 0 || locCount > 1) {
+			if (entry == null) {
+				entry = new EventListEntryLocationCountError(eventList, trace);
+				eventList.addEntry(entry);
+			} else {
+				entry.update();
+			}
+		} else {
+			if (entry != null) {
+				eventList.removeEntry(entry);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.trace.eventview.TraceEventHandler#
+	 *      handleEvent(com.nokia.trace.eventrouter.TraceEvent)
+	 */
+	public boolean handleEvent(TraceEvent event) {
+		boolean retval = false;
+		Object o = event.getSource();
+		if (o instanceof SourceLocation || o instanceof TraceObject) {
+			eventList.asyncExec(new EventAdder(eventList, event));
+			retval = true;
+		}
+		return retval;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.model.TraceModelExtensionListener#
+	 *      extensionAdded(com.nokia.tracebuilder.model.TraceObject,
+	 *      com.nokia.tracebuilder.model.TraceModelExtension)
+	 */
+	public void extensionAdded(TraceObject object, TraceModelExtension extension) {
+		if (object instanceof Trace || object instanceof TraceModel) {
+			if (extension instanceof TraceLocationList) {
+				TraceLocationList list = (TraceLocationList) extension;
+				list.addLocationListListener(locationListListener);
+			} else if (extension instanceof LastKnownLocationList) {
+				LastKnownLocationList list = (LastKnownLocationList) extension;
+				list.addLocationListListener(locationListListener);
+			}
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.model.TraceModelExtensionListener#
+	 *      extensionRemoved(com.nokia.tracebuilder.model.TraceObject,
+	 *      com.nokia.tracebuilder.model.TraceModelExtension)
+	 */
+	public void extensionRemoved(TraceObject object,
+			TraceModelExtension extension) {
+		if (object instanceof Trace || object instanceof TraceModel) {
+			if (extension instanceof TraceLocationList) {
+				TraceLocationList list = (TraceLocationList) extension;
+				list.removeLocationListListener(locationListListener);
+			} else if (extension instanceof LastKnownLocationList) {
+				LastKnownLocationList list = (LastKnownLocationList) extension;
+				list.removeLocationListListener(locationListListener);
+			}
+		}
+	}
+
+}
\ No newline at end of file