← Back to team overview

gephi.team team mailing list archive

[Merge] lp:~cezary-bartosiak/gephi/dynamic-attr-stats into lp:gephi

 

Sébastien Heymann has proposed merging lp:~cezary-bartosiak/gephi/dynamic-attr-stats into lp:gephi.

Requested reviews:
  Mathieu Bastian (mathieu.bastian)


See http://wiki.gephi.org/index.php/Specification_-_Dynamic_Statistics
-- 
https://code.launchpad.net/~cezary-bartosiak/gephi/dynamic-attr-stats/+merge/43425
Your team Gephi Team is subscribed to branch lp:gephi.
=== modified file 'StatisticsAPI/nbproject/genfiles.properties'
--- StatisticsAPI/nbproject/genfiles.properties	2010-08-26 17:33:14 +0000
+++ StatisticsAPI/nbproject/genfiles.properties	2010-12-11 15:49:16 +0000
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=1713e19b
+build.xml.data.CRC32=aa7e7e84
 build.xml.script.CRC32=5fa00924
 build.xml.stylesheet.CRC32=a56c6a5b@1.42.2
 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
 # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=1713e19b
+nbproject/build-impl.xml.data.CRC32=aa7e7e84
 nbproject/build-impl.xml.script.CRC32=d265fda5
 nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.42.2

=== modified file 'StatisticsAPI/nbproject/project.properties'
--- StatisticsAPI/nbproject/project.properties	2010-08-28 09:35:47 +0000
+++ StatisticsAPI/nbproject/project.properties	2010-12-11 15:49:16 +0000
@@ -1,9 +1,9 @@
-auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=8
-auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=80
-auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=default
-javac.source=1.5
-javac.compilerargs=-Xlint -Xlint:-serial
-keystore=nbproject/private/keystore.ks
-license.file=../agpl-3.0.txt
-nbm.module.author=Gephi.org
-nbm_alias=gephi
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=8
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=80
+auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=default
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
+keystore=nbproject/private/keystore.ks
+license.file=../gpl-3.0.txt
+nbm.module.author=Gephi.org
+nbm_alias=gephi

=== modified file 'StatisticsAPI/nbproject/project.xml'
--- StatisticsAPI/nbproject/project.xml	2010-08-26 17:33:14 +0000
+++ StatisticsAPI/nbproject/project.xml	2010-12-11 15:49:16 +0000
@@ -15,6 +15,14 @@
                     </run-dependency>
                 </dependency>
                 <dependency>
+                    <code-name-base>org.gephi.dynamic.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>0.7.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
                     <code-name-base>org.gephi.graph.api</code-name-base>
                     <build-prerequisite/>
                     <compile-dependency/>
@@ -105,6 +113,7 @@
                 </test-type>
             </test-dependencies>
             <public-packages>
+                <package>org.gephi.statistics</package>
                 <package>org.gephi.statistics.api</package>
                 <package>org.gephi.statistics.spi</package>
             </public-packages>

=== added file 'StatisticsAPI/src/org/gephi/statistics/DynamicStatisticsImpl.java'
--- StatisticsAPI/src/org/gephi/statistics/DynamicStatisticsImpl.java	1970-01-01 00:00:00 +0000
+++ StatisticsAPI/src/org/gephi/statistics/DynamicStatisticsImpl.java	2010-12-11 15:49:16 +0000
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2008-2010 Gephi
+ * Authors : Cezary Bartosiak
+ * Website : http://www.gephi.org
+ *
+ * This file is part of Gephi.
+ *
+ * Gephi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gephi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Gephi.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.gephi.statistics;
+
+import org.gephi.data.attributes.api.AttributeModel;
+import org.gephi.data.attributes.api.Estimator;
+import org.gephi.data.attributes.type.TimeInterval;
+import org.gephi.dynamic.DynamicUtilities;
+import org.gephi.dynamic.api.DynamicController;
+import org.gephi.dynamic.api.DynamicGraph;
+import org.gephi.dynamic.api.DynamicModel;
+import org.gephi.graph.api.Graph;
+import org.gephi.graph.api.GraphModel;
+import org.gephi.statistics.spi.DynamicStatistics;
+import org.gephi.statistics.spi.Statistics;
+import org.gephi.utils.longtask.spi.LongTask;
+import org.gephi.utils.progress.Progress;
+import org.gephi.utils.progress.ProgressTicket;
+import org.openide.util.Lookup;
+
+/**
+ * The default implementation of {@link DynamicStatistics}.
+ *
+ * @author Cezary Bartosiak
+ */
+public abstract class DynamicStatisticsImpl implements DynamicStatistics, Statistics, LongTask {
+	protected TimeInterval timeInterval = new TimeInterval(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY);
+	protected double       window       = Double.POSITIVE_INFINITY - Double.NEGATIVE_INFINITY;
+	protected Estimator    estimator    = Estimator.FIRST;
+
+	private boolean        cancel;
+	private ProgressTicket progressTicket;
+	private String         graphRevision;
+
+	public TimeInterval getTimeInterval() {
+		return timeInterval;
+	}
+
+	public double getWindow() {
+		return window;
+	}
+
+	public Estimator getEstimator() {
+		return estimator;
+	}
+
+	public void setTimeInterval(TimeInterval timeInterval) {
+		this.timeInterval = timeInterval;
+	}
+
+	public void setWindow(double window) {
+		if (window < 0 || window > timeInterval.getHigh() - timeInterval.getLow())
+			throw new IllegalArgumentException(
+						"The window must be greater than 0 " +
+						"and less or equal to (high - low).");
+
+		this.window = window;
+	}
+
+	public void setEstimator(Estimator estimator) {
+		if (estimator != Estimator.MEDIAN && estimator != Estimator.MODE &&
+				estimator != Estimator.FIRST && estimator != Estimator.LAST)
+			throw new IllegalArgumentException(
+					"The given estimator must be one of the following: " +
+					"MEDIAN, MODE, FIRST, LAST.");
+
+		this.estimator = estimator;
+	}
+
+	public void execute(GraphModel graphModel, AttributeModel attributeModel) {
+		Graph graph = graphModel.getGraphVisible();
+
+		DynamicController dynamicController = Lookup.getDefault().lookup(DynamicController.class);
+		DynamicModel      dynamicModel      = dynamicController.getModel();
+		DynamicGraph      dynamicGraph      = dynamicModel.createDynamicGraph(graph, timeInterval);
+
+		cancel = false;
+		graph.writeLock();
+
+		graphRevision = "(" + graph.getNodeVersion() + ", " + graph.getEdgeVersion() + ")";
+
+		// fire abstract preloop method
+		preloop();
+
+		int progress = 0;
+		Progress.start(progressTicket, progress);
+
+		for (double low = timeInterval.getLow(); low <= timeInterval.getHigh() - window;
+				low += (window < 1.0 ? 1.0 : window)) {
+			double high = low + window;
+
+			Graph g = dynamicGraph.getSnapshotGraph(low, high, estimator);
+
+			// fire abstract inloop method
+			inloop(low, high, g, attributeModel);
+
+			Progress.progress(progressTicket, ++progress);
+			if (cancel) {
+				graph.writeUnlock();
+				return;
+			}
+		}
+
+		graph.writeUnlock();
+	}
+
+	/**
+	 * Fires before the loop on all time intervals.
+	 */
+	protected abstract void preloop();
+
+	/**
+	 * Fires during the loop on all time intervals.
+	 *
+	 * @param low            the left endpoint of the current interval
+	 * @param high           the right endpoint of the current interval
+	 * @param g              the snapshot graph
+	 * @param attributeModel the attributes model to write results to
+	 */
+	protected abstract void inloop(double low, double high, Graph g, AttributeModel attributeModel);
+
+	public String getReport() {
+		String start = "-inf";
+		String end   = "+inf";
+		if (!Double.isInfinite(timeInterval.getLow()))
+			start = DynamicUtilities.getXMLDateStringFromDouble(timeInterval.getLow()).replace('T', ' ').
+					substring(0, 19);
+		if (!Double.isInfinite(timeInterval.getHigh()))
+			end = DynamicUtilities.getXMLDateStringFromDouble(timeInterval.getHigh()).replace('T', ' ').
+					substring(0, 19);
+
+		String windowString = (int)Math.round(window / (timeInterval.getHigh() - timeInterval.getLow()) * 100) + "";
+
+		String report = new String(
+				"<html><body><h1>" + getReportName() + "</h1>" +
+				"<hr><br><h2>Network Revision Number:</h2>" +
+				graphRevision +
+				"<br>" +
+				"<h2>Parameters:</h2>" +
+				"Time interval: " + "[" + start + ", " + end + "]<br>" +
+				"Window: " + windowString + " %<br>" +
+				"Estimator: " + estimator + "<br>" +
+				getAdditionalParameters() +
+				"<h2>Results:</h2>" +
+				getResults() +
+				"</body></html>"
+			);
+
+		return report;
+	}
+	
+	/**
+	 * Returns the name of the report.
+	 * 
+	 * @return the name of the report.
+	 */
+	protected abstract String getReportName();
+	
+	/**
+	 * Returns html with additional parameters.
+	 * 
+	 * @return html with additional parameters.
+	 */
+	protected abstract String getAdditionalParameters();
+	
+	/**
+	 * Returns html with results of firing this dynamic metric.
+	 *
+	 * @return html with results of firing this dynamic metric.
+	 */
+	protected abstract String getResults();
+
+	public boolean cancel() {
+		cancel = true;
+		return true;
+	}
+
+	public void setProgressTicket(ProgressTicket progressTicket) {
+		this.progressTicket = progressTicket;
+	}
+}

