//-------------------------------------------------------------------
// OWL Extensions (OWLEXT) Class Library
// Copyright(c) 1996 by Manic Software.
// All rights reserved.
//
// TMultiFrame: TFrameWindow that manages "owned" TFrameWindows
//-------------------------------------------------------------------
#include <owlext\pch.h>
#pragma hdrstop
 
#include <owlext/multiwin.h>
 
using namespace owl;
 
namespace OwlExt {
 
using namespace std;
 
//
// Diagnostic group declarations/definitions
//
DIAG_DEFINE_GROUP_INIT(OWL_INI, OwlExtMultiFrame, 1, 0);
 
 
TMultiFrame::TMultiFrame(TWindow* parent, LPCTSTR title, TWindow* client,
             bool shrinkToClient, TModule* module)
             :
TFrameWindow(parent, title, client, shrinkToClient, module)
{
  TRACEX(OwlExtMultiFrame, 1, _T("TMultiFrame constructed at ") << hex << (void*)this << dec);
 
  m_frameArray = new TObjectArray<Datum>;
}
TMultiFrame::TMultiFrame(HWND hWnd, TModule* module)
:
TFrameWindow(hWnd, module)
{
  TRACEX(OwlExtMultiFrame, 2, _T("TMultiFrame constructed at ") << hex << (void*)this << dec);
 
  m_frameArray = new TObjectArray<Datum>;
}
TMultiFrame::~TMultiFrame()
{
  for (TObjectArray<Datum>::Iterator iter(*m_frameArray); iter; iter++) {
    TRACEX(OwlExtMultiFrame, 1,
      _T("TMultiFrame::~TMultiFrame considering ") << hex << (void*)iter.Current().m_frame
      << dec << _T(" for destruction"));
    if (iter.Current().m_ownsIt){
      TRACEX(OwlExtMultiFrame, 1, _T("TMultiFrame::~TMultiFrame destructing it"));
      delete iter.Current().m_frame;
    }
  }
  delete m_frameArray;
  TRACEX(OwlExtMultiFrame, 2, _T("TMultiFrame at ") << hex << (void*)this << dec << _T(" destructed"));
}
 
bool
TMultiFrame::Create()
{
  TRACEX(OwlExtMultiFrame, 2, _T("TMultiFrame(") << hex << (void*)this << dec << _T(")::Create() invoked"));
 
  bool retval = TFrameWindow::Create();
 
  // Create all frames in m_frameArray
  for (TObjectArray<Datum>::Iterator iter(*m_frameArray); iter; iter++){
    // Must turn off wfDeleteOnClose flag for these frame-windows; otherwise,
    // they'll be deleted when the user closes the associated widget, and we'll
    // have a time-bomb on our hands, waiting for us to call delete on the
    // pointer that was already deleted a LONG time ago. The culprit lies in
    // TWindow::EvClose()--see there for details.
    if (iter.Current().m_frame->IsFlagSet(wfDeleteOnClose))
      iter.Current().m_frame->ClearFlag(wfDeleteOnClose);
 
    if (iter.Current().m_frame->Create()!=true){
      TRACEX(OwlExtMultiFrame, 1, _T("TMultiFrame(") << hex << (void*)this << dec << _T(")::Create(): ")
        _T("Create() invoked on owned frame ") << hex << iter.Current().m_frame << dec << _T(" failed"));
      return false;
    }
    else
      iter.Current().m_frame->ShowWindow(SW_SHOW);
  }
  return retval;
}
void TMultiFrame::Destroy(int retVal)
{
  TRACEX(OwlExtMultiFrame, 2, _T("TMultiFrame(") << hex << (void*)this << dec << _T(")::Destroy() invoked"));
 
  // Destroy all frames in m_frameArray
  for (TObjectArray<Datum>::Iterator iter(*m_frameArray); iter; iter++)
    iter.Current().m_frame->Destroy(retVal);
 
  TFrameWindow::Destroy(retVal);
}
bool TMultiFrame::CanClose()
{
  // Check all frames first
  for (TObjectArray<Datum>::Iterator iter(*m_frameArray); iter; iter++)
    if (iter.Current().m_frame->CanClose()!=true)
      return false;
 
  return TFrameWindow::CanClose();
}
 
uint TMultiFrame::GetWindowCount()
{
  return m_frameArray->GetItemsInContainer();
}
 
TFrameWindow* TMultiFrame::operator[](unsigned int index)
{
  return (*m_frameArray)[index].m_frame;
}
 
bool TMultiFrame::AddFrame(TFrameWindow* frame, bool multiframeOwnsIt)
{
  TRACEX(OwlExtMultiFrame, 2, _T("TMultiFrame(") << hex << (void*)this << dec << _T(")::AddFrame() invoked"));
 
  // Add this window into the collection
  Datum datum(frame, multiframeOwnsIt);
  m_frameArray->Add(datum);
 
  // If we've been created, create this window and show it
  if (GetHandle() != NULL){
    datum.m_frame->Create();
    datum.m_frame->ShowWindow(SW_SHOW);
  }
 
  return true;
}
 
 
bool
TMultiFrame::RemoveFrame(TFrameWindow* frame)
{
  TRACEX(OwlExtMultiFrame, 2, _T("TMultiFrame(") << hex << (void*)this << dec << _T(")::RemoveFrame invoked"));
 
  // Remove this window from the collection
  for (TObjectArray<Datum>::Iterator iter(*m_frameArray); iter; iter++){
    if (iter.Current().m_frame == frame){
      if (iter.Current().m_ownsIt)
        delete iter.Current().m_frame;
      m_frameArray->DestroyItem(iter.Current());
      return true;
    }
  }
 
  return false;
}
 
 
bool
TMultiFrame::RemoveAllFrames()
{
  // Remove all windows from the collection
  for (TObjectArray<Datum>::Iterator iter(*m_frameArray); iter; iter++){
    if (iter.Current().m_ownsIt)
      delete iter.Current().m_frame;
    m_frameArray->DestroyItem(iter.Current());
  }
  return true;
}
 
} // OwlExt namespace
 

V803 Decreased performance. In case 'iter' is iterator it's more effective to use prefix form of increment. Replace iterator++ with ++iterator.

V803 Decreased performance. In case 'iter' is iterator it's more effective to use prefix form of increment. Replace iterator++ with ++iterator.

V803 Decreased performance. In case 'iter' is iterator it's more effective to use prefix form of increment. Replace iterator++ with ++iterator.

V803 Decreased performance. In case 'iter' is iterator it's more effective to use prefix form of increment. Replace iterator++ with ++iterator.

V803 Decreased performance. In case 'iter' is iterator it's more effective to use prefix form of increment. Replace iterator++ with ++iterator.

V803 Decreased performance. In case 'iter' is iterator it's more effective to use prefix form of increment. Replace iterator++ with ++iterator.

V807 Decreased performance. Consider creating a pointer to avoid using the 'iter.Current().m_frame' expression repeatedly.

V807 Decreased performance. Consider creating a reference to avoid using the 'iter.Current()' expression repeatedly.

V807 Decreased performance. Consider creating a reference to avoid using the 'iter.Current()' expression repeatedly.