Package tvbrowser.extras.programinfo

Source Code of tvbrowser.extras.programinfo.TaskMenuAction

/*
* TV-Browser
* Copyright (C) 04-2003 Martin Oberhauser (darras@users.sourceforge.net)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*
* CVS information:
*     $Date: 2011-03-26 21:21:11 +0100 (Sat, 26 Mar 2011) $
*   $Author: bananeweizen $
* $Revision: 6974 $
*/

package tvbrowser.extras.programinfo;


import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.Icon;
import javax.swing.JSeparator;
import javax.swing.SwingConstants;

import util.ui.UIThreadRunner;
import util.ui.findasyoutype.TextComponentFindAction;

import com.l2fprod.common.swing.JLinkButton;
import com.l2fprod.common.swing.JTaskPaneGroup;

import devplugin.ActionMenu;
import devplugin.ContextMenuSeparatorAction;
import devplugin.Plugin;
import devplugin.Program;

/**
* A class that holds a ContextMenuAction of a Plugin.
*
* @author René Mach
*
*/
public class TaskMenuAction {

  private Action mAction;
  private ProgramInfoDialog mInfo;
  private TextComponentFindAction mFind;

  /**
   * @param parent
   *          The parent JTaskPaneGroup
   * @param program
   *          The Program for the Action.
   * @param menu
   *          The ActionMenu.
   * @param info
   *          The ProgramInfoDialog.
   * @param id
   *          The id of the Plugin.
   * @param comp
   *          The Text Component find action to register the keyListener on.
   */
  public TaskMenuAction(final JTaskPaneGroup parent, final Program program,
      final ActionMenu menu, final ProgramInfoDialog info, final String id,
      final TextComponentFindAction comp) {
    mInfo = info;
    mFind = comp;

    if(menu.getAction() == null || menu.getAction().getValue(Plugin.DISABLED_ON_TASK_MENU) == null || !((Boolean)menu.getAction().getValue(Plugin.DISABLED_ON_TASK_MENU))) {
      if (!menu.hasSubItems()) {
        addAction(parent, menu);
      } else {
        final ActionMenu childMenu = getSingleActiveChild(menu);
        if (childMenu != null) {
          if (id.contains("WebPlugin")) {
            childMenu.getAction().putValue(Action.NAME,
                menu.getAction().getValue(Action.NAME));
          }
          childMenu.getAction().putValue(Action.SMALL_ICON, menu.getAction().getValue(Action.SMALL_ICON));
          addAction(parent, childMenu);
        }
        else {
          addTaskPaneGroup(parent, program, menu, info, id);
        }
      }
    }
  }

  private ActionMenu getSingleActiveChild(final ActionMenu menu) {
    int count = 0;
    ActionMenu result = null;
    for (int i = 0; i < menu.getSubItems().length; i++) {
      final ActionMenu subItem = menu.getSubItems()[i];
      if (subItem.getAction().getValue(Plugin.DISABLED_ON_TASK_MENU) == null) {
        count++;
        result = subItem;
      }
    }
    if (count == 1) {
      return result;
    }
    return null;
  }

  // Adds the action to the TaskPaneGroup.
  private void addAction(final JTaskPaneGroup parent, final ActionMenu menu) {
    final Action a = menu.getAction();

    mAction = new AbstractAction() {
      private static final long serialVersionUID = 1L;

      public void actionPerformed(final ActionEvent e) {
        a.actionPerformed(e);

        if (mAction.getValue(Action.ACTION_COMMAND_KEY) == null
            || !mAction.getValue(Action.ACTION_COMMAND_KEY).equals("action")) {
          mInfo.addPluginActions(true);
        }
      }
    };

    mAction.putValue(Action.NAME,"<html>" + a.getValue(Action.NAME)+ "</html>");
    mAction.putValue(Action.ACTION_COMMAND_KEY,a.getValue(Action.ACTION_COMMAND_KEY));
    mAction.putValue(Action.SMALL_ICON,a.getValue(Action.SMALL_ICON));

    Component c;

    if(ContextMenuSeparatorAction.getInstance().equals(menu.getAction())) {
      parent.add(Box.createRigidArea(new Dimension(0,2)));
      c = parent.add(new JSeparator());
      parent.add(Box.createRigidArea(new Dimension(0,2)));
    }
    else {
      c = parent.add(mAction);
    }

    mFind.installKeyListener(c);

    if(c instanceof JLinkButton) {
      ((JLinkButton)c).setVerticalTextPosition(SwingConstants.TOP);
      ((JLinkButton)c).setBorder(BorderFactory.createEmptyBorder(1,1,1,1));
    }
  }

  /**
   * Adds a new TaskPaneGroup to the parent TaskPaneGroup for an ActionMenu with
   * submenus.
   */
  private void addTaskPaneGroup(final JTaskPaneGroup parent,
      final Program program, final ActionMenu menu, final ProgramInfoDialog info,
      final String id) {
    final ActionMenu[] subs = menu.getSubItems();

    final JTaskPaneGroup group = new JTaskPaneGroup();
    group.setTitle((String) menu.getAction().getValue(Action.NAME));
    final boolean expanded = ProgramInfo
        .getInstance()
        .getSettings()
        .getExpanded(
        id + "_" + (String) menu.getAction().getValue(Action.NAME));
    group.setExpanded(expanded);
    group.setEnabled(true);
    mFind.installKeyListener(group);

    /*
     * Listener to get expand state changes and store the state in the
     * Properties for the Plugins menu.
     */
    group.addPropertyChangeListener(new PropertyChangeListener() {
      public void propertyChange(final PropertyChangeEvent evt) {
        ProgramInfo.getInstance().getSettings().setExpanded(
            id + "_" + (String) menu.getAction().getValue(Action.NAME),
            group.isExpanded());
      }
    });

    if (menu.getAction().getValue(Action.SMALL_ICON) != null) {
      group.setIcon((Icon) menu.getAction().getValue(Action.SMALL_ICON));
    }

    // delay group creation if it is not expanded
    if (expanded) {
      for (ActionMenu subMenu : subs) {
        new TaskMenuAction(group, program, subMenu, info, id, mFind);
      }
    }
    else {
      UIThreadRunner.invokeLater(new Runnable() {

        @Override
        public void run() {
          for (ActionMenu subMenu : subs) {
            new TaskMenuAction(group, program, subMenu, info, id, mFind);
          }
        }
      });
    }
    parent.add(Box.createRigidArea(new Dimension(0, 10)));
    parent.add(group);
    parent.add(Box.createRigidArea(new Dimension(0, 5)));
  }

  protected void setText(final String value) {
    mAction.putValue(Action.NAME, "<html>" + value + "</html>");
  }
}
TOP

Related Classes of tvbrowser.extras.programinfo.TaskMenuAction

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.