=== modified file 'StatisticsAPI/src/org/gephi/statistics/StatisticsPersistenceProvider.java'
--- StatisticsAPI/src/org/gephi/statistics/StatisticsPersistenceProvider.java	2010-08-26 15:48:36 +0000
+++ StatisticsAPI/src/org/gephi/statistics/StatisticsPersistenceProvider.java	2010-12-11 15:49:16 +0000
@@ -20,7 +20,6 @@
  */
 package org.gephi.statistics;
 
-import org.gephi.statistics.StatisticsModelImpl;
 import org.gephi.project.api.Workspace;
 import org.gephi.project.spi.WorkspacePersistenceProvider;
 import org.openide.util.lookup.ServiceProvider;

=== added file 'StatisticsAPI/src/org/gephi/statistics/spi/DynamicStatistics.java'
--- StatisticsAPI/src/org/gephi/statistics/spi/DynamicStatistics.java	1970-01-01 00:00:00 +0000
+++ StatisticsAPI/src/org/gephi/statistics/spi/DynamicStatistics.java	2010-12-11 15:49:16 +0000
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2008-2010 Gephi
+ * Authors : Cezary Bartosiak
+ * Website : http://www.gephi.org
+ * 
+ * This file is part of Gephi.
+ * 
+ * Gephi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gephi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Gephi.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.gephi.statistics.spi;
+
+import org.gephi.data.attributes.api.Estimator;
+import org.gephi.data.attributes.type.TimeInterval;
+
+/**
+ * An interface for dynamic statistics.
+ * 
+ * @author Cezary Bartosiak
+ */
+public interface DynamicStatistics {
+	/**
+	 * Sets a time interval for which the statistics is executed.
+	 *
+	 * @param timeInterval the {@code TimeInterval} to set
+	 */
+	public void setTimeInterval(TimeInterval timeInterval);
+
+	/**
+	 * Sets the window - duration of one slice. It can be for instance
+	 * one year, one month etc.
+	 *
+	 * @param window duration of one slice
+	 *
+	 * @throws IllegalArgumentException if {@code window} <= {@code 0} or
+	 *                                  {@code window} > {@code high} - {@code low}.
+	 */
+	public void setWindow(double window);
+
+	/**
+	 * Sets the {@code Estimator} used to estimate snapshot graphs.
+	 *
+	 * @param estimator the {@code Estimator} used to estimate snapshot graphs
+	 *
+	 * @throws IllegalArgumentException if the given {@code Estimator} is other than
+	 *                                  {@code MEDIAN}, {@code MODE}, {@code FIRST} or
+	 *                                  {@code LAST}.
+	 */
+	public void setEstimator(Estimator estimator);
+
+	/**
+	 * Returns the time interval for which the statistics is executed.
+	 *
+	 * @return the time interval for which the statistics is executed.
+	 */
+	public TimeInterval getTimeInterval();
+
+	/**
+	 * Returns the duration of one slice.
+	 *
+	 * @return the duration of one slice.
+	 */
+	public double getWindow();
+
+	/**
+	 * Returns the {@code Estimator} used to estimate snapshot graphs.
+	 *
+	 * @return the {@code Estimator} used to estimate snapshot graphs.
+	 */
+	public Estimator getEstimator();
+}

=== modified file 'StatisticsPlugin/nbproject/genfiles.properties'
--- StatisticsPlugin/nbproject/genfiles.properties	2010-06-24 04:19:06 +0000
+++ StatisticsPlugin/nbproject/genfiles.properties	2010-12-11 15:49:16 +0000
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=21b3e328
+build.xml.data.CRC32=474d6815
 build.xml.script.CRC32=c86b517c
 build.xml.stylesheet.CRC32=a56c6a5b@1.42.1
 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
 # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=21b3e328
+nbproject/build-impl.xml.data.CRC32=474d6815
 nbproject/build-impl.xml.script.CRC32=53e53f17
 nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.42.1

=== modified file 'StatisticsPlugin/nbproject/project.xml'
--- StatisticsPlugin/nbproject/project.xml	2010-06-22 16:26:18 +0000
+++ StatisticsPlugin/nbproject/project.xml	2010-12-11 15:49:16 +0000
@@ -15,6 +15,14 @@
                     </run-dependency>
                 </dependency>
                 <dependency>
+                    <code-name-base>org.gephi.dynamic.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>0.7</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
                     <code-name-base>org.gephi.graph.api</code-name-base>
                     <build-prerequisite/>
                     <compile-dependency/>
@@ -27,7 +35,7 @@
                     <build-prerequisite/>
                     <compile-dependency/>
                     <run-dependency>
-                        <specification-version>0.7</specification-version>
+                        <specification-version>0.7.0.3</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>

