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

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1994 by Borland International
  3. //----------------------------------------------------------------------------
  4. #include <owl/owlpch.h>
  5. #include <owl/applicat.h>
  6. #include <owl/editfile.h>
  7. #include <owl/mdi.h>
  8. #include <owl/decmdifr.h>
  9. #include <owl/statusba.h>
  10. #include <owl/controlb.h>
  11. #include <owl/buttonga.h>
  12. #include <owl/gdiobjec.h>
  13. #include <owl/olemdifr.h>
  14. #include <owl/uihandle.h>
  15. #include <ocf/ocdoc.h>
  16. #include <ocf/ocview.h>
  17.  
  18. #include "sampcont.h"
  19. #include "mdiole.h"
  20.  
  21. // Locations for toolbar placement
  22. //
  23. const TDecoratedFrame::TLocation Location[] = {
  24.   TDecoratedFrame::Top,
  25.   TDecoratedFrame::Left,
  26.   TDecoratedFrame::Right
  27. };
  28.  
  29. // App registration object
  30. //
  31. static TPointer<TOcRegistrar> Registrar;
  32.  
  33. // Registration tables
  34. //
  35. REGISTRATION_FORMAT_BUFFER(100)
  36.  
  37. BEGIN_REGISTRATION(AppReg)
  38.  REGDATA(clsid,      "{5E4BD400-8ABC-101B-A23B-CE4E85D07ED2}")
  39.  REGDATA(appname,    "MdiOle")
  40. END_REGISTRATION
  41.  
  42. //----------------------------------------------------------------------------
  43. // Ole MDI application class
  44. //
  45.  
  46. class TOwlMdiApp : public TApplication, public TOcModule {
  47.   public:
  48.     TOwlMdiApp();
  49.    ~TOwlMdiApp();
  50.     void InitMainWindow();
  51.     void InitInstance();
  52.  
  53.   protected:
  54.     TOpenSaveDialog::TData   FileData;
  55.     TMDIClient*              Client;
  56.     TGadgetWindow::THintMode HintMode;
  57.     TOleMDIFrame*            Frame;
  58.     TControlBar*             ControlBar;
  59.     int                      ControlBarLoc;
  60.  
  61.   protected:
  62.     void CmFileNew();
  63.     void CmFileOpen();
  64.     void CmToggleHint();
  65.     void CeToggleHint(TCommandEnabler&);
  66.     void CmToggleBar();
  67.     void CmToggleStatus();
  68.     void CeToggleStatus(TCommandEnabler&);
  69.  
  70.   DECLARE_RESPONSE_TABLE(TOwlMdiApp);
  71. };
  72.  
  73. DEFINE_RESPONSE_TABLE1(TOwlMdiApp, TApplication)
  74.   EV_COMMAND(CM_FILENEW, CmFileNew),
  75.   EV_COMMAND(CM_FILEOPEN, CmFileOpen),
  76.   EV_COMMAND(CM_TOGGLEHINT, CmToggleHint),
  77.   EV_COMMAND_ENABLE(CM_TOGGLEHINT, CeToggleHint),
  78.   EV_COMMAND(CM_TOGGLEBAR, CmToggleBar),
  79.   EV_COMMAND(CM_TOGGLESTATUS, CmToggleStatus),
  80.   EV_COMMAND_ENABLE(CM_TOGGLESTATUS, CeToggleStatus),
  81. END_RESPONSE_TABLE;
  82.  
  83.  
  84. TOwlMdiApp::TOwlMdiApp()
  85.  : TApplication(::AppReg["appname"])
  86. {
  87.   // Make OC app helper
  88.   //
  89.   OcInit(*::Registrar, ::Registrar->GetOptions());
  90. }
  91.  
  92. TOwlMdiApp::~TOwlMdiApp()
  93. {
  94. }
  95.  
  96. static TControlBar*
  97. BuildControlBar(TWindow* parent, TControlBar::TTileDirection direction)
  98. {
  99.   TControlBar* cb = new TControlBar(parent, direction);
  100.   cb->Insert(*new TButtonGadget(CM_FILENEW, CM_FILENEW));
  101.   cb->Insert(*new TButtonGadget(CM_FILEOPEN, CM_FILEOPEN));
  102.   cb->Insert(*new TButtonGadget(CM_FILESAVE, CM_FILESAVE));
  103.   cb->Insert(*new TButtonGadget(CM_FILESAVEAS, CM_FILESAVEAS));
  104.  
  105.   cb->Insert(*new TSeparatorGadget(6));
  106.   cb->Insert(*new TButtonGadget(CM_EDITUNDO, CM_EDITUNDO));
  107.   cb->Insert(*new TButtonGadget(CM_EDITCUT, CM_EDITCUT));
  108.   cb->Insert(*new TButtonGadget(CM_EDITCOPY, CM_EDITCOPY));
  109.   cb->Insert(*new TButtonGadget(CM_EDITPASTE, CM_EDITPASTE));
  110.  
  111.   cb->Insert(*new TSeparatorGadget(6));
  112.   cb->Insert(*new TButtonGadget(CM_EDITFIND, CM_EDITFIND));
  113.   cb->Insert(*new TButtonGadget(CM_EDITREPLACE, CM_EDITREPLACE));
  114.   cb->Insert(*new TButtonGadget(CM_EDITFINDNEXT, CM_EDITFINDNEXT));
  115.  
  116.   cb->Insert(*new TSeparatorGadget(6));
  117.   cb->Insert(*new TButtonGadget(CM_TOGGLEHINT, CM_TOGGLEHINT,
  118.                       TButtonGadget::NonExclusive));
  119.   cb->Insert(*new TSeparatorGadget(6));
  120.   cb->Insert(*new TButtonGadget(CM_TOGGLEBAR, CM_TOGGLEBAR));
  121.  
  122.   cb->Attr.Style |= WS_CLIPSIBLINGS;    // since toolbar may move around
  123.   cb->Attr.Id = IDW_TOOLBAR;            // From oleframe.h, so we can hide it
  124.  
  125.   return cb;
  126. }
  127.  
  128. //
  129. // Construct the TOwlMdiApp's MainWindow of class TMDIFileWindow,
  130. // loading its menu, accelerator table & icon
  131. //
  132. void
  133. TOwlMdiApp::InitMainWindow()
  134. {
  135.   Client = new TMDIClient;
  136.   Frame = new TOleMDIFrame(GetName(), IDM_EDITFILE_DOC, *Client, true);
  137.   SetMainWindow(Frame);
  138.  
  139.   Frame->Attr.AccelTable = IDA_MDIFILE;
  140.   Frame->SetMenuDescr(TMenuDescr(IDM_EDITFILE_DOC));
  141.   Frame->SetIcon(this, IDI_MULTIFILE);
  142.  
  143.   // Construct, build and insert a control bar into the frame. Start out at
  144.   // the top of the frame
  145.   //
  146.   HintMode = TGadgetWindow::PressHints;
  147.   ControlBarLoc = 0;
  148.   ControlBar = BuildControlBar(Frame, TControlBar::Horizontal);
  149.   Frame->Insert(*ControlBar, Location[ControlBarLoc]);
  150.  
  151.   // Construct a status bar & insert it at the bottom
  152.   //
  153.   TStatusBar* sb = new TStatusBar(0, TGadget::Recessed,
  154.            TStatusBar::CapsLock | TStatusBar::NumLock | TStatusBar::Overtype);
  155.  
  156.   Frame->Insert(*sb, TDecoratedFrame::Bottom);
  157.  
  158.   EnableCtl3d(true);
  159.  
  160.   // Initialize the file data struct used for open and saveas
  161.   //
  162.   FileData.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
  163.   FileData.SetFilter(string(*this, IDS_DOCFILEFILTER).c_str());
  164. }
  165.  
  166. //
  167. // Call file new command handler to get the initial new window
  168. //
  169. void
  170. TOwlMdiApp::InitInstance()
  171. {
  172.   TApplication::InitInstance();
  173.   CmFileNew();
  174. }
  175.  
  176. //
  177. // Respond to "New" command by constructing, creating, and setting up a
  178. // new TFileWindow MDI child
  179. //
  180. void
  181. TOwlMdiApp::CmFileNew()
  182. {
  183.   TMDIChild* child = new TMDIChild(*Client, "", new TOleSampContainer(0, 0));
  184.   child->SetMenuDescr(TMenuDescr(IDM_EDITFILE_CHILD));
  185.   child->SetIcon(this, IDI_DOC);
  186.  
  187.   TMDIChild* curChild = Client->GetActiveMDIChild();
  188.   if (curChild && (curChild->GetWindowLong(GWL_STYLE) & WS_MAXIMIZE))
  189.     child->Attr.Style |= WS_MAXIMIZE;
  190.  
  191.   child->Create();
  192. }
  193.  
  194. //
  195. // Respond to "Open" command by constructing, creating, and setting up a
  196. // new TFileWindow in an MDI child
  197. //
  198. void
  199. TOwlMdiApp::CmFileOpen()
  200. {
  201.   *FileData.FileName = 0;
  202.   if (TFileOpenDialog(MainWindow, FileData).Execute() == IDOK) {
  203.     TMDIChild* child = new TMDIChild(*Client, "", new TOleSampContainer(0, FileData.FileName));
  204.     child->SetMenuDescr(TMenuDescr(IDM_EDITFILE_CHILD));
  205.     child->SetIcon(this, IDI_DOC);
  206.  
  207.     TMDIChild* curChild = Client->GetActiveMDIChild();
  208.     if (curChild && (curChild->GetWindowLong(GWL_STYLE) & WS_MAXIMIZE))
  209.       child->Attr.Style |= WS_MAXIMIZE;
  210.  
  211.     child->Create();
  212.   }
  213. }
  214.  
  215. void
  216. DoCreateChild(TWindow* win, void*)
  217. {
  218.   if (win->IsFlagSet(wfAutoCreate))
  219.     win->Create();
  220. }
  221.  
  222. void
  223. TOwlMdiApp::CeToggleHint(TCommandEnabler& ce)
  224. {
  225.   ce.SetCheck(HintMode == TGadgetWindow::EnterHints);
  226. }
  227.  
  228. void
  229. TOwlMdiApp::CmToggleHint()
  230. {
  231.   HintMode = HintMode==TGadgetWindow::PressHints ?
  232.                TGadgetWindow::EnterHints :
  233.                TGadgetWindow::PressHints;
  234.  
  235.   ControlBar->SetHintMode(HintMode);
  236.   ControlBar->SetHintCommand(-1);  // make sure we don't leave hint text dangling
  237. }
  238.  
  239. void
  240. TOwlMdiApp::CmToggleBar()
  241. {
  242.   ControlBarLoc = (ControlBarLoc+1) % COUNTOF(Location);
  243.   ControlBar->SetDirection(ControlBarLoc==0 ?
  244.                            TControlBar::Horizontal : TControlBar::Vertical);
  245.   Frame->Insert(*ControlBar, Location[ControlBarLoc]);
  246.   Frame->Layout();
  247. }
  248.  
  249. void
  250. TOwlMdiApp::CeToggleStatus(TCommandEnabler& ce)
  251. {
  252.   ce.SetCheck(GetMainWindow()->ChildWithId(IDW_STATUSBAR)->IsWindowVisible());
  253. }
  254.  
  255. void
  256. TOwlMdiApp::CmToggleStatus()
  257. {
  258.   GetMainWindow()->SendMessage(WM_COMMAND, IDW_STATUSBAR);  // toggle status bar on/off
  259. }
  260.  
  261. int
  262. OwlMain(int /*argc*/, char* /*argv*/ [])
  263. {
  264.   ::Registrar = new TOcRegistrar(::AppReg, 0, TApplication::GetCmdLine());
  265.   if (::Registrar->IsOptionSet(amAnyRegOption))
  266.     return 0;
  267.   return TOwlMdiApp().Run();
  268. }
  269.