📄 menubar.java
字号:
//#condition polish.usePolishGui
/*
* Created on 24-Jan-2005 at 05:39:27.
*
* Copyright (c) 2005 Robert Virkus / Enough Software
*
* This file is part of J2ME Polish.
*
* J2ME Polish 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.
*
* J2ME Polish 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 J2ME Polish; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Commercial licenses are also available, please
* refer to the accompanying LICENSE.txt or visit
* http://www.j2mepolish.org for details.
*/
// package de.enough.polish.ui;
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
//import de.enough.polish.ui.backgrounds.TranslucentSimpleBackground;
//import de.enough.polish.util.ArrayList;
//import de.enough.polish.util.Locale;
/**
* <p>Provides a more powerful alternative to the build-in menu bar of the Screen-class.</p>
*
* <p>Copyright (c) 2005, 2006 Enough Software</p>
* <pre>
* history
* 24-Jan-2005 - rob creation
* </pre>
* @author Robert Virkus, j2mepolish@enough.de
*/
public class MenuBar extends Item {
//#ifdef polish.key.LeftSoftKey:defined
private final static int LEFT_SOFT_KEY = -6;
//#else
//# private final static int LEFT_SOFT_KEY = -6;
//#endif
//#ifdef polish.key.RightSoftKey:defined
private final static int RIGHT_SOFT_KEY = -7;
//#else
//# private final static int RIGHT_SOFT_KEY = -7;
//#endif
//#if polish.blackberry && (polish.BlackBerry.useStandardMenuBar != true)
//#define tmp.useInvisibleMenuBar
//# private Command hideCommand;
//# private Command positiveCommand;
//#endif
//#if ${lowercase(polish.MenuBar.OptionsPosition)} == right && ${lowercase(polish.MenuBar.OkPosition)} == left
//#define tmp.RightOptions
//#define tmp.OkCommandOnLeft
//# private final int openOptionsMenuKey = RIGHT_SOFT_KEY;
//# private final int selectOptionsMenuKey = LEFT_SOFT_KEY;
//# private final int closeOptionsMenuKey = RIGHT_SOFT_KEY;
//#elif ${lowercase(polish.MenuBar.OptionsPosition)} == right
//#define tmp.RightOptions
//# private final int openOptionsMenuKey = RIGHT_SOFT_KEY;
//# private final int selectOptionsMenuKey = RIGHT_SOFT_KEY;
//# private final int closeOptionsMenuKey = LEFT_SOFT_KEY;
//#elif ${lowercase(polish.MenuBar.OptionsPosition)} == middle
//#define tmp.MiddleOptions
//# private final int openOptionsMenuKey = MIDDLE_SOFT_KEY;
//# private final int selectOptionsMenuKey = LEFT_SOFT_KEY;
//# private final int closeOptionsMenuKey = RIGHT_SOFT_KEY;
//#else
//#define tmp.LeftOptions
private final int openOptionsMenuKey = LEFT_SOFT_KEY;
private final int selectOptionsMenuKey = LEFT_SOFT_KEY;
private final int closeOptionsMenuKey = RIGHT_SOFT_KEY;
//#endif
private final ArrayList commandsList;
private final Container commandsContainer;
protected boolean isOpened;
private Command singleLeftCommand;
private final IconItem singleLeftCommandItem;
private Command singleRightCommand;
private final IconItem singleRightCommandItem;
private int commandsContainerY;
private int topY;
private int commandsContainerWidth;
protected boolean isSoftKeyPressed;
protected boolean canScrollDownwards; // indicator for parent screen
protected boolean canScrollUpwards; // indicator for parent screen
protected boolean paintScrollIndicator; // indicator for parent screen
private Image optionsImage;
private boolean showImageAndText;
private Image selectImage;
private Image cancelImage;
private int singleLeftCommandY;
private int singleRightCommandY;
//#if !polish.Bugs.noTranslucencyWithDrawRgb
private Background overlayBackground;
//#endif
/**
* Creates a new menu bar
*
* @param screen the parent screen
*/
public MenuBar( Screen screen ) {
this( screen, null );
}
/**
* Creates a new menu bar
*
* @param screen the parent screen
* @param style the style of this menu-bar
*/
public MenuBar(Screen screen, Style style) {
super(style);
this.screen = screen;
this.commandsList = new ArrayList();
//#style menu, default
this.commandsContainer = new Container( true , StyleSheet.menuStyle );
if (this.commandsContainer.style != null) {
this.commandsContainer.setStyle( this.commandsContainer.style );
}
this.commandsContainer.layout |= LAYOUT_SHRINK;
this.commandsContainer.screen = screen;
this.commandsContainer.parent = this;
//#style rightcommand, default
this.singleRightCommandItem = new IconItem( null, null , StyleSheet.defaultStyle );
this.singleRightCommandItem.setImageAlign( Graphics.LEFT );
//#style leftcommand, default
this.singleLeftCommandItem = new IconItem( null, null , StyleSheet.defaultStyle );
this.singleLeftCommandItem.setImageAlign( Graphics.LEFT );
}
public void addCommand(Command cmd) {
if (cmd == this.singleLeftCommand || cmd == this.singleRightCommand || this.commandsList.contains(cmd)) {
// do not add an existing command again...
//#debug
//# System.out.println( this + ": Ignoring existing command " + cmd.getLabel() + ", cmd==this.singleRightCommand: " + ( cmd == this.singleRightCommand) + ", cmd==this.singleLeftCommand: " + (cmd == this.singleLeftCommand) + ", this.commandsList.contains(cmd): " + this.commandsList.contains(cmd) );
//#if polish.debug.debug
//# for (int i = 0; i < this.commandsList.size(); i++) {
//# System.out.println( ((Command)this.commandsList.get(i)).getLabel() );
//# }
//#endif
return;
}
//#debug
//# System.out.println(this + ": adding command " + cmd.getLabel() + " (" + cmd + ")");
int type = cmd.getCommandType();
int priority = cmd.getPriority();
//#if tmp.useInvisibleMenuBar
//# if ( this.hideCommand == null ) {
//# // add hide command:
//#ifdef polish.i18n.useDynamicTranslations
//# String text = "Hide";
//#elifdef polish.command.hide:defined
//#= String text = "${polish.command.hide}";
//#else
//# String text = "Hide";
//#endif
//# this.hideCommand = new Command( text, Command.CANCEL, 2000 );
//# addCommand( this.hideCommand );
//# }
//# if ( (cmd != this.hideCommand) &&
//# (type == Command.BACK || type == Command.CANCEL || type == Command.EXIT) )
//# {
//#if tmp.RightOptions
//# if ( this.singleLeftCommand == null || this.singleLeftCommand.getPriority() > priority ) {
//# this.singleLeftCommand = cmd;
//# }
//#else
//# if ( this.singleRightCommand == null || this.singleRightCommand.getPriority() > priority ) {
//# this.singleRightCommand = cmd;
//# }
//#endif
//# }
//#else
//#if tmp.OkCommandOnLeft
//# if (type == Command.OK || type == Command.ITEM || type == Command.SCREEN) {
//# if (this.singleLeftCommand == null) {
//# this.singleLeftCommand = cmd;
//# this.singleLeftCommandItem.setImage( (Image)null );
//# this.singleLeftCommandItem.setText( cmd.getLabel() );
//# if (this.isInitialised) {
//# this.isInitialised = false;
//# repaint();
//# }
//# return;
//# } else if ( this.singleLeftCommand.getPriority() > priority ) {
//# Command oldLeftCommand = this.singleLeftCommand;
//# this.singleLeftCommand = cmd;
//# this.singleLeftCommandItem.setText( cmd.getLabel() );
//# cmd = oldLeftCommand;
//# priority = oldLeftCommand.getPriority();
//# }
//# }
//#else
if (type == Command.BACK || type == Command.CANCEL || type == Command.EXIT ) {
//#if tmp.RightOptions
//# if (this.singleLeftCommand == null) {
//# this.singleLeftCommand = cmd;
//# this.singleLeftCommandItem.setImage( (Image)null );
//# this.singleLeftCommandItem.setText( cmd.getLabel() );
//# if (this.isInitialised) {
//# this.isInitialised = false;
//# repaint();
//# }
//# return;
//# } else if ( this.singleLeftCommand.getPriority() > priority ) {
//# Command oldLeftCommand = this.singleLeftCommand;
//# this.singleLeftCommand = cmd;
//# this.singleLeftCommandItem.setText( cmd.getLabel() );
//# cmd = oldLeftCommand;
//# priority = oldLeftCommand.getPriority();
//# }
//#else
if (this.singleRightCommand == null) {
//#debug
//# System.out.println("Setting single right command " + cmd.getLabel() );
this.singleRightCommand = cmd;
this.singleRightCommandItem.setImage( (Image)null );
this.singleRightCommandItem.setText( cmd.getLabel() );
if (this.isInitialised) {
this.isInitialised = false;
repaint();
}
return;
} else if ( this.singleRightCommand.getPriority() > priority ) {
Command oldRightCommand = this.singleRightCommand;
this.singleRightCommand = cmd;
this.singleRightCommandItem.setText( cmd.getLabel() );
cmd = oldRightCommand;
priority = oldRightCommand.getPriority();
//#debug
//# System.out.println("exchanging right command " + oldRightCommand.getLabel() );
}
//#endif
}
//#endif
//#if tmp.RightOptions
//# if (this.singleRightCommand != null) {
//# // add existing right command first:
//#style menuitem, menu, default
//# CommandItem item = new CommandItem( this.singleRightCommand, this );
//# this.commandsList.add( this.singleRightCommand );
//# this.commandsContainer.add( item );
//# this.singleRightCommand = null;
//# } else if (this.commandsList.size() == 0) {
//# // this is the new single right command!
//#debug
//# System.out.println("Setting single right command " + cmd.getLabel() );
//# this.singleRightCommand = cmd;
//# this.singleRightCommandItem.setText( cmd.getLabel() );
//# if (this.isInitialised) {
//# this.isInitialised = false;
//# repaint();
//# }
//# return;
//# }
//#else
if (this.singleLeftCommand != null) {
// add existing left command first:
//#debug
//# System.out.println("moving single left command " + this.singleLeftCommand.getLabel() + " to commandsContainer");
//#style menuitem, menu, default
CommandItem item = new CommandItem( this.singleLeftCommand, this , StyleSheet.menuitemStyle );
this.commandsList.add( this.singleLeftCommand );
this.commandsContainer.add( item );
this.singleLeftCommand = null;
} else if (this.commandsList.size() == 0) {
// this is the new single left command!
//#debug
//# System.out.println("Setting single left command " + cmd.getLabel() );
this.singleLeftCommand = cmd;
this.singleLeftCommandItem.setText( cmd.getLabel() );
if (this.isInitialised) {
this.isInitialised = false;
repaint();
}
return;
}
//#endif
//#endif
//#if tmp.useInvisibleMenuBar
//# if (this.positiveCommand == null
//# && type != Command.BACK
//# && type != Command.CANCEL
//# && type != Command.EXIT)
//# {
//# this.positiveCommand = cmd;
//# }
//#endif
//#debug
//# System.out.println("Adding command " + cmd.getLabel() + " to the commands list...");
//#style menuitem, menu, default
CommandItem item = new CommandItem( cmd, this , StyleSheet.menuitemStyle );
if ( this.commandsList.size() == 0 ) {
this.commandsList.add( cmd );
this.commandsContainer.add( item );
} else {
// there are already several commands,
// so add this cmd to the appropriate sorted position:
Command[] myCommands = (Command[]) this.commandsList.toArray( new Command[ this.commandsList.size() ]);
boolean inserted = false;
for (int i = 0; i < myCommands.length; i++) {
Command command = myCommands[i];
if ( cmd == command ) {
return;
}
if (command.getPriority() > priority ) {
this.commandsList.add( i, cmd );
this.commandsContainer.add(i, item);
inserted = true;
break;
}
}
if (!inserted) {
this.commandsList.add( cmd );
this.commandsContainer.add( item );
}
}
if (this.isInitialised) {
this.isInitialised = false;
repaint();
}
}
/* (non-Javadoc)
* @see javax.microedition.lcdui.Displayable#removeCommand(javax.microedition.lcdui.Command)
*/
public void removeCommand(Command cmd) {
//#debug
//# System.out.println(this + ": removing command " + cmd.getLabel() + " (" + cmd + ")");
//#if tmp.useInvisibleMenuBar
//# if (cmd == this.positiveCommand) {
//# this.positiveCommand = null;
//# }
//#endif
// 1.case: cmd == this.singleLeftCommand
if ( cmd == this.singleLeftCommand ) {
this.singleLeftCommand = null;
if (this.isInitialised) {
this.isInitialised = false;
repaint();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -