|
|
/*
* @doc INTERNAL * * @module _URLSUP.H URL detection support | * * Author: alexgo (4/1/96) * * Copyright (c) 1995-2000, Microsoft Corporation. All rights reserved. */
#ifndef _URLSUP_H_
#define _URLSUP_H_
#include "_dfreeze.h"
#include "_notmgr.h"
#include "_range.h"
class CTxtEdit; class IUndoBuilder;
// Maximum URL length. It's a good thing to have a protection like
// this to make sure we don't select the whole document; and we really
// need this for space-containing URLs.
// Note (keithcu). I bumped these values up because of RAID 7210. I thought about
// removing this support altogether, but it's nice to have and speeds up
// performance when you are inserting angle brackets inside URLs and you
// do the left one first.
#define URL_MAX_SIZE 4096
// for MoveByDelimiter
#define URL_EATWHITESPACE 32
#define URL_STOPATWHITESPACE 1
#define URL_EATNONWHITESPACE 0
#define URL_STOPATNONWHITESPACE 2
#define URL_EATPUNCT 0
#define URL_STOPATPUNCT 4
#define URL_EATNONPUNCT 0
#define URL_STOPATNONPUNCT 8
#define URL_STOPATCHAR 16
// need this one to initialize a scan with something invalid
#define URL_INVALID_DELIMITER TEXT(' ')
#define LEFTANGLEBRACKET TEXT('<')
#define RIGHTANGLEBRACKET TEXT('>')
/*
* CDetectURL * * @class This class watches edit changes and automatically * changes detected URL's into links (see CFE_LINK && EN_LINK) */ class CDetectURL : public ITxNotify { //@access Public Methods
public: // constructor/destructor
CDetectURL(CTxtEdit *ped); //@cmember constructor
~CDetectURL(); //@cmember destructor
// ITxNotify methods
//@cmember Called before a change
virtual void OnPreReplaceRange( LONG cp, LONG cchDel, LONG cchNew, LONG cpFormatMin, LONG cpFormatMax, NOTIFY_DATA *pNotifyData ); //@cmember Called after a change
virtual void OnPostReplaceRange( LONG cp, LONG cchDel, LONG cchNew, LONG cpFormatMin, LONG cpFormatMax, NOTIFY_DATA *pNotifyData ); virtual void Zombie(); //@cmember Turn into a zombie
// useful methods
void ScanAndUpdate(IUndoBuilder *publdr);//@cmember Scan changed area
// & update link status
//@cmember Return TRUE if text is a URL
BOOL IsURL(CTxtPtr &tp, LONG cch, BOOL *pfURLLeadin);
//@access Private Methods and Data
private:
// Worker routines for ScanAndUpdate
BOOL GetScanRegion(LONG& cpStart, LONG& cpEnd);//@cmember Get region to
// check & clear accumulator
static void ExpandToURL(CTxtRange& rg, LONG &cchAdvance); //@cmember Expand range to next
// URL candidate
static void SetURLEffects(CTxtRange& rg, IUndoBuilder *publdr); //@cmember Set
// desired URL effects
//@cmember Remove URL effects if
// appropriate
void CheckAndCleanBogusURL(CTxtRange& rg, BOOL &fDidClean, IUndoBuilder *publdr);
//@cmember Scan along for white
// space / not whitespace,
// punctuation / non punctuation
// and remember what stopped scan
static LONG MoveByDelimiters(const CTxtPtr& tp, LONG iDir, DWORD grfDelimiters, WCHAR *pchStopChar);
static LONG GetAngleBracket(CTxtPtr &tp, LONG cch = 0); static WCHAR BraceMatch(WCHAR chEnclosing); CTxtEdit * _ped; //@cmember Edit context
CAccumDisplayChanges _adc; //@cmember Change accumulator
// FUTURE (alexgo): we may want to add more options to detection,
// such as the charformat to use on detection, etc.
};
#endif // _URLSUP_H_
|