nyctergatis.com

Contact

Projects
Sysquake Remote Live
NME
PDF
Hike
Sudoku
GifBuilder
jpeglib for Palm OS
MySQL Client
Cross-GCC for Mac OS
NMEStyleCpp.h
Go to the documentation of this file.
00001 
00013 /* License: new BSD license (see NME.h) */
00014 
00015 #ifndef __NMEStyleCpp__
00016 #define __NMEStyleCpp__
00017 
00018 #if defined(UseNMECppException)
00019     // class NME is used without exceptions
00020 #   undef UseNMECppException
00021 #   include "NMECpp.h"
00022 #   define UseNMECppException
00023     // still define class NMEError
00024 #   include "NMEErrorCpp.h"
00025 #else
00026 #   include "NMECpp.h"
00027 #endif
00028 
00029 #include "NMEStyle.h"
00030 
00033 class NMELinkHandler
00034 {
00035     public:
00040         virtual void click(NMEConstText link, NMEInt linkLength) = 0;
00041 };
00042 
00054 class NMEStyle: public NME
00055 {
00056     public:
00057         
00060         NMEStyle(): NME()
00061         {
00062             styleTable = NULL;
00063         }
00064         
00070         NMEStyle(char const *input, int inputLength = -1): NME(input, inputLength)
00071         {
00072             styleTable = NULL;
00073         }
00074         
00078         NMEStyle(NMEStyle const &nme): NME(nme)
00079         {
00080             unicodeStyleOffsets = nme.unicodeStyleOffsets;
00081             if (nme.styleTable)
00082             {
00083                 format.parHookFun = format.spanHookFun = NMEStyleSpanHook;
00084                 styleTableSize = nme.styleTableSize;
00085                 styleTable = (NMEStyleTable *) new char[styleTableSize];
00086                 NMEStyleInit(styleTable, styleTableSize,
00087                         unicodeStyleOffsets);
00088                 styleTable->n = nme.styleTable->n;
00089                 int i;
00090                 for (i = 0; i < styleTable->n; i++)
00091                     styleTable->span[i] = nme.styleTable->span[i];
00092                 format.hookData = (void *)styleTable;
00093             }
00094             else
00095                 styleTable = NULL;
00096         }
00097         
00099         ~NMEStyle()
00100         {
00101             if (styleTable)
00102                 delete [] (char *)styleTable;
00103         }
00104         
00109         NMEStyle operator = (NMEStyle const &nme)
00110         {
00111             if (this != &nme)
00112             {
00113                 NME::operator = (nme);
00114                 if (styleTable)
00115                     delete [] (char *)styleTable;
00116                 if (nme.styleTable)
00117                 {
00118                     format.parHookFun = format.spanHookFun = NMEStyleSpanHook;
00119                     styleTableSize = nme.styleTableSize;
00120                     styleTable = (NMEStyleTable *) new char[styleTableSize];
00121                     NMEStyleInit(styleTable, styleTableSize,
00122                             unicodeStyleOffsets);
00123                     styleTable->n = nme.styleTable->n;
00124                     int i;
00125                     for (i = 0; i < styleTable->n; i++)
00126                         styleTable->span[i] = nme.styleTable->span[i];
00127                     format.hookData = (void *)styleTable;
00128                 }
00129                 else
00130                     styleTable = NULL;
00131             }
00132             return *this;
00133         }
00134         
00139         void setUnicodeStyleOffsets(bool unicodeStyleOffsets = true)
00140         {
00141             this->unicodeStyleOffsets = unicodeStyleOffsets;
00142         }
00143         
00149         NMEErr getOutput(NMEConstText *output, NMEInt *outputLength = NULL)
00150         {
00151             if (!styleTable)
00152             {
00153                 format.parHookFun = format.spanHookFun = NMEStyleSpanHook;
00154                 styleTableSize = sizeof(NMEStyleTable) + inputLength;
00155                 styleTable = (NMEStyleTable *) new char[styleTableSize];
00156                 NMEStyleInit(styleTable, styleTableSize,
00157                         unicodeStyleOffsets);
00158                 format.hookData = (void *)styleTable;
00159             }
00160             
00161             for (;;)
00162             {
00163                 NMEErr err = NME::getOutput(output, outputLength);
00164                 if (err == kNMEErrOk)
00165                     break;
00166                 else if (err == (NMEErr)kNMEErrStyleTableTooSmall)
00167                 {
00168                     if (styleTableSize >= 65536 + 10 * inputLength)
00169 #if defined(UseNMECppException)
00170                         throw NMEError((NMEErr)kNMEErrStyleTableTooSmall);
00171 #else
00172                         return (NMEErr)kNMEErrStyleTableTooSmall;
00173 #endif
00174                     delete [] (char *)styleTable;
00175                     styleTableSize *= 2;
00176                     styleTable = (NMEStyleTable *) new char[styleTableSize];
00177                     NMEStyleInit(styleTable, styleTableSize,
00178                             unicodeStyleOffsets);
00179                     format.hookData = (void *)styleTable;
00180                 }
00181                 else
00182 #if defined(UseNMECppException)
00183                     throw NMEError(err);
00184 #else
00185                     return err;
00186 #endif
00187             }
00188             
00189             return kNMEErrOk;
00190         }
00191         
00195         NMEStyleTable const *getStyleTable()
00196         {
00197             // parse input if not done yet
00198             if (!output)
00199                 if (getOutput(NULL) != kNMEErrOk)   // ignore output
00200                 {
00201                     // getOutput has allocated styleTable; reset it
00202                     NMEStyleInit(styleTable, styleTableSize,
00203                             unicodeStyleOffsets);
00204                     return NULL;
00205                 }
00206             return styleTable;
00207         }
00208         
00216         NMEBoolean handleLinkClick(NMEInt offset, NMELinkHandler *handler)
00217         {
00218             // check table
00219             if (!styleTable)
00220                 (void)getOutput(NULL);
00221             if (styleTable)
00222             {
00223                 NMEInt i;
00224                 
00225                 for (i = 0; i < styleTable->n; i++)
00226                     if (styleTable->span[i].style == kNMEStyleCharLink
00227                             && offset >= styleTable->span[i].begin
00228                             && offset < styleTable->span[i].end)
00229                     {
00230                         if (handler)
00231                             handler->click(input + styleTable->span[i].linkOffset,
00232                                     styleTable->span[i].linkLength);
00233                         return TRUE;
00234                     }
00235             }
00236             
00237             return FALSE;
00238         }
00239         
00240     private:
00241         
00242         bool unicodeStyleOffsets;
00243         NMEStyleTable *styleTable;
00244         NMEInt styleTableSize;
00245 };
00246 
00247 #endif
Generated by Doxygen.
Copyright 2007-2013, Yves Piguet.
All rights reserved.