NewPostView.java

/*
 * Copyright © 2011 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation. 
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners. 
 * See LICENSE.TXT for license information.
 */ 

package com.nokia.example.wordpress.views;

import com.nokia.example.wordpress.components.OptionsMenu;
import com.nokia.example.wordpress.helpers.KeyCodes;
import com.nokia.example.wordpress.networking.Blog;
import com.nokia.example.wordpress.networking.GetRecentPostsOperation;
import com.nokia.example.wordpress.networking.NewPostOperation;
import com.nokia.mid.ui.TextEditor;
import com.nokia.mid.ui.TextEditorListener;
import java.util.Vector;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.TextField;

/**
 * View for writing a new post.
 */
public class NewPostView extends BaseView implements TextEditorListener {

    private TextEditor titleEditor;
    private TextEditor contentEditor;

    NewPostView(Graphics g, int x, int y, int width, int height) {
        super(g, ViewMaster.VIEW_NEWPOST, x, y, width, height);
        haveTabs = false;

        int border = 2;
        int editorWidth = width - 2 * border;

        titleEditor = TextEditor.createTextEditor(100/*max char len*/, TextField.ANY, editorWidth, 1/*rows*/);
        titleEditor.setFont(Visual.SMALL_FONT);
        titleEditor.setBackgroundColor(Visual.EDITOR_ACTIVE_BACKGROUND_COLOR); // white
        titleEditor.setForegroundColor(Visual.EDITOR_ACTIVE_FOREGROUND_COLOR); // black
        titleEditor.setContent("");
        titleEditor.setParent(viewMaster);
        titleEditor.setPosition(border, Visual.SMALL_FONT.getHeight());
        titleEditor.setVisible(false);
        titleEditor.setTextEditorListener(this);

        int rowsLeft = 6; // this is suitable for the C3

        contentEditor = TextEditor.createTextEditor(1000/*max char len*/, TextField.ANY, editorWidth, rowsLeft);
        contentEditor.setFont(Visual.SMALL_FONT);
        contentEditor.setBackgroundColor(Visual.EDITOR_PASSIVE_BACKGROUND_COLOR); // white
        contentEditor.setForegroundColor(Visual.EDITOR_PASSIVE_FOREGROUND_COLOR); // black
        contentEditor.setContent("");
        contentEditor.setParent(viewMaster);
        contentEditor.setPosition(border, Visual.SMALL_FONT.getHeight() + titleEditor.getPositionY() + titleEditor.getHeight());
        contentEditor.setVisible(false);
        contentEditor.setTextEditorListener(this);


        // Create options menu
        menu = new OptionsMenu(width, height) {

            {
                addExitItem();
            }
        };

        softkey1Label = "Options";
        softkey2Label = "Ok";
        softkey3Label = "Cancel";
    }

    public void activate() {
        System.out.println("newpost activate");
        super.activate();
        titleEditor.setContent("");
        contentEditor.setContent("");
    }

    public void deactivate() {
        System.out.println("newpost deactivate");
        titleEditor.setVisible(false);
        contentEditor.setVisible(false);
    }

    public void transitionFinished()
    {
        titleEditor.setVisible(true);
        titleEditor.setFocus(true);
        contentEditor.setVisible(true);
    }

    public void draw(int x, int y, int width, int height) {
        System.out.println("newpost render");
        if (menu.isVisible()) {
            menu.draw(g);
            return;
        }
        //drawTabs();
        viewMaster.drawBackground(g, x, y, width, height, false);

        g.setColor(Visual.LIST_PRIMARY_COLOR);
        g.setFont(Visual.SMALL_FONT);
        g.drawString("Post title:", titleEditor.getPositionX() + titleEditor.getWidth() / 2, titleEditor.getPositionY() - Visual.SMALL_FONT.getHeight(), g.TOP | g.HCENTER);
        g.drawString("Post content:", contentEditor.getPositionX() + contentEditor.getWidth() / 2, contentEditor.getPositionY() - Visual.SMALL_FONT.getHeight(), g.TOP | g.HCENTER);
        drawSoftkeys();
    }

    public void keyPressed(int keyCode) {

        if (menu != null && menu.notifyKeyEvents(keyCode)) {
            // menu used this keycode, let's not use for anything else.
            viewMaster.draw();
            return;
        }

        switch (keyCode) {
            case KeyCodes.MIDDLE_SOFTKEY:
                // Ok, send post
                sendPost();
                break;
            case KeyCodes.RIGHT_SOFTKEY:
                // Cancel
                viewMaster.setPreviousView();
                return;
            default:
                break;

        }
    }

    public void inputAction(TextEditor editor, int actions) {
        if ((actions & TextEditorListener.ACTION_CARET_MOVE) != 0) {
            // Caret was moved. Calculate for example a new position
            // for a custom scroll bar using layout metrics.
        }
        if ((actions & TextEditorListener.ACTION_TRAVERSE_NEXT) != 0) {
            titleEditor.setFocus(false);
            contentEditor.setFocus(true);

            contentEditor.setBackgroundColor(Visual.EDITOR_ACTIVE_BACKGROUND_COLOR);
            contentEditor.setForegroundColor(Visual.EDITOR_ACTIVE_FOREGROUND_COLOR);

            titleEditor.setBackgroundColor(Visual.EDITOR_PASSIVE_BACKGROUND_COLOR);
            titleEditor.setForegroundColor(Visual.EDITOR_PASSIVE_FOREGROUND_COLOR);

        }
        if ((actions & TextEditorListener.ACTION_TRAVERSE_PREVIOUS) != 0) {
            titleEditor.setFocus(true);
            contentEditor.setFocus(false);

            contentEditor.setBackgroundColor(Visual.EDITOR_PASSIVE_BACKGROUND_COLOR);
            contentEditor.setForegroundColor(Visual.EDITOR_PASSIVE_FOREGROUND_COLOR);

            titleEditor.setBackgroundColor(Visual.EDITOR_ACTIVE_BACKGROUND_COLOR);
            titleEditor.setForegroundColor(Visual.EDITOR_ACTIVE_FOREGROUND_COLOR);
        }
    }

    /**
     * Sends the post to the server.
     */
    private void sendPost() {
        titleEditor.setFocus(false);
        contentEditor.setFocus(false);
        viewMaster.drawDimmedBackground();
        busy = true; // this will trigger busy animation

        final NewPostOperation.Listener postListener = new NewPostOperation.Listener() {

            // After post sent, get the posts from the server.
            // This could be done more efficiently by adding the new post manually
            // to the posts vector and reloading in background.
            public void newPostSent(Blog blog, String postId) {
                System.out.println("post sent");
                getPosts();
            }
        };

        NewPostOperation op = new NewPostOperation(postListener, data.getBlog(), titleEditor.getContent(), contentEditor.getContent());
        op.start();
    }

    /**
     * Loads posts from the server,
     */
    private void getPosts() {
        final GetRecentPostsOperation.Listener postsListener = new GetRecentPostsOperation.Listener() {

            // After receiving the posts, store them and enter the posts view.
            public void postsReceived(Vector posts) {
                System.out.println("posts received");
                data.setPosts(posts);
                viewMaster.setView(ViewMaster.VIEW_POSTS);
            }
        };
        GetRecentPostsOperation op = new GetRecentPostsOperation(postsListener, data.getBlog());
        op.start();
    }

}