/* * SVGScreen.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.svganimatordemo; import java.io.IOException; import java.io.InputStream; import javax.microedition.m2g.SVGAnimator; import javax.microedition.m2g.SVGImage; import javax.microedition.m2g.ScalableImage; import net.rim.device.api.ui.Field; import net.rim.device.api.ui.FieldChangeListener; import net.rim.device.api.ui.Manager; import net.rim.device.api.ui.UiApplication; import net.rim.device.api.ui.component.ButtonField; import net.rim.device.api.ui.component.ChoiceField; import net.rim.device.api.ui.component.Dialog; import net.rim.device.api.ui.component.ObjectChoiceField; import net.rim.device.api.ui.container.FlowFieldManager; import net.rim.device.api.ui.container.MainScreen; import net.rim.device.api.ui.container.VerticalFieldManager; import org.w3c.dom.Document; import org.w3c.dom.svg.SVGElement; /** * Simple demo showing how to create an interactive svg file which contains * animation and acquire its hosted ui field to add it to the screen. */ public final class SVGScreen extends MainScreen { // String constants. private static final String BOUNCING_BALL = "bouncingBall"; private static final String PLANETS = "planets"; private static final String RUNNER = "runner"; private static final String DISPLAY_ATTR = "display"; private static final String NONE_VALUE = "none"; private static final String INLINE_VALUE = "inline"; // The svg files we want to demo. private static final String SAMPLE_URL = "/sample.svg"; private static final String FIELD_PACKAGE = "net.rim.device.api.ui.Field"; private SVGImage _image; private SVGAnimator _animator; // Holds the element id of the element that is currently being displayed. private String _currentAnimation; // The interactive ui field holding the animated svg context. private Field _field; // Components used to start the selected animation. private ObjectChoiceField _options; private ButtonField _playButton; /** * Constructor. */ public SVGScreen() { setTitle("SVG Animator Demo"); // Set up the components that allow the user to choose // an animation and then run it. final VerticalFieldManager vManager = new VerticalFieldManager(Manager.VERTICAL_SCROLL); final Manager fManager = new FlowFieldManager(Manager.VERTICAL_SCROLL); setChoiceField(); fManager.add(_options); setButtonField(); fManager.add(_playButton); vManager.add(fManager); add(vManager); // First animation is set to the bouncing ball animation by default. _currentAnimation = BOUNCING_BALL; try { // Load our svg image. _image = loadSVGImage(SAMPLE_URL); // Create an interactive svg animator which hosts our ui field. _animator = SVGAnimator.createAnimator(_image, FIELD_PACKAGE); // Get the ui field from the animator. _field = (net.rim.device.api.ui.Field) _animator .getTargetComponent(); // Add the field to the screen. vManager.add(_field); _animator.play(); _playButton.setFocus(); } catch (final IOException e) { UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { Dialog.alert("SVGScreen#loadSVGImage() threw " + e.toString()); } }); } } /** * Lays out the ChoiceField with a list of available animations. */ private void setChoiceField() { final String[] items = { "Bouncing Ball", "Running Stick", "Planets" }; _options = new ObjectChoiceField("Samples:", items); _options.setChangeListener(new FieldChangeListener() { public void fieldChanged(final Field field, final int context) { if ((context & ChoiceField.CONTEXT_CHANGE_OPTION) != 0) { String elementId = null; final int index = _options.getSelectedIndex(); switch (index) { case 0: elementId = BOUNCING_BALL; break; case 1: elementId = RUNNER; break; case 2: elementId = PLANETS; break; } setDisplayInline(elementId); _playButton.setFocus(); } } }); } /** * Activates the given element. * * @param elementId * the id of the element being activated */ private void activateElement(final String elementId) { final Document doc = _image.getDocument(); final SVGElement element = (SVGElement) doc.getElementById(elementId); _image.focusOn(element); _image.activate(); } /** * Displays the given element. * * @param elementId * the id of the element being displayed */ private void setDisplayInline(final String elementId) { final Document doc = _image.getDocument(); SVGElement animation = null; if (!_currentAnimation.equals("")) { animation = (SVGElement) doc.getElementById(_currentAnimation); animation.setTrait(DISPLAY_ATTR, NONE_VALUE); } animation = (SVGElement) doc.getElementById(elementId); _currentAnimation = elementId; animation.setTrait(DISPLAY_ATTR, INLINE_VALUE); } /** * Lays out the button that starts the current animation. */ private void setButtonField() { _playButton = new ButtonField("Play", ButtonField.CONSUME_CLICK); _playButton.setChangeListener(new FieldChangeListener() { public void fieldChanged(final Field field, final int context) { activateElement(_currentAnimation); } }); } /** * 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); } /** * Prevent the save dialog from being displayed. * * @see net.rim.device.api.ui.container.MainScreen#onSavePrompt() */ public boolean onSavePrompt() { return true; } }