Platforms to show: All Mac Windows Linux Cross-Platform
/ChartDirector/symbolline datezoom
Required plugins for this example: MBS ChartDirector Plugin
You find this example project in your Plugins Download as a Xojo project file within the examples folder: /ChartDirector/symbolline datezoom
This example is the version from Mon, 12th Jan 2020.
Project "symbolline datezoom.xojo_binary_project"
Class App Inherits Application
Const kEditClear = "&Delete"
Const kFileQuit = "&Quit"
Const kFileQuitShortcut = ""
End Class
MenuBar MenuBar1
MenuItem FileMenu = "&File"
MenuItem FileQuit = "#App.kFileQuit"
MenuItem EditMenu = "&Edit"
MenuItem EditUndo = "&Undo"
MenuItem UntitledMenu1 = "-"
MenuItem EditCut = "Cu&t"
MenuItem EditCopy = "&Copy"
MenuItem EditPaste = "&Paste"
MenuItem EditClear = "#App.kEditClear"
MenuItem UntitledMenu0 = "-"
MenuItem EditSelectAll = "Select &All"
End MenuBar
Class PicWindow Inherits Window
Const zoomInRatio = 2.0
Const zoomOutRatio = 0.5
Control out Inherits Canvas
ControlInstance out Inherits Canvas
EventHandler Function MouseDown(X As Integer, Y As Integer) As Boolean
if ToolMove.Value then
out.MouseCursor=System.Cursors.HandClosed
StartX=X
StartY=Y
viewport.startDrag
else
// zoom
StartX=X
StartY=Y
StartX2=X
StartY2=Y
end if
Return true
End EventHandler
EventHandler Sub MouseDrag(X As Integer, Y As Integer)
If ToolMove.Value Then
if viewport.dragTo(CDBaseChartMBS.kDirectionHorizontalVertical, Startx-x,y-Starty) then
redraw
end if
else
StartX2=X
StartY2=Y
dim l,t as integer
dim w,h as integer
l=min(StartX,StartX2)
t=min(StartY,StartY2)
w=StartX2-StartX
h=StartY2-StartY
if w<0 then w=-w
if h<0 then h=-h
// trigger refresh
RectangleTop = t
rectangleLeft = l
rectangleWidth = w
rectangleHeight = h
out.Invalidate
end if
End EventHandler
EventHandler Sub MouseUp(X As Integer, Y As Integer)
rectangleWidth = 0
If ToolMove.Value Then
out.MouseCursor=System.Cursors.HandOpen
elseif ToolZoomIn.Value then
// zoom on point?
if abs(X-StartX)<3 and abs(Y-StartY)<3 then
// zoom in on point
if viewport.canZoomIn(CDBaseChartMBS.kDirectionHorizontalVertical) then
if viewport.zoomAt(CDBaseChartMBS.kDirectionHorizontalVertical, x, y, zoomInRatio) then
redraw
end if
else
redraw
beep
end if
else
// zoom in on a rectangle
if viewport.canZoomIn(CDBaseChartMBS.kDirectionHorizontalVertical) then
if viewport.zoomTo(CDBaseChartMBS.kDirectionHorizontalVertical, x, y, StartX, StartY) then
redraw
end if
else
redraw
beep
end if
end if
elseif ToolZoomOut.Value then
// zoom out on point
if viewport.canZoomOut(CDBaseChartMBS.kDirectionHorizontalVertical) then
if viewport.zoomAt(CDBaseChartMBS.kDirectionHorizontalVertical, x, y, zoomOutRatio) then
redraw
end if
else
redraw
beep
end if
end if
End EventHandler
EventHandler Sub Open()
me.MouseCursor=System.Cursors.HandOpen
// fix some properties if set wrong in IDE
me.DoubleBuffer = false
me.EraseBackground = false
#if RBVersion >= 2013.0 then
me.Transparent = False
#endif
End EventHandler
EventHandler Sub Paint(g As Graphics, areas() As REALbasic.Rect)
If g <> Nil Then
g.DrawPicture lastpicture,0,0
If rectangleWidth > 0 Then
g.DrawPicture rectanglePicture, rectangleLeft, rectangleTop, rectangleWidth, rectangleHeight, 0, 0, rectanglePicture.Width, rectanglePicture.Height
end if
End If
End EventHandler
End Control
Control ToolMove Inherits RadioButton
ControlInstance ToolMove Inherits RadioButton
EventHandler Sub Action()
out.MouseCursor=System.Cursors.HandOpen
End EventHandler
End Control
Control ToolZoomIn Inherits RadioButton
ControlInstance ToolZoomIn Inherits RadioButton
EventHandler Sub Action()
out.MouseCursor=System.Cursors.MagnifyLarger
End EventHandler
End Control
Control ToolZoomOut Inherits RadioButton
ControlInstance ToolZoomOut Inherits RadioButton
EventHandler Sub Action()
out.MouseCursor=System.Cursors.MagnifySmaller
End EventHandler
End Control
EventHandler Sub Open()
viewport=New CDViewPortManagerMBS
viewport.setViewPortHeight 0.6
viewport.setViewPortTop 0.2
viewport.setViewPortWidth 0.1
viewport.setViewPortLeft 0.9
'viewport.setZoomInWidthLimit 0.01
'viewport.setZoomInHeightLimit 0.01
viewport.setZoomOutWidthLimit 0.2
'viewport.setZoomOutHeightLimit 1.0
dim x0 as Double=70
dim x1 as Double=50
dim x2 as Double=30
dim d as new date
d.Year=d.Year-1
data0.Append x0
data1.Append x1
data2.Append x2
datax.append CDBaseChartMBS.chartTime(d.Year, d.Month, d.day)
for i as integer=1 to 100
x0=x0+rnd*5.0-2.5
x1=x1+rnd*5.0-2.5
x2=x2+rnd*5.0-2.5
data0.Append x0
data1.Append x1
data2.Append x2
d.day=d.day+1
datax.append CDBaseChartMBS.chartTime(d.Year, d.Month, d.day)
next
// for the selection box
rectanglePicture=New Picture(32,32,32)
rectanglePicture.Graphics.ForeColor=&cFF0000
rectanglePicture.Graphics.FillRect 0,0,32,32
rectanglePicture.mask.Graphics.ForeColor=&cCCCCCC
rectanglePicture.mask.Graphics.FillRect 0,0,32,32
redraw
End EventHandler
Protected Sub redraw()
// The data for the line chart
'dim i as integer
viewport.validateViewPort
// Create a XYChart object of size 600 x 375 pixels
Dim c As New CDXYChartMBS(600, 375)
// Add a title to the chart using 18 pts Times Bold Italic font
Call c.addTitle("Product Line Global Revenue", "timesbi.ttf", 18)
// Set the plotarea at (50, 55) and of 500 x 280 pixels in size. Use a vertical
// gradient color from light blue (f9f9ff) to sky blue (aaccff) as background.
// Set border to transparent and grid lines to white (ffffff).
Call c.setPlotArea(50, 55, 500, 280, c.linearGradientColor(0, 55, 0, 335, &hf9fcff, &haaccff), -1, c.kTransparent, &hffffff)
Call c.setClipping
// Add a legend box at (50, 28) using horizontal layout. Use 10pts Arial Bold as
// font, with transparent background.
c.addLegend(50, 28, False, "arialbd.ttf", 10).setBackground(c.kTransparent)
// Set the x axis labels
'call c.xAxis.setLabels(labels)
// Set y-axis tick density to 30 pixels. ChartDirector auto-scaling will use this
// as the guideline when putting ticks on the y-axis.
c.yAxis.setTickDensity(30)
c.yAxis2.setTickDensity(30)
// Set axis label style to 8pts Arial Bold
Call c.xAxis.setLabelStyle("arialbd.ttf", 8)
Call c.yAxis.setLabelStyle("arialbd.ttf", 8)
Call c.yAxis2.setLabelStyle("arialbd.ttf", 8)
// Set axis line width to 2 pixels
c.xAxis.setWidth(2)
c.yAxis.setWidth(2)
c.yAxis2.setWidth(2)
// Add axis title using 10pts Arial Bold Italic font
Call c.yAxis.setTitle("Revenue in US millions", "arialbi.ttf", 10)
Call c.yAxis2.setTitle("Revenue in US millions", "arialbi.ttf", 10)
// scroll
Dim axisLowerLimit As Double
Dim axisUpperLimit As Double
Dim firstDate As Double=datax(0)
Dim endDate As Double=datax(UBound(datax))
Dim deltaDate As Double = endDate-firstDate
axisLowerLimit = endDate-deltaDate *(viewport.getViewPortLeft + viewport.getViewPortWidth)
axisUpperLimit = endDate-deltaDate * viewport.getViewPortLeft
c.xAxis.setDateScale(axisLowerLimit,axisUpperLimit)
axisLowerLimit = 100.0-100.0 *(viewport.getViewPortTop + viewport.getViewPortHeight)
axisUpperLimit = 100.0-100.0 * viewport.getViewPortTop
c.yAxis.setLinearScale(axisLowerLimit,axisUpperLimit)
c.yAxis.setRounding(False, False)
c.yAxis2.setLinearScale(axisLowerLimit,axisUpperLimit)
c.yAxis2.setRounding(False, False)
// Add a line layer to the chart
Dim layer As CDLineLayerMBS
layer = c.addLineLayer
layer.setXData(datax)
// Set the line width to 3 pixels
layer.setLineWidth(3)
// Add the three data sets to the line layer, using circles, diamands and X
// shapes as symbols
Dim dataset As CDDataSetMBS
dataset=layer.addDataSet(data0, &hff0000, "Quantum Computer")
dataset.setDataSymbol(c.kCircleSymbol, 9)
dataset=layer.addDataSet(data1, &h00ff00, "Atom Synthesizer")
dataset.setDataSymbol(c.kDiamondSymbol, 11)
dataset=layer.addDataSet(data2, &hff6600, "Proton Cannon")
dataset.setDataSymbol(c.Cross2Shape, 11)
lastpicture=c.makeChartPicture
viewport.setChartMetrics c.getChartMetrics
// trigger refresh
out.Invalidate
End Sub
Property Protected StartX As Integer
Property Protected StartX2 As Integer
Property Protected StartY As Integer
Property Protected StartY2 As Integer
Property Protected data0() As double
Property Protected data1() As double
Property Protected data2() As double
Property Protected datax() As Double
Property Protected lastpicture As picture
Property Protected maxvalue As double
Property Protected minvalue As double
Property rectangleHeight As Integer
Property rectangleLeft As Integer
Property Protected rectanglePicture As picture
Property rectangleTop As Integer
Property rectangleWidth As Integer
Property Protected viewport As cdviewPortManagerMBS
End Class
End Project
See also:
The items on this page are in the following plugins: MBS ChartDirector Plugin.