OZ++ Class: OpenCVApplicationView
/******************************************************************************
 *
 * Copyright (c) 2017 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer.
 *
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 *  OpenCVApplicationView.cpp
 *
 *****************************************************************************/


#include <oz++/motif/ApplicationView.h>
#include <oz++/motif/MainWindow.h>
#include <oz++/BulletinBoard.h>
#include <oz++/motif/MenuBar.h>
#include <oz++/motif/CascadeButton.h>
#include <oz++/motif/PulldownMenu.h>
#include <oz++/opencv/OpenCVObject.h>

namespace OZ {

class MainView :public ApplicationView {
private:
  SmartPtr<MainWindow>     mainw;
  SmartPtr<BulletinBoard>  bboard;
  SmartPtr<MenuBar>        menubar;
  SmartPtr<CascadeButton>  file;
  SmartPtr<CascadeButton>  edit;
  SmartPtr<CascadeButton>  help;
  SmartPtr<PulldownMenu>   pulldownm;
  SmartPtr<PulldownMenu>   epulldownm;
  SmartPtr<PulldownMenu>   hpulldownm;

public:
  enum  MENU_IDS{
    //File
    NEW, OPEN, SAVE, SAVE_AS, EXIT,
    //Edit
    CUT, COPY, PASTE,FIND, REPLACE,
    //Help
    HELP, OPENCV_VERSION };

private:
  virtual void   addPulldownMenu()
  {
    static MenuItem items[] = {
      {PUSHBUTTON,  "new",     "New",     NEW,     ZERO},
      {PUSHBUTTON,  "open",    "Open",    OPEN,    ZERO},
      {PUSHBUTTON,  "save",    "Save",    SAVE,    ZERO},
      {PUSHBUTTON,  "saveas",  "Save As", SAVE_AS, ZERO},
      {PUSHBUTTON,  "exit",    "Exit",    EXIT,    ZERO}
     };

     static MenuItem eitems[] = {
       {PUSHBUTTON,  "cut",     "Cut",     CUT,     ZERO},
       {PUSHBUTTON,  "copy",    "Copy",    COPY,    ZERO},
       {PUSHBUTTON,  "paste",   "Paste",   PASTE,   ZERO},
       {PUSHBUTTON,  "find",    "Find",    FIND,    ZERO},
       {PUSHBUTTON,  "replace", "Replace", REPLACE, ZERO}
      };

     static MenuItem hitems[] = {
       {PUSHBUTTON,  "help",     "Help",           HELP,     ZERO},
       {PUSHBUTTON,  "version",  "OpenCV Version", OPENCV_VERSION,    ZERO},
     };

     Args ar;
     CompoundString cs("File");
     ar.reset();
     ar.set(XmNlabelString, cs);
     file = new CascadeButton(menubar, "File", ar);

     ar.reset();
     //ar.set(XmNtearOffModel, XmTEAR_OFF_ENABLED);
     pulldownm = new PulldownMenu(menubar, "pulldownm", ar);
     pulldownm -> addItem(items, XtNumber(items),
                          this, (Callback)&MainView::fileMenu);
     file -> set(XmNsubMenuId, pulldownm);

     CompoundString ecs("Edit");
     ar.reset();
     ar.set(XmNlabelString, ecs);
     edit = new CascadeButton(menubar, "Edit", ar);

     ar.reset();
     //ar.set(XmNtearOffModel, XmTEAR_OFF_ENABLED);
     epulldownm = new PulldownMenu(menubar, "epulldownm", ar);
     epulldownm -> addItem(eitems, XtNumber(eitems),
                          this, (Callback)&MainView::editMenu);
     edit -> set(XmNsubMenuId, epulldownm);

     CompoundString hcs("Help");
     ar.reset();
     ar.set(XmNlabelString, hcs);
     help = new CascadeButton(menubar, "Help", ar);

     ar.reset();
     //ar.set(XmNtearOffModel, XmTEAR_OFF_ENABLED);
     hpulldownm = new PulldownMenu(menubar, "epulldownm", ar);
     hpulldownm -> addItem(eitems, XtNumber(eitems),
                          this, (Callback)&MainView::helpMenu);
     help -> set(XmNsubMenuId, hpulldownm);
  }

  virtual void    fileMenu(Action& action)
  {
    int menuId = (int)action.getClientData();
    printf("fileMenu %d\n", menuId);
    if(menuId == EXIT) {
       exit(action);
    }
  }

  virtual void    editMenu(Action& action)
  {
    int menuId = (int)action.getClientData();
    printf("editMenu %d\n", menuId);
  }

  virtual void    helpMenu(Action& action)
  {
    int menuId = (int)action.getClientData();
    printf("helpMenu %d\n", menuId);
    if (menuId == OPENCV_VERSION) {
      char message[1024];
      sprintf_s(message, CountOf(message), "Major Version: %d  Minor Version: %d  SubMinor_Version: %d",
          CV_MAJOR_VERSION,
          CV_MINOR_VERSION,
          CV_SUBMINOR_VERSION);

      // showMessageDialog("OpenCV Version", message, MB_ICONINFORMATION|MB_OK);
    }
  }

public:
  OpenCVApplicationView(Application& applet, const char* name, Args& args)
  :ApplicationView(applet, name, args)
  {
     Args ar;
     mainw   = new MainWindow(this, "mainw", ar);

     ar.reset();
     menubar = new MenuBar(mainw, "menubar", ar);

     addPulldownMenu();

     ar.reset();
     bboard = new BulletinBoard(mainw, "", ar);
  }

  ~MainView()
  {
  }

  BulletinBoard* getBulletinBoard()
  {
     return bboard;
  }
};

}