// Copyright 2007 Google Inc. All Rights Reserved.
//
// 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.scrollview.ui;

import com.google.scrollview.events.SVEventType;
import com.google.scrollview.ui.SVWindow;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;

import javax.swing.JMenu;
import javax.swing.JMenuBar;

/**
 * The SVMenuBar class provides the functionality to add a menubar to
 * ScrollView. Each menubar item gets associated with a (client-defined)
 * command-id, which SVMenuBar will return upon clicking it.
 *
 * @author wanke@google.com
 *
 */
public class SVMenuBar implements ActionListener {
  /** The root entry to add items to. */
  private JMenuBar root;
  /** Contains a map of item name to its actual entry. */
  private HashMap<String, SVAbstractMenuItem> items;
  /** The window the menubar belongs to. */
  private SVWindow svWindow;

  /**
   * Create a new SVMenuBar and place it at the top of the ScrollView window.
   *
   * @param scrollView The window our menubar belongs to.
   */
  public SVMenuBar(SVWindow scrollView) {
    root = new JMenuBar();
    svWindow = scrollView;
    items = new HashMap<String, SVAbstractMenuItem>();
    svWindow.setJMenuBar(root);
  }


  /**
   * A click on one of the items in our menubar has occurred. Forward it
   * to the item itself to let it decide what happens.
   */
  public void actionPerformed(ActionEvent e) {
    // Get the corresponding menuitem.
    SVAbstractMenuItem svm = items.get(e.getActionCommand());

    svm.performAction(svWindow, SVEventType.SVET_MENU);
  }

  /**
   * Add a new entry to the menubar.
   *
   * @param parent The menu we add our new entry to (should have been defined
   *        before). If the parent is "", we will add the entry to the root
   *        (top-level)
   * @param name The caption of the new entry.
   * @param id The Id of the new entry. If it is -1, the entry will be treated
   *        as a menu.
   */
  public void add(String parent, String name, int id) {
    // A duplicate entry - we just throw it away, since its already in.
    if (items.get(name) != null) { return; }
    // A new submenu at the top-level
    if (parent.equals("")) {
      JMenu jli = new JMenu(name);
      SVAbstractMenuItem mli = new SVSubMenuItem(name, jli);
      items.put(name, mli);
      root.add(jli);
    }
    // A new sub-submenu
    else if (id == -1) {
      SVAbstractMenuItem jmi = items.get(parent);
      JMenu jli = new JMenu(name);
      SVAbstractMenuItem mli = new SVSubMenuItem(name, jli);
      items.put(name, mli);
      jmi.add(jli);
    }
    // A new child entry. Add to appropriate parent.
    else {
      SVAbstractMenuItem jmi = items.get(parent);
      if (jmi == null) {
        System.out.println("ERROR: Unknown parent " + parent);
        System.exit(1);
      }
      SVAbstractMenuItem mli = new SVEmptyMenuItem(id, name);
      mli.mi.addActionListener(this);
      items.put(name, mli);
      jmi.add(mli);
    }
  }

  /**
   * Add a new checkbox entry to the menubar.
   *
   * @param parent The menu we add our new entry to (should have been defined
   *        before). If the parent is "", we will add the entry to the root
   *        (top-level)
   * @param name The caption of the new entry.
   * @param id The Id of the new entry. If it is -1, the entry will be treated
   *        as a menu.
   * @param b Whether the entry is initially flagged.
   *
   */

  public void add(String parent, String name, int id, boolean b) {
    SVAbstractMenuItem jmi = items.get(parent);
    if (jmi == null) {
      System.out.println("ERROR: Unknown parent " + parent);
      System.exit(1);
    }
    SVAbstractMenuItem mli = new SVCheckboxMenuItem(id, name, b);
    mli.mi.addActionListener(this);
    items.put(name, mli);
    jmi.add(mli);
  }

}
