--- /dev/null
+/*!
+* Ext JS Library 4.0
+* Copyright(c) 2006-2011 Sencha Inc.
+* licensing@sencha.com
+* http://www.sencha.com/license
+*/
+
+Ext.define('MyDesktop.SystemStatus', {
+ extend: 'Ext.ux.desktop.Module',
+
+ requires: [
+ 'Ext.chart.*'
+ ],
+
+ id: 'systemstatus',
+
+ init : function() {
+ // No launcher means we don't appear on the Start Menu...
+// this.launcher = {
+// text: 'SystemStatus',
+// iconCls:'cpustats',
+// handler : this.createWindow,
+// scope: this
+// };
+
+ Ext.chart.theme.Memory = Ext.extend(Ext.chart.theme.Base, {
+ constructor: function(config) {
+ Ext.chart.theme.Memory.superclass.constructor.call(this, Ext.apply({
+ colors: [ 'rgb(244, 16, 0)',
+ 'rgb(248, 130, 1)',
+ 'rgb(0, 7, 255)',
+ 'rgb(84, 254, 0)']
+ }, config));
+ }
+ });
+ },
+
+ createNewWindow: function () {
+ var me = this,
+ desktop = me.app.getDesktop();
+
+ me.cpuLoadData = [];
+ me.cpuLoadStore = Ext.create('store.json', {
+ fields: ['core1', 'core2']
+ });
+
+ me.memoryArray = ['Wired', 'Active', 'Inactive', 'Free'];
+ me.memoryStore = Ext.create('store.json', {
+ fields: ['name', 'memory'],
+ data: me.generateData(me.memoryArray)
+ });
+
+ me.pass = 0;
+ me.processArray = ['explorer', 'monitor', 'charts', 'desktop', 'Ext3', 'Ext4'];
+ me.processesMemoryStore = Ext.create('store.json', {
+ fields: ['name', 'memory'],
+ data: me.generateData(me.processArray)
+ });
+
+ me.generateCpuLoad();
+
+ return desktop.createWindow({
+ id: 'systemstatus',
+ title: 'System Status',
+ width: 800,
+ height: 600,
+ animCollapse:false,
+ constrainHeader:true,
+ border: false,
+ layout: 'fit',
+ listeners: {
+ afterrender: {
+ fn: me.updateCharts,
+ delay: 100
+ },
+ destroy: function () {
+ clearTimeout(me.updateTimer);
+ me.updateTimer = null;
+ },
+ scope: me
+ },
+ items: [{
+ xtype: 'panel',
+ layout: {
+ type: 'hbox',
+ align: 'stretch'
+ },
+ items: [{
+ flex: 1,
+ height: 600,
+ width: 400,
+ xtype: 'container',
+ layout: {
+ type: 'vbox',
+ align: 'stretch'
+ },
+ items: [
+ me.createCpu1LoadChart(),
+ me.createCpu2LoadChart()
+ ]
+ }, {
+ flex: 1,
+ width: 400,
+ height: 600,
+ xtype: 'container',
+ layout: {
+ type: 'vbox',
+ align: 'stretch'
+ },
+ items: [
+ me.createMemoryPieChart(),
+ me.createProcessChart()
+ ]
+ }]
+ }]
+ });
+ },
+
+ createWindow : function() {
+ var win = this.app.getDesktop().getWindow(this.id);
+ if (!win) {
+ win = this.createNewWindow();
+ }
+ win.show();
+ return win;
+ },
+
+ createCpu1LoadChart: function () {
+ return {
+ flex: 1,
+ xtype: 'chart',
+ theme: 'Category1',
+ animate: false,
+ store: this.cpuLoadStore,
+ legend: {
+ position: 'bottom'
+ },
+ axes: [{
+ type: 'Numeric',
+ position: 'left',
+ minimum: 0,
+ maximum: 100,
+ fields: ['core1'],
+ title: 'CPU Load',
+ grid: true,
+ labelTitle: {
+ font: '13px Arial'
+ },
+ label: {
+ font: '11px Arial'
+ }
+ }],
+ series: [{
+ title: 'Core 1 (3.4GHz)',
+ type: 'line',
+ lineWidth: 4,
+ showMarkers: false,
+ fill: true,
+ axis: 'right',
+ xField: 'time',
+ yField: 'core1',
+ style: {
+ 'stroke-width': 1
+ }
+ }]
+ };
+ },
+
+ createCpu2LoadChart: function () {
+ return {
+ flex: 1,
+ xtype: 'chart',
+ theme: 'Category2',
+ animate: false,
+ store: this.cpuLoadStore,
+ legend: {
+ position: 'bottom'
+ },
+ axes: [{
+ type: 'Numeric',
+ position: 'left',
+ minimum: 0,
+ maximum: 100,
+ grid: true,
+ fields: ['core2'],
+ title: 'CPU Load',
+ labelTitle: {
+ font: '13px Arial'
+ },
+ label: {
+ font: '11px Arial'
+ }
+ }],
+ series: [{
+ title: 'Core 2 (3.4GHz)',
+ type: 'line',
+ lineWidth: 4,
+ showMarkers: false,
+ fill: true,
+ axis: 'right',
+ xField: 'time',
+ yField: 'core2',
+ style: {
+ 'stroke-width': 1
+ }
+ }]
+ };
+ },
+
+ createMemoryPieChart: function () {
+ var me = this;
+
+ return {
+ flex: 1,
+ xtype: 'chart',
+ animate: {
+ duration: 250
+ },
+ store: this.memoryStore,
+ shadow: true,
+
+ legend: {
+ position: 'right'
+ },
+ insetPadding: 40,
+ theme: 'Memory:gradients',
+ series: [{
+ donut: 30,
+ type: 'pie',
+ field: 'memory',
+ showInLegend: true,
+ tips: {
+ trackMouse: true,
+ width: 140,
+ height: 28,
+ renderer: function(storeItem, item) {
+ //calculate percentage.
+ var total = 0;
+ me.memoryStore.each(function(rec) {
+ total += rec.get('memory');
+ });
+ this.setTitle(storeItem.get('name') + ': ' +
+ Math.round(storeItem.get('memory') / total * 100) + '%');
+ }
+ },
+ highlight: {
+ segment: {
+ margin: 20
+ }
+ },
+ labelTitle: {
+ font: '13px Arial'
+ },
+ label: {
+ field: 'name',
+ display: 'rotate',
+ contrast: true,
+ font: '12px Arial'
+ }
+ }]
+ };
+ },
+
+ createProcessChart: function () {
+ return {
+ flex: 1,
+ xtype: 'chart',
+ theme: 'Category1',
+ store: this.processesMemoryStore,
+ animate: {
+ easing: 'ease-in-out',
+ duration: 750
+ },
+ axes: [{
+ type: 'Numeric',
+ position: 'left',
+ minimum: 0,
+ maximum: 10,
+ fields: ['memory'],
+ title: 'Memory',
+ labelTitle: {
+ font: '13px Arial'
+ },
+ label: {
+ font: '11px Arial'
+ }
+ },{
+ type: 'Category',
+ position: 'bottom',
+ fields: ['name'],
+ title: 'System Processes',
+ labelTitle: {
+ font: 'bold 14px Arial'
+ },
+ label: {
+ rotation: {
+ degrees: 45
+ }
+ }
+ },{
+ type: 'Numeric',
+ position: 'top',
+ fields: ['memory'],
+ title: 'Memory Usage',
+ labelTitle: {
+ font: 'bold 14px Arial'
+ },
+ label: {
+ fill: '#FFFFFF',
+ stroke: '#FFFFFF'
+ },
+ axisStyle: {
+ fill: '#FFFFFF',
+ stroke: '#FFFFFF'
+ }
+ }],
+ series: [{
+ title: 'Processes',
+ type: 'column',
+ xField: 'name',
+ yField: 'memory',
+ renderer: function(sprite, record, attr, index, store) {
+ var lowColor = Ext.draw.Color.fromString('#b1da5a'),
+ value = record.get('memory'),
+ color;
+
+ if (value > 5) {
+ color = lowColor.getDarker((value - 5) / 15).toString();
+ } else {
+ color = lowColor.getLighter(((5 - value) / 20)).toString();
+ }
+
+ if (value >= 8) {
+ color = '#CD0000';
+ }
+
+ return Ext.apply(attr, {
+ fill: color
+ });
+ }
+ }]
+ };
+ },
+
+ generateCpuLoad: function () {
+ var me = this,
+ data = me.cpuLoadData;
+
+ function generate(factor) {
+ var value = factor + ((Math.floor(Math.random() * 2) % 2) ? -1 : 1) * Math.floor(Math.random() * 9);
+
+ if (value < 0 || value > 100) {
+ value = 50;
+ }
+
+ return value;
+ }
+
+ if (data.length === 0) {
+ data.push({
+ core1: 0,
+ core2: 0,
+ time: 0
+ });
+
+ for (var i = 1; i < 100; i++) {
+ data.push({
+ core1: generate(data[i - 1].core1),
+ core2: generate(data[i - 1].core2),
+ time: i
+ });
+ }
+
+ me.cpuLoadStore.loadData(data);
+ } else {
+ me.cpuLoadStore.data.removeAt(0);
+ me.cpuLoadStore.data.each(function(item, key) {
+ item.data.time = key;
+ });
+
+ var lastData = me.cpuLoadStore.last().data;
+ me.cpuLoadStore.loadData([{
+ core1: generate(lastData.core1),
+ core2: generate(lastData.core2),
+ time: lastData.time + 1
+ }], true);
+ }
+
+ },
+
+ generateData: function (names) {
+ var data = [],
+ i,
+ rest = names.length, consume;
+
+ for (i = 0; i < names.length; i++) {
+ consume = Math.floor(Math.random() * rest * 100) / 100 + 2;
+ rest = rest - (consume - 5);
+ data.push({
+ name: names[i],
+ memory: consume
+ });
+ }
+
+ return data;
+ },
+
+ updateCharts: function () {
+ var me = this;
+ clearTimeout(me.updateTimer);
+ me.updateTimer = setTimeout(function() {
+ if (me.pass % 3 === 0) {
+ me.memoryStore.loadData(me.generateData(me.memoryArray));
+ }
+
+ if (me.pass % 5 === 0) {
+ me.processesMemoryStore.loadData(me.generateData(me.processArray));
+ }
+
+ me.generateCpuLoad();
+ me.updateCharts();
+ me.pass++;
+ }, 500);
+ }
+});