From 43e69c7627e66a9df458c24f192946209ea955a4 Mon Sep 17 00:00:00 2001 From: Eric House Date: Fri, 18 Oct 2013 20:40:20 -0700 Subject: [PATCH] make group head view selectable, and separate group and game selection so that only one type can be selected at once. Combine all three menus into one, but only enable subsets equivalent to the old menus depending on what's selected. Snapshot: menus pretty much don't work. --- .../res/menu/games_list_group_menu.xml | 19 - .../XWords4/res/menu/games_list_item_menu.xml | 44 --- .../XWords4/res/menu/games_list_menu.xml | 40 ++- .../eehouse/android/xw4/ExpiringTextView.java | 14 + .../eehouse/android/xw4/GameListAdapter.java | 36 +- .../eehouse/android/xw4/GameListGroup.java | 39 ++- .../org/eehouse/android/xw4/GameListItem.java | 45 ++- .../org/eehouse/android/xw4/GamesList.java | 331 +++++++++--------- 8 files changed, 311 insertions(+), 257 deletions(-) delete mode 100644 xwords4/android/XWords4/res/menu/games_list_group_menu.xml delete mode 100644 xwords4/android/XWords4/res/menu/games_list_item_menu.xml diff --git a/xwords4/android/XWords4/res/menu/games_list_group_menu.xml b/xwords4/android/XWords4/res/menu/games_list_group_menu.xml deleted file mode 100644 index abd12fcd0..000000000 --- a/xwords4/android/XWords4/res/menu/games_list_group_menu.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - diff --git a/xwords4/android/XWords4/res/menu/games_list_item_menu.xml b/xwords4/android/XWords4/res/menu/games_list_item_menu.xml deleted file mode 100644 index 23c59e58d..000000000 --- a/xwords4/android/XWords4/res/menu/games_list_item_menu.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/xwords4/android/XWords4/res/menu/games_list_menu.xml b/xwords4/android/XWords4/res/menu/games_list_menu.xml index 98eaa3b55..7f1ac84dc 100644 --- a/xwords4/android/XWords4/res/menu/games_list_menu.xml +++ b/xwords4/android/XWords4/res/menu/games_list_menu.xml @@ -11,6 +11,13 @@ android:icon="@drawable/ic_action_delete" android:showAsAction="ifRoom" /> + + + + + + + + + + + + + + + + + - diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ExpiringTextView.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ExpiringTextView.java index a122ee817..cee016a6d 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/ExpiringTextView.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/ExpiringTextView.java @@ -21,6 +21,7 @@ package org.eehouse.android.xw4; import android.content.Context; import android.graphics.Canvas; +import android.graphics.drawable.Drawable; import android.os.Handler; import android.util.AttributeSet; import android.widget.TextView; @@ -28,6 +29,8 @@ import android.widget.TextView; class ExpiringTextView extends TextView { private ExpiringDelegate m_delegate = null; private Context m_context; + private Drawable m_origDrawable; + protected boolean m_selected = false; public ExpiringTextView( Context context, AttributeSet attrs ) { @@ -52,6 +55,17 @@ class ExpiringTextView extends TextView { } } + protected void toggleSelected() + { + m_selected = !m_selected; + if ( m_selected ) { + m_origDrawable = getBackground(); + setBackgroundColor( XWApp.SEL_COLOR ); + } else { + setBackgroundDrawable( m_origDrawable ); + } + } + @Override protected void onDraw( Canvas canvas ) { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListAdapter.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListAdapter.java index ebca22600..c301fb25e 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListAdapter.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListAdapter.java @@ -49,11 +49,15 @@ public class GameListAdapter implements ExpandableListAdapter { private long[] m_positions; public interface LoadItemCB { - public void itemClicked( long rowid, GameSummary summary ); - public void itemToggled( long rowid, boolean selected ); + public void itemClicked( Object clicked, GameSummary summary ); + public void itemToggled( Object toggled, boolean selected ); public boolean getSelected( long rowid ); } + public interface ClickHandler { + public void longClicked(); + } + public GameListAdapter( Context context, ExpandableListView list, Handler handler, LoadItemCB cb, long[] positions, String fieldName ) @@ -152,9 +156,14 @@ public class GameListAdapter implements ExpandableListAdapter { return ggi.m_name; } - public void clearSelected( Set rowids ) + public void clearSelectedRows( Set rowids ) { - deselect( rowids ); + deselectRows( rowids ); + } + + public void clearSelectedGroups( HashSet groups ) + { + deselectGroups( groups ); } ////////////////////////////////////////////////////////////////////////// @@ -182,7 +191,7 @@ public class GameListAdapter implements ExpandableListAdapter { for ( long rowid : rowids ) { asSet.add( rowid ); } - deselect( asSet ); + deselectRows( asSet ); } public void onGroupExpanded( int groupPosition ) @@ -232,9 +241,8 @@ public class GameListAdapter implements ExpandableListAdapter { // if ( null != convertView ) { // DbgUtils.logf( "getGroupView gave non-null convertView" ); // } - GameListGroup view = (GameListGroup) - Utils.inflate(m_context, R.layout.game_list_group ); - view.setGroupPosition( groupPosition ); + GameListGroup view = + GameListGroup.makeForPosition( m_context, groupPosition, m_cb ); if ( !isExpanded ) { GameGroupInfo ggi = getInfoForGroup( groupPosition ); @@ -364,7 +372,7 @@ public class GameListAdapter implements ExpandableListAdapter { return gameInfo().get( getPositions()[groupPosition] ); } - private void deselect( Set rowids ) + private void deselectRows( Set rowids ) { GameListItem[] items = new GameListItem[rowids.size()]; getGameItemsFor( rowids, items ); @@ -375,6 +383,16 @@ public class GameListAdapter implements ExpandableListAdapter { } } + private void deselectGroups( HashSet groups ) + { + groups = (HashSet)groups.clone(); + for ( Iteratoriter = groups.iterator(); + iter.hasNext(); ) { + GameListGroup group = getGroupItemFor( iter.next() ); + group.setSelected( false ); + } + } + private void getGameItemsFor( Set rowids, GameListItem[] items ) { int next = 0; diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListGroup.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListGroup.java index 90b5827a2..1ce963098 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListGroup.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListGroup.java @@ -23,11 +23,27 @@ package org.eehouse.android.xw4; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; +import android.view.View; import org.eehouse.android.xw4.DBUtils.GameGroupInfo; -public class GameListGroup extends ExpiringTextView { +public class GameListGroup extends ExpiringTextView + implements GameListAdapter.ClickHandler +{ private int m_groupPosition; + private boolean m_expanded; + private GameListAdapter.LoadItemCB m_cb; + + public static GameListGroup makeForPosition( Context context, + int groupPosition, + GameListAdapter.LoadItemCB cb ) + { + GameListGroup result = + (GameListGroup)Utils.inflate( context, R.layout.game_list_group ); + result.m_cb = cb; + result.m_groupPosition = groupPosition; + return result; + } public GameListGroup( Context cx, AttributeSet as ) { @@ -43,4 +59,25 @@ public class GameListGroup extends ExpiringTextView { { return m_groupPosition; } + + public void setSelected( boolean selected ) + { + // If new value and state not in sync, force change in state + if ( selected != m_selected ) { + toggleSelected(); + } + } + + // GameListAdapter.ClickHandler interface + public void longClicked() + { + toggleSelected(); + } + + protected void toggleSelected() + { + super.toggleSelected(); + m_cb.itemToggled( this, m_selected ); + } + } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListItem.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListItem.java index 34a710ea8..5a59909b0 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListItem.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GameListItem.java @@ -43,7 +43,7 @@ import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnType; import org.eehouse.android.xw4.jni.GameSummary; public class GameListItem extends LinearLayout - implements View.OnClickListener { + implements View.OnClickListener, GameListAdapter.ClickHandler { private static HashSet s_invalRows = new HashSet(); @@ -62,6 +62,7 @@ public class GameListItem extends LinearLayout private int m_loadingCount; private int m_groupPosition; private Drawable m_origDrawable; + private boolean m_selected = false; public GameListItem( Context cx, AttributeSet as ) { @@ -71,6 +72,18 @@ public class GameListItem extends LinearLayout m_rowid = DBUtils.ROWID_NOTFOUND; m_lastMoveTime = 0; m_loadingCount = 0; + + setOnClickListener( new View.OnClickListener() { + @Override + public void onClick( View v ) { + // if selected, just un-select + if ( m_selected ) { + toggleSelected(); + } else if ( null != m_summary ) { + m_cb.itemClicked( this, m_summary ); + } + } + } ); } private void init( Handler handler, long rowid, int groupPosition, @@ -105,7 +118,7 @@ public class GameListItem extends LinearLayout public void setSelected( boolean selected ) { // If new value and state not in sync, force change in state - if ( selected != (null != m_origDrawable) ) { + if ( selected != m_selected ) { toggleSelected(); } } @@ -214,24 +227,12 @@ public class GameListItem extends LinearLayout return state; } - private void setData( final GameSummary summary ) + private void setData( GameSummary summary ) { if ( null != summary ) { TextView tview; String state = setName(); - setOnClickListener( new View.OnClickListener() { - @Override - public void onClick( View v ) { - // if selected, just un-select - if ( null != m_origDrawable ) { - toggleSelected(); - } else { - m_cb.itemClicked( m_rowid, summary ); - } - } - } ); - LinearLayout list = (LinearLayout)findViewById( R.id.player_list ); list.removeAllViews(); @@ -305,14 +306,14 @@ public class GameListItem extends LinearLayout private void toggleSelected() { - if ( null == m_origDrawable ) { + m_selected = !m_selected; + if ( m_selected ) { m_origDrawable = getBackground(); setBackgroundColor( XWApp.SEL_COLOR ); } else { setBackgroundDrawable( m_origDrawable ); - m_origDrawable = null; } - m_cb.itemToggled( m_rowid, null != m_origDrawable ); + m_cb.itemToggled( this, m_selected ); } private class LoadItemTask extends AsyncTask { @@ -334,7 +335,7 @@ public class GameListItem extends LinearLayout } } - if ( m_cb.getSelected( m_rowid ) && null != m_origDrawable ) { + if ( m_cb.getSelected( m_rowid ) && m_selected ) { toggleSelected(); } } @@ -372,5 +373,11 @@ public class GameListItem extends LinearLayout // } // return TextUtils.join(",", strs ); // } + // GameListAdapter.ClickHandler interface + + public void longClicked() + { + toggleSelected(); + } } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesList.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesList.java index 4db3ffd6f..cc4a09eec 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesList.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/GamesList.java @@ -32,16 +32,15 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.preference.PreferenceManager; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.widget.AdapterView.OnItemLongClickListener; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; -import android.widget.ExpandableListView.ExpandableListContextMenuInfo; +// import android.widget.ExpandableListView.ExpandableListContextMenuInfo; import android.widget.ExpandableListView; import android.widget.LinearLayout; import android.widget.ListView; @@ -59,7 +58,8 @@ import junit.framework.Assert; import org.eehouse.android.xw4.jni.*; public class GamesList extends XWExpandableListActivity - implements DBUtils.DBChangeListener, + implements OnItemLongClickListener, + DBUtils.DBChangeListener, GameListAdapter.LoadItemCB, DictImportActivity.DownloadFinishedListener { @@ -91,9 +91,32 @@ public class GamesList extends XWExpandableListActivity DELETE_SELGAMES, OPEN_GAME }; - private static final int[] DEBUGITEMS = { R.id.gamel_menu_loaddb - , R.id.gamel_menu_storedb - , R.id.gamel_menu_checkupdates + private static final int[] DEBUGITEMS = { + R.id.gamel_menu_loaddb + , R.id.gamel_menu_storedb + , R.id.gamel_menu_checkupdates + }; + private static final int[] NOSEL_ITEMS = { + R.id.gamel_menu_newgame + ,R.id.gamel_menu_newgroup + ,R.id.gamel_menu_prefs + ,R.id.gamel_menu_dicts + ,R.id.gamel_menu_about + ,R.id.gamel_menu_email + ,R.id.gamel_menu_checkmoves + }; + private static final int[] ONEGAME_ITEMS = { + R.id.listl_item_config + ,R.id.list_item_rename + ,R.id.list_item_new_from + ,R.id.list_item_copy + }; + + private static final int[] ONEGROUP_ITEMS = { + R.id.list_group_default + ,R.id.list_group_rename + ,R.id.list_group_moveup + ,R.id.list_group_movedown }; private static boolean s_firstShown = false; @@ -110,7 +133,8 @@ public class GamesList extends XWExpandableListActivity private NetLaunchInfo m_netLaunchInfo; private GameNamer m_namer; private boolean m_gameLaunched = false; - private HashSet m_selected; + private HashSet m_selectedRows; + private HashSet m_selectedGroups; @Override protected Dialog onCreateDialog( int id ) @@ -339,10 +363,11 @@ public class GamesList extends XWExpandableListActivity getBundledData( savedInstanceState ); - m_selected = new HashSet(); + m_selectedRows = new HashSet(); + m_selectedGroups = new HashSet(); setContentView(R.layout.game_list); - registerForContextMenu( getExpandableListView() ); + ExpandableListView listview = getExpandableListView(); DBUtils.setDBChangeListener( this ); boolean isUpgrade = Utils.firstBootThisVersion( this ); @@ -354,11 +379,12 @@ public class GamesList extends XWExpandableListActivity String field = CommonPrefs.getSummaryField( this ); long[] positions = XWPrefs.getGroupPositions( this ); - m_adapter = new GameListAdapter( this, getExpandableListView(), - new Handler(), this, positions, - field ); + m_adapter = new GameListAdapter( this, listview, new Handler(), + this, positions, field ); setListAdapter( m_adapter ); - m_adapter.expandGroups( getExpandableListView() ); + listview.setOnItemLongClickListener( this ); + + m_adapter.expandGroups( listview ); NetUtils.informOfDeaths( this ); @@ -431,6 +457,16 @@ public class GamesList extends XWExpandableListActivity } } + // OnItemLongClickListener interface + public boolean onItemLongClick( AdapterView parent, View view, + int position, long id ) { + boolean success = view instanceof GameListAdapter.ClickHandler; + if ( success ) { + ((GameListAdapter.ClickHandler)view).longClicked(); + } + return success; + } + // DBUtils.DBChangeListener interface public void gameSaved( final long rowid, final boolean countChanged ) { @@ -446,33 +482,47 @@ public class GamesList extends XWExpandableListActivity } // GameListAdapter.LoadItemCB interface - public void itemClicked( long rowid, GameSummary summary ) + public void itemClicked( Object clicked, GameSummary summary ) { // We need a way to let the user get back to the basic-config // dialog in case it was dismissed. That way it to check for // an empty room name. - if ( !m_gameLaunched ) { - showNotAgainDlgThen( R.string.not_again_newselect, - R.string.key_notagain_newselect, - GamesActions.OPEN_GAME.ordinal(), - rowid, summary ); + if ( clicked instanceof GameListItem ) { + if ( !m_gameLaunched ) { + long rowid = ((GameListItem)clicked).getRowID(); + showNotAgainDlgThen( R.string.not_again_newselect, + R.string.key_notagain_newselect, + GamesActions.OPEN_GAME.ordinal(), + rowid, summary ); + } } } - public void itemToggled( long rowid, boolean selected ) + public void itemToggled( Object toggled, boolean selected ) { - int countBefore = m_selected.size(); - if ( selected ) { - m_selected.add( rowid ); - } else { - m_selected.remove( rowid ); + if ( toggled instanceof GameListItem ) { + long rowid = ((GameListItem)toggled).getRowID(); + if ( selected ) { + m_selectedRows.add( rowid ); + clearSelectedGroups(); + } else { + m_selectedRows.remove( rowid ); + } + } else if ( toggled instanceof GameListGroup ) { + int position = ((GameListGroup)toggled).getGroupPosition(); + if ( selected ) { + m_selectedGroups.add( position ); + clearSelectedRows(); + } else { + m_selectedGroups.remove( position ); + } } Utils.invalidateOptionsMenuIf( this ); } public boolean getSelected( long rowid ) { - return m_selected.contains( rowid ); + return m_selectedRows.contains( rowid ); } // BTService.MultiEventListener interface @@ -548,77 +598,13 @@ public class GamesList extends XWExpandableListActivity @Override public void onBackPressed() { - if ( 0 == m_selected.size() ) { + if ( 0 == m_selectedRows.size() ) { super.onBackPressed(); } else { - clearSelected(); + clearSelectedRows(); } } - @Override - public void onCreateContextMenu( ContextMenu menu, View view, - ContextMenuInfo menuInfo ) - { - ExpandableListView.ExpandableListContextMenuInfo info - = (ExpandableListView.ExpandableListContextMenuInfo)menuInfo; - long packedPos = info.packedPosition; - int childPos = ExpandableListView.getPackedPositionChild( packedPos ); - - String name; - if ( 0 <= childPos ) { // game case - MenuInflater inflater = getMenuInflater(); - inflater.inflate( R.menu.games_list_item_menu, menu ); - - long rowid = m_adapter.getRowIDFor( packedPos ); - name = GameUtils.getName( this, rowid ); - } else { // group case - MenuInflater inflater = getMenuInflater(); - inflater.inflate( R.menu.games_list_group_menu, menu ); - - int pos = ExpandableListView.getPackedPositionGroup( packedPos ); - name = m_adapter.groupNames()[pos]; - - if ( 0 == pos ) { - Utils.setItemEnabled( menu, R.id.list_group_moveup, false ); - } - if ( pos + 1 == m_adapter.getGroupCount() ) { - Utils.setItemEnabled( menu, R.id.list_group_movedown, false ); - } - if ( XWPrefs.getDefaultNewGameGroup( this ) - == m_adapter.getGroupIDFor( pos ) ) { - Utils.setItemEnabled( menu, R.id.list_group_default, false ); - Utils.setItemEnabled( menu, R.id.list_group_delete, false ); - } - } - menu.setHeaderTitle( getString( R.string.game_item_menu_titlef, - name ) ); - } - - @Override - public boolean onContextItemSelected( MenuItem item ) - { - ExpandableListContextMenuInfo info; - try { - info = (ExpandableListContextMenuInfo)item.getMenuInfo(); - } catch (ClassCastException cce) { - DbgUtils.loge( cce ); - return false; - } - - long packedPos = info.packedPosition; - int childPos = ExpandableListView.getPackedPositionChild( packedPos ); - int groupPos = ExpandableListView.getPackedPositionGroup(packedPos); - int menuID = item.getItemId(); - boolean handled; - if ( 0 <= childPos ) { - long rowid = m_adapter.getRowIDFor( groupPos, childPos ); - handled = handleGameMenuItem( menuID, rowid ); - } else { - handled = handleGroupMenuItem( menuID, groupPos ); - } - return handled; - } // onContextItemSelected - @Override public boolean onCreateOptionsMenu( Menu menu ) { @@ -631,22 +617,38 @@ public class GamesList extends XWExpandableListActivity @Override public boolean onPrepareOptionsMenu( Menu menu ) { + int nGamesSelected = m_selectedRows.size(); + int nGroupsSelected = m_selectedGroups.size(); + boolean nothingSelected = 0 == (nGroupsSelected + nGamesSelected); + Assert.assertTrue( 0 == nGamesSelected || 0 == nGroupsSelected ); + boolean visible = XWPrefs.getDebugEnabled( this ); for ( int id : DEBUGITEMS ) { - MenuItem item = menu.findItem( id ); - item.setVisible( visible ); + Utils.setItemVisible( menu, id, nothingSelected && visible ); } if ( visible && !DBUtils.gameDBExists( this ) ) { - MenuItem item = menu.findItem( R.id.gamel_menu_loaddb ); - item.setVisible( false ); + Utils.setItemVisible( menu, R.id.gamel_menu_loaddb, false ); } - int nSelected = m_selected.size(); + for ( int id : NOSEL_ITEMS ) { + Utils.setItemVisible( menu, id, nothingSelected ); + } + for ( int id : ONEGAME_ITEMS ) { + Utils.setItemVisible( menu, id, 1 == nGamesSelected ); + } + for ( int id : ONEGROUP_ITEMS ) { + Utils.setItemVisible( menu, id, 1 == nGroupsSelected ); + } - Utils.setItemVisible( menu, R.id.gamel_menu_newgame, 0 == nSelected ); - Utils.setItemVisible( menu, R.id.gamel_menu_delete, 0 < nSelected ); - Utils.setItemVisible( menu, R.id.listl_item_config, 1 == nSelected ); + // Multiples can be deleted + Utils.setItemVisible( menu, R.id.gamel_menu_delete, + 0 < nGamesSelected ); + Utils.setItemVisible( menu, R.id.list_group_delete, + 0 < nGroupsSelected ); + // multiple games can be regrouped/reset + Utils.setItemVisible( menu, R.id.list_item_move, 0 < nGroupsSelected ); + Utils.setItemVisible( menu, R.id.list_item_reset, 0 < nGroupsSelected ); return super.onPrepareOptionsMenu( menu ); } @@ -665,13 +667,13 @@ public class GamesList extends XWExpandableListActivity break; case R.id.listl_item_config: - long rowid = m_selected.iterator().next(); + long rowid = m_selectedRows.iterator().next(); GameUtils.doConfig( this, rowid, GameConfig.class ); break; case R.id.gamel_menu_delete: String msg = Utils.format( this, R.string.confirm_seldeletesf, - m_selected.size() ); + m_selectedRows.size() ); showConfirmThen( msg, R.string.button_delete, GamesActions.DELETE_SELGAMES.ordinal() ); break; @@ -745,61 +747,53 @@ public class GamesList extends XWExpandableListActivity m_rowid = rowid; - if ( R.id.list_item_delete == menuID - || R.id.list_item_config == menuID ) { - showOKOnlyDialog( "This menu item is going away soon. Please select" - + " games by tapping the left icons then use" - + " action bar icons or the screen menu to operate" - + " on the selection." ); - } else { - if ( checkWarnNoDict( m_rowid ) ) { - switch ( menuID ) { - case R.id.list_item_reset: - showConfirmThen( R.string.confirm_reset, - R.string.button_reset, - GamesActions.RESET_GAME.ordinal() ); - break; - case R.id.list_item_rename: - showDialog( RENAME_GAME ); - break; - case R.id.list_item_move: - if ( 1 >= m_adapter.getGroupCount() ) { - showOKOnlyDialog( R.string.no_move_onegroup ); - } else { - showDialog( CHANGE_GROUP ); - } - break; - case R.id.list_item_new_from: - showNotAgainDlgThen( R.string.not_again_newfrom, - R.string.key_notagain_newfrom, - GamesActions.NEW_FROM.ordinal() ); - break; - - case R.id.list_item_copy: - GameSummary summary = DBUtils.getSummary( this, m_rowid ); - if ( summary.inNetworkGame() ) { - showOKOnlyDialog( R.string.no_copy_network ); - } else { - byte[] stream = GameUtils.savedGame( this, m_rowid ); - GameLock lock = GameUtils.saveNewGame( this, stream ); - DBUtils.saveSummary( this, lock, summary ); - lock.unlock(); - } - break; - - // These require some notion of predictable sort order. - // Maybe put off until I'm using a db? - // case R.id.list_item_hide: - // case R.id.list_item_move_up: - // case R.id.list_item_move_down: - // case R.id.list_item_move_to_top: - // case R.id.list_item_move_to_bottom: - // Utils.notImpl( this ); - // break; - default: - handled = false; - break; + if ( checkWarnNoDict( m_rowid ) ) { + switch ( menuID ) { + case R.id.list_item_reset: + showConfirmThen( R.string.confirm_reset, + R.string.button_reset, + GamesActions.RESET_GAME.ordinal() ); + break; + case R.id.list_item_rename: + showDialog( RENAME_GAME ); + break; + case R.id.list_item_move: + if ( 1 >= m_adapter.getGroupCount() ) { + showOKOnlyDialog( R.string.no_move_onegroup ); + } else { + showDialog( CHANGE_GROUP ); } + break; + case R.id.list_item_new_from: + showNotAgainDlgThen( R.string.not_again_newfrom, + R.string.key_notagain_newfrom, + GamesActions.NEW_FROM.ordinal() ); + break; + + case R.id.list_item_copy: + GameSummary summary = DBUtils.getSummary( this, m_rowid ); + if ( summary.inNetworkGame() ) { + showOKOnlyDialog( R.string.no_copy_network ); + } else { + byte[] stream = GameUtils.savedGame( this, m_rowid ); + GameLock lock = GameUtils.saveNewGame( this, stream ); + DBUtils.saveSummary( this, lock, summary ); + lock.unlock(); + } + break; + + // These require some notion of predictable sort order. + // Maybe put off until I'm using a db? + // case R.id.list_item_hide: + // case R.id.list_item_move_up: + // case R.id.list_item_move_down: + // case R.id.list_item_move_to_top: + // case R.id.list_item_move_to_bottom: + // Utils.notImpl( this ); + // break; + default: + handled = false; + break; } } @@ -1076,11 +1070,11 @@ public class GamesList extends XWExpandableListActivity private void deleteSelected() { - for ( Iterator iter = m_selected.iterator(); iter.hasNext(); ) { + for ( Iterator iter = m_selectedRows.iterator(); iter.hasNext(); ) { long rowid = iter.next(); GameUtils.deleteGame( this, rowid, false ); } - m_selected.clear(); + m_selectedRows.clear(); Utils.invalidateOptionsMenuIf( this ); NetUtils.informOfDeaths( this ); } @@ -1095,12 +1089,21 @@ public class GamesList extends XWExpandableListActivity return madeGame; } - private void clearSelected() + private void clearSelectedRows() { // clear any selection - if ( 0 < m_selected.size() ) { - m_adapter.clearSelected( m_selected ); - m_selected.clear(); + if ( 0 < m_selectedRows.size() ) { + m_adapter.clearSelectedRows( m_selectedRows ); + m_selectedRows.clear(); + } + } + + private void clearSelectedGroups() + { + // clear any selection + if ( 0 < m_selectedGroups.size() ) { + m_adapter.clearSelectedGroups( m_selectedGroups ); + m_selectedGroups.clear(); } } @@ -1119,7 +1122,7 @@ public class GamesList extends XWExpandableListActivity if ( !m_gameLaunched ) { m_gameLaunched = true; GameUtils.launchGame( this, rowid, invited ); - clearSelected(); + clearSelectedRows(); } }