⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 peekandpick.java

📁 由Jonathan Knudsen开发的移动电话RSS阅读器.
💻 JAVA
字号:
import java.io.*;
import java.util.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.rms.*;

import display.*;
import rss.*;
import util.*;

/**
 * <code>PeekAndPick</code> is a <code>MIDlet</code> that
 * controls the PeekAndPick application. It handles all
 * <code>Command</code>s and responds to events from
 * the <code>Worker</code> thread and the RSS/RDF parser.
 *
 * @author Jonathan Knudsen
 */
public class PeekAndPick
    extends MIDlet
    implements CommandListener, WorkerListener,
        ParserListener {
  private static final String kBanner = "PeekAndPick 2.0";
  
  private boolean mInitialized;
  private FeedStore mFeedStore;
  private Preferences mPreferences;
  private Parser mParser;
  private Worker mWorker;
  
  private Display mDisplay;
  private Displayable mLastScreen;
  private Command mExitCommand, mBackCommand,
      mSubmitCommand, mSendCommand, mPrefCommand,
      mSaveCommand, mDetailsCommand, mCancelCommand;
  private Command mAddStoriesCommand;
  
  private List mFeedList;
  private PreferencesEditor mPreferencesEditor;
  private ListCanvas mListCanvas;
  private QueryForm mQueryForm;
  
  private boolean mAddStoriesFlag;
  
  public PeekAndPick() {
    mInitialized = false;
  }
  
  public void startApp() {
    if (mDisplay == null) mDisplay = Display.getDisplay(this);
    if (mInitialized == false) {
      initialize();
      try {
        // mLastScreen is already set by initialize(). Here
        //   we attempt to create the splash screen.
        Displayable splash = new SplashScreen("/splash.png",
            mDisplay, mLastScreen);
        mLastScreen = splash;
      }
      catch (IOException ioe) {}
    }
    mDisplay.setCurrent(mLastScreen);
  }
  
  public void pauseApp() {
    // Save the last visible screen. This will be
    // restored in startApp().
    mLastScreen = mDisplay.getCurrent();
  }
  
  public void destroyApp(boolean unconditional) {}
  
  // CommandListener method
  
  public void commandAction(Command c, Displayable s) {
    if (c == mExitCommand)
      notifyDestroyed();
    else if (c == mBackCommand)
      mDisplay.setCurrent(mFeedList);
    else if (c == mAddStoriesCommand) {
      mAddStoriesFlag = true;
      mDisplay.setCurrent(mFeedList);
    }
    else if (c == List.SELECT_COMMAND) {
      mLastScreen = mDisplay.getCurrent();
      Feed feed = getSelectedFeed();
      if (feed.hasPrompts()) {
        // Prompt for the missing parameters.
        Vector parameters = feed.getParameters();
        createQueryForm(parameters);
        mDisplay.setCurrent(mQueryForm);
      }
      else {
        mListCanvas.setFontSize(mPreferences.get("Font size"));
        if (mAddStoriesFlag == true) mAddStoriesFlag = false;
        else mListCanvas.clear();
        mDisplay.setCurrent(mListCanvas);
        ParseTask task = new ParseTask(mParser, feed, null);
        mWorker.queue(task);
      }
    }
    else if (c == mDetailsCommand && s == mListCanvas) {
      mListCanvas.details();
    }
    else if (c == mSubmitCommand) {
      Feed feed = getSelectedFeed();
      mListCanvas.setFontSize(mPreferences.get("Font size"));
      if (mAddStoriesFlag == true) mAddStoriesFlag = false;
      else mListCanvas.clear();
      mDisplay.setCurrent(mListCanvas);
      // Use the form entries.
      ParseTask task = new ParseTask(mParser,
          feed, mQueryForm.getEntries());
      mWorker.queue(task);
    }
    else if (c == mSendCommand) {
      mLastScreen = mDisplay.getCurrent();
      sendMail();
    }
    else if (c == mPrefCommand) {
      getPreferencesEditor();
      mPreferencesEditor.initialize(mPreferences);
      
      // Show the preferences screen.
      mDisplay.setCurrent(mPreferencesEditor);
    }
    else if (c == mSaveCommand) {
      // Validate the email address.
      Hashtable hashtable = mPreferencesEditor.extract();
      if (validate(hashtable) == false) {
        Alert a = new Alert("Sorry",
            "I didn't recognize that email address.",
            null, null);
        a.setTimeout(Alert.FOREVER);
        mDisplay.setCurrent(a, mPreferencesEditor);
        return;
      }

      // Save preferences.
      mDisplay.setCurrent(mFeedList);
      mPreferences.set(hashtable);
      mPreferences.save();
    }
    else if (c == mCancelCommand) {
      // Cancel the current task.
      mWorker.cancel();
    }
  }
  
  // WorkerListener methods
  
  public void exception(WorkerTask r, Exception e) {
    String message = "";
    
    
    if (r instanceof ParseTask)
      message = "Something went wrong while reading " +
          "that feed. Please try again or try a " + 
          "different feed.";
    else if (r instanceof MailTask)
      message = "Something went wrong while trying " +
          "to send email. Please try again or check " + 
          "your email address in the preferences screen.";
    Alert a = new Alert("Error", message,
        null, null);
    a.setTimeout(Alert.FOREVER);
    Displayable next = mFeedList;
    if (mListCanvas.size() > 0) next = mListCanvas;
    mDisplay.setCurrent(a, next);
  }
  
  public void finished(WorkerTask r) {
    if (r instanceof MailTask) {
      MailTask mailTask = (MailTask)r;
      int code = mailTask.getResponseCode();
      if (code == -1) return;
      else if (code < 200) {
        // Succeed silently.
      }
      else {
        Alert a = new Alert("Oops",
            "A problem occurred when sending " +
            "your email: " + mailTask.getResponseMessage(),
            null, null);
        a.setTimeout(Alert.FOREVER);
        mDisplay.setCurrent(a, mListCanvas);
      }
      if (code == 199) {
        String newURL = mailTask.getResponseMessage();
        mPreferences.put("PeekAndPick Server", newURL);
        mPreferences.save();
      }
    }
  }
    
  // ParserListener methods
  
  public void firstItem() {
  }

  public void itemParsed(String title, String link,
      String description) {
    mListCanvas.addItem(title, description, link);
  }
  
  public void finished() {
    // Put up a screen if nothing came back.
    if (mListCanvas.size() == 0) {
      Alert a = new Alert("No results",
          "No items were returned.",
          null, null);
      a.setTimeout(Alert.FOREVER);
      mDisplay.setCurrent(a, mListCanvas);
    }
  }
  
  // Private internal methods
  
  private void initialize() {
    // Pull the feeds out of persistent storage.
    mFeedStore = new FeedStore(
        "PeekAndPick.feeds", "PeekAndPick.feed", this);
    
    // Create commands.
    mExitCommand = new Command("Exit", Command.EXIT, 2);
    mBackCommand = new Command("Back", Command.BACK, 1);
    mSendCommand = new Command("Email", Command.SCREEN, 0);
    mPrefCommand = new Command("Prefs",
        Command.SCREEN, 2);
    mSaveCommand = new Command("Save", Command.SCREEN, 1);
    mDetailsCommand =
        new Command("Details", Command.SCREEN, 0);
    mCancelCommand =
        new Command("Cancel", Command.CANCEL, 0);
    mAddStoriesCommand =
        new Command("Add stories", Command.SCREEN, 0);
    
    // Create the main screen, a list of feeds.
    mFeedList = new List(kBanner, List.IMPLICIT);
    for (int i = 0; i < mFeedStore.size(); i++) {
      Feed feed = mFeedStore.getFeed(i);
      mFeedList.append(feed.getName(), null);
    }
    mFeedList.addCommand(mExitCommand);
    mFeedList.addCommand(mPrefCommand);
    mFeedList.setCommandListener(this);
    
    // Load preferences.
    mPreferences = new Preferences("PeekAndPick.preferences");
    String email =
        getAppProperty("PeekAndPick.preferences.email");
    String server =
        getAppProperty("PeekAndPick.server.URL");
    mPreferences.putIfNull("Email address", email);
    mPreferences.putIfNull("PeekAndPick Server", server);
    mPreferences.putIfNull("Font size", "Small");
    
    // Create the headline list screen.
    mListCanvas = new ListCanvas(mDisplay, mCancelCommand);
    mListCanvas.addCommand(mBackCommand);
    mListCanvas.addCommand(mSendCommand);
    mListCanvas.addCommand(mDetailsCommand);
    mListCanvas.addCommand(mAddStoriesCommand);
    mListCanvas.setCommandListener(this);
    
    // Create the parser.
    mParser = new kXML12Parser();
    mParser.addParserListener(this);
    
    // Create the worker.
    mWorker = new Worker(mListCanvas);
    mWorker.setWorkerListener(this);

    // Last screen is the feed list by default. But if
    // the preferences aren't valid (e.g. if they're
    // uninitialized), show the preferences screen first.
    mLastScreen = mFeedList;
    if (validate() == false)
      mLastScreen = getPreferencesEditor();
    
    mInitialized = true;
  }

  private Feed getSelectedFeed() {
    // First find the matching feed.
    String name = mFeedList.getString(
        mFeedList.getSelectedIndex());
    Feed feed = null;
    for (int i = 0; i < mFeedStore.size() && feed == null; i++) {
      feed = mFeedStore.getFeed(i);
      if (name.equals(feed.getName()) == false)
        feed = null;
    }
    return feed;
  }

  private void sendMail() {
    if (mListCanvas.hasMarks() == false) {
      Alert a = new Alert("Nothing to send",
          "You haven't marked any items to e-mail. " + 
          "To mark an item, " +
          "press the select button. A small check mark " +
          "will appear next to the current item.",
          null, null);
      a.setTimeout(Alert.FOREVER);
      mDisplay.setCurrent(a, mListCanvas);
      return;
    }

    String email = mPreferences.get("Email address");
    String url = mPreferences.get("PeekAndPick Server");
    
    // Send some information for the server log.
    String log = "";

    // Create the message.
    StringBuffer messageBuffer = new StringBuffer();
    int size = mListCanvas.size();
    for (int i = 0; i < size; i++) {
      if (mListCanvas.isMarked(i)) {
        messageBuffer.append(mListCanvas.getShortText(i));
        messageBuffer.append('\n');
        messageBuffer.append(mListCanvas.getExtra(i));
        messageBuffer.append('\n');
        messageBuffer.append('\n');
      }
    }
    String message = messageBuffer.toString();
    
    MailTask task = new MailTask(url, log, email, message);
    mWorker.queue(task);
  }

  private void createQueryForm(Vector parameters) {
    if (mQueryForm == null) {
      mQueryForm = new QueryForm("Entry");
      mSubmitCommand = new Command("Submit", Command.OK, 0);
      mQueryForm.addCommand(mSubmitCommand);
      mQueryForm.addCommand(mBackCommand);
      mQueryForm.setCommandListener(this);
    }
    mQueryForm.setParameters(parameters);
  }
  
  private Form getPreferencesEditor() {
    if (mPreferencesEditor == null) {
      boolean valid = validate();
      // Create the preferences editor.
      String[] noShows = { "PeekAndPick Server" };
      mPreferencesEditor = new PreferencesEditor(noShows);
      mPreferencesEditor.setType("Email address",
          PreferencesEditor.kText,
          TextField.EMAILADDR);
      mPreferencesEditor.setType("Font size",
          PreferencesEditor.kChoice,
          new String[] { "Small", "Medium", "Large" });
      mPreferencesEditor.initialize(mPreferences);
      // Only allow Back if the email address is valid.
      if (valid == true)
        mPreferencesEditor.addCommand(mBackCommand);
      mPreferencesEditor.addCommand(mSaveCommand);
      mPreferencesEditor.setCommandListener(this);
    }
    return mPreferencesEditor;
  }
  
  private boolean validate() {
    return validate(mPreferences.getHashtable());
  }
  
  private boolean validate(Hashtable hashtable) {
    String email = (String)hashtable.get("Email address");
    
    boolean valid = true;
    if (email == null) valid = false;
    else if (email.length() == 0) valid = false;
    else {
      int atSign = email.indexOf('@');
      if (atSign <= 0) valid = false;
      else if (atSign >= email.length() - 1) valid = false;
    }
    
    return valid;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -