Package com.rim.samples.device.blackberrymaildemo

Source Code of com.rim.samples.device.blackberrymaildemo.FoldersViewScreen

/*
* FoldersViewScreen.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.blackberrymaildemo;

import net.rim.blackberry.api.mail.Folder;
import net.rim.blackberry.api.mail.Message;
import net.rim.blackberry.api.mail.MessagingException;
import net.rim.device.api.command.Command;
import net.rim.device.api.command.CommandHandler;
import net.rim.device.api.command.ReadOnlyCommandMetadata;
import net.rim.device.api.system.Characters;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ObjectListField;
import net.rim.device.api.util.Arrays;
import net.rim.device.api.util.StringProvider;

/**
* This class displays the messages organized by the folders they belong to
*/
public final class FoldersViewScreen extends BlackBerryMailDemoScreen {
    private Folder _currentFolder;

    /**
     * Creates a new FoldersViewScreen object
     *
     * @param currentFolder
     *            The folder for which to display the folder view
     */
    public FoldersViewScreen(final Folder currentFolder) {
        setTitle("Folders View Screen");

        _currentFolder = currentFolder;

        _changeViewMenuItem =
                new MenuItem(new StringProvider("Messages View"), 0x230010, 0);
        _changeViewMenuItem.setCommand(new Command(new CommandHandler() {
            /**
             * @see net.rim.device.api.command.CommandHandler#execute(ReadOnlyCommandMetadata,
             *      Object)
             */
            public void execute(final ReadOnlyCommandMetadata metadata,
                    final Object context) {
                _currentDisplayMode = MESSAGES_VIEW_MODE;
                close();
            }
        }));

        _listField = new FolderObjectListField();
        add(_listField);

        // Fill the list with the files and subfolders in the current folder
        populateFolderViewList();
    }

    /**
     * Fills the ListField with the objects in the current folder
     */
    private void populateFolderViewList() {
        // Retrieve the messages and subfolders residing in the current folder
        Message[] messages;
        try {
            messages = _currentFolder.getMessages();
        } catch (final MessagingException me) {
            BlackBerryMailDemo.errorDialog("Folder#getMessages() threw "
                    + me.toString());
            return;
        }
        final Folder[] subfolders = _currentFolder.list();

        // Calculate the number of objects to display and allocate the array
        // of objects to display.
        int noOfObjects = subfolders.length + messages.length;
        if (_currentFolder.getParent() != null) {
            noOfObjects++;
        }

        final Object[] objectsToDisplay = new Object[noOfObjects];

        // Add the different objects to the array of objects to display
        int indexToAddNewObjects = 0;

        // Add an entry to go back up a level if we are not in the root folder
        final Folder parent = _currentFolder.getParent();
        if (parent != null) {
            objectsToDisplay[0] = "..";
            indexToAddNewObjects++;
        }

        // Add the folders to the ObjectListField if there is something to add
        System.arraycopy(subfolders, 0, objectsToDisplay, indexToAddNewObjects,
                subfolders.length);
        indexToAddNewObjects += subfolders.length;

        // Add the messages to the ObjectListField in sorted order
        Arrays.sort(messages, Util.SORT_BY_MOST_RECENT_DATE);
        System.arraycopy(messages, 0, objectsToDisplay, indexToAddNewObjects,
                messages.length);

        // Set the list field to display the objects gathered in this method
        final ObjectListField objectListField = (ObjectListField) _listField;
        objectListField.set(objectsToDisplay);
    }

    /**
     * Opens an object selected from the list field
     */
    protected void openAction() {
        // Get the currently selected item.
        final int[] selection = _listField.getSelection();

        // MultiSelect is not enabled, so only one item will be returned.
        final Object folderOrMessageOrString =
                ((ObjectListField) _listField).get(_listField, selection[0]);

        if (folderOrMessageOrString instanceof String) {
            // The ".." entry is a string. Go back up one level.
            _currentFolder = _currentFolder.getParent();
            populateFolderViewList();
        } else if (folderOrMessageOrString instanceof Folder) {
            _currentFolder = (Folder) folderOrMessageOrString;
            populateFolderViewList();
        } else if (folderOrMessageOrString instanceof Message) {
            openMessage((Message) folderOrMessageOrString);
        }
    }

    /**
     * This is a custom ObjectListField class which draws the objects stored by
     * the FoldersViewScreen on the list field. It handles drawing Strings,
     * Folders and Messages.
     */
    private static class FolderObjectListField extends ObjectListField {
        public void drawListRow(final ListField list, final Graphics g,
                final int index, final int y, final int w) {
            // Display the name of the object, depending on its type
            final Object obj = get(list, index);
            String text = null;
            if (obj instanceof String) {
                text = (String) obj;
            } else if (obj instanceof Folder) {
                text =
                        Characters.WHITE_RIGHT_POINTING_SMALL_TRIANGLE + "  "
                                + ((Folder) obj).getName();
            } else if (obj instanceof Message) {
                final Message message = (Message) obj;
                text =
                        Util.getStatusIcon(message) + "  "
                                + message.getSubject();
            }

            g.drawText(text, 0, y, 0, w);
        }
    }
}
TOP

Related Classes of com.rim.samples.device.blackberrymaildemo.FoldersViewScreen

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.