TextParser.h
上传用户:hmc_gdtv
上传日期:2013-08-04
资源大小:798k
文件大小:5k
源码类别:

Windows Mobile

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2001,2002,2003 Mike Matsnev.  All Rights Reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice immediately at the beginning of the file, without modification,
  10.  *    this list of conditions, and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. Absolutely no warranty of function or purpose is made by the author
  15.  *    Mike Matsnev.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * 
  28.  * $Id: TextParser.h,v 1.39.2.3 2004/01/08 11:06:06 mike Exp $
  29.  * 
  30.  */
  31. #if !defined(AFX_TEXTPARSER_H__2F6237F5_E47E_45B8_9597_CB0AAAA1413C__INCLUDED_)
  32. #define AFX_TEXTPARSER_H__2F6237F5_E47E_45B8_9597_CB0AAAA1413C__INCLUDED_
  33. #if _MSC_VER > 1000
  34. #pragma once
  35. #endif // _MSC_VER > 1000
  36. #include "ptr.h"
  37. #include "Attr.h"
  38. #include "BufFile.h"
  39. #include "Bookmarks.h"
  40. struct Paragraph {
  41.   Buffer<wchar_t> str;
  42.   Buffer<Attr> cflags;
  43.   int len;
  44.   BYTE flags;
  45.   int lindent,rindent,findent;
  46.   struct Link {
  47.     DWORD     off; // offset into str
  48.     DWORD     len; // number of chars
  49.     const wchar_t *target; // target footnote or paragraph, this is _borrowed_ from textparser
  50.   };
  51.   Buffer<Link> links;
  52.   enum {
  53.     right=1,
  54.     center=2,
  55.     justify=4,
  56.     align_mask=7,
  57.     header=8,
  58.     image=64,
  59.     hypdone=128
  60.   };
  61.   Paragraph() : len(0), flags(0), lindent(0), rindent(0), findent(0) { }
  62.   Paragraph(int l) : str(l), cflags(l), len(l), flags(0), lindent(0), rindent(0), findent(0) { }
  63.   Paragraph(const Paragraph& p) : str(p.str), cflags(p.cflags), len(p.len),
  64.     flags(p.flags), lindent(p.lindent), rindent(p.rindent), findent(p.findent),
  65.     links(p.links) { }
  66.   Paragraph& operator=(const Paragraph& p) {
  67.     str=p.str;
  68.     cflags=p.cflags;
  69.     len=p.len;
  70.     flags=p.flags;
  71.     links=p.links;
  72.     lindent=p.lindent;
  73.     rindent=p.rindent;
  74.     findent=p.findent;
  75.     return *this;
  76.   }
  77.   void Hyphenate();
  78. };
  79. struct Image {
  80.   HBITMAP   hBmp;
  81.   int     width;  // virutual/rotated
  82.   int     height;
  83. };
  84. class TextParser
  85. {
  86. public:
  87.   class Meter {
  88.   public:
  89.     virtual ~Meter() { }
  90.     virtual void  SetMax(DWORD max) = 0;
  91.     virtual void  SetCur(DWORD cur) = 0;
  92.   };
  93. protected:
  94.   CBufFile   *m_fp;
  95.   int   m_format;
  96.   int   m_encoding;
  97.   Meter   *m_mm;
  98.   Bookmarks   *m_bmk;
  99.   HANDLE   m_heap;
  100.   TextParser(Meter *m,CBufFile *fp,HANDLE heap,Bookmarks *bmk) :
  101.     m_fp(fp), m_mm(m), m_bmk(bmk), m_heap(heap) {
  102.     if (m_mm) m_mm->SetMax(m_fp->size());
  103.   }
  104.   void ProgSetCur(DWORD cur) { if (m_mm) m_mm->SetCur(cur); }
  105. public:
  106.   virtual ~TextParser();
  107.   int GetFormat() { return m_format; }
  108.   int GetEncoding() { return m_encoding; }
  109.   // paragraphs, mandatory
  110.   virtual Paragraph GetParagraph(int docid,int para) = 0;
  111.   virtual int Length(int docid) = 0; // in paragraphs
  112.   virtual int GetPLength(int docid,int para) = 0;
  113.   virtual int GetPStart(int docid,int para) = 0;
  114.   virtual int GetTotalLength(int docid) = 0;
  115.   virtual int LookupParagraph(int docid,int charpos) = 0;
  116.   // images, optional
  117.   virtual bool GetImage(const wchar_t *name,HDC hDC,
  118.     int maxwidth,int maxheight,int rotation,Image& img) { return false; }
  119.   virtual void InvalidateImageCache() { }
  120.   virtual bool IsImage() { return false; }
  121.   // subdocuments, optional
  122.   virtual int GetSubDocCount() { return 1; }
  123.   virtual CString GetSubDocName(int docid) { return _T("Main"); }
  124.   // links, optional
  125.   virtual bool LookupReference(const wchar_t *rname,FilePos& dest) {
  126.     return false;
  127.   }
  128.   // helper functions
  129.   static int DetectFormat(CBufFile *fp);
  130.   static int GetNumFormats();
  131.   static const TCHAR *GetFormatName(int format);
  132.   static TextParser *Create(Meter *m,CBufFile *fp,int format,int encoding,Bookmarks *bma);
  133. };
  134. #endif // !defined(AFX_TEXTPARSER_H__2F6237F5_E47E_45B8_9597_CB0AAAA1413C__INCLUDED_)