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(); } }