/*****************************************************************************\
*                                                                             *
*  Name   : gui_message                                                       *
*  Author : Chris Koeritz                                                     *
*                                                                             *
*  Purpose:                                                                   *
*                                                                             *
*    Allows batch files to pop up message boxes, where supported by the       *
*  operating system.                                                          *
*                                                                             *
*******************************************************************************
* Copyright (c) 2004-$now By Author.  This program is free software; you can  *
* redistribute it and/or modify it under the terms of the GNU General Public  *
* License as published by the Free Software Foundation; either version 2 of   *
* the License or (at your option) any later version.  This is online at:      *
*     http://www.fsf.org/copyleft/gpl.html                                    *
* Please send any updates to: fred@gruntose.com                               *
\*****************************************************************************/

#include <basis/convert_utf.h>
#include <basis/guards.h>
#include <opsystem/application_shell.h>
#include <loggers/console_logger.h>
#include <data_struct/static_memory_gremlin.h>

#include <stdlib.h>

class gui_message : public application_shell
{
public:
  gui_message() : application_shell(class_name()) {}
  IMPLEMENT_CLASS_NAME("gui_message");
  virtual int execute();
  void print_instructions_and_exit();
};

void gui_message::print_instructions_and_exit()
{
  log(istring(istring::SPRINTF, "\n\
Usage:\t%s {text} {title}\n\n\
This is a utility that provides scripts with the ability to pop up a\n\
message box for the user.  The user must hit the okay button to proceed.\n\
The text is the main message to show while the title will be used for the\n\
descriptive caption on the box window.  Note that this is only supported\n\
by some operating systems; others may be in truly console mode and have\n\
no access to a graphical message box.\n",
      class_name(), class_name()));
  exit(0);
}

int gui_message::execute()
{
  if (__argc < 3) print_instructions_and_exit();
#ifdef __WIN32__
  // special gui code for windows.
  int r = MessageBox(0, to_unicode_temp(__argv[1]), to_unicode_temp(__argv[2]),
      MB_OK | MB_TOPMOST);
  if (!r) {
    istring text = portable::system_error_text(portable::system_error());
    log(istring("the error creating messagebox is: ") + text);
  }
#else
  guards::alert_message(__argv[1], __argv[2]);
#endif
  return 0;
}

HOOPLE_MAIN(gui_message, )

#ifdef __BUILD_STATIC_APPLICATION__
  // static dependencies found by buildor_gen_deps.sh:
  #include <basis/array.cpp>
  #include <basis/byte_array.cpp>
  #include <basis/callstack_tracker.cpp>
  #include <basis/chaos.cpp>
  #include <basis/convert_utf.cpp>
  #include <basis/definitions.cpp>
  #include <basis/earth_time.cpp>
  #include <basis/guards.cpp>
  #include <basis/istring.cpp>
  #include <basis/log_base.cpp>
  #include <basis/memory_checker.cpp>
  #include <basis/mutex.cpp>
  #include <basis/object_base.cpp>
  #include <basis/outcome.cpp>
  #include <basis/packable.cpp>
  #include <basis/portable.cpp>
  #include <basis/sequence.cpp>
  #include <basis/set.cpp>
  #include <basis/utility.cpp>
  #include <basis/version_record.cpp>
  #include <data_struct/amorph.cpp>
  #include <data_struct/bit_vector.cpp>
  #include <data_struct/byte_hasher.cpp>
  #include <data_struct/configurator.cpp>
  #include <data_struct/hash_table.cpp>
  #include <data_struct/pointer_hash.cpp>
  #include <data_struct/stack.cpp>
  #include <data_struct/static_memory_gremlin.cpp>
  #include <data_struct/string_hash.cpp>
  #include <data_struct/string_hasher.cpp>
  #include <data_struct/string_table.cpp>
  #include <data_struct/symbol_table.cpp>
  #include <data_struct/table_configurator.cpp>
  #include <loggers/console_logger.cpp>
  #include <loggers/file_logger.cpp>
  #include <loggers/locked_logger.cpp>
  #include <loggers/null_logger.cpp>
  #include <loggers/program_wide_logger.cpp>
  #include <opsystem/application_base.cpp>
  #include <opsystem/application_shell.cpp>
  #include <opsystem/byte_filer.cpp>
  #include <opsystem/command_line.cpp>
  #include <opsystem/critical_events.cpp>
  #include <opsystem/directory.cpp>
  #include <opsystem/filename.cpp>
  #include <opsystem/ini_config.cpp>
  #include <opsystem/ini_parser.cpp>
  #include <opsystem/path_configuration.cpp>
  #include <opsystem/rendezvous.cpp>
  #include <textual/byte_format.cpp>
  #include <textual/parser_bits.cpp>
  #include <textual/string_manipulation.cpp>
  #include <textual/tokenizer.cpp>
#endif // __BUILD_STATIC_APPLICATION__