=== added file 'StatisticsPlugin/src/org/gephi/statistics/plugin/DynamicDegreeDistribution.java'
--- StatisticsPlugin/src/org/gephi/statistics/plugin/DynamicDegreeDistribution.java	1970-01-01 00:00:00 +0000
+++ StatisticsPlugin/src/org/gephi/statistics/plugin/DynamicDegreeDistribution.java	2010-12-11 15:49:16 +0000
@@ -0,0 +1,395 @@
+/*
+ * Copyright 2008-2010 Gephi
+ * Authors : Cezary Bartosiak
+ * Website : http://www.gephi.org
+ * 
+ * This file is part of Gephi.
+ *
+ * Gephi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gephi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Gephi.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.gephi.statistics.plugin;
+
+import java.awt.Color;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.gephi.data.attributes.api.AttributeColumn;
+import org.gephi.data.attributes.api.AttributeModel;
+import org.gephi.data.attributes.api.AttributeOrigin;
+import org.gephi.data.attributes.api.AttributeRow;
+import org.gephi.data.attributes.api.AttributeTable;
+import org.gephi.data.attributes.api.AttributeType;
+import org.gephi.data.attributes.type.DynamicInteger;
+import org.gephi.data.attributes.type.Interval;
+import org.gephi.dynamic.DynamicUtilities;
+import org.gephi.graph.api.DirectedGraph;
+import org.gephi.graph.api.Graph;
+import org.gephi.graph.api.Node;
+import org.gephi.graph.api.UndirectedGraph;
+import org.gephi.statistics.DynamicStatisticsImpl;
+import org.gephi.utils.TempDirUtils;
+import org.gephi.utils.TempDirUtils.TempDir;
+import org.gephi.utils.progress.ProgressTicket;
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.ChartRenderingInfo;
+import org.jfree.chart.ChartUtilities;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.axis.CategoryAxis;
+import org.jfree.chart.axis.CategoryLabelPositions;
+import org.jfree.chart.axis.NumberAxis;
+import org.jfree.chart.axis.NumberTickUnit;
+import org.jfree.chart.entity.StandardEntityCollection;
+import org.jfree.chart.plot.CategoryPlot;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.category.DefaultCategoryDataset;
+import org.jfree.ui.RectangleInsets;
+import org.openide.util.Exceptions;
+
+/**
+ * This class measures how closely the degree distribution of a
+ * network follows a power-law scale.  An alpha value between 2 and 3
+ * implies a power law. It's a dynamic version that means the statistic
+ * is measured for every part (year, month etc. it depends on user's
+ * settings) of the given time interval.
+ *
+ * @author Cezary Bartosiak
+ */
+public class DynamicDegreeDistribution extends DynamicStatisticsImpl {
+	private boolean directed;
+
+	private List<Interval<Double>> inDegrees       = new ArrayList<Interval<Double>>();
+	private List<Interval<Double>> outDegrees      = new ArrayList<Interval<Double>>();
+	private List<Interval<Double>> combinedDegrees = new ArrayList<Interval<Double>>();
+
+	/**
+	 * Indicates if this network should be directed or undirected.
+	 *
+	 * @param directed indicates the metric's interpretation of this network
+	 */
+	public void setDirected(boolean directed) {
+		this.directed = directed;
+	}
+
+	/**
+	 * Returns {@code true} if this network should be directed,
+	 * otherwise {@code false}.
+	 *
+	 * @return {@code true} if this network should be directed,
+	 *         otherwise {@code false}.
+	 */
+	public boolean isDirected() {
+		return directed;
+	}
+
+	@Override
+	protected void preloop() {
+		inDegrees.clear();
+		outDegrees.clear();
+		combinedDegrees.clear();
+	}
+
+	@Override
+	protected void inloop(double low, double high, Graph g, AttributeModel attributeModel) {
+		DegreeDistribution dd = new DegreeDistribution();
+		dd.setDirected(directed);
+		dd.execute(g, attributeModel);
+
+		AttributeTable  nodeTable        = attributeModel.getNodeTable();
+		AttributeColumn dynamicInDegree  = nodeTable.getColumn("dynamicInDegree");
+		AttributeColumn dynamicOutDegree = nodeTable.getColumn("dynamicOutDegree");
+		AttributeColumn dynamicDegree    = nodeTable.getColumn("dynamicDegree");
+		if (dynamicInDegree == null)
+			dynamicInDegree = nodeTable.addColumn("dynamicInDegree", "Dynamic In Degree",
+					AttributeType.DYNAMIC_INT, AttributeOrigin.COMPUTED, new DynamicInteger());
+		if (dynamicOutDegree == null)
+			dynamicOutDegree = nodeTable.addColumn("dynamicOutDegree", "Dynamic Out Degree",
+					AttributeType.DYNAMIC_INT, AttributeOrigin.COMPUTED, new DynamicInteger());
+		if (dynamicDegree == null)
+			dynamicDegree = nodeTable.addColumn("dynamicDegree", "Dynamic Degree",
+					AttributeType.DYNAMIC_INT, AttributeOrigin.COMPUTED, new DynamicInteger());
+
+		for (Node node : g.getNodes()) {
+			AttributeRow row = (AttributeRow)node.getNodeData().getAttributes();
+			if (directed) {
+				row.setValue(dynamicInDegree, new DynamicInteger((DynamicInteger)row.getValue(dynamicInDegree),
+						new Interval<Integer>(low, high, ((DirectedGraph)g).getInDegree(node))));
+				row.setValue(dynamicOutDegree, new DynamicInteger((DynamicInteger)row.getValue(dynamicOutDegree),
+						new Interval<Integer>(low, high, ((DirectedGraph)g).getOutDegree(node))));
+			}
+			else row.setValue(dynamicDegree, new DynamicInteger((DynamicInteger)row.getValue(dynamicDegree),
+						new Interval<Integer>(low, high, ((UndirectedGraph)g).getDegree(node))));
+		}
+
+		inDegrees.add(new Interval<Double>(low, high, dd.getInPowerLaw()));
+		outDegrees.add(new Interval<Double>(low, high, dd.getOutPowerLaw()));
+		combinedDegrees.add(new Interval<Double>(low, high, dd.getCombinedPowerLaw()));
+	}
+
+	@Override
+	protected String getReportName() {
+		return "Dynamic Degree Distribution Metric Report";
+	}
+
+	@Override
+	protected String getAdditionalParameters() {
+		return "Network Interpretation: " + (directed ? "directed" : "undirected");
+	}
+
+	@Override
+	protected String getResults() {
+		if (directed)
+			return getDirectedReport();
+		else return getUndirectedReport();
+	}
+
+	private String getDirectedReport() {
+		String tableContent = "";
+		for (int i = 0; i < inDegrees.size(); ++i) {
+			String interval = "[";
+			interval += DynamicUtilities.getXMLDateStringFromDouble(inDegrees.get(i).getLow()).replace('T', ' ').
+						substring(0, 19) + ", ";
+			interval += DynamicUtilities.getXMLDateStringFromDouble(inDegrees.get(i).getHigh()).replace('T', ' ').
+						substring(0, 19);
+			interval += "]";
+
+			tableContent += "<tr>";
+			tableContent += "<td>";
+			tableContent += interval;
+			tableContent += "</td>";
+			tableContent += "<td>";
+			tableContent += inDegrees.get(i).getValue();
+			tableContent += "</td>";
+			tableContent += "<td>";
+			tableContent += outDegrees.get(i).getValue();
+			tableContent += "</td>";
+			tableContent += "</tr>";
+		}
+		String table =
+				"<table>" +
+				"<tr>" +
+					"<td><b>Time interval</b></td>" +
+					"<td><b>In-Degree Power Law</b></td>" +
+					"<td><b>Out-Degree Power Law</b></td>" +
+				"</tr>" +
+				tableContent +
+				"</table>";
+
+		String inImage = "";
+		try {
+			double inMin = Double.POSITIVE_INFINITY;
+			double inMax = Double.NEGATIVE_INFINITY;
+			DefaultCategoryDataset inDataset = new DefaultCategoryDataset();
+			for (int i = 0; i < inDegrees.size(); ++i) {
+				if (inMin > inDegrees.get(i).getValue())
+					inMin = inDegrees.get(i).getValue();
+				if (inMax < inDegrees.get(i).getValue())
+					inMax = inDegrees.get(i).getValue();
+				String interval = "[";
+				interval += DynamicUtilities.getXMLDateStringFromDouble(inDegrees.get(i).getLow()).replace('T', ' ').
+							substring(0, 19) + ", ";
+				interval += DynamicUtilities.getXMLDateStringFromDouble(inDegrees.get(i).getHigh()).replace('T', ' ').
+							substring(0, 19);
+				interval += "]";
+				inDataset.addValue(inDegrees.get(i).getValue(), "in degrees", interval);
+			}
+
+			JFreeChart inChart = ChartFactory.createLineChart(
+					"In-Degree Power Law",
+					"Time intervals",
+					"In-Degree Power Law",
+					inDataset,
+					PlotOrientation.VERTICAL,
+					true,
+					false,
+					false
+				);
+			inChart.setPadding(new RectangleInsets(0, 80, 0, 0));
+			CategoryPlot inPlot = (CategoryPlot)inChart.getPlot();
+			inPlot.setBackgroundPaint(Color.WHITE);
+			inPlot.setDomainGridlinePaint(Color.GRAY);
+			inPlot.setRangeGridlinePaint(Color.GRAY);
+			CategoryAxis inDomainAxis = inPlot.getDomainAxis();
+			inDomainAxis.setLowerMargin(0.0);
+			inDomainAxis.setUpperMargin(0.0);
+			inDomainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
+			NumberAxis inRangeAxis = (NumberAxis)inPlot.getRangeAxis();
+			inRangeAxis.setTickUnit(new NumberTickUnit(0.05));
+			inRangeAxis.setRange(inMin - 0.01 * inMin, inMax + 0.01 * inMax);
+
+			ChartRenderingInfo inInfo = new ChartRenderingInfo(new StandardEntityCollection());
+			TempDir inTempDir  = TempDirUtils.createTempDir();
+			String  inFileName = "inDynamicDistribution.png";
+			File    inFile     = inTempDir.createFile(inFileName);
+			inImage = "<img src=\"file:" + inFile.getAbsolutePath() + "\" " + "width=\"600\" height=\"600\" " +
+						"border=\"0\" usemap=\"#chart\"></img>";
+			ChartUtilities.saveChartAsPNG(inFile, inChart, 600, 600, inInfo);
+		}
+		catch (IOException ex) {
+			Exceptions.printStackTrace(ex);
+		}
+
+		String outImage = "";
+		try {
+			double outMin = Double.POSITIVE_INFINITY;
+			double outMax = Double.NEGATIVE_INFINITY;
+			DefaultCategoryDataset outDataset = new DefaultCategoryDataset();
+			for (int i = 0; i < outDegrees.size(); ++i) {
+				if (outMin > outDegrees.get(i).getValue())
+					outMin = outDegrees.get(i).getValue();
+				if (outMax < outDegrees.get(i).getValue())
+					outMax = outDegrees.get(i).getValue();
+				String interval = "[";
+				interval += DynamicUtilities.getXMLDateStringFromDouble(outDegrees.get(i).getLow()).replace('T', ' ').
+							substring(0, 19) + ", ";
+				interval += DynamicUtilities.getXMLDateStringFromDouble(outDegrees.get(i).getHigh()).replace('T', ' ').
+							substring(0, 19);
+				interval += "]";
+				outDataset.addValue(outDegrees.get(i).getValue(), "out degrees", interval);
+			}
+
+			JFreeChart outChart = ChartFactory.createLineChart(
+					"Out-Degree Power Law",
+					"Time intervals",
+					"Out-Degree Power Law",
+					outDataset,
+					PlotOrientation.VERTICAL,
+					true,
+					false,
+					false
+				);
+			outChart.setPadding(new RectangleInsets(0, 80, 0, 0));
+			CategoryPlot outPlot = (CategoryPlot)outChart.getPlot();
+			outPlot.setBackgroundPaint(Color.WHITE);
+			outPlot.setDomainGridlinePaint(Color.GRAY);
+			outPlot.setRangeGridlinePaint(Color.GRAY);
+			CategoryAxis outDomainAxis = outPlot.getDomainAxis();
+			outDomainAxis.setLowerMargin(0.0);
+			outDomainAxis.setUpperMargin(0.0);
+			outDomainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
+			NumberAxis outRangeAxis = (NumberAxis)outPlot.getRangeAxis();
+			outRangeAxis.setTickUnit(new NumberTickUnit(0.05));
+			outRangeAxis.setRange(outMin - 0.01 * outMin, outMax + 0.01 * outMax);
+
+			ChartRenderingInfo outInfo = new ChartRenderingInfo(new StandardEntityCollection());
+			TempDir outTempDir  = TempDirUtils.createTempDir();
+			String  outFileName = "outDynamicDistribution.png";
+			File    outFile     = outTempDir.createFile(outFileName);
+			outImage = "<img src=\"file:" + outFile.getAbsolutePath() + "\" " + "width=\"600\" height=\"600\" " +
+						"border=\"0\" usemap=\"#chart\"></img>";
+			ChartUtilities.saveChartAsPNG(outFile, outChart, 600, 600, outInfo);
+		}
+		catch (IOException ex) {
+			Exceptions.printStackTrace(ex);
+		}
+
+		String report = new String(
+				table + "<br>" +
+				inImage + "<br>" +
+				outImage + "<br>"
+			);
+
+		return report;
+	}
+
+	private String getUndirectedReport() {
+		String tableContent = "";
+		for (int i = 0; i < combinedDegrees.size(); ++i) {
+			String interval = "[";
+			interval += DynamicUtilities.getXMLDateStringFromDouble(combinedDegrees.get(i).getLow()).replace('T', ' ').
+						substring(0, 19) + ", ";
+			interval += DynamicUtilities.getXMLDateStringFromDouble(combinedDegrees.get(i).getHigh()).replace('T', ' ').
+						substring(0, 19);
+			interval += "]";
+
+			tableContent += "<tr>";
+			tableContent += "<td>";
+			tableContent += interval;
+			tableContent += "</td>";
+			tableContent += "<td>";
+			tableContent += combinedDegrees.get(i).getValue();
+			tableContent += "</td>";
+			tableContent += "</tr>";
+		}
+		String table =
+				"<table>" +
+				"<tr>" +
+					"<td><b>Time interval</b></td>" +
+					"<td><b>Combined-Degree Power Law</b></td>" +
+				"</tr>" +
+				tableContent +
+				"</table>";
+
+		String image = "";
+		try {
+			double min = Double.POSITIVE_INFINITY;
+			double max = Double.NEGATIVE_INFINITY;
+			DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+			for (int i = 0; i < combinedDegrees.size(); ++i) {
+				if (min > combinedDegrees.get(i).getValue())
+					min = combinedDegrees.get(i).getValue();
+				if (max < combinedDegrees.get(i).getValue())
+					max = combinedDegrees.get(i).getValue();
+				String interval = "[";
+				interval += DynamicUtilities.getXMLDateStringFromDouble(combinedDegrees.get(i).getLow()).
+							replace('T', ' ').substring(0, 19) + ", ";
+				interval += DynamicUtilities.getXMLDateStringFromDouble(combinedDegrees.get(i).getHigh()).
+							replace('T', ' ').substring(0, 19);
+				interval += "]";
+				dataset.addValue(combinedDegrees.get(i).getValue(), "combined degrees", interval);
+			}
+
+			JFreeChart chart = ChartFactory.createLineChart(
+					"Combined-Degree Power Law",
+					"Time intervals",
+					"Combined-Degree Power Law",
+					dataset,
+					PlotOrientation.VERTICAL,
+					true,
+					false,
+					false
+				);
+			chart.setPadding(new RectangleInsets(0, 80, 0, 0));
+			CategoryPlot plot = (CategoryPlot)chart.getPlot();
+			plot.setBackgroundPaint(Color.WHITE);
+			plot.setDomainGridlinePaint(Color.GRAY);
+			plot.setRangeGridlinePaint(Color.GRAY);
+			CategoryAxis domainAxis = plot.getDomainAxis();
+			domainAxis.setLowerMargin(0.0);
+			domainAxis.setUpperMargin(0.0);
+			domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
+			NumberAxis rangeAxis = (NumberAxis)plot.getRangeAxis();
+			rangeAxis.setTickUnit(new NumberTickUnit(0.05));
+			rangeAxis.setRange(min - 0.01 * min, max + 0.01 * max);
+
+			ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
+			TempDir tempDir  = TempDirUtils.createTempDir();
+			String  fileName = "combinedDynamicDistribution.png";
+			File    file     = tempDir.createFile(fileName);
+			image = "<img src=\"file:" + file.getAbsolutePath() + "\" " + "width=\"600\" height=\"600\" " +
+						"border=\"0\" usemap=\"#chart\"></img>";
+			ChartUtilities.saveChartAsPNG(file, chart, 600, 600, info);
+		}
+		catch (IOException ex) {
+			Exceptions.printStackTrace(ex);
+		}
+
+		String report = new String(
+				table + "<br>" +
+				image + "<br>"
+			);
+
+		return report;
+	}
+}

=== added file 'StatisticsPlugin/src/org/gephi/statistics/plugin/builder/DynamicDegreeDistributionBuilder.java'
--- StatisticsPlugin/src/org/gephi/statistics/plugin/builder/DynamicDegreeDistributionBuilder.java	1970-01-01 00:00:00 +0000
+++ StatisticsPlugin/src/org/gephi/statistics/plugin/builder/DynamicDegreeDistributionBuilder.java	2010-12-11 15:49:16 +0000
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2008-2010 Gephi
+ * Authors : Cezary Bartosiak
+ * Website : http://www.gephi.org
+ * 
+ * This file is part of Gephi.
+ *
+ * Gephi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gephi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Gephi.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.gephi.statistics.plugin.builder;
+
+import org.gephi.statistics.plugin.DynamicDegreeDistribution;
+import org.gephi.statistics.spi.Statistics;
+import org.gephi.statistics.spi.StatisticsBuilder;
+import org.openide.util.lookup.ServiceProvider;
+
+/**
+ * The dynamic degree distribution builder that bundles together GUI,
+ * theory and dynamic aspects of the statistic.
+ *
+ * @author Cezary Bartosiak
+ */
+@ServiceProvider(service = StatisticsBuilder.class)
+public class DynamicDegreeDistributionBuilder implements StatisticsBuilder {
+	@Override
+	public String getName() {
+		return "Dynamic Degree Distribution";
+	}
+
+	@Override
+	public Statistics getStatistics() {
+		return new DynamicDegreeDistribution();
+	}
+
+	@Override
+	public Class<? extends Statistics> getStatisticsClass() {
+		return DynamicDegreeDistribution.class;
+	}
+}

=== modified file 'StatisticsPluginUI/nbproject/genfiles.properties'
--- StatisticsPluginUI/nbproject/genfiles.properties	2010-06-22 16:26:18 +0000
+++ StatisticsPluginUI/nbproject/genfiles.properties	2010-12-11 15:49:16 +0000
@@ -1,8 +1,8 @@
-build.xml.data.CRC32=a02d6deb
+build.xml.data.CRC32=86386ce8
 build.xml.script.CRC32=4246cdb0
 build.xml.stylesheet.CRC32=a56c6a5b@1.42.1
 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
 # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
-nbproject/build-impl.xml.data.CRC32=a02d6deb
+nbproject/build-impl.xml.data.CRC32=86386ce8
 nbproject/build-impl.xml.script.CRC32=c692b14f
 nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.42.1

=== modified file 'StatisticsPluginUI/nbproject/project.xml'
--- StatisticsPluginUI/nbproject/project.xml	2010-06-22 16:26:18 +0000
+++ StatisticsPluginUI/nbproject/project.xml	2010-12-11 15:49:16 +0000
@@ -7,6 +7,22 @@
             <suite-component/>
             <module-dependencies>
                 <dependency>
+                    <code-name-base>org.gephi.data.attributes.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>0.7.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.gephi.dynamic.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>0.7</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
                     <code-name-base>org.gephi.statistics.api</code-name-base>
                     <build-prerequisite/>
                     <compile-dependency/>

=== modified file 'StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/Bundle.properties'
--- StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/Bundle.properties	2010-06-06 15:55:26 +0000
+++ StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/Bundle.properties	2010-12-11 15:49:16 +0000
@@ -62,3 +62,12 @@
 EigenvectorCentralityPanel.directedButton.text=Directed
 EigenvectorCentralityPanel.undirectedButton.text=UnDirected
 GraphDistancePanel.normalizeButton.text=Normalize Centralities in [0,1]
+DynamicPanel.timeIntervalLabel.AccessibleContext.accessibleName=timeIntervalLabel
+DynamicPanel.jLabel1.AccessibleContext.accessibleName=separatorTimeInterval
+DynamicPanel.windowLabel.AccessibleContext.accessibleName=windowLabel
+DynamicPanel.estimatorLabel.AccessibleContext.accessibleName=estimatorLabel
+DynamicPanel.separatorTimeInterval2.text=-
+DynamicPanel.separatorTimeInterval1.text=-
+DynamicPanel.timeIntervalLabel.text=Set a time interval:
+DynamicPanel.windowLabel.text=Set a window as a part of the time interval (in %):
+DynamicPanel.estimatorLabel.text=Set an estimator:

=== modified file 'StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DegreeDistributionPanel.form'
--- StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DegreeDistributionPanel.form	2010-02-16 10:56:02 +0000
+++ StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DegreeDistributionPanel.form	2010-12-11 15:49:16 +0000
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" ?>
+<?xml version="1.1" encoding="UTF-8" ?>
 
 <Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
   <NonVisualComponents>
@@ -41,7 +41,7 @@
               <EmptySpace type="unrelated" max="-2" attributes="0"/>
               <Component id="undirectedRadioButton" min="-2" max="-2" attributes="0"/>
               <EmptySpace min="-2" pref="96" max="-2" attributes="0"/>
-              <Component id="descriptionLabel" pref="2" max="32767" attributes="0"/>
+              <Component id="descriptionLabel" max="32767" attributes="0"/>
               <EmptySpace max="-2" attributes="0"/>
           </Group>
       </Group>
@@ -92,6 +92,9 @@
           <ResourceString bundle="org/gephi/ui/statistics/plugin/Bundle.properties" key="DegreeDistributionPanel.header.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_SerializeTo" type="java.lang.String" value="DegreeDistributionPanel_header"/>
+      </AuxValues>
     </Component>
   </SubComponents>
 </Form>

=== modified file 'StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DegreeDistributionPanel.java'
--- StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DegreeDistributionPanel.java	2010-08-22 21:06:56 +0000
+++ StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DegreeDistributionPanel.java	2010-12-11 15:49:16 +0000
@@ -88,7 +88,7 @@
                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                 .addComponent(undirectedRadioButton)
                 .addGap(96, 96, 96)
-                .addComponent(descriptionLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 2, Short.MAX_VALUE)
+                .addComponent(descriptionLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                 .addContainerGap())
         );
     }// </editor-fold>//GEN-END:initComponents

=== added file 'StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicDegreeDistributionPanel.java'
--- StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicDegreeDistributionPanel.java	1970-01-01 00:00:00 +0000
+++ StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicDegreeDistributionPanel.java	2010-12-11 15:49:16 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2008-2010 Gephi
+ * Authors : Cezary Bartosiak
+ * Website : http://www.gephi.org
+ * 
+ * This file is part of Gephi.
+ *
+ * Gephi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gephi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Gephi.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.gephi.ui.statistics.plugin;
+
+/**
+ * Dynamic degree distribution panel.
+ *
+ * @author Cezary Bartosiak
+ */
+public class DynamicDegreeDistributionPanel extends DynamicPanel {
+	private DegreeDistributionPanel panel = new DegreeDistributionPanel();
+
+	public DynamicDegreeDistributionPanel() {
+		setContent(panel, 150);
+	}
+
+	public boolean isDirected() {
+		return panel.isDirected();
+	}
+
+	public void setDirected(boolean directed) {
+		panel.setDirected(directed);
+	}
+}

=== added file 'StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicDegreeDistributionUI.java'
--- StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicDegreeDistributionUI.java	1970-01-01 00:00:00 +0000
+++ StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicDegreeDistributionUI.java	2010-12-11 15:49:16 +0000
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2008-2010 Gephi
+ * Authors : Cezary Bartosiak
+ * Website : http://www.gephi.org
+ * 
+ * This file is part of Gephi.
+ *
+ * Gephi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gephi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Gephi.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.gephi.ui.statistics.plugin;
+
+import javax.swing.JPanel;
+import org.gephi.statistics.plugin.DynamicDegreeDistribution;
+import org.gephi.statistics.spi.Statistics;
+import org.gephi.statistics.spi.StatisticsUI;
+import org.openide.util.lookup.ServiceProvider;
+
+/**
+ * UI for dynamic degree distribution.
+ *
+ * @author Cezary Bartosiak
+ */
+@ServiceProvider(service = StatisticsUI.class)
+public class DynamicDegreeDistributionUI implements StatisticsUI {
+	private DynamicDegreeDistributionPanel panel;
+	private DynamicDegreeDistribution      metric;
+
+	public JPanel getSettingsPanel() {
+		panel = new DynamicDegreeDistributionPanel();
+		return panel;
+	}
+
+	public void setup(Statistics statistics) {
+		metric = (DynamicDegreeDistribution)statistics;
+		if (panel != null) {
+			panel.setDirected(metric.isDirected());
+			panel.setTimeInterval(metric.getTimeInterval());
+			panel.setWindow(metric.getWindow());
+			panel.setEstimator(metric.getEstimator());
+		}
+	}
+
+	public void unsetup() {
+		if (panel != null) {
+			metric.setDirected(panel.isDirected());
+			metric.setTimeInterval(panel.getTimeInterval());
+			metric.setWindow(panel.getWindow());
+			metric.setEstimator(panel.getEstimator());
+		}
+		metric = null;
+		panel  = null;
+	}
+
+	public Class<? extends Statistics> getStatisticsClass() {
+		return DynamicDegreeDistribution.class;
+	}
+
+	public String getValue() {
+		return null;
+	}
+
+	public String getDisplayName() {
+		return "Dynamic Degree Power Law";
+	}
+
+	public String getCategory() {
+		return StatisticsUI.CATEGORY_NODE_OVERVIEW;
+	}
+
+	public int getPosition() {
+		return 101;
+	}
+}

