summaryrefslogtreecommitdiff
path: root/tvision/msgbox.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tvision/msgbox.cc')
-rw-r--r--tvision/msgbox.cc244
1 files changed, 244 insertions, 0 deletions
diff --git a/tvision/msgbox.cc b/tvision/msgbox.cc
new file mode 100644
index 0000000..bc9eb93
--- /dev/null
+++ b/tvision/msgbox.cc
@@ -0,0 +1,244 @@
+/*
+ * Turbo Vision - Version 2.0
+ *
+ * Copyright (c) 1994 by Borland International
+ * All Rights Reserved.
+ *
+
+Modified by Robert H”hne to be used for RHIDE.
+Modified by Salvador E. Tropea to add mfDontShowAgain, vsnprintf usage and
+i18n. Added TValidator, etc.
+
+ *
+ *
+ */
+// SET: Moved the standard headers here because according to DJ
+// they can inconditionally declare symbols like NULL
+#include <stdarg.h>
+#define Uses_string
+#define Uses_stdio
+
+#define Uses_MsgBox
+#define Uses_TObject
+#define Uses_TDialog
+#define Uses_TStaticText
+#define Uses_TRect
+#define Uses_TButton
+#define Uses_TProgram
+#define Uses_TInputLine
+#define Uses_TDeskTop
+#define Uses_TLabel
+#define Uses_TCheckBoxes
+#define Uses_TSItem
+#define Uses_TScreen
+#define Uses_AllocLocal
+#define Uses_TValidator
+#define Uses_snprintf
+#include <tv.h>
+
+static const char *buttonName[] =
+{
+ __("~Y~es"),
+ __("~N~o"),
+ __("~O~K"),
+ __("Cancel")
+};
+
+static ushort commands[] =
+{
+ cmYes,
+ cmNo,
+ cmOK,
+ cmCancel
+};
+
+static const char *Titles[] =
+{
+ __("Warning"),
+ __("Error"),
+ __("Information"),
+ __("Confirm")
+};
+
+ushort messageBoxRect( const TRect &r, const char *msg, ushort aOptions )
+{
+ TDialog *dialog;
+ short i, x, buttonCount;
+ TView* buttonList[5];
+ ushort ccode;
+ int height=r.b.y-r.a.y;
+ TCheckBoxes *dsa=0;
+ TRect rlocal=r;
+
+ if (aOptions & mfDontShowAgain)
+ {
+ rlocal.a.y-=2;
+ rlocal.b.y++;
+ }
+
+ dialog = new TDialog( rlocal, Titles[aOptions & 0x3] );
+
+ stTVIntl *intlMessage=NULL;
+ if (aOptions & mfDontTranslate)
+ intlMessage=TVIntl::dontTranslateSt();
+ else
+ TVIntl::getText(msg,intlMessage);
+
+ dialog->insert(
+ new TStaticText(TRect(3, 2, dialog->size.x - 2, height - 3),
+ msg,intlMessage) );
+
+ if (aOptions & mfDontShowAgain)
+ {
+ dsa=new TCheckBoxes(TRect(2,height-2,dialog->size.x-2,height-1),
+ new TSItem(__("Don't warn you next time"),0));
+ dialog->insert(dsa);
+ }
+
+ for( i = 0, x = -2, buttonCount = 0; i < 4; i++ )
+ {
+ if( (aOptions & (0x0100 << i)) != 0)
+ {
+ buttonList[buttonCount] =
+ new TButton( TRect(0, 0, 10, 2), _(buttonName[i]), commands[i], bfNormal );
+ x += buttonList[buttonCount++]->size.x + 2;
+ }
+ }
+
+ x = (dialog->size.x - x) / 2;
+
+ for( i = 0; i < buttonCount; i++ )
+ {
+ dialog->insert(buttonList[i]);
+ buttonList[i]->moveTo(x, dialog->size.y - 3);
+ x += buttonList[i]->size.x + 2;
+ }
+
+ dialog->selectNext(False);
+
+ Boolean oldBusy=TScreen::showBusyState(False);
+ ccode = TProgram::deskTop->execView(dialog);
+ TScreen::showBusyState(oldBusy);
+ if (aOptions & mfDontShowAgain)
+ {
+ ushort val;
+ dsa->getData(&val);
+ if (val)
+ ccode|=0x8000; // Not so clean but cmOK,Yes,etc are low values
+ }
+
+ TObject::CLY_destroy( dialog );
+
+ return ccode;
+}
+
+ushort messageBoxRect( const TRect &r,
+ ushort aOptions,
+ const char *fmt,
+ ... )
+{
+ va_list argptr;
+
+ char *intlFmt=TVIntl::getTextNew(fmt);
+
+ va_start( argptr, fmt );
+ int l=CLY_vsnprintf(NULL, (size_t)0, intlFmt, argptr);
+ va_end( argptr );
+ AllocLocalStr(msg,l+1);
+
+ va_start( argptr, fmt );
+ CLY_vsnprintf(msg, (size_t)l+1, intlFmt, argptr);
+ va_end( argptr );
+
+ DeleteArray(intlFmt);
+ return messageBoxRect( r, msg, aOptions | mfDontTranslate );
+}
+
+static TRect makeRect()
+{
+ TRect r( 0, 0, 40, 9 );
+ r.move((TProgram::deskTop->size.x - r.b.x) / 2,
+ (TProgram::deskTop->size.y - r.b.y) / 2);
+ return r;
+}
+
+ushort messageBox( const char *msg, ushort aOptions )
+{
+ return messageBoxRect( makeRect(), msg, aOptions );
+}
+
+ushort messageBox( ushort aOptions, const char *fmt, ... )
+{
+ va_list argptr;
+
+ char *intlFmt=TVIntl::getTextNew(fmt);
+
+ va_start( argptr, fmt );
+ int l=CLY_vsnprintf(NULL, (size_t)0, intlFmt, argptr);
+ va_end( argptr );
+ AllocLocalStr(msg,l+1);
+
+ va_start( argptr, fmt );
+ CLY_vsnprintf(msg, (size_t)l+1, intlFmt, argptr);
+ va_end( argptr );
+
+ DeleteArray(intlFmt);
+ return messageBoxRect( makeRect(), msg, aOptions | mfDontTranslate );
+}
+
+ushort inputBox( const char *Title, const char *aLabel, char *s, int limit,
+ TValidator *v )
+{ // Use a size according to the label+limit and title
+ int len;
+ len = max( strlen(aLabel) + 8 + limit, strlen(Title) + 11 );
+ len = min( len, 60 );
+ len = max( len , 24 );
+ TRect r(0, 0, len, 7);
+ r.move((TProgram::deskTop->size.x - r.b.x) / 2,
+ (TProgram::deskTop->size.y - r.b.y) / 2);
+ return inputBoxRect(r, Title, aLabel, s, limit, v);
+}
+
+ushort inputBoxRect( const TRect &bounds,
+ const char *Title,
+ const char *aLabel,
+ char *s,
+ int limit,
+ TValidator *v )
+{
+ TDialog *dialog;
+ TInputLine* control;
+ TRect r;
+ ushort c;
+
+ dialog = new TDialog(bounds, Title);
+
+ unsigned x = 4 + strlen( aLabel );
+ r = TRect( x, 2, min(x + limit + 2, (unsigned int)dialog->size.x - 3), 3 );
+ control = new TInputLine( r, limit );
+ control->setValidator( v );
+ dialog->insert( control );
+
+ stTVIntl *intlLabel = NULL;
+ r = TRect(2, 2, 3 + strlen(TVIntl::getText(aLabel,intlLabel)), 3);
+ dialog->insert( new TLabel( r, aLabel, control, intlLabel ) );
+
+ r = TRect( dialog->size.x / 2 - 11, dialog->size.y - 3,
+ dialog->size.x / 2 - 1 , dialog->size.y - 1);
+ dialog->insert( new TButton(r, __("~O~K"), cmOK, bfDefault));
+
+ r.a.x += 12;
+ r.b.x += 12;
+ dialog->insert( new TButton(r, __("Cancel"), cmCancel, bfNormal));
+
+ r.a.x += 12;
+ r.b.x += 12;
+ dialog->selectNext(False);
+ dialog->setData(s);
+ c = TProgram::deskTop->execView(dialog);
+ if( c != cmCancel )
+ dialog->getData(s);
+ TObject::CLY_destroy( dialog );
+ return c;
+}
+