package ny2010; import javafx.stage.*; import javafx.scene.*; import javafx.scene.paint.*; import javafx.animation.*; import javafx.scene.image.*; import javax.swing.*; import javafx.ext.swing.*; import crudfx.util.*; import crudfx.map.*; import crudfx.data.*; import javafx.scene.text.*; import javafx.scene.shape.*; import javafx.scene.input.*; import javafx.scene.media.*; class SnowFlake extends CustomNode{ public var x:Number; public var y:Number; public var r:Number; override function create():Node{ return Circle { fill:Color.web("#ffffff", 0.3+0.5*r) centerX:bind x centerY:bind y radius:bind 3+r*5 }; } } var properties:HomeProperties=HomeProperties{ key:"ny2010.CRUDfx.xml" }; def _width=properties.node("width").asNumber(600); def _height=properties.node("height").asNumber(650); def _left=properties.node("left").asNumber(100); def _top=properties.node("top").asNumber(50); def _zoom=properties.node("zoom").asNumber(2); def _nn=properties.node("nn").asInteger(0); if(_height.value<300 or _height.value>3000)_height.value=300; if(_width.value<300 or _width.value>3000)_width.value=300; if(_left.value<0 or _left.value>3000)_left.value=100; if(_top.value<0 or _top.value>3000)_top.value=100; var googleMap:GoogleMap; var c:Circle; var flakes:SnowFlake[]; var url:String[]; var info:String[]; var cancel:Boolean=false; var longitude:Number[]; var latitude:Number[]; insert "http://images.earthcam.com/ec_metros/ourcams/moscow.jpg?d=" into url; insert "Russia, Moscow, Red Hills" into info; insert 37.624708 into longitude; insert 55.748465 into latitude; insert "http://www.pyramidcam.com/netcam.jpg?1" into url; insert "Egypt, Giza" into info; insert 32.626305 into longitude; insert 25.703258 into latitude; insert "http://images.earthcam.com/ec_metros/ourcams/lindys.jpg?d=" into url; insert "USA, New York, Times Square" into info; insert -73.984509 into longitude; insert 40.763836 into latitude; insert "http://www.imb.it/fullsize2.jpg?d=" into url; insert "Italy, Milano, San Babila" into info; insert 9.18839 into longitude; insert 45.464781 into latitude; insert "http://www.livecam.ru/pics/fullsize.jpg?d=" into url; insert "Russia, Sankt Peterburg, Nevskiy prospect" into info; insert 30.322266 into longitude; insert 59.937128 into latitude; insert "http://wirelessweb.co.nz/square.jpg?d=" into url; insert "New Zealand, Christchurch, Cathedral Square" into info; insert 172.636645 into longitude; insert -43.531637 into latitude; insert "http://www.zincportdouglas.com/portico_image.jpg?d=1" into url; insert "Australia, Port Douglas" into info; insert 145.46582 into longitude; insert -16.483986 into latitude; insert "http://www.dosanko.co.jp/weather/camera_l.jpg?d=1" into url; insert "Japan, Sapporo" into info; insert 141.355591 into longitude; insert 43.038783 into latitude; insert "http://www.mucl.cz/user_data/webkamera/webcam/current.jpg?a" into url; insert "Czech Republic, Ceska Lipa" into info; insert 14.537128 into longitude; insert 50.686649 into latitude; insert "http://ww2.medway.gov.uk/FTP/_webcam/camimg.jpg?1" into url; insert "United Kingdom, Rochester" into info; insert 0.503732 into longitude; insert 51.38979 into latitude; insert "http://www.bucuticam.com/arubacam.jpg?a=1" into url; insert "Aruba, Bucuti" into info; insert -70.033333 into longitude; insert 12.516667 into latitude; insert "http://www.stjohns.ca/camera/gower/current.jpg?d" into url; insert "Canada, St John's City" into info; insert -52.713419 into longitude; insert 47.55895 into latitude; var image:Image=Image { url:url[_nn.value] }; var lock:Boolean=false; function updateImage(){ if(lock) return; lock=true; cancel=false; var img:Image; Waiter { action:function ():Void{ var newURL:String="{url[_nn.value]}{java.lang.Math.random()}"; ConsoleIO.message(newURL); try{ var t:ImageIcon=new ImageIcon(new java.net.URL(newURL)); var bi:java.awt.image.BufferedImage=crudfx.util.Tools.toBufferedImage(t.getImage()); img=SwingUtils.toFXImage(bi); ConsoleIO.message("done"); }catch(e){ e.printStackTrace(); } } onDone:function ():Void{ lock=false; if(not cancel){ image=img; googleMap.latitude=latitude[_nn.value]; googleMap.longitude=longitude[_nn.value]; googleMap.latitude=latitude[_nn.value]; } } }.serve(); } var bg:Timeline=Timeline { repeatCount:Timeline.INDEFINITE keyFrames:KeyFrame { //canSkip:true time:3s action:function ():Void{ updateImage(); } } }; var snow:Timeline=Timeline { repeatCount:Timeline.INDEFINITE keyFrames:KeyFrame { canSkip:true time:0.05s action:function ():Void{ tick(); } } }; for(i in [1..50]){ insert SnowFlake { r:java.lang.Math.random() x:_width.value*java.lang.Math.random() y:_height.value*java.lang.Math.random() } into flakes; } function tick(){ for(s:SnowFlake in flakes){ s.y=s.y+3+5*s.r; if(s.y>_height.value){ s.y=0; s.x=_width.value*java.lang.Math.random(); } } } function stopAll(){ bg.stop(); snow.stop(); } FX.addShutdownAction( function ():Void{ stopAll(); properties.gather(); properties.save(); }); var d:java.awt.Dimension=Tools.getFrameInnerSize(false); var dw:Number=d.getWidth(); Stage { title:"Happy New Year 2010 - {Tools.getVersion()}" width:bind _width.value with inverse height:bind _height.value with inverse x:bind _left.value with inverse y:bind _top.value with inverse scene:Scene { fill:Color.web("#000000") content:[ ImageView { image:bind image preserveRatio:true fitWidth:bind _width.value-dw } Rectangle { x:0 y:bind _height.value-90 width:bind _width.value height:90 fill:Color.web("#000000") } googleMap=GoogleMap { width:120 height:120 translateX:bind _width.value-170 translateY:bind _height.value-170 zoom:bind _zoom.value with inverse latitude:latitude[_nn.value] longitude:longitude[_nn.value] } Rectangle { x:bind _width.value-44 y:bind _height.value-81 width:9 height:3 fill:Color.web("#ffffff",0.5) } Rectangle { x:bind _width.value-44+3 y:bind _height.value-81-3 width:3 height:9 fill:Color.web("#ffffff",0.5) } Rectangle { x:bind _width.value-44 y:bind _height.value-81+20 width:9 height:3 fill:Color.web("#ffffff",0.5) } Circle { cursor:Cursor.HAND fill:Color.web("#ffffff", 0.5) centerX:bind _width.value-40 centerY:bind _height.value-60 radius:8 onMouseClicked:function (mouseEvent:MouseEvent):Void{ if(_zoom.value>0)_zoom.value--; } } Circle { cursor:Cursor.HAND fill:Color.web("#ffffff", 0.5) centerX:bind _width.value-40 centerY:bind _height.value-60-20 radius:8 onMouseClicked:function (mouseEvent:MouseEvent):Void{ if(_zoom.value<9)_zoom.value++; } } Circle { cursor:Cursor.HAND fill:Color.web("#ffffff", 0.5) centerX:bind _width.value-40 centerY:bind _height.value-60-20-20 radius:8 onMouseClicked:function (mouseEvent:MouseEvent):Void{ googleMap.latitude=latitude[_nn.value]; googleMap.longitude=longitude[_nn.value]; googleMap.latitude=latitude[_nn.value]; } } Rectangle { x:19 y:bind _height.value-66 width:12 height:12 fill:Color.web("#ffffff") } Text { x:50 y:bind _height.value-50 fill:Color.web("#eeeeff") font:Font { name:"Arial Bold" size:17 } content:bind info[_nn.value] } Group { content:bind flakes } c=Circle { cursor:Cursor.HAND fill:bind if(c.hover) then Color.web("#ffffff", 0.9) else Color.web("#ffffff", 0.5) centerX:25 centerY:bind _height.value-60 radius:16 onMouseClicked:function (mouseEvent:MouseEvent):Void{ cancel=true; image=null; if(_nn.value