=== added file 'StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicPanel.form'
--- StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicPanel.form	1970-01-01 00:00:00 +0000
+++ StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicPanel.form	2010-12-11 15:49:16 +0000
@@ -0,0 +1,306 @@
+<?xml version="1.1" encoding="UTF-8" ?>
+
+<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <NonVisualComponents>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="100" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="100" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+    </Container>
+  </NonVisualComponents>
+  <Properties>
+    <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+      <Dimension value="[419, 381]"/>
+    </Property>
+  </Properties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="windowSlider" pref="399" max="32767" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="estimatorLabel" min="-2" max="-2" attributes="0"/>
+              <EmptySpace pref="326" max="32767" attributes="0"/>
+          </Group>
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="estimatorComboBox" min="-2" pref="100" max="-2" attributes="1"/>
+              <EmptySpace min="-2" pref="309" max="-2" attributes="0"/>
+          </Group>
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="windowLabel" min="-2" max="-2" attributes="0"/>
+              <EmptySpace pref="168" max="32767" attributes="0"/>
+          </Group>
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="1" attributes="0">
+                  <Component id="timeIntervalLabel" alignment="0" min="-2" max="-2" attributes="0"/>
+                  <Group type="102" alignment="0" attributes="0">
+                      <Group type="103" groupAlignment="1" max="-2" attributes="0">
+                          <Group type="102" alignment="0" attributes="1">
+                              <Component id="beginHourSpinner" min="-2" pref="42" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="beginMinuteSpinner" min="-2" pref="42" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="beginSecondSpinner" min="-2" pref="42" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="separatorTimeInterval2" max="32767" attributes="0"/>
+                          </Group>
+                          <Group type="102" alignment="0" attributes="0">
+                              <Component id="beginDatePicker" min="-2" pref="139" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="separatorTimeInterval1" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Group type="102" alignment="0" attributes="0">
+                              <Component id="endHourSpinner" min="-2" pref="42" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="endMinuteSpinner" min="-2" pref="42" max="-2" attributes="0"/>
+                              <EmptySpace max="-2" attributes="0"/>
+                              <Component id="endSecondSpinner" min="-2" pref="42" max="-2" attributes="0"/>
+                          </Group>
+                          <Component id="endDatePicker" alignment="0" min="-2" pref="139" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+              </Group>
+              <EmptySpace pref="119" max="32767" attributes="0"/>
+          </Group>
+          <Component id="separator" alignment="0" pref="419" max="32767" attributes="0"/>
+          <Component id="content" alignment="0" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="1" attributes="0">
+              <Component id="content" max="32767" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="separator" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="timeIntervalLabel" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="beginDatePicker" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="separatorTimeInterval1" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="endDatePicker" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="beginHourSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="beginMinuteSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="beginSecondSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="separatorTimeInterval2" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="endHourSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="endMinuteSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="endSecondSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+              <Component id="windowLabel" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="windowSlider" min="-2" max="-2" attributes="0"/>
+              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+              <Component id="estimatorLabel" min="-2" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="estimatorComboBox" min="-2" max="-2" attributes="0"/>
+              <EmptySpace min="-2" max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Component class="javax.swing.JLabel" name="timeIntervalLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/gephi/ui/statistics/plugin/Bundle.properties" key="DynamicPanel.timeIntervalLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/gephi/ui/statistics/plugin/Bundle.properties" key="DynamicPanel.timeIntervalLabel.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="windowLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/gephi/ui/statistics/plugin/Bundle.properties" key="DynamicPanel.windowLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/gephi/ui/statistics/plugin/Bundle.properties" key="DynamicPanel.windowLabel.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="separatorTimeInterval1">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/gephi/ui/statistics/plugin/Bundle.properties" key="DynamicPanel.separatorTimeInterval1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/gephi/ui/statistics/plugin/Bundle.properties" key="DynamicPanel.jLabel1.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </Component>
+    <Component class="javax.swing.JComboBox" name="estimatorComboBox">
+      <Properties>
+        <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
+          <StringArray count="5">
+            <StringItem index="0" value="FIRST"/>
+            <StringItem index="1" value="LAST"/>
+            <StringItem index="2" value="MEDIAN"/>
+            <StringItem index="3" value="MODE"/>
+            <StringItem index="4" value=" "/>
+          </StringArray>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="estimatorLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/gephi/ui/statistics/plugin/Bundle.properties" key="DynamicPanel.estimatorLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/gephi/ui/statistics/plugin/Bundle.properties" key="DynamicPanel.estimatorLabel.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </Component>
+    <Container class="javax.swing.JPanel" name="content">
+      <AuxValues>
+        <AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="4"/>
+      </AuxValues>
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="419" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="161" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+    </Container>
+    <Component class="javax.swing.JSlider" name="windowSlider">
+      <Properties>
+        <Property name="majorTickSpacing" type="int" value="10"/>
+        <Property name="minorTickSpacing" type="int" value="1"/>
+        <Property name="paintLabels" type="boolean" value="true"/>
+        <Property name="paintTicks" type="boolean" value="true"/>
+        <Property name="snapToTicks" type="boolean" value="true"/>
+        <Property name="value" type="int" value="100"/>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JSeparator" name="separator">
+    </Component>
+    <Component class="org.jdesktop.swingx.JXDatePicker" name="beginDatePicker">
+      <Properties>
+        <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[150, 22]"/>
+        </Property>
+        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[150, 22]"/>
+        </Property>
+        <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[150, 22]"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="org.jdesktop.swingx.JXDatePicker" name="endDatePicker">
+      <Properties>
+        <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[150, 22]"/>
+        </Property>
+        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[150, 22]"/>
+        </Property>
+        <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[150, 22]"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JSpinner" name="beginHourSpinner">
+      <Properties>
+        <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+          <SpinnerModel initial="0" maximum="23" minimum="0" numberType="java.lang.Integer" stepSize="1" type="number"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JSpinner" name="beginMinuteSpinner">
+      <Properties>
+        <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+          <SpinnerModel initial="0" maximum="59" minimum="0" numberType="java.lang.Integer" stepSize="1" type="number"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JSpinner" name="beginSecondSpinner">
+      <Properties>
+        <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+          <SpinnerModel initial="0" maximum="59" minimum="0" numberType="java.lang.Integer" stepSize="1" type="number"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="separatorTimeInterval2">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/gephi/ui/statistics/plugin/Bundle.properties" key="DynamicPanel.separatorTimeInterval2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JSpinner" name="endHourSpinner">
+      <Properties>
+        <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+          <SpinnerModel initial="0" maximum="23" minimum="0" numberType="java.lang.Integer" stepSize="1" type="number"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JSpinner" name="endMinuteSpinner">
+      <Properties>
+        <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+          <SpinnerModel initial="0" maximum="59" minimum="0" numberType="java.lang.Integer" stepSize="1" type="number"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JSpinner" name="endSecondSpinner">
+      <Properties>
+        <Property name="model" type="javax.swing.SpinnerModel" editor="org.netbeans.modules.form.editors2.SpinnerModelEditor">
+          <SpinnerModel initial="0" maximum="59" minimum="0" numberType="java.lang.Integer" stepSize="1" type="number"/>
+        </Property>
+      </Properties>
+    </Component>
+  </SubComponents>
+</Form>

