00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Settings.h"
00020 #include <libermanifest/ermanifest.h>
00021 #include <liberipc/eripctoolbar.h>
00022
00023 static const int INVALID_PAGE_NUMBER = -1;
00024
00025 #if (HISTORY_DEBUG)
00026 int HistoryItem::count = 0;
00027 #endif
00028 HistoryItem::HistoryItem()
00029 : x(0)
00030 , y(0)
00031 , pageNumber(0)
00032 {
00033 #if (HISTORY_DEBUG)
00034 ++count;
00035 #endif
00036 }
00037
00038 HistoryItem::~HistoryItem()
00039 {
00040 #if (HISTORY_DEBUG)
00041 --count;
00042 #endif
00043 }
00044
00046
00047
00048
00049
00050 CSettings::CSettings(void)
00051 {
00052 zoom = ZoomPage; rotate = 0; screenX = screenY = 0;
00053 currentPage = INVALID_PAGE_NUMBER;
00054 drawAreaWidth = SCREEN_WIDTH;
00055 drawAreaHeight = CLIENT_AREA;
00056 renderDir = RenderNext;
00057 mode = ModePage; zbState = iconState_grey;
00058 enableScb = gTrue; currentItem = 0;
00059 }
00060
00061 CSettings::~CSettings(void)
00062 {
00063 clearHistory();
00064 }
00065
00066 void CSettings::setNewZoom(const double z)
00067 {
00068 record.zoom = zoom;
00069 zoom = z;
00070 record.x = screenX;
00071 record.y = screenY;
00072 zbState = iconState_normal;
00073 }
00074
00075 GBool CSettings::zoomBack()
00076 {
00077 if (InvalidZoom == record.zoom)
00078 {
00079 return gFalse;
00080 }
00081
00082 if (mode == ModePage)
00083 {
00084 swap(zoom, record.zoom);
00085 swap(screenX, record.x);
00086 swap(screenY, record.y);
00087 }
00088 else
00089 {
00090 double ratio = record.zoom / zoom;
00091 swap(zoom, record.zoom);
00092 if (rotate == 270)
00093 {
00094 record.x = (int)(screenX * ratio);
00095 swap(screenX, record.x);
00096 swap(screenY, record.y);
00097 }
00098 else if (rotate == 0)
00099 {
00100 record.y = (int)(screenY * ratio);
00101 swap(screenY, record.y);
00102 swap(screenX, record.x);
00103 }
00104 }
00105 if (iconState_normal == zbState)
00106 {
00107 zbState = iconState_selected;
00108 }
00109 else if (iconState_selected == zbState)
00110 {
00111 zbState = iconState_normal;
00112 }
00113 return gTrue;
00114 }
00115
00116 void CSettings::disableZoomBack()
00117 {
00118 record.zoom = InvalidZoom;
00119 zbState = iconState_grey;
00120 }
00121
00122 GBool CSettings::canZoomBack()
00123 {
00124 return (InvalidZoom != record.zoom);
00125 }
00126
00127 void CSettings::load(const char * pathName)
00128 {
00129 erManifest manifest;
00130 if (RET_OK == ermXmlOpenManifest(pathName, &manifest))
00131 {
00132
00133 ermXmlGetInt(&manifest, "/package/last-location/pagenumber", ¤tPage);
00134
00135
00136 static const int MAX = 20;
00137 char tmp[MAX] = {0};
00138 ermXmlGetString(&manifest, "/package/viewer-settings/zoomfactor", tmp, MAX);
00139
00140 if (0 == strcasecmp(tmp, "zoomPage"))
00141 {
00142 zoom = ZoomPage;
00143 }
00144 else if (0 == strcasecmp(tmp, "zoomWidth"))
00145 {
00146 zoom = ZoomWidth;
00147 }
00148 else
00149 {
00150 sscanf(tmp, "%lf", &zoom);
00151 }
00152
00153
00154 ermXmlGetInt(&manifest, "/package/viewer-settings/rotation", &rotate);
00155 ermXmlGetInt(&manifest, "/package/viewer-settings/positionx", &screenX);
00156 ermXmlGetInt(&manifest, "/package/viewer-settings/positiony", &screenY);
00157 ermXmlGetString(&manifest, "/package/viewer-settings/mode", tmp, MAX);
00158
00159 if (0 == strcasecmp(tmp, "continous"))
00160 {
00161 mode = ModeContinous;
00162 }
00163 else if (0 == strcasecmp(tmp, "page"))
00164 {
00165 mode = ModePage;
00166 }
00167
00168
00169
00170 enableScb = gTrue;
00171 if (RET_OK == ermXmlGetString(&manifest, "/package/metadata/y-metadata/modify-enable/scribble-enable", tmp, MAX))
00172 {
00173 if (strncmp(tmp, "true", MAX) != 0)
00174 {
00175 enableScb = gFalse;
00176 }
00177 }
00178
00179 else if (RET_OK == ermXmlGetAttributeString(&manifest,
00180 "/package/metadata/y-metadata/modify-enable",
00181 "default", tmp, MAX))
00182 {
00183 if (strncmp(tmp, "true", MAX) != 0)
00184 {
00185 enableScb = gFalse;
00186 }
00187 }
00188 }
00189 ermXmlClose(&manifest);
00190 }
00191
00192 void CSettings::save(const char *pathName)
00193 {
00194 erManifest manifest;
00195 if (RET_OK == ermXmlOpenManifest(pathName, &manifest))
00196 {
00197
00198
00199
00200
00201
00202
00203 if (RET_OK != ermXmlExist(&manifest, "/package/last-location/pagenumber"))
00204 {
00205 ermXmlNewString(&manifest, "/package", "last-location", "");
00206 ermXmlNewString(&manifest, "/package/last-location", "pagenumber", "");
00207 }
00208 ermXmlSetInt(&manifest, "/package/last-location/pagenumber", currentPage);
00209
00210
00211 if (RET_OK != ermXmlExist(&manifest, "/package/viewer-settings/zoomfactor"))
00212 {
00213 ermXmlNewString(&manifest, "/package", "viewer-settings", "");
00214 ermXmlNewString(&manifest, "/package/viewer-settings", "zoomfactor", "");
00215 }
00216 if (zoom == ZoomPage)
00217 {
00218 ermXmlSetString(&manifest, "/package/viewer-settings/zoomfactor", "zoomPage");
00219 }
00220 else if (zoom == ZoomWidth)
00221 {
00222 ermXmlSetString(&manifest, "/package/viewer-settings/zoomfactor", "zoomWidth");
00223 }
00224 else
00225 {
00226 char tmp[20] = {0};
00227 snprintf(tmp, 20, "%lf", zoom);
00228 ermXmlSetString(&manifest, "/package/viewer-settings/zoomfactor", tmp);
00229 }
00230
00231
00232 if (RET_OK != ermXmlExist(&manifest, "/package/viewer-settings/rotation"))
00233 {
00234 ermXmlNewString(&manifest, "/package/viewer-settings", "rotation", "");
00235 }
00236 ermXmlSetInt(&manifest, "/package/viewer-settings/rotation", rotate);
00237
00238
00239 if (RET_OK != ermXmlExist(&manifest, "/package/viewer-settings/positionx"))
00240 {
00241 ermXmlNewString(&manifest, "/package/viewer-settings", "positionx", "");
00242 }
00243 ermXmlSetInt(&manifest, "/package/viewer-settings/positionx", screenX);
00244
00245
00246 if (RET_OK != ermXmlExist(&manifest, "/package/viewer-settings/positiony"))
00247 {
00248 ermXmlNewString(&manifest, "/package/viewer-settings", "positiony", "");
00249 }
00250 ermXmlSetInt(&manifest, "/package/viewer-settings/positiony", screenY);
00251
00252
00253 if (RET_OK != ermXmlExist(&manifest, "/package/viewer-settings/mode"))
00254 {
00255 ermXmlNewString(&manifest, "/package/viewer-settings", "mode", "");
00256 }
00257 if (mode == ModeContinous)
00258 {
00259 ermXmlSetString(&manifest, "/package/viewer-settings/mode", "continous");
00260 }
00261 else
00262 {
00263 ermXmlSetString(&manifest, "/package/viewer-settings/mode", "page");
00264 }
00265
00266 ermXmlSaveAndClose(&manifest);
00267 }
00268 }
00269
00270 void CSettings::getScreenRect(rectangle & rect)
00271 {
00272 if (getRotate() == 0 || getRotate() == 180)
00273 {
00274 rect.left = screenX; rect.top = screenY;
00275 rect.right = screenX + drawAreaWidth;
00276 rect.bottom = screenY + drawAreaHeight;
00277 }
00278 else if (getRotate() == 90 || getRotate() == 270)
00279 {
00280 rect.left = screenY; rect.top = screenX;
00281 rect.right = screenY + drawAreaHeight;
00282 rect.bottom = screenX + drawAreaWidth;
00283 }
00284 }
00285
00286 void CSettings::setScreenPosition(const int nX, const int nY)
00287 {
00288 screenX = nX; screenY = nY;
00289 }
00290
00291 void CSettings::setScreenSize(const int width, const int height)
00292 {
00293 drawAreaWidth = width; drawAreaHeight = height;
00294 }
00295
00296 void CSettings::setScreenRect(const rectangle & rect)
00297 {
00298 screenX = rect.left; screenY = rect.top;
00299 drawAreaWidth = rect.right - rect.left;
00300 drawAreaHeight = rect.bottom - rect.top;
00301 }
00302
00303 void CSettings::clearHistory()
00304 {
00305
00306 HistoryItemPtr ptr = 0;
00307 while (forward.getLength() > 0)
00308 {
00309 ptr = (HistoryItemPtr)forward.del(0);
00310 delete ptr;
00311 }
00312
00313
00314 while (backward.getLength() > 0)
00315 {
00316 ptr = (HistoryItemPtr)backward.del(0);
00317 delete ptr;
00318 }
00319
00320
00321 delete currentItem;
00322 currentItem = 0;
00323
00324 #if (HISTORY_DEBUG)
00325
00326 printf("\n\nHistoryItem count reaches %d\n\n", HistoryItem::count);
00327 #endif
00328 }
00329
00330
00331 void CSettings::setCurrentPage(const int p)
00332 {
00333
00334 if (currentPage != p && currentPage != INVALID_PAGE_NUMBER)
00335 {
00336
00337 addNewItem(currentPage);
00338 }
00339
00340 if (currentItem == 0)
00341 {
00342 currentItem = new HistoryItem;
00343 }
00344
00345
00346 currentItem->pageNumber = p;
00347 currentPage = p;
00348
00349 #if (HISTORY_DEBUG)
00350 dumpHistory();
00351 #endif
00352 }
00353
00354
00355 void CSettings::addNewItem(HistoryItemPtr ptr)
00356 {
00357
00358 if (backward.getLength() >= HISTORY_MAX_LENGTH)
00359 {
00360 delete (HistoryItemPtr)backward.del(0);
00361 }
00362
00363 backward.append(ptr);
00364
00365
00366 while (forward.getLength() > 0)
00367 {
00368 ptr = (HistoryItemPtr)forward.del(0);
00369 delete ptr;
00370 }
00371 }
00372
00373 void CSettings::addNewItem(const int page)
00374 {
00375 HistoryItemPtr ptr = new HistoryItem;
00376 ptr->pageNumber = page;
00377 addNewItem(ptr);
00378 }
00379
00380 HistoryItemPtr CSettings::goBackward()
00381 {
00382 int last = backward.getLength();
00383 if (last <= 0)
00384 {
00385 return 0;
00386 }
00387
00388 forward.append(currentItem);
00389 currentItem = (HistoryItemPtr)backward.del(last - 1);
00390 currentPage = currentItem->pageNumber;
00391 return currentItem;
00392 }
00393
00394 HistoryItemPtr CSettings::goForward()
00395 {
00396 int last = forward.getLength();
00397 if (last <= 0)
00398 {
00399 return 0;
00400 }
00401
00402 backward.append(currentItem);
00403 currentItem = (HistoryItemPtr)forward.del(last - 1);
00404 currentPage = currentItem->pageNumber;
00405 return currentItem;
00406 }
00407
00408 GBool CSettings::canGoBack()
00409 {
00410 return (backward.getLength() > 0);
00411 }
00412
00413 GBool CSettings::canGoForward()
00414 {
00415 return (forward.getLength() > 0);
00416 }
00417
00418 #if (HISTORY_DEBUG)
00419 void CSettings::dumpHistory()
00420 {
00421 printf("backward pages: ");
00422 int count = backward.getLength();
00423 for(int i = 0; i < count; ++i)
00424 {
00425 HistoryItemPtr ptr = (HistoryItemPtr)backward.get(i);
00426 printf("%d\t", ptr->pageNumber);
00427 }
00428 printf("\n");
00429
00430 printf("forward pages: ");
00431 count = forward.getLength();
00432 for(int i = 0; i < count; ++i)
00433 {
00434 HistoryItemPtr ptr = (HistoryItemPtr)forward.get(i);
00435 printf("%d\t", ptr->pageNumber);
00436 }
00437 printf("\n");
00438 printf("current page %d\n", currentItem->pageNumber);
00439 }
00440 #endif
00441