3.3.3 ApplicationView and Callback

 On Motif++ application for OZ++ 2.0, you can write easily a typical application window with a menubar and pulldown menus, as shown below.
The following MainView class is an example to select a text file from a fileDialog, and to display the content of the selected file in a scrolledText window.
Note:
1. Define your own top level application view class(MainView) to be a subclass of OZ::ApplicationView class.
2. Define member vairlables for MainWindow, MenuBar, PulldownMenu, ScrolledTextm, and FileDialog.
3. Define a constructor to create the instances of the above classes, and register callbacks to a menu and a file selection.
4. Define calllback method(fileMenu) for a menu selection, and callback method (open) for a file selection in a fileDialog.
5. In main function, create an instance of your OZ::Application class, and an instance of your own application view class(MainView).
6. Call realize method of the instance of the application view.
7. Call run method of the instance of Application to enter an event loop.



//
//ApplicationView.cpp
//Copyright (c) 2015 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.

#include <oz++/motif/ApplicationView.h>

#include <oz++/motif/MainWindow.h>
#include <oz++/motif/MenuItem.h>
#include <oz++/motif/MenuBar.h>
#include <oz++/motif/PushButton.h>
#include <oz++/motif/CascadeButton.h>
#include <oz++/motif/PulldownMenu.h>
#include <oz++/motif/ScrolledText.h>
#include <oz++/motif/FileDialog.h>
#include <oz++/Exception.h>
#include <oz++/CharString.h>

namespace OZ {

class MainView :public ApplicationView {
private:
  //FILE_MENU_ID
  enum {NEW=100, OPEN, SAVE, SAVE_AS, EXIT};

  int             menuId;
  CharString      filePath;

  SmartPtr<MainWindow>     mainw;
  SmartPtr<MenuBar>        menubar;
  SmartPtr<CascadeButton>  file;
  SmartPtr<PulldownMenu>   pulldownm;
  SmartPtr<ScrolledText>   sctext;
  SmartPtr<FileDialog>     fileDialog;

  void    fileMenu(Action& action)
  {
    this->menuId = (int)action.getClientIntData();

    switch(menuId) {
    case NEW: 
       sctext -> getText() -> setString("");
        break;
        
    case OPEN: 
        fileDialog->manage();
        break;
        
    case SAVE:
      sctext -> getText() -> save((const char*)filePath);
        break;

    case SAVE_AS: 
        fileDialog->manage();
        break;
        
    case EXIT: 
        confirm(action);
        break;
    }
  }


  void  open(Action& action)
  {
    XmFileSelectionBoxCallbackStruct* cbs =
           (XmFileSelectionBoxCallbackStruct*)action.getCallData();
    CompoundString cs(cbs->value);
    char* filename = NULL;
    cs.get(&filename);
    printf("filename: %s\n", filename);
    if (menuId == OPEN) {
      sctext -> getText() -> load(filename);
      filePath = filename;
    }
    if (menuId == SAVE_AS) {
      sctext -> getText() -> save(filename);
      filePath = filename;
    }
    XtFree(filename);
    fileDialog ->unmanage();
  }

  void  cancel(Action& action)
  {
    fileDialog -> unmanage();
  }

public:
  MainView(Application& applet, const char* name, Args& args)
  :ApplicationView(applet, name, args) 
  {
    static MenuItem items[] = {
     {PUSHBUTTON,  "new",   "New",      NEW,  ZERO, NULL, NULL, NULL},
     {PUSHBUTTON,  "open",  "Open",     OPEN, ZERO, NULL, NULL, NULL},
     {PUSHBUTTON,  "save",  "Save",     SAVE, ZERO, NULL, NULL, NULL},
     {PUSHBUTTON,  "saveas", "Save As", SAVE_AS, ZERO,NULL, NULL, NULL},
     {SEPARATOR,   "sep",    "",        0,      ZERO, NULL, NULL, NULL},
     {PUSHBUTTON,  "exit",  "Exit",     EXIT, ZERO, NULL, NULL, NULL},
    };

    Args ar;
    mainw   = new MainWindow(this, "mainw", ar);

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

    ar.reset();
    sctext = new ScrolledText(mainw, "sctext", ar);
    filePath = "./ApplicationView.cpp";
    sctext->getText()
          ->load((const char*)filePath);

    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);

    ar.reset();
    fileDialog = new FileDialog(this, "filed", ar);
    fileDialog -> getFileBox()
               -> addCallback(XmNokCallback, this,
                      (Callback)&MainView::open, NULL);
    fileDialog -> getFileBox()
               -> addCallback(XmNcancelCallback, this,
                      (Callback)&MainView::cancel, NULL);
  }

  ~MainView()
  {
  }
};
}

//
int main(int argc, char** argv) 
{
  try {
    const char*  appclass = argv[0]; 
    Application applet(appclass, argc, argv);

    Args args;
    args.set(XmNgeometry, "500x500");
    MainView view(applet, argv[0], args);
    view.realize();

    applet.run();
  } catch (Exception& ex) {
    caught(ex);
  } 
  return 0;
}




Last modified: 21 Aug. 2017

 Last modified: 21 Aug 2017

Copyright (c) 2000-2017 Antillia.com ALL RIGHTS RESERVED.