=== added file 'StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicPanel.java'
--- StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicPanel.java	1970-01-01 00:00:00 +0000
+++ StatisticsPluginUI/src/org/gephi/ui/statistics/plugin/DynamicPanel.java	2010-12-11 15:49:16 +0000
@@ -0,0 +1,345 @@
+/*
+ * Copyright 2008-2010 Gephi
+ * Authors : Cezary Bartosiak
+ * Website : http://www.gephi.org
+ *
+ * This file is part of Gephi.
+ *
+ * Gephi is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gephi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Gephi.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.gephi.ui.statistics.plugin;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import javax.swing.JPanel;
+import org.gephi.data.attributes.api.Estimator;
+import org.gephi.data.attributes.type.TimeInterval;
+import org.gephi.dynamic.DynamicUtilities;
+
+/**
+ * A base class for all dynamic panels.
+ *
+ * @author Cezary Bartosiak
+ */
+public class DynamicPanel extends javax.swing.JPanel {
+	/** Creates new form DynamicPanel */
+	public DynamicPanel() {
+		initComponents();
+	}
+
+	public TimeInterval getTimeInterval() {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		String begin = sdf.format(beginDatePicker.getDate());
+		String end   = sdf.format(endDatePicker.getDate());
+		int beginHour   = (Integer)beginHourSpinner.getValue();
+		int beginMinute = (Integer)beginMinuteSpinner.getValue();
+		int beginSecond = (Integer)beginSecondSpinner.getValue();
+		int endHour     = (Integer)endHourSpinner.getValue();
+		int endMinute   = (Integer)endMinuteSpinner.getValue();
+		int endSecond   = (Integer)endSecondSpinner.getValue();
+		begin += "T" + (beginHour < 10 ? "0" + beginHour : beginHour);
+		begin += ":" + (beginMinute < 10 ? "0" + beginMinute : beginMinute);
+		begin += ":" + (beginSecond < 10 ? "0" + beginSecond : beginSecond);
+		end   += "T" + (endHour < 10 ? "0" + endHour : endHour);
+		end   += ":" + (endMinute < 10 ? "0" + endMinute : endMinute);
+		end   += ":" + (endSecond < 10 ? "0" + endSecond : endSecond);
+		
+		return new TimeInterval(
+				DynamicUtilities.getDoubleFromXMLDateString(begin),
+				DynamicUtilities.getDoubleFromXMLDateString(end)
+			);
+	}
+
+	public double getWindow() {
+		TimeInterval timeInterval = getTimeInterval();
+		return windowSlider.getValue() / 100.0 * (timeInterval.getHigh() - timeInterval.getLow());
+	}
+
+	public Estimator getEstimator() {
+		switch (estimatorComboBox.getSelectedIndex()) {
+			case 0: // FIRST
+				return Estimator.FIRST;
+			case 1: // LAST
+				return Estimator.LAST;
+			case 2: // MEDIAN
+				return Estimator.MEDIAN;
+			case 3: // MODE
+				return Estimator.MODE;
+			default:
+				return Estimator.FIRST;
+		}
+	}
+
+	public void setTimeInterval(TimeInterval timeInterval) {
+		try {
+			String begin     = DynamicUtilities.getXMLDateStringFromDouble(timeInterval.getLow()).replace('T', ' ').
+								substring(0, 19);
+			String beginDate = begin.split(" ")[0];
+			String beginTime = begin.split(" ")[1];
+			String end       = DynamicUtilities.getXMLDateStringFromDouble(timeInterval.getHigh()).replace('T', ' ').
+								substring(0, 19);
+			String endDate   = end.split(" ")[0];
+			String endTime   = end.split(" ")[1];
+
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+			beginDatePicker.setDate(sdf.parse(beginDate));
+			beginHourSpinner.setValue(Integer.parseInt(beginTime.split(":")[0]));
+			beginMinuteSpinner.setValue(Integer.parseInt(beginTime.split(":")[1]));
+			beginSecondSpinner.setValue(Integer.parseInt(beginTime.split(":")[2]));
+			endDatePicker.setDate(sdf.parse(endDate));
+			endHourSpinner.setValue(Integer.parseInt(endTime.split(":")[0]));
+			endMinuteSpinner.setValue(Integer.parseInt(endTime.split(":")[1]));
+			endSecondSpinner.setValue(Integer.parseInt(endTime.split(":")[2]));
+		}
+		catch (Exception ex) {
+			beginDatePicker.setDate(new Date());
+			beginHourSpinner.setValue(0);
+			beginMinuteSpinner.setValue(0);
+			beginSecondSpinner.setValue(0);
+			endDatePicker.setDate(new Date());
+			endHourSpinner.setValue(23);
+			endMinuteSpinner.setValue(59);
+			endSecondSpinner.setValue(59);
+		}
+	}
+
+	public void setWindow(double window) {
+		TimeInterval timeInterval = getTimeInterval();
+		if (window > timeInterval.getHigh() - timeInterval.getLow() || Double.compare(window, 0.0) == 0)
+			windowSlider.setValue(100);
+		else windowSlider.setValue((int)Math.round(window / (timeInterval.getHigh() - timeInterval.getLow()) * 100));
+	}
+
+	public void setEstimator(Estimator estimator) {
+		switch (estimator) {
+			case FIRST:
+				estimatorComboBox.setSelectedIndex(0);
+				break;
+			case LAST:
+				estimatorComboBox.setSelectedIndex(1);
+				break;
+			case MEDIAN:
+				estimatorComboBox.setSelectedIndex(2);
+				break;
+			case MODE:
+				estimatorComboBox.setSelectedIndex(3);
+				break;
+			default:
+				estimatorComboBox.setSelectedIndex(0);
+				break;
+		}
+	}
+
+	protected void setContent(JPanel panel, int height) {
+		javax.swing.GroupLayout contentLayout = new javax.swing.GroupLayout(content);
+		content.setLayout(contentLayout);
+		contentLayout.setHorizontalGroup(
+			contentLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+			.addComponent(panel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE,
+				Short.MAX_VALUE)
+		);
+		contentLayout.setVerticalGroup(
+			contentLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+			.addComponent(panel, height, height, height)
+		);
+	}
+
+	/** This method is called from within the constructor to
+	 * initialize the form.
+	 * WARNING: Do NOT modify this code. The content of this method is
+	 * always regenerated by the Form Editor.
+	 */
+	@SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+        timeIntervalLabel = new javax.swing.JLabel();
+        windowLabel = new javax.swing.JLabel();
+        separatorTimeInterval1 = new javax.swing.JLabel();
+        estimatorComboBox = new javax.swing.JComboBox();
+        estimatorLabel = new javax.swing.JLabel();
+        content = new javax.swing.JPanel();
+        windowSlider = new javax.swing.JSlider();
+        separator = new javax.swing.JSeparator();
+        beginDatePicker = new org.jdesktop.swingx.JXDatePicker();
+        endDatePicker = new org.jdesktop.swingx.JXDatePicker();
+        beginHourSpinner = new javax.swing.JSpinner();
+        beginMinuteSpinner = new javax.swing.JSpinner();
+        beginSecondSpinner = new javax.swing.JSpinner();
+        separatorTimeInterval2 = new javax.swing.JLabel();
+        endHourSpinner = new javax.swing.JSpinner();
+        endMinuteSpinner = new javax.swing.JSpinner();
+        endSecondSpinner = new javax.swing.JSpinner();
+
+        setPreferredSize(new java.awt.Dimension(419, 381));
+
+        timeIntervalLabel.setText(org.openide.util.NbBundle.getMessage(DynamicPanel.class, "DynamicPanel.timeIntervalLabel.text")); // NOI18N
+
+        windowLabel.setText(org.openide.util.NbBundle.getMessage(DynamicPanel.class, "DynamicPanel.windowLabel.text")); // NOI18N
+
+        separatorTimeInterval1.setText(org.openide.util.NbBundle.getMessage(DynamicPanel.class, "DynamicPanel.separatorTimeInterval1.text")); // NOI18N
+
+        estimatorComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "FIRST", "LAST", "MEDIAN", "MODE", " " }));
+
+        estimatorLabel.setText(org.openide.util.NbBundle.getMessage(DynamicPanel.class, "DynamicPanel.estimatorLabel.text")); // NOI18N
+
+        javax.swing.GroupLayout contentLayout = new javax.swing.GroupLayout(content);
+        content.setLayout(contentLayout);
+        contentLayout.setHorizontalGroup(
+            contentLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 419, Short.MAX_VALUE)
+        );
+        contentLayout.setVerticalGroup(
+            contentLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 161, Short.MAX_VALUE)
+        );
+
+        windowSlider.setMajorTickSpacing(10);
+        windowSlider.setMinorTickSpacing(1);
+        windowSlider.setPaintLabels(true);
+        windowSlider.setPaintTicks(true);
+        windowSlider.setSnapToTicks(true);
+        windowSlider.setValue(100);
+
+        beginDatePicker.setMaximumSize(new java.awt.Dimension(150, 22));
+        beginDatePicker.setMinimumSize(new java.awt.Dimension(150, 22));
+        beginDatePicker.setPreferredSize(new java.awt.Dimension(150, 22));
+
+        endDatePicker.setMaximumSize(new java.awt.Dimension(150, 22));
+        endDatePicker.setMinimumSize(new java.awt.Dimension(150, 22));
+        endDatePicker.setPreferredSize(new java.awt.Dimension(150, 22));
+
+        beginHourSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, 23, 1));
+
+        beginMinuteSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, 59, 1));
+
+        beginSecondSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, 59, 1));
+
+        separatorTimeInterval2.setText(org.openide.util.NbBundle.getMessage(DynamicPanel.class, "DynamicPanel.separatorTimeInterval2.text")); // NOI18N
+
+        endHourSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, 23, 1));
+
+        endMinuteSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, 59, 1));
+
+        endSecondSpinner.setModel(new javax.swing.SpinnerNumberModel(0, 0, 59, 1));
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(windowSlider, javax.swing.GroupLayout.DEFAULT_SIZE, 399, Short.MAX_VALUE)
+                .addContainerGap())
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(estimatorLabel)
+                .addContainerGap(326, Short.MAX_VALUE))
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(estimatorComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addGap(309, 309, 309))
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addComponent(windowLabel)
+                .addContainerGap(168, Short.MAX_VALUE))
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                    .addComponent(timeIntervalLabel, javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
+                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
+                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
+                                .addComponent(beginHourSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                                .addComponent(beginMinuteSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                                .addComponent(beginSecondSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                                .addComponent(separatorTimeInterval2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
+                                .addComponent(beginDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, 139, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                                .addComponent(separatorTimeInterval1)))
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addGroup(layout.createSequentialGroup()
+                                .addComponent(endHourSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                                .addComponent(endMinuteSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                                .addComponent(endSecondSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE))
+                            .addComponent(endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, 139, javax.swing.GroupLayout.PREFERRED_SIZE))))
+                .addContainerGap(119, Short.MAX_VALUE))
+            .addComponent(separator, javax.swing.GroupLayout.DEFAULT_SIZE, 419, Short.MAX_VALUE)
+            .addComponent(content, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+                .addComponent(content, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(separator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(timeIntervalLabel)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(beginDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(separatorTimeInterval1)
+                    .addComponent(endDatePicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(beginHourSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(beginMinuteSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(beginSecondSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(separatorTimeInterval2)
+                    .addComponent(endHourSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(endMinuteSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(endSecondSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                .addComponent(windowLabel)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(windowSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                .addComponent(estimatorLabel)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(estimatorComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap())
+        );
+
+        timeIntervalLabel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(DynamicPanel.class, "DynamicPanel.timeIntervalLabel.AccessibleContext.accessibleName")); // NOI18N
+        windowLabel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(DynamicPanel.class, "DynamicPanel.windowLabel.AccessibleContext.accessibleName")); // NOI18N
+        separatorTimeInterval1.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(DynamicPanel.class, "DynamicPanel.jLabel1.AccessibleContext.accessibleName")); // NOI18N
+        estimatorLabel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(DynamicPanel.class, "DynamicPanel.estimatorLabel.AccessibleContext.accessibleName")); // NOI18N
+    }// </editor-fold>//GEN-END:initComponents
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private org.jdesktop.swingx.JXDatePicker beginDatePicker;
+    private javax.swing.JSpinner beginHourSpinner;
+    private javax.swing.JSpinner beginMinuteSpinner;
+    private javax.swing.JSpinner beginSecondSpinner;
+    private javax.swing.JPanel content;
+    private org.jdesktop.swingx.JXDatePicker endDatePicker;
+    private javax.swing.JSpinner endHourSpinner;
+    private javax.swing.JSpinner endMinuteSpinner;
+    private javax.swing.JSpinner endSecondSpinner;
+    private javax.swing.JComboBox estimatorComboBox;
+    private javax.swing.JLabel estimatorLabel;
+    private javax.swing.JSeparator separator;
+    private javax.swing.JLabel separatorTimeInterval1;
+    private javax.swing.JLabel separatorTimeInterval2;
+    private javax.swing.JLabel timeIntervalLabel;
+    private javax.swing.JLabel windowLabel;
+    private javax.swing.JSlider windowSlider;
+    // End of variables declaration//GEN-END:variables
+}

=== modified file 'nbproject/platform.properties'
--- nbproject/platform.properties	2010-06-22 19:50:29 +0000
+++ nbproject/platform.properties	2010-12-11 15:49:16 +0000
@@ -12,4 +12,5 @@
     org.openide.compat,\
     org.openide.options,\
     org.openide.util.enumerations
+nbjdk.active=JDK_1.6
 nbplatform.active=default

=== added directory 'nbproject/private/profiler'
=== added file 'nbproject/private/profiler/configurations.xml'
--- nbproject/private/profiler/configurations.xml	1970-01-01 00:00:00 +0000
+++ nbproject/private/profiler/configurations.xml	2010-12-11 15:49:16 +0000
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd";>
+<properties>
+<entry key="2_profiler.settings.code.region.cpu.res.buf.size">1000</entry>
+<entry key="2_profiler.settings.sort.results.by.thread.cpu.time">false</entry>
+<entry key="0_profiler.settings.instrumentation.filter.selectedprofiler.filter.type">profiler.simple.filter</entry>
+<entry key="0_profiler.settings.instrument.empty.methods">false</entry>
+<entry key="0_profiler.settings.instrumentation.filter.selectedprofiler.simple.filter.name"/>
+<entry key="1_profiler.settings.profiling.type">8</entry>
+<entry key="0_profiler.settings.cpu.exclude.wait.time">true</entry>
+<entry key="0_profiler.settings.override.working.dir"/>
+<entry key="1_profiler.settings.thread.cpu.timer.on">false</entry>
+<entry key="1_profiler.settings.instrumentation.root.methods.size">0</entry>
+<entry key="2_profiler.settings.override">false</entry>
+<entry key="profiler.settings.lastselected">1</entry>
+<entry key="2_profiler.settings.instrument.spawned.threads">false</entry>
+<entry key="0_profiler.settings.threads.monitoring.enabled">false</entry>
+<entry key="0_profiler.settings.istrument.getter.setter.methods">false</entry>
+<entry key="2_profiler.settings.instrumentation.filter.selectedprofiler.filter.type">profiler.simple.filter</entry>
+<entry key="2_profiler.settings.n.profiled.threads.limit">32</entry>
+<entry key="1_profiler.settings.sort.results.by.thread.cpu.time">false</entry>
+<entry key="2_profiler.settings.instr.scheme">1</entry>
+<entry key="1_profiler.settings.instrument.method.invoke">true</entry>
+<entry key="1_profiler.settings.instr.scheme">3</entry>
+<entry key="2_profiler.settings.sampling.interval">10</entry>
+<entry key="0_profiler.settings.instr.scheme">1</entry>
+<entry key="1_profiler.settings.run.gc.on.get.results.in.memory.profiling">true</entry>
+<entry key="2_profiler.settings.settings.name">Analyze Memory</entry>
+<entry key="0_profiler.settings.sort.results.by.thread.cpu.time">false</entry>
+<entry key="0_profiler.settings.profiling.type">1</entry>
+<entry key="1_profiler.settings.cpu.exclude.wait.time">true</entry>
+<entry key="2_profiler.settings.obj.alloc.stack.sampling.interval">10</entry>
+<entry key="1_profiler.settings.obj.alloc.stack.sampling.depth">0</entry>
+<entry key="1_profiler.settings.cpu.quick.filterprofiler.filter.type">profiler.simple.filter</entry>
+<entry key="1_profiler.settings.instrumentation.marker.methods.size">0</entry>
+<entry key="2_profiler.settings.thread.cpu.timer.on">false</entry>
+<entry key="0_profiler.settigns.ispreset">true</entry>
+<entry key="0_profiler.settings.instrumentation.filter.selectedprofiler.simple.filter.value"/>
+<entry key="2_profiler.settings.override.working.dir"/>
+<entry key="0_profiler.settings.cpu.quick.filterprofiler.simple.filter.type">1</entry>
+<entry key="2_profiler.settings.cpu.quick.filterprofiler.simple.filter.value"/>
+<entry key="2_profiler.settings.override.jvm.args"/>
+<entry key="0_profiler.settings.profile.underlying.framework">false</entry>
+<entry key="2_profiler.settings.profile.underlying.framework">false</entry>
+<entry key="2_profiler.settings.cpu.exclude.wait.time">true</entry>
+<entry key="2_profiler.settings.threads.monitoring.enabled">false</entry>
+<entry key="1_profiler.settings.instrument.spawned.threads">false</entry>
+<entry key="1_profiler.settings.n.profiled.threads.limit">32</entry>
+<entry key="0_profiler.settings.cpu.quick.filterprofiler.simple.filter.name">Quick filter...</entry>
+<entry key="2_profiler.settings.instrumentation.root.methods.size">0</entry>
+<entry key="2_profiler.settings.instrument.empty.methods">false</entry>
+<entry key="2_profiler.settings.instrumentation.filter.selectedprofiler.simple.filter.type">0</entry>
+<entry key="1_profiler.settings.instrumentation.filter.selectedprofiler.simple.filter.value">{$project.subprojects.classes.only}</entry>
+<entry key="1_profiler.settings.sampling.interval">10</entry>
+<entry key="2_profiler.settings.cpu.profiling.type">0</entry>
+<entry key="0_profiler.settings.run.gc.on.get.results.in.memory.profiling">true</entry>
+<entry key="1_profiler.settigns.ispreset">true</entry>
+<entry key="2_profiler.settings.instrumentation.filter.selectedprofiler.simple.filter.name"/>
+<entry key="0_profiler.settings.instrument.method.invoke">true</entry>
+<entry key="0_profiler.settings.obj.alloc.stack.sampling.interval">10</entry>
+<entry key="1_profiler.settings.cpu.quick.filterprofiler.simple.filter.value"/>
+<entry key="1_profiler.settings.code.region.cpu.res.buf.size">1000</entry>
+<entry key="0_profiler.settings.instrumentation.marker.methods.size">0</entry>
+<entry key="1_profiler.settings.instrumentation.filter.selectedprofiler.filter.type">profiler.simple.filter</entry>
+<entry key="0_profiler.settings.override">false</entry>
+<entry key="1_profiler.settings.settings.name">Analyze Performance</entry>
+<entry key="2_profiler.settings.instrumentation.filter.selectedprofiler.simple.filter.value"/>
+<entry key="1_profiler.settings.cpu.quick.filterprofiler.simple.filter.type">1</entry>
+<entry key="1_profiler.settings.cpu.profiling.type">0</entry>
+<entry key="1_profiler.settings.override.jvm.args"/>
+<entry key="2_profiler.settings.obj.alloc.stack.sampling.depth">0</entry>
+<entry key="1_profiler.settings.instrument.empty.methods">false</entry>
+<entry key="0_profiler.settings.cpu.quick.filterprofiler.filter.type">profiler.simple.filter</entry>
+<entry key="1_profiler.settings.cpu.quick.filterprofiler.simple.filter.name">Quick filter...</entry>
+<entry key="2_profiler.settigns.ispreset">true</entry>
+<entry key="1_profiler.settings.threads.monitoring.enabled">false</entry>
+<entry key="0_profiler.settings.instrumentation.root.methods.size">0</entry>
+<entry key="1_profiler.settings.override.working.dir"/>
+<entry key="1_profiler.settings.instrumentation.filter.selectedprofiler.simple.filter.type">2</entry>
+<entry key="0_profiler.settings.n.profiled.threads.limit">32</entry>
+<entry key="0_profiler.settings.cpu.quick.filterprofiler.simple.filter.value"/>
+<entry key="0_profiler.settings.cpu.profiling.type">0</entry>
+<entry key="0_profiler.settings.instrument.spawned.threads">false</entry>
+<entry key="1_profiler.settings.instrumentation.filter.selectedprofiler.simple.filter.name">Profile project &amp; subprojects classes</entry>
+<entry key="2_profiler.settings.instrumentation.marker.methods.size">0</entry>
+<entry key="0_profiler.settings.obj.alloc.stack.sampling.depth">0</entry>
+<entry key="2_profiler.settings.cpu.quick.filterprofiler.filter.type">profiler.simple.filter</entry>
+<entry key="0_profiler.settings.profilingpoints.enabled">true</entry>
+<entry key="2_profiler.settings.cpu.quick.filterprofiler.simple.filter.type">1</entry>
+<entry key="1_profiler.settings.override">false</entry>
+<entry key="1_profiler.settings.obj.alloc.stack.sampling.interval">10</entry>
+<entry key="2_profiler.settings.istrument.getter.setter.methods">false</entry>
+<entry key="0_profiler.settings.sampling.interval">10</entry>
+<entry key="1_profiler.settings.profile.underlying.framework">false</entry>
+<entry key="2_profiler.settings.instrument.method.invoke">true</entry>
+<entry key="1_profiler.settings.profilingpoints.enabled">true</entry>
+<entry key="1_profiler.settings.istrument.getter.setter.methods">false</entry>
+<entry key="2_profiler.settings.cpu.quick.filterprofiler.simple.filter.name">Quick filter...</entry>
+<entry key="0_profiler.settings.instrumentation.filter.selectedprofiler.simple.filter.type">0</entry>
+<entry key="0_profiler.settings.thread.cpu.timer.on">false</entry>
+<entry key="0_profiler.settings.override.jvm.args"/>
+<entry key="2_profiler.settings.profiling.type">2</entry>
+<entry key="0_profiler.settings.settings.name">Monitor Application</entry>
+<entry key="0_profiler.settings.code.region.cpu.res.buf.size">1000</entry>
+<entry key="2_profiler.settings.profilingpoints.enabled">true</entry>
+<entry key="2_profiler.settings.run.gc.on.get.results.in.memory.profiling">true</entry>
+</properties>


Follow ups