Go to the documentation of this file.00001
00013
00014
00015 #ifndef __NMEStyleCpp__
00016 #define __NMEStyleCpp__
00017
00018 #if defined(UseNMECppException)
00019
00020 # undef UseNMECppException
00021 # include "NMECpp.h"
00022 # define UseNMECppException
00023
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
00198 if (!output)
00199 if (getOutput(NULL) != kNMEErrOk)
00200 {
00201
00202 NMEStyleInit(styleTable, styleTableSize,
00203 unicodeStyleOffsets);
00204 return NULL;
00205 }
00206 return styleTable;
00207 }
00208
00216 NMEBoolean handleLinkClick(NMEInt offset, NMELinkHandler *handler)
00217 {
00218
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