home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c083 / 20.ddi / DOCVIEW.PAK / DOCVIEWX.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-02  |  8.9 KB  |  286 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 (tpl) {
  66.       tpl->CreateDoc(filePath);
  67.     }
  68.     delete filePath;
  69.   }
  70.   dropInfo.DragFinish();
  71. }
  72.  
  73. void MyDVApp::InitInstance()
  74. {
  75.   TApplication::InitInstance();
  76.   MainWindow->DragAcceptFiles(TRUE);
  77. }
  78.  
  79. void MyDVApp::InitMainWindow()
  80. {
  81.   BOOL decorate;
  82.   switch ((_argc>1 && _argv[1][0]=='-' ? _argv[1][1] : (char)0) | ('S'^'s')) {
  83.     case 's':  DocMode = dmSDI; decorate = FALSE; break;  // command line: -s
  84.     case 'm':  DocMode = dmMDI; decorate = FALSE; break;  // command line: -m
  85.     case 'd':  DocMode = dmSDI; decorate = TRUE;  break;  // command line: -d
  86.     default :  DocMode = dmMDI; decorate = TRUE;  break;  // no command line
  87.   }
  88.   DocManager = new TDocManager(DocMode | dmMenu);
  89.   if (decorate) {
  90.     TDecoratedFrame* frame = (DocMode == dmSDI
  91.            ? new TDecoratedFrame(0, "SDI DocView Example", 0,TRUE)
  92.            : new TDecoratedMDIFrame("MDI DocView Example", 0,
  93.                              *(Client=new TMDIClient), TRUE));
  94.     TStatusBar* sb = new TStatusBar(frame, TGadget::Recessed,
  95.            TStatusBar::CapsLock | TStatusBar::NumLock | TStatusBar::Overtype);
  96.     frame->Insert(*sb, TDecoratedFrame::Bottom);
  97.     MainWindow = frame;
  98.   } else { // !decorate
  99.     MainWindow = (DocMode == dmSDI
  100.           ? new TFrameWindow(0, "SDI DocView Example")
  101.           : new TMDIFrame("MDI DocView Example", 0, *(Client=new TMDIClient)));
  102.   }  
  103.   MainWindow->SetMenuDescr(DocMode==dmSDI ? TMenuDescr(IDM_DVSDI,1,0,1,0,0,0)
  104.                                           : TMenuDescr(IDM_DVMDI,1,0,1,0,1,0));
  105.   MainWindow->SetIcon(this, IDI_DOCVIEW);
  106. }
  107.  
  108. void MyDVApp::EvNewView(TView& view)
  109. {
  110.   if (DocMode == dmSDI) {
  111.     MainWindow->SetClientWindow(view.GetWindow());
  112.     if (!view.IsOK())
  113.       MainWindow->SetClientWindow(0);
  114.     else if (view.GetViewMenu())
  115.       MainWindow->MergeMenu(*view.GetViewMenu());
  116.   } else { // DocMode == dmMDI
  117.     TMDIChild* child = new TMDIChild(*Client, 0, view.GetWindow());
  118.     if (view.GetViewMenu())
  119.       child->SetMenuDescr(*view.GetViewMenu());
  120.     child->Create();
  121.   }
  122. }
  123.  
  124. void MyDVApp::EvCloseView(TView& /*view*/)
  125. {
  126.   if (DocMode == dmSDI) {
  127.     MainWindow->SetClientWindow(0);
  128.     MainWindow->RestoreMenu();
  129.     MainWindow->SetCaption("SDI DocView Example");
  130.   }
  131. }
  132.  
  133. void MyDVApp::CmDeskClear()
  134. {
  135.   delete DocManager;   // delete existing document manager, and doc/views
  136.   DocManager = new TDocManager(DocMode | dmMenu);
  137. }
  138.  
  139. void MyDVApp::CmDeskSave()
  140. {
  141.   ofpstream os(DocMode == dmMDI ? sMDIStream : sSDIStream);
  142.   os << *this;  // start stream with application
  143.   os.close();
  144.   if (os.bad()) {
  145.     unlink(DocMode == dmMDI ? sMDIStream : sSDIStream);
  146.     MainWindow->MessageBox("Unable to write desktop file.", "File error",
  147.                            MB_OK | MB_ICONEXCLAMATION);
  148.   }
  149. }
  150.  
  151. void MyDVApp::CmDeskRestore()
  152. {
  153.   char* errorMsg = 0;
  154.  
  155.   ifpstream is(DocMode == dmMDI ? sMDIStream : sSDIStream);
  156.   if (is.bad())
  157.     errorMsg = "Unable to open desktop file.";
  158.  
  159.   else {
  160.     delete DocManager;   // delete existing document manager, and doc/views
  161.     DocManager = new TDocManager(DocMode | dmMenu);
  162.     is >> *this;         // stream in documents, views, windows
  163.     if (is.bad())
  164.       errorMsg = "Error reading desktop file.";
  165.     is.close();
  166.   }
  167.   if (errorMsg)
  168.     MainWindow->MessageBox(errorMsg, "Error", MB_OK | MB_ICONEXCLAMATION);
  169. }
  170.  
  171. void MyDVApp::Streamer::Write(opstream& os) const
  172. {
  173.   MyDVApp* o = GetObject();
  174.   TFrameWindow* mainWnd = o->MainWindow;
  175.   WriteBaseObject((TApplication*)o, os);
  176.  
  177.   os <<mainWnd->Attr.X <<mainWnd->Attr.Y <<mainWnd->Attr.W <<mainWnd->Attr.H;
  178.  
  179.   if (o->DocMode == dmMDI) {
  180.     os << *o->Client;// stream out object reference only, no children streamed
  181.     os << *o->DocManager;
  182.   } else {
  183.     TWindow* client = mainWnd->SetClientWindow(0);  // unhook view
  184.     client->ShowWindow(SW_HIDE);
  185.     client->SetParent(0);
  186.     os << *o->DocManager;
  187.     os << client;    // save pointer to client window
  188.      mainWnd->SetClientWindow(client);
  189.   }
  190. }
  191.  
  192. void* MyDVApp::Streamer::Read(ipstream& is, uint32 /*version*/ ) const
  193. {
  194.   MyDVApp* o = GetObject();
  195.   TFrameWindow* mainWnd = o->MainWindow;
  196.   ReadBaseObject((TApplication*)o, is);
  197.  
  198.   is >>mainWnd->Attr.X >>mainWnd->Attr.Y >>mainWnd->Attr.W >>mainWnd->Attr.H;
  199.   mainWnd->MoveWindow(mainWnd->Attr.X, mainWnd->Attr.Y,
  200.                       mainWnd->Attr.W, mainWnd->Attr.H, TRUE);
  201.   if (o->DocMode == dmMDI) {
  202.     is >> *o->Client;      // skip stream top ref, no data or children read in
  203.     is >> *o->DocManager;  // streams in all templates, docs, views, windows
  204.     o->Client->CreateChildren(); // create MDI children and descendents
  205.   } else {
  206.     TWindow* client;
  207.     is >> *o->DocManager; // streams in all templates, docs, views, windows
  208.     is >> client;         // streams in pointer to constructed client window
  209.     mainWnd->SetClientWindow(client);
  210.     TDocument* doc;
  211.     TView* view;
  212.     if ((doc = o->DocManager->DocList.Next(0)) != 0 &&
  213.         (view = doc->NextView(0)) != 0)
  214.       mainWnd->MergeMenu(*view->GetViewMenu());
  215.   }
  216.   return GetObject();
  217. }
  218.  
  219. void MyDVApp::CmHideView()
  220. {
  221.   TMDIChild* child = Client->GetActiveMDIChild();
  222.   if (child)
  223.     child->ShowWindow(SW_HIDE);
  224. }
  225.  
  226. void sUnHide(TWindow* win, void*)
  227. {
  228.   TMDIChild* child = TYPESAFE_DOWNCAST(win, TMDIChild);
  229.   if (child && !child->IsWindowVisible())
  230.     child->ShowWindow(SW_RESTORE);
  231. }
  232.  
  233. void MyDVApp::CmShowViews()
  234. {
  235.   Client->ForEach(sUnHide);
  236. }
  237.  
  238. void MyDVApp::CmDisableView()
  239. {
  240.   TMDIChild* child = Client->GetActiveMDIChild();
  241.   if (child)
  242.     child->EnableWindow(FALSE);
  243. }
  244.  
  245. void sUnDisable(TWindow* win, void*)
  246. {
  247.   TMDIChild* child = TYPESAFE_DOWNCAST(win, TMDIChild);
  248.   if (child && !child->IsWindowEnabled())
  249.     child->EnableWindow(TRUE);
  250. }
  251.  
  252. void MyDVApp::CmEnableViews()
  253. {
  254.   Client->ForEach(sUnDisable);
  255. }
  256.  
  257. int OwlMain(int /*argc*/, char* /*argv*/ [])
  258. {
  259.   MyDVApp* app;
  260.   int status;
  261.   int done;
  262.   do {
  263.     try {
  264.       app = new MyDVApp;
  265.       status = app->Run();
  266.       done = 1;
  267.       if (status) {
  268.         char buf[40];
  269.         wsprintf(buf, "Run returned %i", status);
  270.         done = HandleGlobalException(xmsg(string(buf)),
  271.                                      "Abnormal Termination","RunAgain?");
  272.       }
  273.     }
  274.     catch (xmsg& x) {
  275.       done = status = HandleGlobalException(x,
  276.                             "Abnormal Termination, uncaught xmsg","RunAgain?");
  277.     }
  278.     catch(...) {
  279.       done = status = HandleGlobalException(xmsg(string()),
  280.                             "Abnormal Termination, uncaught ...","RunAgain?");
  281.     }
  282.     delete app;
  283.   } while (!done);
  284.   return status;
  285. }
  286.