gecko-dev/cmd/macfe/Composer/meditor.cp

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;
}