Package com.rim.samples.device.mapfielddemo

Source Code of com.rim.samples.device.mapfielddemo.DemoMapField

/*
* DemoMapField.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.mapfielddemo;

import java.util.Vector;

import javax.microedition.location.Coordinates;

import net.rim.device.api.lbs.MapField;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.XYPoint;
import net.rim.device.api.ui.component.LabelField;

/**
* Displays a map and all the sites added to it.
*/
public class DemoMapField extends MapField {
    // Vector of sites
    private final Vector _allSites = new Vector();
    private MapFieldDemoSite _highlightedSite;

    // For cursor
    private final Bitmap _cursor = Bitmap.getBitmapResource("bullseye.png");

    // For preferred height
    private LabelField _sampleLabel;

    // Instructive text
    private final int _textHeight;
    private boolean _turnOffText = false;

    /**
     * Initializes map.
     */
    public DemoMapField() {
        // Sample label is only used to determine the instructive text height
        // and is declared null right after use.
        _sampleLabel = new LabelField();
        _textHeight = _sampleLabel.getPreferredHeight();
        _sampleLabel = null;

        // Zoom in to the deepest level
        setZoom(getMinZoom());
    }

    /**
     * Runs through all the sites and sets their color.
     */
    private void determineSiteColors() {
        final Vector highlightCandidates = new Vector(); // Stores the sites
                                                         // that the cursor
                                                         // touches.
        final XYPoint convertedHighlightArea[] = new XYPoint[4];

        // Cursor coordinates , obtained by dividing preferred width and height
        // by 2.
        final int cursorX = getPreferredWidth() >> 1;
        final int cursorY = getPreferredHeight() >> 1;

        // See comments below.
        int above, below, right, left;

        for (int count = 0; count < _allSites.size(); count++) {
            final Coordinates[] highlightableArea =
                    ((MapFieldDemoSite) _allSites.elementAt(count))
                            .getHighlightableArea();

            /*
             * The following algorithm dictates that for a site to be deemed
             * highlightable, the cursor must be at least over one point, under
             * one point, to the left of one point and to the right of one point
             */

            above = below = right = left = 0;
            for (int side = 0; side < 4; side++) {
                convertedHighlightArea[side] = new XYPoint();
                convertWorldToField(highlightableArea[side],
                        convertedHighlightArea[side]);

                if (convertedHighlightArea[side].x > cursorX) {
                    right++;
                }

                if (convertedHighlightArea[side].x < cursorX) {
                    left++;
                }

                if (convertedHighlightArea[side].y > cursorY) {
                    above++;
                }

                if (convertedHighlightArea[side].y < cursorY) {
                    below++;
                }
            }

            // If this condition passes, the site is being touched by the
            // cursor.
            if (right >= 1 && left >= 1 && above >= 1 && below >= 1) {
                highlightCandidates.addElement(_allSites.elementAt(count));
            } else {
                ((MapFieldDemoSite) _allSites.elementAt(count))
                        .setHighlight(false);
            }
        }

        if (highlightCandidates.size() > 0) {
            // Highlights the first highlightable site and disregards the rest.
            ((MapFieldDemoSite) highlightCandidates.elementAt(0))
                    .setHighlight(true);
            _highlightedSite =
                    (MapFieldDemoSite) highlightCandidates.elementAt(0);

            if (highlightCandidates.size() > 1) {
                for (int count = 1; count < highlightCandidates.size(); count++) {
                    ((MapFieldDemoSite) highlightCandidates.elementAt(count))
                            .setHighlight(false);
                }
            }
        }
    }

    /**
     * @see net.rim.device.api.lbs.MapField#paint(Graphics)
     */
    protected void paint(final Graphics g) {
        // Smooths out all the polygons.
        g.setDrawingStyle(Graphics.DRAWSTYLE_ANTIALIASED, true);
        super.paint(g);

        // Runs through all sites and determines color.
        determineSiteColors();

        // Paints all the sites on the map.
        for (int count = 0; count < _allSites.size(); count++) {
            final MapFieldDemoSite currentSite =
                    (MapFieldDemoSite) _allSites.elementAt(count);
            currentSite.drawSite(g);
        }

        // Places the cursor permanently at the center of the map.
        // Logical right shift ">> 1" is equivalent to division by 2.
        g.drawBitmap(getWidth() >> 1, getHeight() >> 1, getWidth(),
                getHeight(), _cursor, 0, 0);

        // Displays instructive text until turned off.
        if (!_turnOffText) {
            g.setColor(Color.SLATEGRAY);
            g.drawText("Use 'I' to zoom in", 1, _textHeight + 2);
            g.drawText("Use 'O' to zoom out", 1, _textHeight * 2 + 4);
        }
    }

    /**
     * @see net.rim.device.api.lbs.MapField#setZoom(int)
     */
    public void setZoom(final int zoom) {
        _turnOffText = true;
        super.setZoom(zoom);
    }

    /**
     * @see net.rim.device.api.ui.Field#navigationMovement(int, int, int, int)
     */
    protected boolean navigationMovement(final int dx, final int dy,
            final int status, final int time) {
        // The map is shifted in relation to the current zoom level.
        final int zoom = getZoom();
        final int latitude = getLatitude() - (dy << 3 << zoom); // << 3 is
                                                                // equivalent to
                                                                // multiplication
                                                                // by 8.
        final int longitude = getLongitude() + (dx << 3 << zoom);

        moveTo(latitude, longitude);

        return true;
    }

    /**
     * Adds a site to the map.
     *
     * @param site
     *            Site to be added.
     */
    void addSite(final MapFieldDemoSite site) {
        _allSites.addElement(site);
    }

    /**
     * Returns all the highlighted sites. Ideally there would only be one
     * highlighted site, but differing zoom levels and proximity of sites may
     * result in multiple highlighted sites.
     *
     * @return Highlighted sites.
     */
    MapFieldDemoSite getHighlightedSite() {
        return _highlightedSite;
    }
}
TOP

Related Classes of com.rim.samples.device.mapfielddemo.DemoMapField

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.