/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ // Written by John R. McMullen #include "CButtonEnabler.h" #include "LSharable.h" #include "MButtonEnablerPolicy.h" //====================================== #pragma mark --------- class CButtonMaster //====================================== //====================================== class CButtonMaster //====================================== : public LAttachable // CButtonEnablers all attach to this , public LSharable // shared by all CButtonEnablers. { public: CButtonMaster(); virtual ~CButtonMaster(); static CButtonMaster* sButtonMaster; }; // class CButtonMaster CButtonMaster* CButtonMaster::sButtonMaster = nil; //----------------------------------- CButtonMaster::CButtonMaster() //----------------------------------- { sButtonMaster = this; } // CButtonMaster::CButtonMaster() //----------------------------------- CButtonMaster::~CButtonMaster() //----------------------------------- { sButtonMaster = nil; } // CButtonMaster::~CButtonMaster() //====================================== #pragma mark --------- class CButtonEnabler //====================================== //----------------------------------- CButtonEnabler* CButtonEnabler::CreateButtonEnablerStream(LStream* inStream) //----------------------------------- { return new CButtonEnabler(inStream); } //----------------------------------- CButtonEnabler::CButtonEnabler(LStream* inStream) //----------------------------------- : LAttachment(inStream) , mControl(nil) { SetMessage(msg_Event); // execute me only for event messages. LAttachable *host = LAttachable::GetDefaultAttachable(); mControl = dynamic_cast(host); Assert_(mControl); Try_ { if (!CButtonMaster::sButtonMaster) new CButtonMaster; CButtonMaster::sButtonMaster->AddUser(this); CButtonMaster::sButtonMaster->AddAttachment(this, nil, false); // don't care where, master is not owner. } Catch_ (inErr) { } EndCatch_ LAttachable::SetDefaultAttachable(host); // Restore, because LAttachable's constructor (called when we made // the new button master) clobbers the default attachable } // CButtonEnabler::CButtonEnabler //----------------------------------- CButtonEnabler::~CButtonEnabler() //----------------------------------- { if (CButtonMaster::sButtonMaster) { CButtonMaster::sButtonMaster->RemoveAttachment(this); CButtonMaster::sButtonMaster->RemoveUser(this); } } // CButtonEnabler::~CButtonEnabler //----------------------------------- void CButtonEnabler::UpdateButtons() //----------------------------------- { if (CButtonMaster::sButtonMaster) CButtonMaster::sButtonMaster->ExecuteAttachments(msg_Event, nil); } // CButtonEnabler::UpdateButtons //----------------------------------- void CButtonEnabler::ExecuteSelf(MessageT inMessage, void*) //----------------------------------- { MButtonEnablerPolicy* thePolicy = dynamic_cast(mControl); if (thePolicy) { // Delegate the policy thePolicy->HandleButtonEnabling(); } else { // Default enabling policy for LControl LCommander* theTarget = LCommander::GetTarget(); MessageT command = mControl->GetValueMessage(); Boolean enabled = false; Boolean usesMark = false; Str255 outName; Char16 outMark; if (!mControl->IsActive() || !mControl->IsVisible()) return; if (!theTarget) return; theTarget->ProcessCommandStatus(command, enabled, usesMark, outMark, outName); if (enabled) { mControl->Enable(); } else { mControl->Disable(); } } } // CButtonEnabler::ExecuteSelf