2015-03-11 06:32:08 +00:00
|
|
|
/*
|
|
|
|
* Apple // emulator for *nix
|
|
|
|
*
|
|
|
|
* This software package is subject to the GNU General Public License
|
|
|
|
* version 2 or later (your choice) as published by the Free Software
|
|
|
|
* Foundation.
|
|
|
|
*
|
|
|
|
* THERE ARE NO WARRANTIES WHATSOEVER.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
package org.deadc0de.apple2ix;
|
|
|
|
|
|
|
|
import android.content.Context;
|
2015-03-11 21:42:57 +00:00
|
|
|
import android.graphics.drawable.BitmapDrawable;
|
|
|
|
import android.os.Build;
|
2015-03-11 06:32:08 +00:00
|
|
|
import android.util.Log;
|
|
|
|
import android.view.Gravity;
|
|
|
|
import android.view.LayoutInflater;
|
|
|
|
import android.view.View;
|
2015-04-08 02:54:02 +00:00
|
|
|
import android.view.ViewGroup;
|
2015-03-11 06:32:08 +00:00
|
|
|
import android.widget.AdapterView;
|
|
|
|
import android.widget.ArrayAdapter;
|
|
|
|
import android.widget.LinearLayout;
|
|
|
|
import android.widget.ListView;
|
|
|
|
import android.widget.PopupWindow;
|
2015-04-08 02:54:02 +00:00
|
|
|
import android.widget.TextView;
|
2015-03-11 06:32:08 +00:00
|
|
|
|
|
|
|
public class Apple2MainMenu {
|
|
|
|
|
2015-03-12 22:12:18 +00:00
|
|
|
private final static int MENU_INSET = 20;
|
2015-03-11 06:32:08 +00:00
|
|
|
private final static String TAG = "Apple2MainMenu";
|
|
|
|
|
|
|
|
private Apple2Activity mActivity = null;
|
|
|
|
private Apple2View mParentView = null;
|
|
|
|
private PopupWindow mMainMenuPopup = null;
|
2015-03-12 22:12:18 +00:00
|
|
|
private Apple2SettingsMenu mSettingsMenu = null;
|
2015-04-08 05:40:22 +00:00
|
|
|
private Apple2DisksMenu mDisksMenu = null;
|
2015-03-11 06:32:08 +00:00
|
|
|
|
|
|
|
public Apple2MainMenu(Apple2Activity activity, Apple2View parent) {
|
|
|
|
mActivity = activity;
|
|
|
|
mParentView = parent;
|
2015-03-12 22:12:18 +00:00
|
|
|
setup();
|
2015-03-11 06:32:08 +00:00
|
|
|
}
|
|
|
|
|
2015-04-08 02:54:02 +00:00
|
|
|
enum SETTINGS {
|
|
|
|
SHOW_SETTINGS {
|
|
|
|
@Override public String getTitle(Context ctx) {
|
|
|
|
return ctx.getResources().getString(R.string.menu_settings);
|
|
|
|
}
|
|
|
|
@Override public String getSummary(Context ctx) {
|
|
|
|
return ctx.getResources().getString(R.string.menu_settings_summary);
|
|
|
|
}
|
|
|
|
@Override public void handleSelection(Apple2MainMenu mainMenu) {
|
|
|
|
mainMenu.showSettings();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
LOAD_DISK {
|
|
|
|
@Override public String getTitle(Context ctx) {
|
|
|
|
return ctx.getResources().getString(R.string.menu_disks);
|
|
|
|
}
|
|
|
|
@Override public String getSummary(Context ctx) {
|
|
|
|
return ctx.getResources().getString(R.string.menu_disks_summary);
|
|
|
|
}
|
|
|
|
@Override public void handleSelection(Apple2MainMenu mainMenu) {
|
|
|
|
mainMenu.showDisksMenu();
|
|
|
|
}
|
|
|
|
},
|
2015-04-08 05:46:36 +00:00
|
|
|
REBOOT_EMULATOR {
|
2015-04-08 02:54:02 +00:00
|
|
|
@Override public String getTitle(Context ctx) {
|
2015-04-08 05:46:36 +00:00
|
|
|
return ctx.getResources().getString(R.string.reboot);
|
2015-04-08 02:54:02 +00:00
|
|
|
}
|
|
|
|
@Override public String getSummary(Context ctx) {
|
2015-04-08 05:46:36 +00:00
|
|
|
return ctx.getResources().getString(R.string.reboot_summary);
|
2015-04-08 02:54:02 +00:00
|
|
|
}
|
|
|
|
@Override public void handleSelection(Apple2MainMenu mainMenu) {
|
2015-04-08 05:46:36 +00:00
|
|
|
mainMenu.mActivity.maybeReboot();
|
2015-04-08 02:54:02 +00:00
|
|
|
}
|
|
|
|
},
|
2015-04-08 05:46:36 +00:00
|
|
|
QUIT_EMULATOR {
|
2015-04-08 02:54:02 +00:00
|
|
|
@Override public String getTitle(Context ctx) {
|
2015-04-08 05:46:36 +00:00
|
|
|
return ctx.getResources().getString(R.string.quit);
|
2015-04-08 02:54:02 +00:00
|
|
|
}
|
|
|
|
@Override public String getSummary(Context ctx) {
|
2015-04-08 05:46:36 +00:00
|
|
|
return ctx.getResources().getString(R.string.quit_summary);
|
2015-04-08 02:54:02 +00:00
|
|
|
}
|
|
|
|
@Override public void handleSelection(Apple2MainMenu mainMenu) {
|
2015-04-08 05:46:36 +00:00
|
|
|
mainMenu.mActivity.maybeQuitApp();
|
2015-04-08 02:54:02 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
public abstract String getTitle(Context ctx);
|
|
|
|
public abstract String getSummary(Context ctx);
|
|
|
|
public abstract void handleSelection(Apple2MainMenu mainMenu);
|
|
|
|
|
|
|
|
public static String[] titles(Context ctx) {
|
|
|
|
String[] titles = new String[values().length];
|
|
|
|
int i = 0;
|
|
|
|
for (SETTINGS setting : values()) {
|
|
|
|
titles[i++] = setting.getTitle(ctx);
|
|
|
|
}
|
|
|
|
return titles;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-12 22:12:18 +00:00
|
|
|
private void setup() {
|
2015-03-11 06:32:08 +00:00
|
|
|
|
|
|
|
LayoutInflater inflater = (LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
|
|
|
View listLayout=inflater.inflate(R.layout.activity_main_menu, null, false);
|
|
|
|
ListView mainMenuView = (ListView)listLayout.findViewById(R.id.main_popup_menu);
|
|
|
|
mainMenuView.setEnabled(true);
|
|
|
|
LinearLayout mainPopupContainer = (LinearLayout)listLayout.findViewById(R.id.main_popup_container);
|
2015-03-12 22:12:18 +00:00
|
|
|
|
2015-04-08 02:54:02 +00:00
|
|
|
final String[] values = SETTINGS.titles(mActivity);
|
2015-03-11 06:32:08 +00:00
|
|
|
|
2015-04-08 02:54:02 +00:00
|
|
|
ArrayAdapter<?> adapter = new ArrayAdapter<String>(mActivity, android.R.layout.simple_list_item_2, android.R.id.text1, values) {
|
2015-03-12 22:12:18 +00:00
|
|
|
@Override
|
|
|
|
public boolean areAllItemsEnabled() {
|
2015-04-08 02:54:02 +00:00
|
|
|
return true;
|
2015-03-12 22:12:18 +00:00
|
|
|
}
|
|
|
|
@Override
|
2015-04-08 02:54:02 +00:00
|
|
|
public View getView(int position, View convertView, ViewGroup parent) {
|
|
|
|
View view = super.getView(position, convertView, parent);
|
|
|
|
TextView tv = (TextView)view.findViewById(android.R.id.text2);
|
|
|
|
SETTINGS setting = SETTINGS.values()[position];
|
|
|
|
tv.setText(setting.getSummary(mActivity));
|
|
|
|
return view;
|
2015-03-12 22:12:18 +00:00
|
|
|
}
|
|
|
|
};
|
2015-03-11 06:32:08 +00:00
|
|
|
mainMenuView.setAdapter(adapter);
|
|
|
|
mainMenuView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
|
|
|
@Override
|
|
|
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
2015-04-08 02:54:02 +00:00
|
|
|
Log.d(TAG, "position:"+position+" tapped...");
|
|
|
|
SETTINGS setting = SETTINGS.values()[position];
|
|
|
|
setting.handleSelection(Apple2MainMenu.this);
|
2015-03-11 06:32:08 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-03-11 21:42:57 +00:00
|
|
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
|
|
|
|
mMainMenuPopup = new PopupWindow(mainPopupContainer, android.app.ActionBar.LayoutParams.WRAP_CONTENT, android.app.ActionBar.LayoutParams.WRAP_CONTENT, true);
|
|
|
|
} else {
|
|
|
|
// 2015/03/11 ... there may well be a less hackish way to support Gingerbread, but eh ... diminishing returns
|
|
|
|
final int TOTAL_MARGINS = 16;
|
|
|
|
int totalHeight = TOTAL_MARGINS;
|
|
|
|
int maxWidth = 0;
|
|
|
|
for (int i = 0; i < adapter.getCount(); i++) {
|
|
|
|
View view = adapter.getView(i, null, mainMenuView);
|
|
|
|
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
|
|
|
|
totalHeight += view.getMeasuredHeight();
|
|
|
|
int width = view.getMeasuredWidth();
|
|
|
|
if (width > maxWidth) {
|
|
|
|
maxWidth = width;
|
|
|
|
}
|
2015-03-11 06:32:08 +00:00
|
|
|
}
|
2015-03-11 21:42:57 +00:00
|
|
|
mMainMenuPopup = new PopupWindow(mainPopupContainer, maxWidth+TOTAL_MARGINS, totalHeight, true);
|
2015-03-11 06:32:08 +00:00
|
|
|
}
|
|
|
|
|
2015-03-11 21:42:57 +00:00
|
|
|
// This kludgery allows touching the outside or back-buttoning to dismiss
|
|
|
|
mMainMenuPopup.setBackgroundDrawable(new BitmapDrawable());
|
|
|
|
mMainMenuPopup.setOutsideTouchable(true);
|
|
|
|
mMainMenuPopup.setOnDismissListener(new PopupWindow.OnDismissListener() {
|
|
|
|
@Override
|
|
|
|
public void onDismiss() {
|
2015-04-08 05:40:22 +00:00
|
|
|
boolean otherMenusShowing = (getSettingsMenu().isShowing() || getDisksMenu().isShowing());
|
|
|
|
if (!otherMenusShowing) {
|
2015-04-15 05:02:48 +00:00
|
|
|
Apple2MainMenu.this.mActivity.nativeOnResume(/*isSystemResume:*/false);
|
2015-03-12 22:12:18 +00:00
|
|
|
}
|
2015-03-11 21:42:57 +00:00
|
|
|
}
|
|
|
|
});
|
2015-03-11 06:32:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void showDisksMenu() {
|
2015-04-08 05:40:22 +00:00
|
|
|
Apple2DisksMenu disksMenu = getDisksMenu();
|
|
|
|
disksMenu.show();
|
|
|
|
mMainMenuPopup.dismiss();
|
2015-03-11 06:32:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void showSettings() {
|
2015-03-12 22:12:18 +00:00
|
|
|
Apple2SettingsMenu settings = getSettingsMenu();
|
|
|
|
settings.show();
|
|
|
|
mMainMenuPopup.dismiss();
|
|
|
|
}
|
|
|
|
|
2015-04-08 05:40:22 +00:00
|
|
|
public synchronized Apple2DisksMenu getDisksMenu() {
|
|
|
|
if (mDisksMenu == null) {
|
2015-07-25 05:36:57 +00:00
|
|
|
mDisksMenu = new Apple2DisksMenu(mActivity);
|
2015-04-08 05:40:22 +00:00
|
|
|
}
|
|
|
|
return mDisksMenu;
|
|
|
|
}
|
|
|
|
|
2015-03-12 22:12:18 +00:00
|
|
|
public synchronized Apple2SettingsMenu getSettingsMenu() {
|
|
|
|
if (mSettingsMenu == null) {
|
2015-07-25 05:36:57 +00:00
|
|
|
mSettingsMenu = new Apple2SettingsMenu(mActivity);
|
2015-03-12 22:12:18 +00:00
|
|
|
}
|
|
|
|
return mSettingsMenu;
|
2015-03-11 06:32:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void show() {
|
|
|
|
if (mMainMenuPopup.isShowing()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
mActivity.nativeOnPause();
|
|
|
|
|
2015-03-11 21:42:57 +00:00
|
|
|
mMainMenuPopup.showAtLocation(mParentView, Gravity.CENTER, 0, 0);
|
2015-03-11 06:32:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public void dismiss() {
|
|
|
|
if (mMainMenuPopup.isShowing()) {
|
|
|
|
mMainMenuPopup.dismiss();
|
2015-03-12 22:12:18 +00:00
|
|
|
// listener will resume ...
|
2015-03-11 06:32:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isShowing() {
|
|
|
|
return mMainMenuPopup.isShowing();
|
|
|
|
}
|
|
|
|
}
|