diff options
| author | Bananeweizen <bananeweizen@gmx.de> | 2014-06-12 08:02:00 +0200 |
|---|---|---|
| committer | Bananeweizen <bananeweizen@gmx.de> | 2014-06-12 08:02:18 +0200 |
| commit | dfd93e387f51b2cd505491e05ac5440b17351211 (patch) | |
| tree | e087320a3d58f707f86ae2f1394f06356cc4918f /main/src/cgeo/geocaching/sorting/SortActionProvider.java | |
| parent | f04d04a2b2438416335e6a5b03a21568912fa15f (diff) | |
| download | cgeo-dfd93e387f51b2cd505491e05ac5440b17351211.zip cgeo-dfd93e387f51b2cd505491e05ac5440b17351211.tar.gz cgeo-dfd93e387f51b2cd505491e05ac5440b17351211.tar.bz2 | |
convert sort selection to actionprovider
Diffstat (limited to 'main/src/cgeo/geocaching/sorting/SortActionProvider.java')
| -rw-r--r-- | main/src/cgeo/geocaching/sorting/SortActionProvider.java | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/sorting/SortActionProvider.java b/main/src/cgeo/geocaching/sorting/SortActionProvider.java new file mode 100644 index 0000000..8663391 --- /dev/null +++ b/main/src/cgeo/geocaching/sorting/SortActionProvider.java @@ -0,0 +1,153 @@ +package cgeo.geocaching.sorting; + +import cgeo.geocaching.R; +import cgeo.geocaching.utils.Log; + +import org.eclipse.jdt.annotation.NonNull; + +import rx.functions.Action1; + +import android.content.Context; +import android.support.v4.view.ActionProvider; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.SubMenu; +import android.view.View; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +/** + * Provides a sub menu for sorting caches. Register your listener in the onCreateOptionsMenu of the containing activity. + * + */ +public class SortActionProvider extends ActionProvider implements OnMenuItemClickListener { + + private static final int MENU_GROUP = 1; + private final Context mContext; + private final ArrayList<ComparatorEntry> registry = new ArrayList<ComparatorEntry>(20); + /** + * Callback triggered on selecting a new sort order. + */ + private Action1<CacheComparator> onClickListener; + /** + * Currently selected filter. Used for radio button indication. + */ + private CacheComparator selection; + + private static final class ComparatorEntry { + private final String name; + private final Class<? extends CacheComparator> cacheComparator; + + public ComparatorEntry(final String name, final Class<? extends CacheComparator> cacheComparator) { + this.name = name; + this.cacheComparator = cacheComparator; + } + + @Override + public String toString() { + return name; + } + } + + public SortActionProvider(final Context context) { + super(context); + mContext = context; + registerComparators(); + } + + private void register(final int resourceId, final Class<? extends CacheComparator> comparatorClass) { + registry.add(new ComparatorEntry(mContext.getString(resourceId), comparatorClass)); + } + + private void registerComparators() { + register(R.string.caches_sort_distance, null); + register(R.string.caches_sort_date_hidden, DateComparator.class); + register(R.string.caches_sort_difficulty, DifficultyComparator.class); + register(R.string.caches_sort_finds, FindsComparator.class); + register(R.string.caches_sort_geocode, GeocodeComparator.class); + register(R.string.caches_sort_inventory, InventoryComparator.class); + register(R.string.caches_sort_name, NameComparator.class); + register(R.string.caches_sort_favorites, PopularityComparator.class); + register(R.string.caches_sort_favorites_ratio, PopularityRatioComparator.class); + register(R.string.caches_sort_rating, RatingComparator.class); + register(R.string.caches_sort_size, SizeComparator.class); + register(R.string.caches_sort_state, StateComparator.class); + register(R.string.caches_sort_storage, StorageTimeComparator.class); + register(R.string.caches_sort_terrain, TerrainComparator.class); + register(R.string.caches_sort_date_logged, VisitComparator.class); + register(R.string.caches_sort_vote, VoteComparator.class); + + // sort the menu labels alphabetically for easier reading + Collections.sort(registry, new Comparator<ComparatorEntry>() { + + @Override + public int compare(final ComparatorEntry lhs, final ComparatorEntry rhs) { + return lhs.name.compareToIgnoreCase(rhs.name); + } + }); + } + + @Override + public View onCreateActionView(){ + // must return null, otherwise onPrepareSubMenu is not called + return null; + } + + @Override + public boolean hasSubMenu(){ + return true; + } + + @Override + public void onPrepareSubMenu(final SubMenu subMenu){ + subMenu.clear(); + for (int i = 0; i < registry.size(); i++) { + final ComparatorEntry comparatorEntry = registry.get(i); + final MenuItem menuItem = subMenu.add(MENU_GROUP, i, i, comparatorEntry.name); + menuItem.setOnMenuItemClickListener(this).setCheckable(true); + if (selection == null) { + if (comparatorEntry.cacheComparator == null) { + menuItem.setChecked(true); + } + } + else { + if (selection.getClass().equals(comparatorEntry.cacheComparator)) { + menuItem.setChecked(true); + } + } + } + subMenu.setGroupCheckable(MENU_GROUP, true, true); + } + + @Override + public boolean onMenuItemClick(final MenuItem item){ + callListener(registry.get(item.getItemId()).cacheComparator); + return true; + } + + private void callListener(final Class<? extends CacheComparator> cacheComparator) { + try { + if (cacheComparator == null) { + onClickListener.call(null); + } + else { + final CacheComparator comparator = cacheComparator.newInstance(); + onClickListener.call(comparator); + } + } catch (final InstantiationException e) { + Log.e("selectComparator", e); + } catch (final IllegalAccessException e) { + Log.e("selectComparator", e); + } + } + + public void setClickListener(final @NonNull Action1<CacheComparator> onClickListener) { + this.onClickListener = onClickListener; + } + + public void setSelection(final CacheComparator selection) { + this.selection = selection; + } +}
\ No newline at end of file |
