home *** CD-ROM | disk | FTP | other *** search
- /* -*- 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.0 (the "NPL"); you may not use this file except in
- * compliance with the NPL. You may obtain a copy of the NPL at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the NPL is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
- * for the specific language governing rights and limitations under the
- * NPL.
- *
- * The Initial Developer of this code under the NPL is Netscape
- * Communications Corporation. Portions created by Netscape are
- * Copyright (C) 1998 Netscape Communications Corporation. All Rights
- * Reserved.
- */
-
- // ===========================================================================
- // COpenRecentlyEditedPopup.cp
- // ===========================================================================
-
- #include "COpenRecentlyEditedPopup.h"
-
- #include "CWindowMediator.h"
- #include "CBrowserContext.h"
- #include "CEditorWindow.h"
- #include "UMenuUtils.h"
- #include "PascalString.h"
-
- #include "net.h" // NET_CreateURLStruct
- #include "structs.h" // TagType which is needed in edt.h
- #include "edt.h"
-
-
- // ---------------------------------------------------------------------------
- // Ñ CreateNavigationButtonPopupStream [static]
- // ---------------------------------------------------------------------------
-
- COpenRecentlyEditedPopup*
- COpenRecentlyEditedPopup::CreateOpenRecentlyEditedPopupStream( LStream* inStream )
- {
- return new COpenRecentlyEditedPopup(inStream);
- }
-
- // ---------------------------------------------------------------------------
- // Ñ COpenRecentlyEditedPopup
- // ---------------------------------------------------------------------------
-
- COpenRecentlyEditedPopup::COpenRecentlyEditedPopup( LStream* inStream )
- : mBrowserContext(nil),
- super(inStream)
- {
- }
-
- // ---------------------------------------------------------------------------
- // Ñ ~COpenRecentlyEditedPopup
- // ---------------------------------------------------------------------------
-
- COpenRecentlyEditedPopup::~COpenRecentlyEditedPopup()
- {
- }
-
- #pragma mark -
-
- // ---------------------------------------------------------------------------
- // Ñ AdjustMenuContents
- // ---------------------------------------------------------------------------
-
- void
- COpenRecentlyEditedPopup::AdjustMenuContents()
- {
- if (!GetMenu() || !GetMenu()->GetMacMenuH())
- return;
-
- if (!AssertPreconditions())
- return;
-
- // Purge the menu
- UMenuUtils::PurgeMenuItems(GetMenu()->GetMacMenuH(), PERM_OPEN_ITEMS);
-
- // Fill the menu
- int i;
- char *urlp = NULL, *titlep = NULL;
- for ( i = 0; i < MAX_EDIT_HISTORY_LOCATIONS
- && EDT_GetEditHistory( ((MWContext *)(*mBrowserContext)), i, &urlp, &titlep ); i++ )
- {
- // strange logic: if we have no URL (then how do we go there???) then use title if it exists
- if ( urlp == NULL )
- urlp = titlep;
-
- if ( urlp )
- {
- NET_UnEscape( urlp );
- InsertItemIntoMenu( urlp, PERM_OPEN_ITEMS + i );
- }
- else
- break;
- }
-
- // delete menu break line if we don't have any history items
- if ( i == 0 )
- {
- ::DeleteMenuItem( GetMenu()->GetMacMenuH(), PERM_OPEN_ITEMS );
- }
-
- // Set the min/max values of the control since we populated the menu
- SetPopupMinMaxValues();
- }
-
- // ---------------------------------------------------------------------------
- // Ñ InsertItemIntoMenu
- // ---------------------------------------------------------------------------
-
- void
- COpenRecentlyEditedPopup::InsertItemIntoMenu( char *urlp, Int16 inAfterItem )
- {
- Assert_(GetMenu() && GetMenu()->GetMacMenuH());
- Assert_(mBrowserContext);
- CStr255 thePString( urlp );
-
- // Insert a "blank" item first...
- ::InsertMenuItem( GetMenu()->GetMacMenuH(), "\p ", inAfterItem + 1 );
-
- // Then change it. We do this so that no interpretation of metacharacters will occur.
- ::SetMenuItemText( GetMenu()->GetMacMenuH(), inAfterItem + 1, thePString );
- }
-
- #pragma mark -
-
- // ---------------------------------------------------------------------------
- // Ñ HandleNewValue
- // ---------------------------------------------------------------------------
-
- Boolean
- COpenRecentlyEditedPopup::HandleNewValue( Int32 inNewValue )
- {
- if ( inNewValue >= 1 && inNewValue < PERM_OPEN_ITEMS )
- {
- // someone else will handle this
- return false;
- }
-
- if ( AssertPreconditions() && inNewValue )
- {
- MWContext *cntxt = ((MWContext *)(*mBrowserContext));
- if ( cntxt )
- {
- char *aURLtoOpen = NULL;
- // EDT_GetEditHistory is 0-based so deduct 1 from 2nd parameter
- if ( EDT_GetEditHistory( cntxt, inNewValue - PERM_OPEN_ITEMS - 1, &aURLtoOpen, NULL) )
- {
- URL_Struct* theURL = NET_CreateURLStruct( aURLtoOpen, NET_NORMAL_RELOAD );
- if ( theURL )
- CEditorWindow::MakeEditWindow( NULL, theURL );
- }
- }
- }
-
- return true;
- }
-
- // ---------------------------------------------------------------------------
- // Ñ AssertPreconditions
- // ---------------------------------------------------------------------------
- // Assert preconditions and fill in interesting member data
-
- Boolean
- COpenRecentlyEditedPopup::AssertPreconditions()
- {
- CMediatedWindow* topWindow = CWindowMediator::GetWindowMediator()->FetchTopWindow( WindowType_Any, regularLayerType );
-
- if (!topWindow || topWindow->GetWindowType() != WindowType_Editor)
- return false;
-
- CEditorWindow* composerWindow = dynamic_cast<CEditorWindow*>(topWindow);
- if ( !composerWindow )
- return false;
-
- if ( !(mBrowserContext = (CBrowserContext*)composerWindow->GetWindowContext()) )
- return false;
-
- return true;
- }