home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / DOCVIEW.PAK / DOCVIEWX.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-06  |  9.2 KB  |  305 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // Copyright (c) 1993, 1995 by Borland International, All Rights Reserved
  4. //
  5. //   Example of a minimal doc/view application. Doc/views must be linked in.
  6. //   NOTE: this example interprets command line flags to select frame type.
  7. //----------------------------------------------------------------------------
  8. #include <owl/pch.h>
  9. #include <owl/docmanag.h>
  10. #include <owl/decmdifr.h>
  11. #include <owl/statusba.h>
  12. #include <stdio.h>
  13. #include "docviewx.rc"
  14.  
  15. class MyDVApp : public TApplication {
  16.   public:
  17.     MyDVApp() {}
  18.  
  19.     void  InitInstance();
  20.     void  InitMainWindow();
  21.     void  EvNewView(TView& view);
  22.     void  EvCloseView(TView& view);
  23.     void  EvDropFiles(TDropInfo dropInfo);
  24.     void  CmDeskClear();
  25.     void  CmDeskSave();
  26.     void  CmDeskRestore();
  27.     void  CmHideView();
  28.     void  CmShowViews();
  29.     void  CmDisableView();
  30.     void  CmEnableViews();
  31.  
  32.     int         DocMode;
  33.     TMDIClient* Client;
  34.  
  35.   DECLARE_RESPONSE_TABLE(MyDVApp);
  36.   DECLARE_STREAMABLE(, MyDVApp, 1);
  37. };
  38.  
  39. DEFINE_RESPONSE_TABLE1(MyDVApp, TApplication)
  40.   EV_OWLVIEW(dnCreate, EvNewView),
  41.   EV_OWLVIEW(dnClose,  EvCloseView),
  42.   EV_WM_DROPFILES,
  43.   EV_COMMAND(CM_DESKCLEAR,   CmDeskClear),
  44.   EV_COMMAND(CM_DESKSAVE,    CmDeskSave),
  45.   EV_COMMAND(CM_DESKRESTORE, CmDeskRestore),
  46.   EV_COMMAND(CM_HIDEVIEW,    CmHideView),
  47.   EV_COMMAND(CM_SHOWVIEWS,   CmShowViews),
  48.   EV_COMMAND(CM_DISABLEVIEW, CmDisableView),
  49.   EV_COMMAND(CM_ENABLEVIEWS, CmEnableViews),
  50. END_RESPONSE_TABLE;
  51.  
  52. IMPLEMENT_CASTABLE1(MyDVApp, TApplication);
  53. IMPLEMENT_STREAMABLE1(MyDVApp, TApplication);
  54.  
  55. const char sSDIStream[] = "C:\\DOCVIEWX.SDI";
  56. const char sMDIStream[] = "C:\\DOCVIEWX.MDI";
  57. _OWLLINK(rTMDIChild);  // force TMDIChild::Streamer to be linked in
  58. _OWLLINK(rTMDIClient); // force TMDIClient::Streamer to be linked in
  59. _OWLLINK(rTFileDocument); // force TMDIClient::Streamer to be linked in
  60.  
  61. void MyDVApp::EvDropFiles(TDropInfo dropInfo)
  62. {
  63.   int fileCount = dropInfo.DragQueryFileCount();
  64.   int index = 0;
  65.   while (index < fileCount) {
  66.     int fileLength = dropInfo.DragQueryFileNameLen(index)+1;
  67.     char* filePath = new char [fileLength];
  68.     dropInfo.DragQueryFile(index++, filePath, fileLength);
  69.     TDocTemplate* tpl = GetDocManager()->MatchTemplate(filePath);
  70. #if 0  // obsolete code
  71.     if (tpl) {
  72.       tpl->CreateDoc(filePath);
  73.     }
  74. #else // new code
  75.     GetDocManager()->CreateDoc(tpl, filePath);
  76. #endif
  77.     delete filePath;
  78.   }
  79.   dropInfo.DragFinish();
  80. }
  81.  
  82. void MyDVApp::InitInstance()
  83. {
  84.   TApplication::InitInstance();
  85.   MainWindow->DragAcceptFiles(true);
  86. }
  87.  
  88. void MyDVApp::InitMainWindow()
  89. {
  90.   bool decorate;
  91.   switch ((_argc>1 && _argv[1][0]=='-' ? _argv[1][1] : (char)0) | ('S'^'s')) {
  92.     case 's':  DocMode = dmSDI; decorate = false; break;  // command line: -s
  93.     case 'm':  DocMode = dmMDI; decorate = false; break;  // command line: -m
  94.     case 'd':  DocMode = dmSDI; decorate = true;  break;  // command line: -d
  95.     default :  DocMode = dmMDI; decorate = true;  break;  // no command line
  96.   }
  97.   DocManager = new TDocManager(DocMode | dmMenu);
  98.   if (decorate) {
  99.     TDecoratedFrame* frame = (DocMode == dmSDI
  100.            ? new TDecoratedFrame(0, "SDI DocView Example", 0,true)
  101.            : new TDecoratedMDIFrame("MDI DocView Example", 0,
  102.                              *(Client=new TMDIClient), true));
  103.     TStatusBar* sb = new TStatusBar(frame, TGadget::Recessed,
  104.            TStatusBar::CapsLock | TStatusBar::NumLock | TStatusBar::Overtype);
  105.     frame->Insert(*sb, TDecoratedFrame::Bottom);
  106.     MainWindow = frame;
  107.   } else { // !decorate
  108.     MainWindow = (DocMode == dmSDI
  109.           ? new TFrameWindow(0, "SDI DocView Example")
  110.           : new TMDIFrame("MDI DocView Example", 0, *(Client=new TMDIClient)));
  111.   }
  112.   MainWindow->SetMenuDescr(TMenuDescr(DocMode==dmSDI ? IDM_DVSDI : IDM_DVMDI));
  113.   MainWindow->SetIcon(this, IDI_DOCVIEW);
  114. }
  115.  
  116. void MyDVApp::EvNewView(TView& view)
  117. {
  118.   if (DocMode == dmSDI) {
  119.     MainWindow->SetClientWindow(view.GetWindow());
  120.     if (!view.IsOK())
  121.       MainWindow->SetClientWindow(0);
  122.     else if (view.GetViewMenu())
  123.       MainWindow->MergeMenu(*view.GetViewMenu());
  124.   } else { // DocMode == dmMDI
  125.     TMDIChild* child = new TMDIChild(*Client, 0, view.GetWindow());
  126.     if (view.GetViewMenu())
  127.       child->SetMenuDescr(*view.GetViewMenu());
  128.     child->Create();
  129.   }
  130. }
  131.  
  132. void MyDVApp::EvCloseView(TView& /*view*/)
  133. {
  134.   if (DocMode == dmSDI) {
  135.     MainWindow->SetClientWindow(0);
  136.     MainWindow->RestoreMenu();
  137.     MainWindow->SetCaption("SDI DocView Example");
  138.   }
  139. }
  140.  
  141. void MyDVApp::CmDeskClear()
  142. {
  143.   delete DocManager;   // delete existing document manager, and doc/views
  144.   DocManager = new TDocManager(DocMode | dmMenu);
  145. }
  146.  
  147. void MyDVApp::CmDeskSave()
  148. {
  149.   ofpstream os(DocMode == dmMDI ? sMDIStream : sSDIStream);
  150.   os << *this;  // start stream with application
  151.   os.close();
  152.   if (os.bad()) {
  153.     unlink(DocMode == dmMDI ? sMDIStream : sSDIStream);
  154.     MainWindow->MessageBox("Unable to write desktop file.", "File error",
  155.                            MB_OK | MB_ICONEXCLAMATION);
  156.   }
  157. }
  158.  
  159. void MyDVApp::CmDeskRestore()
  160. {
  161.   char* errorMsg = 0;
  162.  
  163.   ifpstream is(DocMode == dmMDI ? sMDIStream : sSDIStream);
  164.   if (is.bad())
  165.     errorMsg = "Unable to open desktop file.";
  166.  
  167.   else {
  168.     delete DocManager;   // delete existing document manager, and doc/views
  169.     DocManager = new TDocManager(DocMode | dmMenu);
  170.     is >> *this;         // stream in documents, views, windows
  171.     if (is.bad())
  172.       errorMsg = "Error reading desktop file.";
  173.     is.close();
  174.   }
  175.   if (errorMsg)
  176.     MainWindow->MessageBox(errorMsg, "Error", MB_OK | MB_ICONEXCLAMATION);
  177. }
  178.  
  179. void MyDVApp::Streamer::Write(opstream& os) const
  180. {
  181.   MyDVApp* o = GetObject();
  182.   TFrameWindow* mainWnd = o->MainWindow;
  183.   WriteBaseObject((TApplication*)o, os);
  184.  
  185.   os <<mainWnd->Attr.X <<mainWnd->Attr.Y <<mainWnd->Attr.W <<mainWnd->Attr.H;
  186.  
  187.   if (o->DocMode == dmMDI) {
  188.     os << *o->Client;// stream out object reference only, no children streamed
  189.     os << *o->DocManager;
  190.     os << o->Client->GetActiveMDIChild();
  191.   } else {
  192.     TWindow* client = mainWnd->SetClientWindow(0);  // unhook view
  193.     if (client) {
  194.       client->ShowWindow(SW_HIDE);
  195.       client->SetParent(0);
  196.       os << *o->DocManager;
  197.       os << client;    // save pointer to client window
  198.       mainWnd->SetClientWindow(client);
  199.     }
  200.   }
  201. }
  202.  
  203. void* MyDVApp::Streamer::Read(ipstream& is, uint32 /*version*/ ) const
  204. {
  205.   MyDVApp* o = GetObject();
  206.   TFrameWindow* mainWnd = o->MainWindow;
  207.   ReadBaseObject((TApplication*)o, is);
  208.  
  209.   is >>mainWnd->Attr.X >>mainWnd->Attr.Y >>mainWnd->Attr.W >>mainWnd->Attr.H;
  210.   mainWnd->MoveWindow(mainWnd->Attr.X, mainWnd->Attr.Y,
  211.                       mainWnd->Attr.W, mainWnd->Attr.H, true);
  212.   if (o->DocMode == dmMDI) {
  213.     is >> *o->Client;      // skip stream top ref, no data or children read in
  214.     is >> *o->DocManager;  // streams in all templates, docs, views, windows
  215.     o->Client->CreateChildren(); // create MDI children and descendents
  216.  
  217.     TMDIChild* active;
  218.     is >> active;
  219.     if (active)
  220.       GetObject()->Client->HandleMessage(WM_MDIACTIVATE,(uint)active->GetHandle());
  221.  
  222.   } else {
  223.     TWindow* client;
  224.     is >> *o->DocManager; // streams in all templates, docs, views, windows
  225.     is >> client;         // streams in pointer to constructed client window
  226.     if (client) {
  227.       mainWnd->SetClientWindow(client);
  228.       TDocument* doc;
  229.       TView* view;
  230.       if ((doc = o->DocManager->DocList.Next(0)) != 0 &&
  231.           (view = doc->NextView(0)) != 0)
  232.         mainWnd->MergeMenu(*view->GetViewMenu());
  233.     }
  234.   }
  235.   return GetObject();
  236. }
  237.  
  238. void MyDVApp::CmHideView()
  239. {
  240.   TMDIChild* child = Client->GetActiveMDIChild();
  241.   if (child)
  242.     child->ShowWindow(SW_HIDE);
  243. }
  244.  
  245. void sUnHide(TWindow* win, void*)
  246. {
  247.   TMDIChild* child = TYPESAFE_DOWNCAST(win, TMDIChild);
  248.   if (child && !child->IsWindowVisible())
  249.     child->ShowWindow(SW_RESTORE);
  250. }
  251.  
  252. void MyDVApp::CmShowViews()
  253. {
  254.   Client->ForEach(sUnHide);
  255. }
  256.  
  257. void MyDVApp::CmDisableView()
  258. {
  259.   TMDIChild* child = Client->GetActiveMDIChild();
  260.   if (child)
  261.     child->EnableWindow(false);
  262. }
  263.  
  264. void sUnDisable(TWindow* win, void*)
  265. {
  266.   TMDIChild* child = TYPESAFE_DOWNCAST(win, TMDIChild);
  267.   if (child && !child->IsWindowEnabled())
  268.     child->EnableWindow(true);
  269. }
  270.  
  271. void MyDVApp::CmEnableViews()
  272. {
  273.   Client->ForEach(sUnDisable);
  274. }
  275.  
  276. int OwlMain(int /*argc*/, char* /*argv*/ [])
  277. {
  278.   MyDVApp* app;
  279.   int status;
  280.   int done;
  281.   do {
  282.     try {
  283.       app = new MyDVApp;
  284.       status = app->Run();
  285.       done = 1;
  286.       if (status) {
  287.         char buf[40];
  288.         sprintf(buf, "Run returned %i", status);
  289.         done = HandleGlobalException(xmsg(string(buf)),
  290.                                      "Abnormal Termination","RunAgain?");
  291.       }
  292.     }
  293.     catch (xmsg& x) {
  294.       done = status = HandleGlobalException(x,
  295.                             "Abnormal Termination, uncaught xmsg","RunAgain?");
  296.     }
  297.     catch(...) {
  298.       done = status = HandleGlobalException(xmsg(string()),
  299.                             "Abnormal Termination, uncaught ...","RunAgain?");
  300.     }
  301.     delete app;
  302.   } while (!done);
  303.   return status;
  304. }
  305.