diff --git a/app/src/main/cpp/core/pch.h b/app/src/main/cpp/core/pch.h index 5bc203f..06d764e 100644 --- a/app/src/main/cpp/core/pch.h +++ b/app/src/main/cpp/core/pch.h @@ -34,6 +34,8 @@ extern void mainViewResizeCallback(int x, int y); extern int openFileFromContentResolver(const TCHAR * url, int writeAccess); extern int closeFileFromContentResolver(int fd); extern int showAlert(const TCHAR * messageText, int flags); +extern void sendMenuItemCommand(int menuItem); + void clipboardCopyText(const TCHAR * text); const TCHAR * clipboardPasteText(); diff --git a/app/src/main/cpp/emu48-jni.c b/app/src/main/cpp/emu48-jni.c index b1da4bd..e1c8a1e 100644 --- a/app/src/main/cpp/emu48-jni.c +++ b/app/src/main/cpp/emu48-jni.c @@ -126,6 +126,13 @@ int showAlert(const TCHAR * messageText, int flags) { return IDOK; } +void sendMenuItemCommand(int menuItem) { + JNIEnv *jniEnv = getJNIEnvironment(); + jclass mainActivityClass = (*jniEnv)->GetObjectClass(jniEnv, mainActivity); + jmethodID midStr = (*jniEnv)->GetMethodID(jniEnv, mainActivityClass, "sendMenuItemCommand", "(I)V"); + (*jniEnv)->CallVoidMethod(jniEnv, mainActivity, midStr, menuItem); +} + void clipboardCopyText(const TCHAR * text) { JNIEnv *jniEnv = getJNIEnvironment(); jclass mainActivityClass = (*jniEnv)->GetObjectClass(jniEnv, mainActivity); diff --git a/app/src/main/cpp/win32-layer.c b/app/src/main/cpp/win32-layer.c index 9eca352..bce1c13 100644 --- a/app/src/main/cpp/win32-layer.c +++ b/app/src/main/cpp/win32-layer.c @@ -657,8 +657,9 @@ LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { //TODO if(hWnd == 0 && Msg == WM_COMMAND) { - int menuCommand = (wParam & 0xffff); + int menuCommand = (wParam & 0xffff) - 40000; LOGD("Menu Item %d", menuCommand); + sendMenuItemCommand(menuCommand); } return NULL; } @@ -1510,9 +1511,6 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc } UINT SetDIBColorTable(HDC hdc, UINT iStart, UINT cEntries, CONST RGBQUAD *prgbq) { if(prgbq -// && hdc && hdc->selectedPalette && hdc->selectedPalette->paletteLog && hdc->selectedPalette->paletteLog->palPalEntry -// && hdc->selectedPalette->paletteLog->palNumEntries > 0 && iStart < hdc->selectedPalette->paletteLog->palNumEntries) { -// PALETTEENTRY * palPalEntry = hdc->selectedPalette->paletteLog->palPalEntry; && hdc && hdc->realizedPalette && hdc->realizedPalette->paletteLog && hdc->realizedPalette->paletteLog->palPalEntry && hdc->realizedPalette->paletteLog->palNumEntries > 0 && iStart < hdc->realizedPalette->paletteLog->palNumEntries) { PALETTEENTRY * palPalEntry = hdc->realizedPalette->paletteLog->palPalEntry; diff --git a/app/src/main/java/com/regis/cosnier/emu48/MainActivity.java b/app/src/main/java/com/regis/cosnier/emu48/MainActivity.java index ae56632..b127444 100644 --- a/app/src/main/java/com/regis/cosnier/emu48/MainActivity.java +++ b/app/src/main/java/com/regis/cosnier/emu48/MainActivity.java @@ -22,6 +22,7 @@ import android.provider.MediaStore; import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -45,8 +46,10 @@ import java.util.Comparator; import java.util.Date; import java.util.EnumSet; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -95,6 +98,15 @@ public class MainActivity extends AppCompatActivity Print } + private int MRU_ID_START = 10000; + private int MAX_MRU = 5; + private LinkedHashMap mruLinkedHashMap = new LinkedHashMap(5, 1.0f, true) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_MRU; + } + }; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -152,6 +164,15 @@ public class MainActivity extends AppCompatActivity AssetManager assetManager = getResources().getAssets(); NativeLib.start(assetManager, mainScreenView.getBitmapMainScreen(), this, mainScreenView); + Set savedMRU = sharedPreferences.getStringSet("MRU", null); + if(savedMRU != null) { + for (String url : savedMRU) { + mruLinkedHashMap.put(url, null); + } + } + + updateMRU(); + updateFromPreferences(null, false); sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override @@ -211,6 +232,25 @@ public class MainActivity extends AppCompatActivity drawer.openDrawer(GravityCompat.START); } + private void updateMRU() { + Menu menu = navigationView.getMenu(); + MenuItem recentsMenuItem = menu.findItem(R.id.nav_item_recents); + SubMenu recentsSubMenu = null; + if(recentsMenuItem != null) { + recentsSubMenu = recentsMenuItem.getSubMenu(); + if (recentsSubMenu != null) + recentsSubMenu.clear(); + } + if (recentsSubMenu != null) { + Set mruLinkedHashMapKeySet = mruLinkedHashMap.keySet(); + String[] mrus = mruLinkedHashMapKeySet.toArray(new String[mruLinkedHashMapKeySet.size()]); + for (int i = mrus.length - 1; i >= 0; i--) { + String displayName = getFilenameFromURL(mrus[i]); + recentsSubMenu.add(Menu.NONE, MRU_ID_START + i, Menu.NONE, displayName); + } + } + } + @Override protected void onResume() { super.onResume(); @@ -228,9 +268,15 @@ public class MainActivity extends AppCompatActivity if(NativeLib.isDocumentAvailable() && sharedPreferences.getBoolean("settings_autosave", true)) { String currentFilename = NativeLib.getCurrentFilename(); if (currentFilename != null && currentFilename.length() > 0) { - NativeLib.onFileSave(); + if(NativeLib.onFileSave() == 1) + showAlert("State saved"); } } + + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putStringSet("MRU", mruLinkedHashMap.keySet()); + editor.apply(); + super.onStop(); } @@ -342,6 +388,25 @@ public class MainActivity extends AppCompatActivity OnTopics(); } else if (id == R.id.nav_about) { OnAbout(); + } else if(id >= MRU_ID_START && id < MRU_ID_START + MAX_MRU) { + + Set mruLinkedHashMapKeySet = mruLinkedHashMap.keySet(); + int mruLength = mruLinkedHashMapKeySet.size(); + String[] mrus = mruLinkedHashMapKeySet.toArray(new String[mruLength]); + + int mruClickedIndex = id - MRU_ID_START; + final String url = mrus[mruClickedIndex]; + mruLinkedHashMap.get(url); + + ensureDocumentSaved(new Runnable() { + @Override + public void run() { + if(onFileOpen(url) != 0) { + saveLastDocument(url); + } + } + }); + } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); @@ -462,7 +527,8 @@ public class MainActivity extends AppCompatActivity public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_POSITIVE) { if (hasFilename) { - NativeLib.onFileSave(); + if(NativeLib.onFileSave() == 1) + showAlert("State saved"); if (continueCallback != null) continueCallback.run(); } else { @@ -529,7 +595,6 @@ public class MainActivity extends AppCompatActivity }); } private void OnFileSave() { - //NativeLib.onFileSave(); ensureDocumentSaved(null); } private void OnFileSaveAs() { @@ -703,6 +768,7 @@ public class MainActivity extends AppCompatActivity public void onClick(DialogInterface dialog, int which) { String kmlScriptFilename = kmlScriptsForCurrentModel.get(which).filename; NativeLib.onViewScript(kmlScriptFilename); + displayKMLTitle(); showKMLLog(); updateNavigationDrawerItems(); } @@ -738,6 +804,7 @@ public class MainActivity extends AppCompatActivity String url = uri.toString(); if(NativeLib.onFileSaveAs(url) != 0) { + showAlert("State saved"); saveLastDocument(url); makeUriPersistable(data, uri); displayFilename(url); @@ -770,7 +837,10 @@ public class MainActivity extends AppCompatActivity private void saveLastDocument(String url) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("lastDocument", url); - editor.commit(); + editor.apply(); + + mruLinkedHashMap.put(url, null); + updateMRU(); } private void makeUriPersistable(Intent data, Uri uri) { @@ -788,19 +858,30 @@ public class MainActivity extends AppCompatActivity } private void displayFilename(String url) { + String displayName = getFilenameFromURL(url); + View header = displayKMLTitle(); + TextView textViewSubtitle = header.findViewById(R.id.nav_header_subtitle); + if(textViewSubtitle != null) + textViewSubtitle.setText(displayName); + } + + private String getFilenameFromURL(String url) { String displayName = ""; try { displayName = SettingsActivity.getFileName(this, url); } catch(Exception e) { + // Do nothing } + return displayName; + } + + private View displayKMLTitle() { NavigationView navigationView = findViewById(R.id.nav_view); View header = navigationView.getHeaderView(0); TextView textViewTitle = header.findViewById(R.id.nav_header_title); if(textViewTitle != null) textViewTitle.setText(NativeLib.getKMLTitle()); - TextView textViewSubtitle = header.findViewById(R.id.nav_header_subtitle); - if(textViewSubtitle != null) - textViewSubtitle.setText(displayName); + return header; } private void showKMLLog() { @@ -858,8 +939,86 @@ public class MainActivity extends AppCompatActivity } void showAlert(String text) { - Snackbar.make(getWindow().getDecorView().getRootView(), "text", Snackbar.LENGTH_LONG).setAction("Action", null).show(); + Snackbar.make(findViewById(R.id.main_coordinator), text, Snackbar.LENGTH_SHORT).setAction("Action", null).show(); } + + void sendMenuItemCommand(int menuItem) { + switch (menuItem) { + case 1: // FILE_NEW + OnFileNew(); + break; + case 2: // FILE_OPEN + OnFileOpen(); + break; + case 3: // FILE_SAVE + OnFileSave(); + break; + case 4: // FILE_SAVEAS + OnFileSaveAs(); + break; + case 5: // FILE_EXIT + break; + case 6: // EDIT_COPY_SCREEN + OnViewCopy(); + break; + case 7: // FILE_SETTINGS + OnSettings(); + break; + case 8: // EDIT_RESET + OnViewReset(); + break; + case 9: // EDIT_LOAD_OBJECT + OnObjectLoad(); + break; + case 10: // EDIT_SAVE_OBJECT + OnObjectSave(); + break; + case 11: // HELP_ABOUT + OnAbout(); + break; + case 12: // HELP_TOPICS + OnTopics(); + break; + case 13: // FILE_CLOSE + OnFileClose(); + break; + case 14: // EDIT_BACKUP_SAVE + OnBackupSave(); + break; + case 15: // EDIT_BACKUP_RESTORE + OnBackupRestore(); + break; + case 16: // EDIT_BACKUP_DELETE + OnBackupDelete(); + break; + case 17: // VIEW_SCRIPT + OnViewScript(); + break; + case 18: // EDIT_PORT_CONFIGURATION + break; + case 19: // EDIT_COPY_STRING + OnStackCopy(); + break; + case 20: // EDIT_PASTE_STRING + OnStackPaste(); + break; + case 21: // TOOL_DISASM + break; + case 22: // TOOL_DEBUG + break; + case 23: // TOOL_MACRO_RECORD + break; + case 24: // TOOL_MACRO_PLAY + break; + case 25: // TOOL_MACRO_STOP + break; + case 26: // TOOL_MACRO_SETTINGS + break; + default: + break; + } + } + void clipboardCopyText(String text) { // Gets a handle to the clipboard service. ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index 2aa1a4f..e7481af 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -1,7 +1,9 @@ - diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index 4ce005c..1985630 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -93,6 +93,12 @@ info *action android:title="@string/action_settings" /> + + + + +