/*
* SVGMidletDemo.java
*
* Copyright � 1998-2011 Research In Motion Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Note: For the sake of simplicity, this sample application may not leverage
* resource bundles and resource strings. However, it is STRONGLY recommended
* that application developers make use of the localization features available
* within the BlackBerry development platform to ensure a seamless application
* experience across a variety of languages and geographies. For more information
* on localizing your application, please refer to the BlackBerry Java Development
* Environment Development Guide associated with this release.
*/
package com.rim.samples.device.svg.svgmidletdemo;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.m2g.SVGImage;
import javax.microedition.m2g.ScalableGraphics;
import javax.microedition.m2g.ScalableImage;
import javax.microedition.midlet.MIDlet;
/**
* Simple demo midlet which uses JSR226 to load a SVGImage and self render it
* using ScalableGraphics.
*
* Since this sample renders a static image on the screen (i.e. we are not
* updating any of the attribute values), the attribute values of some SVG
* elements in sample.svg were hard-coded in a way to display the image
* correctly on a 9500 device. However, one can programmatically adjust those
* values by calling setFloatTrait() on the SVGElement.
*
*/
public final class SVGMidletDemo extends MIDlet implements CommandListener {
// The svg file
private static final String SVG_URL = "/sample.svg";
private Command _mainExit;
/**
* @see javax.microedition.midlet.MIDlet#startApp()
*/
protected void startApp() {
try {
final SVGImage image = loadSVGImage(SVG_URL);
final Canvas canvas = new MySVGCanvas(image);
// Display the canvas
final Display display = Display.getDisplay(this);
display.setCurrent(canvas);
// Add close command
_mainExit = new Command("Close", Command.EXIT, 1);
canvas.addCommand(_mainExit);
canvas.setCommandListener(this);
} catch (final IOException ex) {
System.exit(1);
}
}
/**
* Loads an SVGImage from a given URL
*
* @param url
* The path to the svg image we want to load
* @return The loaded svg image
*/
private SVGImage loadSVGImage(final String url) throws IOException {
// Open our input stream of the svg file we want to load.
final InputStream inputStream = getClass().getResourceAsStream(url);
// Load our svg image from the input stream.
return (SVGImage) ScalableImage.createImage(inputStream, null);
}
/**
* @see javax.microedition.midlet.MIDlet#pauseApp()
*/
protected void pauseApp() {
// Not implemented
}
/**
* @see javax.microedition.midlet.MIDlet#destroyApp(boolean)
*/
protected void destroyApp(final boolean unconditional) {
// Not implemented
}
/**
* Command listener implementation
*
* @param c
* The menu item clicked
* @param d
* The current displayable
* @see javax.microedition.lcdui.CommandListener#commandAction(Command,
* Displayable)
*/
public void commandAction(final Command c, final Displayable d) {
if (c == _mainExit) {
notifyDestroyed();
}
}
}
/**
* Custom canvas used to render the svg image
*/
final class MySVGCanvas extends Canvas {
private int _canvasWidth;
private int _canvasHeight;
private final SVGImage _image;
private final ScalableGraphics _sg;
/**
* Creates a new MySVGCanvas object
*
* @param image
* The svg image we want to render in the canvas
*/
MySVGCanvas(final SVGImage image) throws IOException {
_canvasWidth = this.getWidth();
_canvasHeight = this.getHeight();
_image = image;
_sg = ScalableGraphics.createInstance();
}
/**
* Paints the contents of the canvas using the ScalableGraphics rendering
* class and the SVGimage we want to render.
*
* @param g
* The graphics rendering context
*/
protected void paint(final Graphics g) {
if (_image == null) {
return;
}
// Bind target Graphics target to render to.
_sg.bindTarget(g);
// Set our viewport dimensions.
_image.setViewportWidth(_canvasWidth);
_image.setViewportHeight(_canvasHeight);
// Render the svg image (model) and x/y=0/0
_sg.render(0, 0, _image);
// Release bindings on Graphics
_sg.releaseTarget();
}
/**
* Invoked when the sample runs and when the screen is tilted.
*
* @see javax.microedition.lcdui.Canvas#sizeChanged(int, int)
*/
protected void sizeChanged(final int w, final int h) {
if (_canvasWidth != w || _canvasHeight != h) {
_canvasWidth = w;
_canvasHeight = h;
}
super.sizeChanged(w, h);
}
}