/* -*- 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): */ #include "LMUCDialog.h" #include "ListUtils.h" #include #include extern "C" { #include "ppp.interface.h" } // ¥ÊLSingleClickListBox void* LSingleClickListBox::CreateSingleClickListBox( LStream* inStream ) { return ( new LSingleClickListBox( inStream ) ); } LSingleClickListBox::LSingleClickListBox( LStream* inStream ): LListBox( inStream ) { mSingleClickMessage = msg_Nothing; } void LSingleClickListBox::ClickSelf( const SMouseDownEvent& inMouseDown ) { if ( SwitchTarget( this ) ) { FocusDraw(this); short modifiers = inMouseDown.macEvent.modifiers & ~(shiftKey | cmdKey ); if ( ::LClick( inMouseDown.whereLocal, modifiers, mMacListH ) ) BroadcastMessage( mDoubleClickMessage, this ); else BroadcastMessage( mSingleClickMessage, this ); } } Boolean LSingleClickListBox::HandleKeyPress( const EventRecord& inKeyEvent ) { if ( LListBox::HandleKeyPress( inKeyEvent ) ) { BroadcastMessage( mSingleClickMessage, this ); return true; } else return false; } void LSingleClickListBox::SetSingleClickMessage( MessageT inMessage ) { mSingleClickMessage = inMessage; } // ¥ÊLPPPListBox void* LPPPListBox::CreatePPPListBox( LStream* inStream ) { return new LPPPListBox( inStream ); } LPPPListBox::LPPPListBox( LStream* inStream ): LSingleClickListBox( inStream ) { mFunction = NULL; } void LPPPListBox::SetPPPFunction( TraversePPPListFunc p ) { mFunction = p; } void LPPPListBox::UpdateList() { if ( mFunction ) { ListHandle listH; listH = this->GetMacListH(); OSErr err; Str255* list; int number; err = ( *mFunction )( &list ); number = ::GetPtrSize( (Ptr)list ) / sizeof ( Str255 ); SynchronizeRowsTo( listH, number ); SynchronizeColumnsTo( listH, 1 ); Cell cell; cell.h = 0; for ( cell.v = 0; cell.v < number; cell.v++ ) { LStr255 text; text = *list; ::LSetCell( (Ptr)&text[ 1 ], text.Length(), cell, listH ); list++; } if ( list ) DisposePtr( (Ptr)list ); // ¥ deselect all cells this->SetValue( -1 ); } } void LPPPListBox::SetToNamedItem( LStr255& name ) { Cell searchAt; ListHandle listH; searchAt.v = searchAt.h = 0; listH = this->GetMacListH(); if ( ::LSearch( (Ptr)&name[ 1 ], name.Length(), NULL, &searchAt, listH ) ) this->SetValue( searchAt.v ); } Boolean LPPPListBox::FocusDraw( LPane* pane ) { const RGBColor rgbWhite = { 0xFFFF, 0xFFFF, 0xFFFF }; const RGBColor rgbBlack = { 0x0000, 0x0000, 0x0000 }; const RGBColor rgbGray = { 0xBBBB, 0xBBBB, 0xBBBB }; if ( LSingleClickListBox::FocusDraw( pane ) ) { ::RGBBackColor( &rgbWhite ); ::RGBForeColor( &rgbBlack ); if ( !this->IsEnabled() ) ::RGBForeColor( &rgbGray ); // if ( this->IsEnabled() ) // ::TextMode( srcCopy ); // else // ::TextMode( grayishTextOr ); return true; } return false; } void LPPPListBox::DrawSelf() { Rect frame; this->CalcLocalFrameRect( frame ); ::EraseRect( &frame ); LSingleClickListBox::DrawSelf(); } void LPPPListBox::EnableSelf() { LSingleClickListBox::EnableSelf(); // ::LSetDrawingMode( true, mMacListH ); ::LActivate( true, mMacListH ); this->Refresh(); this->UpdatePort(); // if ( FocusDraw() ) // this->DrawSelf(); } void LPPPListBox::DisableSelf() { LSingleClickListBox::DisableSelf(); ::LActivate( false, mMacListH ); // ::LSetDrawingMode( false, mMacListH ); this->Refresh(); this->UpdatePort(); // if ( FocusDraw() ) // this->DrawSelf(); } // ¥ÊLMUCDialog void* LMUCDialog::CreateMUCDialogStream( LStream* inStream ) { return new LMUCDialog( inStream ); } LMUCDialog::LMUCDialog( LStream* inStream ): LGADialogBox( inStream ) { } void LMUCDialog::SetPPPFunction( TraversePPPListFunc p ) { if ( mListBox ) mListBox->SetPPPFunction( p ); } void LMUCDialog::GetNewValue( LStr255& str ) { if ( mListBox ) mListBox->GetDescriptor( str ); } void LMUCDialog::UpdateList() { if ( mListBox ) { mListBox->UpdateList(); this->UpdateButtonState(); } } void LMUCDialog::UpdateButtonState() { LButton* okButton; okButton = (LButton*)this->FindPaneByID( mDefaultButtonID ); if ( !okButton || !mListBox ) return; if ( mListBox->GetValue() != -1 ) { if ( !okButton->IsEnabled() ) okButton->Enable(); } else { if ( okButton->IsEnabled() ) okButton->Disable(); } } void LMUCDialog::ListenToMessage( MessageT inMessage, void* ioParam ) { LGADialogBox::ListenToMessage( inMessage, ioParam ); if ( inMessage == msg_SingleClick ) this->UpdateButtonState(); } void LMUCDialog::FinishCreateSelf() { LGADialogBox::FinishCreateSelf(); mListBox = (LPPPListBox*)this->FindPaneByID( 'lstB' ); mListBox->AddListener( this ); mListBox->SetSingleClickMessage( msg_SingleClick ); this->UpdateList(); } void* LMUCEditDialog::CreateMUCEditDialogStream( LStream* inStream ) { return new LMUCEditDialog( inStream ); } LMUCEditDialog::LMUCEditDialog( LStream* inStream ): LGADialogBox( inStream ) { mModemsList = NULL; mAccountsList = NULL; mLocationsList = NULL; mDisabled = NULL; } void LMUCEditDialog::UpdateLists() { if ( mAccountsList ) mAccountsList->UpdateList(); if ( mModemsList ) mModemsList->UpdateList(); if ( mLocationsList ) mLocationsList->UpdateList(); this->UpdateButtonState(); } void LMUCEditDialog::GetNewValues( LStr255& modem, LStr255& account, LStr255& location ) { if ( mDisabled && mDisabled->GetValue() ) { modem = account = location = ""; } else { if ( mAccountsList ) mAccountsList->GetNameValue( account ); if ( mModemsList ) mModemsList->GetNameValue( modem ); if ( mLocationsList ) mLocationsList->GetNameValue( location ); } } void LMUCEditDialog::SetInitialValue( const LStr255& modem, const LStr255& account, const LStr255& location ) { if ( mAccountsList ) mAccountsList->SetToNamedItem( account ); if ( mModemsList ) mModemsList->SetToNamedItem( modem ); if ( mLocationsList ) mLocationsList->SetToNamedItem( location ); LStr255 emptyString( "" ); if ( modem == emptyString || account == emptyString || location == emptyString ) mDisabled->SetValue( 1 ); else mDisabled->SetValue( 0 ); } void LMUCEditDialog::UpdateButtonState() { LButton* okButton; okButton = (LButton*)this->FindPaneByID( mDefaultButtonID ); if ( !okButton ) return; if ( mDisabled && mDisabled->GetValue() ) { mModemsList->Disable(); mAccountsList->Disable(); mLocationsList->Disable(); okButton->Enable(); return; } else if ( mDisabled && !mDisabled->GetValue() ) { mModemsList->Enable(); mAccountsList->Enable(); mLocationsList->Enable(); } if ( mModemsList->GetValue() != -1 && mAccountsList->GetValue() != -1 && mLocationsList->GetValue() != -1 ) okButton->Enable(); else okButton->Disable(); } void LMUCEditDialog::ListenToMessage( MessageT inMessage, void* ioParam ) { LGADialogBox::ListenToMessage( inMessage, ioParam ); if ( inMessage == msg_SingleClick || inMessage == 9181 ) this->UpdateButtonState(); } void LMUCEditDialog::FinishCreateSelf() { LGADialogBox::FinishCreateSelf(); mAccountsList = (LPPPPopup*)this->FindPaneByID( 'popA' ); mAccountsList->AddListener( this ); //mAccountsList->SetSingleClickMessage( msg_SingleClick ); mAccountsList->SetPPPFunction( GetAccountsList ); mModemsList = (LPPPPopup*)this->FindPaneByID( 'popM' ); mModemsList->AddListener( this ); //mModemsList->SetSingleClickMessage( msg_SingleClick ); mModemsList->SetPPPFunction( GetModemsList ); mLocationsList = (LPPPPopup*)this->FindPaneByID( 'popL' ); mLocationsList->AddListener( this ); //mLocationsList->SetSingleClickMessage( msg_SingleClick ); mLocationsList->SetPPPFunction( GetLocationsList ); mDisabled = (LControl*)this->FindPaneByID( 'disC' ); mDisabled->AddListener( this ); }