📄 simplemenu2d.java
字号:
}
/*------------------------------------------------------------------------------------*/
/** To show this menu2D at the specified screen point.
* @param p screen point
*/
public void show( Point p ) {
menuDrawable.setNextPosition( p.x, p.y );
if(!isVisible && menuManager!=null) {
menuDrawable.animateMenu();
menuDrawable.tick();
menuManager.getGraphicsDirector().addDrawable( menuDrawable );
isVisible=true;
}
}
/*------------------------------------------------------------------------------------*/
/** To hide this menu2D.
*/
public void hide() {
if(isVisible && menuManager!=null) {
menuManager.getGraphicsDirector().removeDrawable( menuDrawable );
isVisible=false;
selectedItemIndex=-1;
firstItemIndex=0;
isFirstIndexArrow=false;
scrollEnabled = false;
hideSubMenus();
}
}
/*------------------------------------------------------------------------------------*/
/** To hide this menu's sub-menus.
*/
protected void hideSubMenus() {
// We hide all the other sub-menus
for( int i=0; i<items.length; i++ )
if( items[i].link !=null )
items[i].link.hide();
}
/*------------------------------------------------------------------------------------*/
/** Tells if this menu is visible on screen.
* @return true if it's visible, false otherwise.
*/
public boolean isVisible() {
return isVisible;
}
/*------------------------------------------------------------------------------------*/
/** To get the menu name.
* @return the menu's name.
*/
public String getName() {
return name;
}
/*------------------------------------------------------------------------------------*/
/** To find a menu by its name. The search is performed also among sub-menus.
* @param menuName the menu's name to search
* @return the menu if found, null if not.
*/
public Menu2D findByName(String menuName) {
if(menuName.equals(name))
return this;
// search among sub-menus
for( int i=0; i<items.length; i++ )
if( items[i].link !=null ) {
Menu2D menu = items[i].link.findByName(menuName);
if(menu!=null) return menu;
}
return null; // not found
}
/*------------------------------------------------------------------------------------*/
/** To process a mouse event.
* @param mEvent the mouse event received on this menu
* @return true if the event was processed by us or one of our sub-menus, false
* if the event was not for us.
*/
public boolean mouseClicked( MouseEvent mEvent ) {
if(!isVisible)
return false;
// is it a click on one of our sub-menus ?
int maxIndex = items.length;
if(maxIndex>MAX_ITEMS_DISPLAYED)
maxIndex = firstItemIndex + MAX_ITEMS_DISPLAYED;
for( int i=firstItemIndex; i<maxIndex; i++ )
if( items[i].link !=null && items[i].link.mouseClicked(mEvent) )
return true; // one of our sub-menus received the event
// is the event for us ?
if( menuDrawable.contains( mEvent.getX(), mEvent.getY() ) ) {
// ok the event is for us !
// we ask which item is selected...
int index = menuDrawable.getItemAt( mEvent.getY() );
if(index<firstItemIndex || maxIndex<=index ) return true;
// need to update the first index displayed ?
if( index==firstItemIndex && ( firstItemIndex!=0 || isFirstIndexArrow ) ) {
hideSubMenus();
if( isFirstIndexArrow && firstItemIndex==0 )
isFirstIndexArrow = false;
else
firstItemIndex--; // backward navigation
return true;
}
if( index==maxIndex-1 && index<items.length-1 ) {
hideSubMenus();
if( !isFirstIndexArrow && firstItemIndex==0 )
isFirstIndexArrow = true;
else
firstItemIndex++; // forward navigation
return true;
}
if( items[index].itemName.equals("-") ) return true;
if( !items[index].isEnabled ) return true;
// item is a link
if( items[index].link!=null ) {
if( !items[index].link.isVisible() ) {
hideSubMenus();
// We display the newly selected menu
int x = menuDrawable.getX()+menuDrawable.getWidth()+1;
int y = menuDrawable.getItemY(index);
items[index].link.menuDrawable.setParentRectangle( menuDrawable.getRectangle() );
items[index].link.show( new Point(x,y) );
return true;
}
else {
items[index].link.hide();
timeStamp = System.currentTimeMillis()+1000; // to avoid our menu to re-appear
return true; // we hide the linked menu
}
}
// ok, we have a click on an item !
// we generate an event on our menu listeners.
hideSubMenus();
menuManager.dispatchEvent( new Menu2DEvent( this, items[index].itemName ) );
return true;
}
return false;
}
/*------------------------------------------------------------------------------------*/
/** To call when the mouse cursor is moved.
* @param x mouse's x
* @param y mouse's y
*/
public boolean mouseMoved( int x, int y ) {
if(!isVisible)
return false;
// is it a click on one of our sub-menus ?
int maxIndex = items.length;
if(maxIndex>MAX_ITEMS_DISPLAYED)
maxIndex = firstItemIndex + MAX_ITEMS_DISPLAYED;
for( int i=firstItemIndex; i<maxIndex; i++ )
if( items[i].link !=null && items[i].link.mouseMoved( x, y ) )
return true; // one of our sub-menus received the event
// is the event for us ?
long now = System.currentTimeMillis();
if( menuDrawable.contains( x, y ) ) {
selectedItemIndex = menuDrawable.getItemAt( y );
if(selectedItemIndex<firstItemIndex || maxIndex<=selectedItemIndex ) return true;
if( selectedItemIndex==firstItemIndex && ( firstItemIndex!=0 ||
isFirstIndexArrow ) ) {
if(!scrollEnabled && now-timeStamp < MIN_TIME_BEFORE_SCROLL)
return true;
if(now-timeStamp < MIN_TIME_BETWEEN_SCROLL)
return true;
scrollEnabled=true;
timeStamp = now;
hideSubMenus();
if( isFirstIndexArrow && firstItemIndex==0 )
isFirstIndexArrow = false;
else
firstItemIndex--; // backward navigation
return true;
}
if( selectedItemIndex==maxIndex-1 && selectedItemIndex<items.length-1 ) {
if(!scrollEnabled && now-timeStamp < MIN_TIME_BEFORE_SCROLL)
return true;
if(now-timeStamp < MIN_TIME_BETWEEN_SCROLL)
return true;
scrollEnabled=true;
timeStamp = now;
hideSubMenus();
if( !isFirstIndexArrow && firstItemIndex==0 )
isFirstIndexArrow = true;
else
firstItemIndex++; // forward navigation
return true;
}
scrollEnabled=false; // cancel scrolling
if( items[selectedItemIndex].itemName.equals("-") ) return true;
if( !items[selectedItemIndex].isEnabled ) return true;
// item is a link
if( items[selectedItemIndex].link!=null ) {
if( !items[selectedItemIndex].link.isVisible() ) {
if(now-timeStamp < MIN_TIME_BEFORE_MENU)
return true;
hideSubMenus();
// We display the newly selected menu
int xi = menuDrawable.getX()+menuDrawable.getWidth()+1;
int yi = menuDrawable.getItemY(selectedItemIndex);
items[selectedItemIndex].link.menuDrawable.setParentRectangle( menuDrawable.getRectangle() );
items[selectedItemIndex].link.show( new Point(xi,yi) );
}
}
timeStamp = now; // reset time-stamp
return true;
}
return false;
}
/*------------------------------------------------------------------------------------*/
/** To call when the mouse cursor is dragged.
* @param dx mouse's dx
* @param dy mouse's dy
* @param startsNow tells if the drag movement is just about to start
*/
public boolean mouseDragged( int dx, int dy, boolean startsNow ) {
if(!isVisible)
return false;
for( int i=0; i<items.length; i++ )
if( items[i].link !=null )
items[i].link.mouseDragged(dx,dy,startsNow);
if(startsNow) {
dragFromX = menuDrawable.getX();
dragFromY = menuDrawable.getY();
return true;
}
menuDrawable.setNextPosition( dragFromX + dx, dragFromY + dy );
return true;
}
/*------------------------------------------------------------------------------------*/
/** To get the available items.
* @return available items a null length array if none.
*/
protected SimpleMenu2DItem[] getItems() {
return items;
}
/*------------------------------------------------------------------------------------*/
/** To get the currently selected index
* @return index
*/
public int getSelectedItemIndex() {
return selectedItemIndex;
}
/*------------------------------------------------------------------------------------*/
/** To get the index of the first item displayed.
* @return index
*/
public int getFirstItemIndex() {
return firstItemIndex;
}
/*------------------------------------------------------------------------------------*/
/** To tell if the first item to display is an arrow.
* @return index
*/
public boolean isFirstIndexArrow() {
return isFirstIndexArrow;
}
/*------------------------------------------------------------------------------------*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -