home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / docview.pak / DOCVIEWX.CPP < prev    next >
C/C++ Source or Header  |  1997-07-23  |  9KB  |  300 lines

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