зеркало из https://github.com/mozilla/pjs.git
343 строки
9.9 KiB
C++
343 строки
9.9 KiB
C++
/* -*- 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.
|
|
*/
|
|
|
|
#include "meditor.h" // HandleModalDialog
|
|
#include "StBlockingDialogHandler.h"
|
|
#include "CEditView.h"
|
|
#include "macgui.h" // UGraphics::MakeLOColor
|
|
#include "CPaneEnabler.h"
|
|
#include "resgui.h" // EDITDLG_AUTOSAVE
|
|
#include "edt.h"
|
|
#include "fe_proto.h"
|
|
#include "prefapi.h" // PREF_GetBoolPref, PREF_GetIntPref
|
|
#include "shist.h" // SHIST_GetCurrent
|
|
#include "uapp.h" // CFrontApp
|
|
#include "CColorPopup.h"
|
|
|
|
extern "C" {
|
|
#include "xpgetstr.h"
|
|
#define WANT_ENUM_STRING_IDS
|
|
#include "allxpstr.h"
|
|
#undef WANT_ENUM_STRING_IDS
|
|
}
|
|
|
|
#include "CNSContext.h" // ExtractHyperView
|
|
|
|
|
|
// takes pascal-strings
|
|
MessageT HandleModalDialog( int id, const unsigned char *prompt1, const unsigned char* prompt2)
|
|
{
|
|
StPrepareForDialog prepare;
|
|
|
|
StBlockingDialogHandler handler( id, NULL );
|
|
LDialogBox* dialog = (LDialogBox *)handler.GetDialog();
|
|
if ( prompt1 )
|
|
{
|
|
LCaption *caption = (LCaption *)dialog->FindPaneByID( '^1 ' );
|
|
if ( caption )
|
|
caption->SetDescriptor( prompt1 );
|
|
}
|
|
if ( prompt2 )
|
|
{
|
|
LCaption *caption = (LCaption *)dialog->FindPaneByID( '^2 ' );
|
|
if ( caption )
|
|
caption->SetDescriptor( prompt2 );
|
|
}
|
|
|
|
MessageT message;
|
|
do {
|
|
message = handler.DoDialog();
|
|
}
|
|
while ( message == 0 );
|
|
|
|
return message;
|
|
}
|
|
|
|
/* Set default colors, background from user Preferences via the Page Data structure
|
|
*/
|
|
void FE_SetNewDocumentProperties(MWContext * pContext)
|
|
{
|
|
if ( pContext && pContext->is_editor && pContext->bIsComposeWindow )
|
|
return;
|
|
|
|
EDT_PageData *pageData = EDT_NewPageData();
|
|
|
|
if (pageData == NULL) return;
|
|
|
|
if (CPrefs::GetBoolean(CPrefs::EditorUseCustomColors )) {
|
|
|
|
LO_Color EditorText = UGraphics::MakeLOColor(CPrefs::GetColor(CPrefs::EditorText));
|
|
LO_Color EditorLink = UGraphics::MakeLOColor(CPrefs::GetColor(CPrefs::EditorLink));
|
|
LO_Color EditorActiveLink = UGraphics::MakeLOColor(CPrefs::GetColor(CPrefs::EditorActiveLink));
|
|
LO_Color EditorFollowedLink = UGraphics::MakeLOColor(CPrefs::GetColor(CPrefs::EditorFollowedLink));
|
|
LO_Color EditorBackground = UGraphics::MakeLOColor(CPrefs::GetColor(CPrefs::EditorBackground));
|
|
|
|
pageData->pColorText = &EditorText;
|
|
pageData->pColorLink= &EditorLink;
|
|
pageData->pColorActiveLink = &EditorActiveLink;
|
|
pageData->pColorFollowedLink = &EditorFollowedLink;
|
|
pageData->pColorBackground = &EditorBackground;
|
|
|
|
} else {
|
|
|
|
pageData->pColorText = NULL; // I assume this is how we get the browser defaults...
|
|
pageData->pColorLink= NULL;
|
|
pageData->pColorActiveLink = NULL;
|
|
pageData->pColorFollowedLink = NULL;
|
|
pageData->pColorBackground = NULL;
|
|
|
|
}
|
|
|
|
Bool hasBackgroundImage;
|
|
if ( ( PREF_GetBoolPref( "editor.use_background_image", &hasBackgroundImage ) == PREF_NOERROR )
|
|
&& hasBackgroundImage )
|
|
{
|
|
pageData->pBackgroundImage = CPrefs::GetCharPtr(CPrefs::EditorBackgroundImage);
|
|
if (pageData->pBackgroundImage && XP_STRLEN(pageData->pBackgroundImage) == 0) // if there is really nothing there, skip it.
|
|
pageData->pBackgroundImage = NULL;
|
|
}
|
|
else
|
|
pageData->pBackgroundImage = NULL;
|
|
|
|
if ( pContext && pContext->title )
|
|
pageData->pTitle = XP_STRDUP(pContext->title);
|
|
|
|
|
|
EDT_SetPageData(pContext, pageData);
|
|
|
|
pageData->pColorText = NULL; // don't free out lacal data!!!
|
|
pageData->pColorLink= NULL;
|
|
pageData->pColorActiveLink = NULL;
|
|
pageData->pColorFollowedLink = NULL;
|
|
pageData->pColorBackground = NULL;
|
|
pageData->pBackgroundImage = NULL;
|
|
|
|
EDT_FreePageData(pageData);
|
|
|
|
// Set Author name:
|
|
|
|
// CStr255 EditorAuthor(CPrefs::GetString(CPrefs::EditorAuthor));
|
|
|
|
// FE_UsersFullName();
|
|
|
|
|
|
EDT_MetaData *metaData = EDT_NewMetaData();
|
|
if (metaData == NULL) return;
|
|
metaData->bHttpEquiv = FALSE;
|
|
metaData->pName = XP_STRDUP("Author");
|
|
metaData->pContent = XP_STRDUP(CPrefs::GetString(CPrefs::EditorAuthor));
|
|
EDT_SetMetaData(pContext, metaData);
|
|
EDT_FreeMetaData(metaData);
|
|
}
|
|
|
|
|
|
/*
|
|
* Brings up a modal image load dialog and returns. Calls
|
|
* EDT_ImageLoadCancel() if the cancel button is pressed
|
|
*/
|
|
void FE_ImageLoadDialog( MWContext * /* pContext */ )
|
|
{
|
|
}
|
|
|
|
/*
|
|
* called by the editor engine after the image has been loaded
|
|
*/
|
|
void FE_ImageLoadDialogDestroy( MWContext * /* pContext */ )
|
|
{
|
|
}
|
|
|
|
void FE_EditorDocumentLoaded( MWContext *pContext )
|
|
{
|
|
if (pContext == NULL || !EDT_IS_EDITOR(pContext))
|
|
return;
|
|
|
|
CEditView *editView = (CEditView *)ExtractHyperView(pContext);
|
|
|
|
int32 iSave;
|
|
if ( pContext->bIsComposeWindow )
|
|
{
|
|
iSave = 0; // auto-save
|
|
|
|
CMailEditView *mailEditView = dynamic_cast<CMailEditView *>(editView);
|
|
if ( mailEditView )
|
|
mailEditView->InitMailCompose();
|
|
}
|
|
else
|
|
{
|
|
XP_Bool doAutoSave;
|
|
PREF_GetBoolPref( "editor.auto_save", &doAutoSave );
|
|
if ( doAutoSave )
|
|
PREF_GetIntPref( "editor.auto_save_delay", &iSave );
|
|
else
|
|
iSave = 0;
|
|
}
|
|
|
|
EDT_SetAutoSavePeriod(pContext, iSave );
|
|
|
|
// remember when the file was (last) modified
|
|
// initializes date/time stamp for external editor warning
|
|
EDT_IsFileModified(pContext);
|
|
|
|
// We had disabled everything, now we have to enable it again. This happens automatically on activate, but we might not get an activate
|
|
// if we don't have a dialog poping up (like if the user just creates a new document, there is no dialog...)
|
|
|
|
// set this after calling InitMailCompose
|
|
if ( editView )
|
|
{
|
|
editView->mEditorDoneLoading = true;
|
|
|
|
// set color popup control to show correct default color (now that we have an mwcontext)
|
|
editView->mColorPopup->InitializeCurrentColor();
|
|
}
|
|
|
|
InitCursor();
|
|
(CFrontApp::GetApplication())->UpdateMenus();
|
|
}
|
|
|
|
|
|
Bool FE_CheckAndAutoSaveDocument(MWContext *pContext)
|
|
{
|
|
if (pContext == NULL || !EDT_IS_EDITOR(pContext) || ExtractHyperView(pContext) == NULL )
|
|
return FALSE;
|
|
|
|
if ( pContext->bIsComposeWindow )
|
|
return FALSE;
|
|
|
|
CEditView *editView = (CEditView *)ExtractHyperView(pContext);
|
|
if ( FrontWindow() != editView->GetMacPort() )
|
|
return true;
|
|
|
|
if (!EDT_DirtyFlag(pContext) && !EDT_IS_NEW_DOCUMENT(pContext))
|
|
return TRUE;
|
|
|
|
History_entry* newEntry = SHIST_GetCurrent(&pContext->hist);
|
|
CStr255 fileName;
|
|
if ( newEntry && newEntry->address )
|
|
fileName = newEntry->address;
|
|
|
|
MessageT itemHit = HandleModalDialog(EDITDLG_AUTOSAVE, fileName, NULL );
|
|
if (itemHit != ok)
|
|
return FALSE;
|
|
|
|
return ((CEditView *)ExtractHyperView(pContext))->SaveDocument();
|
|
}
|
|
|
|
|
|
void FE_FinishedSave( MWContext * /* pMWContext */, int /* status */, char * /* pDestURL */, int /* iFileNumber */ )
|
|
{
|
|
}
|
|
|
|
// in xp_file.h
|
|
// Create a backup filename for renaming current file before saving data
|
|
// Input should be be URL file type "file:///..."
|
|
// Caller must free the string with XP_FREE
|
|
|
|
/*
|
|
* I don't know what the logic here should be, so I mostly copied this from the Windows code in:
|
|
* src/ns/cmd/winfe/fegui.cpp#XP_BackupFileName()
|
|
* (I didn't copy all the Windows code which deals with 8.3 filenames.)
|
|
*/
|
|
|
|
char * XP_BackupFileName( const char * szURL )
|
|
{
|
|
// Must have "file:" URL type and at least 1 character after "///"
|
|
if ( szURL == NULL || !NET_IsLocalFileURL((char*)szURL) || XP_STRLEN(szURL) <= 8 )
|
|
return NULL;
|
|
|
|
// Add extra space for '\0' and '.BAK', but subtract space for "file:///"
|
|
|
|
char *szFileName = (char *)XP_ALLOC((XP_STRLEN(szURL)+1+4-7)*sizeof(char));
|
|
if ( szFileName == NULL )
|
|
return NULL;
|
|
|
|
// Get filename but ignore "file:///"
|
|
|
|
// {
|
|
// char* filename = WH_FileName(szURL+7, xpURL);
|
|
// if (!filename) return NULL;
|
|
// XP_STRCPY(szFileName,filename);
|
|
// XP_FREE(filename);
|
|
// }
|
|
XP_STRCPY(szFileName, szURL+7);
|
|
|
|
// Add extension to the filename
|
|
XP_STRCAT( szFileName, ".BAK" );
|
|
|
|
return szFileName;
|
|
}
|
|
|
|
|
|
|
|
// If pszLocalName is not NULL, we return the full pathname
|
|
// in local platform syntax, even if file is not found.
|
|
// Caller must free this string.
|
|
// Returns TRUE if file already exists
|
|
//
|
|
|
|
/*
|
|
* I don't know what the logic here should be, so I mostly copied this from the Windows code in:
|
|
* src/ns/cmd/winfe/fegui.cpp#XP_ConvertUrlToLocalFile()
|
|
* (I didn't copy all the Windows code which deals with 8.3 filenames.)
|
|
*/
|
|
|
|
// The results of this call are passed directly to functions like XP_Stat and XP_FileOpen.
|
|
// brade--use xpURL format
|
|
Bool XP_ConvertUrlToLocalFile(const char * szURL, char **pszLocalName) // return TRUE if the file exists!! or return FALSE;
|
|
{
|
|
// Default assumes no file found - no local filename
|
|
|
|
Boolean bFileFound = FALSE;
|
|
if ( pszLocalName )
|
|
*pszLocalName = NULL;
|
|
|
|
// if "file:///Untitled" fail to convert
|
|
if ( szURL && XP_STRCMP( szURL, XP_GetString(XP_EDIT_NEW_DOC_NAME) ) == 0 )
|
|
return bFileFound;
|
|
|
|
// Must have "file:" URL type and at least 1 character after "///"
|
|
if ( szURL == NULL || !NET_IsLocalFileURL((char*)szURL) || XP_STRLEN(szURL) <= 8 )
|
|
return FALSE;
|
|
|
|
|
|
// Extract file path from URL: e.g. "/c|/foo/file.html"
|
|
|
|
char *szFileName = NET_ParseURL( szURL, GET_PATH_PART);
|
|
if (szFileName == NULL)
|
|
return FALSE;
|
|
|
|
// NET_UnEscape(szFileName); This will be done in WH_FileName, so don't unescape twice.
|
|
|
|
// Test if file exists
|
|
XP_StatStruct statinfo;
|
|
if ( -1 != XP_Stat(szFileName, &statinfo, xpURL) // if the file exists
|
|
&& statinfo.st_mode & S_IFREG ) // and its a normal file
|
|
bFileFound = TRUE; // We found it!
|
|
|
|
if ( pszLocalName )
|
|
{
|
|
// Pass string to caller
|
|
*pszLocalName = WH_FileName(szFileName, xpURL);
|
|
if (szFileName)
|
|
XP_FREE( szFileName );
|
|
}
|
|
else
|
|
XP_FREE(szFileName);
|
|
|
|
return bFileFound;
|
|
}
|