/*
 * Copyright 2009 ZXing authors
 *
 * 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.
 */

package com.google.zxing.client.j2me;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;

/**
 * The Menu form simply adds Command Listener functionality
 * to the standard List User Interface component.
 *
 * @author Simon Flannery (simon.flannery@gmail.com)
 */
final class Menu extends List implements CommandListener {

  private final ZXingMIDlet zXingMIDlet;
  private final Command cancelCommand;
  private final Command barcodeCommand;

  /**
   * Creates a new Search List and initialises all components.
   *
   * @param parent The Parent ZXing MIDlet.
   * @param title The title of the List.
   * @param item The caption of the item action Command.
   */
  Menu(ZXingMIDlet parent, String title, String item) {
    super(title, IMPLICIT); // Set the title of the form
    zXingMIDlet = parent;
    // Build the UI components
    cancelCommand  = new Command("Cancel", Command.CANCEL, 0);
    barcodeCommand = new Command(item, Command.ITEM, 0);
    addCommand(cancelCommand);
    addCommand(barcodeCommand);
    setCommandListener(this);
  }

  /**
   * A convenience method for getting the selected option item.
   *
   * @return The selected option represented as a String. If no option is
   *         selected, then the empty string is returned.
   */
  public String getSelectedString() {
    String result = "";
    if (getSelectedIndex() != -1) {
      result = getString(getSelectedIndex());
    }
    return result;
  }

  /**
   * A convenience method for removing all items from the list.
   * While the size of the list does not equal zero, the first item of the list is deleted.
   */
  public void clear() {
    while (size() != 0) { // Delete the first-most element until there is no first-most element
      delete(0);
    }
  }

  /**
   * CommandListener Required Implementation for capturing soft key presses.
   * This is where all call back methods (of the MIDlet) are serviced.
   *
   * @param command The command requiring attention.
   * @param displayable The Display.
   */
  public void commandAction(Command command, Displayable displayable) {
    if (command == cancelCommand) { /* Detecting the soft key press. */
      Display.getDisplay(zXingMIDlet).setCurrent(zXingMIDlet.getCanvas());
    } else if (command == barcodeCommand || command == SELECT_COMMAND) {
      if (getSelectedIndex() != -1) {
        zXingMIDlet.itemRequest();
      }
    }
  }

}
