Scene, TOC, and toolbar
SceneTocToolbar.cpp
// Copyright 2011 ESRI
// 
// All rights reserved under the copyright laws of the United States
// and applicable international laws, treaties, and conventions.
// 
// You may freely redistribute and use this sample code, with or
// without modification, provided you include the original copyright
// notice and use restrictions.
// 
// See the use restrictions.
// 

  
#include "SceneTocToolbar.h"

// Motif Widgets
Widget g_topLevel;                // application
Widget g_mainWindow;              
Widget g_mainForm;                
Widget g_sceneWidget;             
Widget g_tocWidget;               
Widget g_toolbarWidget;           

// Control Interfaces
ISceneControlPtr g_ipSceneControl;
IToolbarControlPtr g_ipToolbarControl;
ITOCControlPtr g_ipTOCControl;

int main(int argc, char* argv[])
{
  // Initialize the Engine
  ::AoInitialize(NULL);
  {
    IAoInitializePtr ipInit(CLSID_AoInitialize);
    esriLicenseStatus status;
    ipInit->Initialize(esriLicenseProductCodeEngine, &status);
    if (status != esriLicenseCheckedOut)
    {
      std::cerr << "Invalid Licensing." << std::endl;
      AoExit(0);  
    }
    esriLicenseStatus extStatus;
    ipInit->CheckOutExtension(esriLicenseExtensionCode3DAnalyst, &extStatus);
    if (extStatus != esriLicenseCheckedOut)
    {
      std::cerr << "You must have a 3D Analyst License to run this sample." << std::endl;
      AoExit(0);
    }
  }
  
  XtSetLanguageProc(NULL, NULL, NULL);
  XtAppContext app_context;

  // Initialize the Motif toolkit and create the parent widget
  g_topLevel = XtVaAppInitialize(&app_context, "XApplication", 
                                 NULL, 0, &argc, argv, NULL, NULL);
  XtVaSetValues(g_topLevel, 
                XmNtitle, "Motif Widget Scene Control",
                NULL);
  
  // Set the application size by resizing the created widget
  XtResizeWidget(g_topLevel, 800, 640, 1);
  
  g_mainWindow = XtVaCreateWidget("g_mainWindow", 
                                  xmMainWindowWidgetClass, g_topLevel,
                                  NULL);
  
  g_mainForm = XtVaCreateWidget("g_mainForm",
                                xmFormWidgetClass,        g_mainWindow,
                                XmNtopAttachment,         XmATTACH_WIDGET,
                                XmNtopWidget,             g_mainWindow,
                                XmNbottomAttachment,      XmATTACH_WIDGET,
                                XmNbottomWidget,          g_mainWindow,
                                XmNleftAttachment,        XmATTACH_WIDGET,
                                XmNleftWidget,            g_mainWindow,
                                XmNrightAttachment,       XmATTACH_WIDGET,
                                XmNrightWidget,           g_mainWindow,
                                XmNfractionBase,          100,
                                NULL);
  
  // ToolbarControl setup 
  g_toolbarWidget = XtVaCreateWidget("g_toolbarWidget",
                                     mwCtlWidgetClass,    g_mainForm,
                                     XmNtopAttachment,    XmATTACH_FORM,
                                     XmNleftAttachment,   XmATTACH_FORM,
                                     XmNrightAttachment,  XmATTACH_FORM,
                                     MwNprogID,           AoPROGID_ToolbarControl,
                                     NULL);
  XtVaSetValues(g_toolbarWidget, XmNheight, 25, NULL);
  MwCtlGetInterface(g_toolbarWidget, (IUnknown**)&g_ipToolbarControl);
  
  // TOCControl setup
  g_tocWidget = XtVaCreateWidget("g_tocWidget",
                                 mwCtlWidgetClass,        g_mainForm,
                                 XmNtopAttachment,        XmATTACH_WIDGET,
                                 XmNtopWidget,            g_toolbarWidget,
                                 XmNleftAttachment,       XmATTACH_FORM,
                                 XmNbottomAttachment,     XmATTACH_FORM,
                                 MwNprogID,               AoPROGID_TOCControl,
                                 NULL);
  XtVaSetValues(g_tocWidget, XmNwidth, 200, NULL);
  MwCtlGetInterface(g_tocWidget, (IUnknown**)&g_ipTOCControl);
  
  // SceneControl setup
  g_sceneWidget = XtVaCreateWidget("g_sceneWidget",
                                   mwCtlWidgetClass,     g_mainForm,
                                   XmNtopAttachment,     XmATTACH_WIDGET,
                                   XmNtopWidget,         g_toolbarWidget,
                                   XmNleftAttachment,    XmATTACH_WIDGET,
                                   XmNleftWidget,        g_tocWidget,
                                   XmNrightAttachment,   XmATTACH_FORM,
                                   XmNbottomAttachment,  XmATTACH_FORM,
                                   MwNprogID,            AoPROGID_SceneControl,
                                   NULL);
  MwCtlGetInterface(g_sceneWidget, (IUnknown**)&g_ipSceneControl);
  
  // Buddy the toolbar and TOC with the map
  g_ipTOCControl->SetBuddyControl(g_ipSceneControl);
  g_ipToolbarControl->SetBuddyControl(g_ipSceneControl);
  
  AddToolbarItems();
  
  // Manage the non-parent widgets
  XtManageChild(g_mainWindow);
  XtManageChild(g_mainForm);
  XtManageChild(g_toolbarWidget);
  XtManageChild(g_tocWidget);
  XtManageChild(g_sceneWidget);

  // Handle the window manager message that the window is about to be closed 
  Atom wm_delete_window = XmInternAtom(XtDisplay(g_topLevel), 
                                       "WM_DELETE_WINDOW", 
                                       FALSE);

  XmAddWMProtocolCallback(g_topLevel, wm_delete_window, 
                          CloseAppCallback, NULL);

  // Start the application running
  XtRealizeWidget(g_topLevel);
  MwCtlAppMainLoop(app_context);
}

// Function called when WM_DELETE_WINDOW protocol is passed
void CloseAppCallback(Widget w, XtPointer client_data, XtPointer call_data)
{
  g_ipSceneControl = 0;
  g_ipToolbarControl = 0;
  g_ipTOCControl = 0;

  // Uninitialize the engine
  {
    IAoInitializePtr ipInit(CLSID_AoInitialize);
    ipInit->Shutdown();
  }
  ::AoUninitialize();

  AoExit(0);
}

void AddToolbarItems()
{
  long itemIndex;
  CComVariant varTool;

  varTool = L"esri3DAnalyst.ControlsSceneOpenDocCommand";
  g_ipToolbarControl->AddItem(varTool, 0, -1, VARIANT_FALSE, 0,
                              esriCommandStyleIconOnly, &itemIndex);  
  varTool = L"esri3DAnalyst.ControlsSceneSceneToolbar";
  g_ipToolbarControl->AddItem(varTool, 0, -1, VARIANT_FALSE, 0,
                              esriCommandStyleIconOnly, &itemIndex);
  varTool = L"esriControlCommands.ControlsSelectTool";
  g_ipToolbarControl->AddItem(varTool, 0, -1, VARIANT_FALSE, 0,
                              esriCommandStyleIconOnly, &itemIndex);
}