| @@ -490,13 +490,14 @@ public class JuceAppActivity extends Activity | |||||
| builder.create().show(); | builder.create().show(); | ||||
| } | } | ||||
| public final void showOkCancelBox (String title, String message, final long callback) | |||||
| public final void showOkCancelBox (String title, String message, final long callback, | |||||
| String okButtonText, String cancelButtonText) | |||||
| { | { | ||||
| AlertDialog.Builder builder = new AlertDialog.Builder (this); | AlertDialog.Builder builder = new AlertDialog.Builder (this); | ||||
| builder.setTitle (title) | builder.setTitle (title) | ||||
| .setMessage (message) | .setMessage (message) | ||||
| .setCancelable (true) | .setCancelable (true) | ||||
| .setPositiveButton ("OK", new DialogInterface.OnClickListener() | |||||
| .setPositiveButton (okButtonText.isEmpty() ? "OK" : okButtonText, new DialogInterface.OnClickListener() | |||||
| { | { | ||||
| public void onClick (DialogInterface dialog, int id) | public void onClick (DialogInterface dialog, int id) | ||||
| { | { | ||||
| @@ -504,7 +505,7 @@ public class JuceAppActivity extends Activity | |||||
| JuceAppActivity.this.alertDismissed (callback, 1); | JuceAppActivity.this.alertDismissed (callback, 1); | ||||
| } | } | ||||
| }) | }) | ||||
| .setNegativeButton ("Cancel", new DialogInterface.OnClickListener() | |||||
| .setNegativeButton (cancelButtonText.isEmpty() ? "Cancel" : cancelButtonText, new DialogInterface.OnClickListener() | |||||
| { | { | ||||
| public void onClick (DialogInterface dialog, int id) | public void onClick (DialogInterface dialog, int id) | ||||
| { | { | ||||
| @@ -276,7 +276,7 @@ extern AndroidSystem android; | |||||
| STATICMETHOD (createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;I[ILjava/lang/StringBuffer;ILjava/lang/String;)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \ | STATICMETHOD (createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;I[ILjava/lang/StringBuffer;ILjava/lang/String;)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \ | ||||
| METHOD (launchURL, "launchURL", "(Ljava/lang/String;)V") \ | METHOD (launchURL, "launchURL", "(Ljava/lang/String;)V") \ | ||||
| METHOD (showMessageBox, "showMessageBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ | METHOD (showMessageBox, "showMessageBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ | ||||
| METHOD (showOkCancelBox, "showOkCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ | |||||
| METHOD (showOkCancelBox, "showOkCancelBox", "(Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)V") \ | |||||
| METHOD (showYesNoCancelBox, "showYesNoCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ | METHOD (showYesNoCancelBox, "showYesNoCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ | ||||
| STATICMETHOD (getLocaleValue, "getLocaleValue", "(Z)Ljava/lang/String;") \ | STATICMETHOD (getLocaleValue, "getLocaleValue", "(Z)Ljava/lang/String;") \ | ||||
| STATICMETHOD (getDocumentsFolder, "getDocumentsFolder", "()Ljava/lang/String;") \ | STATICMETHOD (getDocumentsFolder, "getDocumentsFolder", "()Ljava/lang/String;") \ | ||||
| @@ -737,7 +737,8 @@ bool JUCE_CALLTYPE NativeMessageBox::showOkCancelBox (AlertWindow::AlertIconType | |||||
| jassert (callback != nullptr); // on android, all alerts must be non-modal!! | jassert (callback != nullptr); // on android, all alerts must be non-modal!! | ||||
| android.activity.callVoidMethod (JuceAppActivity.showOkCancelBox, javaString (title).get(), | android.activity.callVoidMethod (JuceAppActivity.showOkCancelBox, javaString (title).get(), | ||||
| javaString (message).get(), (jlong) (pointer_sized_int) callback); | |||||
| javaString (message).get(), (jlong) (pointer_sized_int) callback, | |||||
| javaString (TRANS ("OK")).get(), javaString (TRANS ("Cancel")).get()); | |||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -753,6 +754,19 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (AlertWindow::AlertIconTy | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (AlertWindow::AlertIconType /*iconType*/, | |||||
| const String& title, const String& message, | |||||
| Component* /*associatedComponent*/, | |||||
| ModalComponentManager::Callback* callback) | |||||
| { | |||||
| jassert (callback != nullptr); // on android, all alerts must be non-modal!! | |||||
| android.activity.callVoidMethod (JuceAppActivity.showOkCancelBox, javaString (title).get(), | |||||
| javaString (message).get(), (jlong) (pointer_sized_int) callback, | |||||
| javaString (TRANS ("Yes")).get(), javaString (TRANS ("No")).get()); | |||||
| return 0; | |||||
| } | |||||
| JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, alertDismissed, void, (JNIEnv* env, jobject /*activity*/, | JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, alertDismissed, void, (JNIEnv* env, jobject /*activity*/, | ||||
| jlong callbackAsLong, jint result)) | jlong callbackAsLong, jint result)) | ||||
| { | { | ||||
| @@ -360,6 +360,20 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (AlertWindow::AlertIconTy | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (AlertWindow::AlertIconType /*iconType*/, | |||||
| const String& title, const String& message, | |||||
| Component* /*associatedComponent*/, | |||||
| ModalComponentManager::Callback* callback) | |||||
| { | |||||
| ScopedPointer<iOSMessageBox> mb (new iOSMessageBox (title, message, @"No", @"Yes", nil, callback, callback != nullptr)); | |||||
| if (callback == nullptr) | |||||
| return mb->getResult(); | |||||
| mb.release(); | |||||
| return 0; | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray&, bool) | bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray&, bool) | ||||
| { | { | ||||
| @@ -3958,6 +3958,15 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (AlertWindow::AlertIconTy | |||||
| associatedComponent, callback); | associatedComponent, callback); | ||||
| } | } | ||||
| int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (AlertWindow::AlertIconType iconType, | |||||
| const String& title, const String& message, | |||||
| Component* associatedComponent, | |||||
| ModalComponentManager::Callback* callback) | |||||
| { | |||||
| return AlertWindow::showOkCancelBox (iconType, title, message, TRANS ("Yes"), TRANS ("No"), | |||||
| associatedComponent, callback); | |||||
| } | |||||
| //============================== X11 - MouseCursor ============================= | //============================== X11 - MouseCursor ============================= | ||||
| void* CustomMouseCursorInfo::create() const | void* CustomMouseCursorInfo::create() const | ||||
| @@ -147,6 +147,15 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (AlertWindow::AlertIconTy | |||||
| "Yes", "Cancel", "No", callback != nullptr); | "Yes", "Cancel", "No", callback != nullptr); | ||||
| } | } | ||||
| int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (AlertWindow::AlertIconType iconType, | |||||
| const String& title, const String& message, | |||||
| Component* /*associatedComponent*/, | |||||
| ModalComponentManager::Callback* callback) | |||||
| { | |||||
| return OSXMessageBox::show (iconType, title, message, callback, | |||||
| "Yes", "No", nullptr, callback != nullptr); | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| static NSRect getDragRect (NSView* view, NSEvent* event) | static NSRect getDragRect (NSView* view, NSEvent* event) | ||||
| @@ -3464,7 +3464,7 @@ public: | |||||
| int getResult() const | int getResult() const | ||||
| { | { | ||||
| const int r = MessageBox (owner, message.toWideCharPointer(), title.toWideCharPointer(), flags); | const int r = MessageBox (owner, message.toWideCharPointer(), title.toWideCharPointer(), flags); | ||||
| return (r == IDYES || r == IDOK) ? 1 : (r == IDNO ? 2 : 0); | |||||
| return (r == IDYES || r == IDOK) ? 1 : (r == IDNO && (flags & 1) != 0 ? 2 : 0); | |||||
| } | } | ||||
| void handleAsyncUpdate() override | void handleAsyncUpdate() override | ||||
| @@ -3550,6 +3550,20 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (AlertWindow::AlertIconTy | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (AlertWindow::AlertIconType iconType, | |||||
| const String& title, const String& message, | |||||
| Component* associatedComponent, | |||||
| ModalComponentManager::Callback* callback) | |||||
| { | |||||
| ScopedPointer<WindowsMessageBox> mb (new WindowsMessageBox (iconType, title, message, associatedComponent, | |||||
| MB_YESNO, callback, callback != nullptr)); | |||||
| if (callback == nullptr) | |||||
| return mb->getResult(); | |||||
| mb.release(); | |||||
| return 0; | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| bool MouseInputSource::SourceList::addSource() | bool MouseInputSource::SourceList::addSource() | ||||
| { | { | ||||
| @@ -155,6 +155,48 @@ public: | |||||
| ModalComponentManager::Callback* callback); | ModalComponentManager::Callback* callback); | ||||
| #endif | #endif | ||||
| /** Shows a dialog box with three buttons. | |||||
| Ideal for yes/no boxes. | |||||
| The escape key can be used to trigger the no button. | |||||
| If the callback parameter is null, the box is shown modally, and the method will | |||||
| block until the user has clicked the button (or pressed the escape or return keys). | |||||
| If the callback parameter is non-null, the box will be displayed and placed into a | |||||
| modal state, but this method will return immediately, and the callback will be invoked | |||||
| later when the user dismisses the box. | |||||
| @param iconType the type of icon to show | |||||
| @param title the headline to show at the top of the box | |||||
| @param message a longer, more descriptive message to show underneath the title | |||||
| @param associatedComponent if this is non-null, it specifies the component that the | |||||
| alert window should be associated with. Depending on the look | |||||
| and feel, this might be used for positioning of the alert window. | |||||
| @param callback if this is non-null, the box will be launched asynchronously, | |||||
| returning immediately, and the callback will receive a call to its | |||||
| modalStateFinished() when the box is dismissed, with its parameter | |||||
| being 1 if the "yes" button was pressed or 0 for the "no" button was | |||||
| pressed. The callback object will be owned and deleted by the | |||||
| system, so make sure that it works safely and doesn't keep any references | |||||
| to objects that might be deleted before it gets called. | |||||
| @returns If the callback parameter has been set, this returns 0. Otherwise, it returns one | |||||
| of the following values: | |||||
| - 0 if 'no' was pressed | |||||
| - 1 if 'yes' was pressed | |||||
| */ | |||||
| static int JUCE_CALLTYPE showYesNoBox (AlertWindow::AlertIconType iconType, | |||||
| const String& title, | |||||
| const String& message, | |||||
| #if JUCE_MODAL_LOOPS_PERMITTED | |||||
| Component* associatedComponent = nullptr, | |||||
| ModalComponentManager::Callback* callback = nullptr); | |||||
| #else | |||||
| Component* associatedComponent, | |||||
| ModalComponentManager::Callback* callback); | |||||
| #endif | |||||
| private: | private: | ||||
| NativeMessageBox() JUCE_DELETED_FUNCTION; | NativeMessageBox() JUCE_DELETED_FUNCTION; | ||||
| JUCE_DECLARE_NON_COPYABLE (NativeMessageBox) | JUCE_DECLARE_NON_COPYABLE (NativeMessageBox) | ||||