sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/graph/YAxis.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/analyzetoolext/com.nokia.s60tools.analyzetool/src/com/nokia/s60tools/analyzetool/internal/ui/graph/YAxis.java Thu Feb 11 15:22:14 2010 +0200
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2008-2009 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: Definitions for the class YAxis
+ *
+ */
+package com.nokia.s60tools.analyzetool.internal.ui.graph;
+import java.text.DecimalFormat;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Transform;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.progress.UIJob;
+
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModel;
+import com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener;
+import com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo;
+import com.nokia.s60tools.analyzetool.internal.ui.util.GraphUtils;
+
+/**
+ * FigureCanvas containing the Y axis of the AnalyzeTool graph
+ *
+ */
+public class YAxis extends Canvas implements IMemoryActivityModelChangeListener {
+ private static final int YLEGENDSPACE = 60;
+ private static final DecimalFormat MB_FORMAT = new DecimalFormat("#####.0");
+ private IMemoryActivityModel model;
+ protected int visualSizeY = 0;
+ private UIJob iRefreshUIJob;
+ private Image bytesImage;
+
+ /**
+ * Constructor
+ * @param parent
+ */
+ public YAxis(Composite parent) {
+ super(parent, SWT.NONE);
+ }
+ /**
+ * To be called once after construction.
+ */
+ public void createContent() {
+ iRefreshUIJob = new UIJob("Updating Memory Activity Graph"){
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor arg0) {
+ // Refresh the graph
+ redraw();
+ return Status.OK_STATUS;
+ }
+
+ };
+ iRefreshUIJob.setSystem(true);
+ }
+
+ /**
+ * Sets a new model as input
+ * @param model
+ */
+ public void setInput(IMemoryActivityModel model) {
+ if (this.model != null){
+ this.model.removeListener(this);
+ }
+ this.model = model;
+ this.model.addListener(this);
+ }
+
+ /**
+ * Called when paint event occurs.
+ * @param gc The GC to draw on
+ */
+ @SuppressWarnings("cast")
+ public void paintYAxis(GC gc){
+
+
+ double visY = visualSizeY - 50;
+ //max value influences unit of measure on graph
+ int prettyBytes = GraphUtils.prettyMaxBytes(model.getHighestCumulatedMemoryAlloc());
+ double multiplier = prettyBytes / visY;
+
+ double yIncrement = visY / 10;
+ int previousBottom = 0;
+
+ for (double k = visY; k >= 0; k-=yIncrement)
+ {
+ // location for the value indicator is k * 1/10 the height of the display
+ int y = (int) (visY - k);
+
+ int bytes = (int)(Math.ceil(k * multiplier));
+
+ String legend = "";
+
+ if (prettyBytes < 10*1024)
+ {
+ legend += bytes + " B";
+ }
+ else if (prettyBytes <= 500 * 1024)
+ {
+ legend += (bytes / 1024) + " KB";
+ }
+ else
+ {
+ legend += MB_FORMAT.format(((float) bytes / (1024 * 1024))) + " MB";
+ }
+ org.eclipse.swt.graphics.Point extent = gc.stringExtent(legend);
+
+ gc.drawLine(YLEGENDSPACE - 3, (int)y + 1, YLEGENDSPACE, (int)y + 1);
+
+ if (y >= previousBottom)
+ {
+ gc.drawString(legend, YLEGENDSPACE - extent.x -2, (int)y);
+ previousBottom = (int)y + extent.y;
+ }
+ }
+
+ if (bytesImage == null){
+ bytesImage = GraphUtils.getVerticalLabel("Bytes");
+ }
+ gc.setAdvanced(true);
+ final org.eclipse.swt.graphics.Rectangle rect2 = bytesImage.getBounds();
+ Transform transform = new Transform(Display.getDefault());
+
+ transform.translate(rect2.height / 2f, rect2.width / 2f);
+ transform.rotate(-90);
+ transform.translate(-rect2.width / 2f, -rect2.height / 2f);
+
+ gc.setTransform(transform);
+ gc.drawImage(bytesImage, -(int)visY/3, 1);
+
+ transform.dispose();
+ }
+
+ /**
+ * @return the visible height of the control
+ */
+ public int getHeight() {
+ return visualSizeY;
+ }
+ /**
+ * Sets the visible height of the control
+ * @param height the height to set
+ */
+ public void setHeight(int height) {
+ visualSizeY = height;
+ }
+
+ /* (non-Javadoc)
+ * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener#onProcessesAdded()
+ */
+ public void onProcessesAdded() {
+ iRefreshUIJob.cancel();
+ iRefreshUIJob.schedule();
+ }
+
+ /* (non-Javadoc)
+ * @see com.nokia.s60tools.analyzetool.engine.IMemoryActivityModelChangeListener#onProcessSelected(com.nokia.s60tools.analyzetool.engine.statistic.ProcessInfo)
+ */
+ public void onProcessSelected(ProcessInfo p) {
+ iRefreshUIJob.cancel();
+ iRefreshUIJob.schedule();
+ }
+
+// public void dispose() {
+// //TODO cancel ui jobs here and remove listeners
+// //there is no dispose() entry point in this class; we may have to call this via MainView.dispose()
+//}
+
+}