Package com.rim.samples.device.blackberrymaildemo

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

/*
* MessagesViewScreen.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.blackberry.api.mail.event.FolderEvent;
import net.rim.blackberry.api.mail.event.FolderListener;
import net.rim.blackberry.api.mail.event.MessageEvent;
import net.rim.blackberry.api.mail.event.MessageListener;
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.ui.MenuItem;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.util.SimpleSortingVector;
import net.rim.device.api.util.StringProvider;

/**
* This class allows the user to view all of the messages. It uses the
* MessagesListField class to display the messages. The messages are displayed
* in reverse chronological order. This class also implements a FolderListener
* to listen for any events in which messages are changed, and a FolderListener
* to listen for events in which messages are added or removed from a store
* folder. In addition to the menu options given by the parent class
* BlackBerryMailDemoScreen, this class allows the user to delete messages.
*/
public final class MessagesViewScreen extends BlackBerryMailDemoScreen
        implements FolderListener, MessageListener {
    private final SimpleSortingVector _messages;
    private final UiApplication _uiApplication;

    /**
     * Creates a new MessagesViewScreen object
     */
    public MessagesViewScreen() {
        setTitle("Messages View Screen");

        // Add this object as the folder listener for the store email service
        _store.addFolderListener(this);

        // Initialize the simple sorting vector to sort manually according to
        // most recent date.
        _messages = new SimpleSortingVector();
        _messages.setSortComparator(Util.SORT_BY_MOST_RECENT_DATE);
        _messages.setSort(false);

        // Fill the message vector then sort it
        populateList(_store.list(Folder.SUBTREE));
        _messages.reSort();

        // Add the list field to display the messages
        _listField = new MessagesListField(_messages);
        add(_listField);

        // Store the UiApplication for use in refreshing the message list field
        _uiApplication = UiApplication.getUiApplication();

        _changeViewMenuItem =
                new MenuItem(new StringProvider("Folders View"), 0x230020, 1);
        _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 = FOLDERS_VIEW_MODE;

                final Folder currentFolder =
                        ((Message) getSelectedItem()).getFolder();

                final FoldersViewScreen foldersViewScreen =
                        new FoldersViewScreen(currentFolder);
                UiApplication.getUiApplication().pushScreen(foldersViewScreen);
            }
        }));

        _deleteMenuItem =
                new MenuItem(new StringProvider("Delete Message"), 0x230010, 0);
        _deleteMenuItem.setCommand(new Command(new CommandHandler() {
            /**
             * @see net.rim.device.api.command.CommandHandler#execute(ReadOnlyCommandMetadata,
             *      Object)
             */
            public void execute(final ReadOnlyCommandMetadata metadata,
                    final Object context) {
                final int choice =
                        Dialog.ask(Dialog.D_YES_NO, "Delete message?",
                                Dialog.YES);
                if (choice == Dialog.YES) {
                    final Message message = (Message) getSelectedItem();
                    final Folder folder = message.getFolder();
                    folder.deleteMessage(message);
                    updateScreen();
                }
            }
        }));
    }

    /**
     * @see com.rim.samples.device.blackberrymaildemo.BlackBerryMailDemoScreen#makeMenu(Menu,
     *      int)
     */
    protected void makeMenu(final Menu menu, final int instance) {
        if (!_listField.isEmpty()) {
            menu.add(_deleteMenuItem);
        }
        super.makeMenu(menu, instance);
    }

    /**
     * Refreshes the message store, messages, and the screen when the message
     * service is changed.
     *
     * @see com.rim.samples.device.blackberrymaildemo.BlackBerryMailDemoScreen#messageServiceChanged()
     */
    protected void messageServiceChanged() {
        _store.addFolderListener(this);
        _messages.removeAllElements();
        populateList(_store.list());
        updateScreen();
    }

    /**
     * Fills the list of messages with the messages stored in the specified
     * folders, including their subfolders.
     *
     * @param folders
     *            The folders to populate the list with
     */
    private void populateList(final Folder[] folders) {
        for (int folderIndex = 0; folderIndex < folders.length; folderIndex++) {
            // Populate the list with the subfolders
            final Folder[] subfolders = folders[folderIndex].list();
            populateList(subfolders);

            // Search the current folder for the message to delete
            Message[] messages;
            try {
                messages = folders[folderIndex].getMessages();
            } catch (final MessagingException e) {
                BlackBerryMailDemo.errorDialog("Folder#getMessages() threw "
                        + e.toString());
                return;
            }

            // Populate the list with the messages in the current folder and
            // add a message listener to them.
            for (int messageIndex = 0; messageIndex < messages.length; messageIndex++) {
                final Message message = messages[messageIndex];
                message.addMessageListener(this);
                _messages.addElement(message);
            }
        }
    }

    /**
     * @see com.rim.samples.device.blackberrymaildemo.BlackBerryMailDemoScreen#updateScreen()
     */
    protected void updateScreen() {
        // Update the screen when the application is free
        _uiApplication.invokeLater(new Runnable() {
            public void run() {
                // Re-sort by most recent date and resize the list field
                _messages.reSort();
                _listField.setSize(_messages.size());
            }
        });
    }

    /**
     * Gets the selected message
     *
     * @see com.rim.samples.device.blackberrymaildemo.BlackBerryMailDemoScreen#getSelectedItem()
     */
    protected Object getSelectedItem() {
        Object obj = null;

        final int index = _listField.getSelectedIndex();
        if (index > -1) {
            obj = _messages.elementAt(index);
        }

        return obj;
    }

    /**
     * Opens the selected message
     *
     * @see com.rim.samples.device.blackberrymaildemo.BlackBerryMailDemoScreen#openAction()
     */
    protected void openAction() {
        final Message selectedMessage = (Message) getSelectedItem();
        if (selectedMessage != null) {
            openMessage(selectedMessage);
        }
    }

    /**
     * @see net.rim.device.api.ui.Screen#close()
     */
    public void close() {
        // De-register listeners before closing
        _store.removeFolderListener(this);

        for (int index = _messages.size() - 1; index >= 0; index--) {
            final Message msg = (Message) _messages.elementAt(index);
            msg.removeMessageListener(this);
        }

        super.close();
    }

    /**
     * MenuItem to delete a message
     */
    private final MenuItem _deleteMenuItem;

    // //////////////////////////////////////////////////////////////////////////
    // ********************* Message Listener *************************** //
    // //////////////////////////////////////////////////////////////////////////

    /**
     * @see net.rim.blackberry.api.mail.event.MessageListener#changed(MessageEvent)
     */

    public void changed(final MessageEvent e) {
        // Get the selected message to update screen at the message's row
        final Message message = e.getMessage();
        _listField.invalidate(_messages.indexOf(message));
    }

    // //////////////////////////////////////////////////////////////////////////
    // ********************** Folder Listener *************************** //
    // //////////////////////////////////////////////////////////////////////////

    /**
     * @see net.rim.blackberry.api.mail.event.FolderListener#messagesAdded(FolderEvent)
     */
    public void messagesAdded(final FolderEvent e) {
        final Message message = e.getMessage();

        message.addMessageListener(this);

        // Insert the message into the vector of messages, preserving
        // the sorted order.
        int indexToInsert = _messages.find(message);
        if (indexToInsert < 0) {
            indexToInsert = -indexToInsert - 1;
        }
        _messages.insertElementAt(message, indexToInsert);

        updateScreen();
    }

    /**
     * @see net.rim.blackberry.api.mail.event.FolderListener#messagesRemoved(FolderEvent)
     */
    public void messagesRemoved(final FolderEvent e) {
        final Message msg = e.getMessage();

        // Remove the listeners and delete the message from the list
        msg.removeMessageListener(this);
        _messages.removeElement(msg);

        updateScreen();
    }
}
TOP

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

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.