📄 sumatrapdf.cpp.svn-base
字号:
/* Copyright Krzysztof Kowalczyk 2006-2007 License: GPLv2 */#include "SumatraPDF.h"#include "file_util.h"#include "geom_util.h"#include "str_strsafe.h"#include "str_util.h"#include "strlist_util.h"#include "translations.h"#include "utf_util.h"#include "win_util.h"#include "tstr_util.h"#include "SumatraDialogs.h"#include "FileHistory.h"#include "AppPrefs.h"#include <assert.h>#include <stdio.h>#include <stdarg.h>#include <ctype.h>#include <direct.h> /* for _mkdir() */#include <shellapi.h>#include <shlobj.h>#include "WinUtil.hpp"#include <windowsx.h>#include <Wininet.h>#ifdef CRASHHANDLER#include "client\windows\handler\exception_handler.h"#endif#ifndef CURR_VERSION#define CURR_VERSION "0.9.3"#endif// #define SVN_PRE_RELEASE_VER 994#define _QUOTEME(x) #x#define QM(x) _QUOTEME(x)#ifdef SVN_PRE_RELEASE_VER#define UPDATE_CHECK_VER QM(SVN_PRE_RELEASE_VER)#else#define UPDATE_CHECK_VER CURR_VERSION#endif// this sucks but I don't know any other way#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")//#define FANCY_UI 1/* Define if you want to conserve memory by always freeing cached bitmaps for pages not visible. Only enable for stress-testing the logic. On desktop machine we usually have plenty memory *///#define CONSERVE_MEMORY 1/* Next action for the benchmark mode */#define MSG_BENCH_NEXT_ACTION WM_USER + 1#define ZOOM_IN_FACTOR 1.2#define ZOOM_OUT_FACTOR 1.0 / ZOOM_IN_FACTOR/* if TRUE, we're in debug mode where we show links as blue rectangle on the screen. Makes debugging code related to links easier. TODO: make a menu item in DEBUG build to turn it on/off. */#ifdef DEBUGstatic BOOL gDebugShowLinks = TRUE;#elsestatic BOOL gDebugShowLinks = FALSE;#endif/* default UI settings *///#define DEFAULT_ZOOM ZOOM_FIT_WIDTH#define DEFAULT_ZOOM ZOOM_FIT_PAGE#define DEFAULT_ROTATION 0//#define START_WITH_ABOUT 1/* define if want to use double-buffering for rendering the PDF. Takes more memory!. */#define DOUBLE_BUFFER 1#define DRAGQUERY_NUMFILES 0xFFFFFFFF#define MAX_LOADSTRING 100#define WM_CREATE_FAILED -1#define WM_CREATE_OK 0#define WM_NCPAINT_HANDLED 0#define WM_VSCROLL_HANDLED 0#define WM_HSCROLL_HANDLED 0#define ABOUT_WIN_DX 440#define ABOUT_WIN_DY 328#define WM_APP_REPAINT_DELAYED (WM_APP + 10)#define WM_APP_REPAINT_NOW (WM_APP + 11)#define WM_APP_URL_DOWNLOADED (WM_APP + 12)/* A caption is 4 white/blue 2 pixel line and a 3 pixel white line */#define CAPTION_DY 2*(2*4)+3#define COL_CAPTION_BLUE RGB(0,0x50,0xa0)#define COL_WHITE RGB(0xff,0xff,0xff)#define COL_BLACK RGB(0,0,0)#define COL_WINDOW_BG RGB(0xcc, 0xcc, 0xcc)#define COL_WINDOW_SHADOW RGB(0x40, 0x40, 0x40)#ifdef SVN_PRE_RELEASE_VER#define ABOUT_BG_COLOR RGB(255,0,0)#else#define ABOUT_BG_COLOR RGB(255,242,0)#endif#define FRAME_CLASS_NAME _T("SUMATRA_PDF_FRAME")#define CANVAS_CLASS_NAME _T("SUMATRA_PDF_CANVAS")#define ABOUT_CLASS_NAME _T("SUMATRA_PDF_ABOUT")#define SPLITER_CLASS_NAME _T("Spliter")#define FINDSTATUS_CLASS_NAME _T("FindStatus")#define PDF_DOC_NAME _T("Adobe PDF Document")#define ABOUT_WIN_TITLE _TR("About SumatraPDF")#define PREFS_FILE_NAME _T("sumatrapdfprefs.dat")#define APP_SUB_DIR _T("SumatraPDF")#define APP_NAME_STR "SumatraPDF"#define DEFAULT_INVERSE_SEARCH_COMMANDLINE _T("C:\\Program Files\\WinEdt Team\\WinEdt\\winedt.exe \"[Open(|%f|);SelPar(%l,8)]\"")/* Default size for the window, happens to be american A4 size (I think) */#define DEF_PAGE_DX 612#define DEF_PAGE_DY 792#define SPLITTER_DX 5#define REPAINT_TIMER_ID 1#define REPAINT_DELAY_IN_MS 400#define SMOOTHSCROLL_TIMER_ID 2#define SMOOTHSCROLL_DELAY_IN_MS 20#define SMOOTHSCROLL_SLOW_DOWN_FACTOR 10#define FIND_STATUS_WIDTH 200 // Default width for the find status window#define FIND_STATUS_MARGIN 8/* A special "pointer" vlaue indicating that we tried to render this bitmap but couldn't (e.g. due to lack of memory) */#define BITMAP_CANNOT_RENDER (RenderedBitmap*)NULL#define WS_REBAR (WS_CHILD | WS_CLIPCHILDREN | WS_BORDER | RBS_VARHEIGHT | \ RBS_BANDBORDERS | CCS_NODIVIDER | CCS_NOPARENTALIGN)#define MAX_RECENT_FILES_IN_MENU 15static FileHistoryList * gFileHistoryRoot = NULL;static HINSTANCE ghinst = NULL;TCHAR windowTitle[MAX_LOADSTRING];static WindowInfo* gWindowList;static HCURSOR gCursorArrow;static HCURSOR gCursorHand;static HCURSOR gCursorDrag;static HCURSOR gCursorIBeam;static HCURSOR gCursorScroll;static HBRUSH gBrushBg;static HBRUSH gBrushWhite;static HBRUSH gBrushShadow;static HBRUSH gBrushLinkDebug;static HPEN ghpenWhite;static HPEN ghpenBlue;static HBITMAP gBitmapCloseToc;//static AppVisualStyle gVisualStyle = VS_WINDOWS;static WCHAR * gBenchFileName;static int gBenchPageNum = INVALID_PAGE_NO;#ifdef DOUBLE_BUFFERstatic bool gUseDoubleBuffer = true;#elsestatic bool gUseDoubleBuffer = false;#endif#define MAX_PAGE_REQUESTS 8static PageRenderRequest gPageRenderRequests[MAX_PAGE_REQUESTS];static int gPageRenderRequestsCount = 0;static HANDLE gPageRenderThreadHandle;static HANDLE gPageRenderSem;static HANDLE gPageRenderClearQueue;static HANDLE gPageRenderQueueCleared;static PageRenderRequest * gCurPageRenderReq;static int gReBarDy;static int gReBarDyFrame;static int gToolbarSpacer = -1;static HWND gHwndAbout;static bool gRestrictedUse = false;#ifdef BUILD_RM_VERSION static bool gDeleteFileOnClose = false; // Delete the file which was passed into the program by command line.#endifSerializableGlobalPrefs gGlobalPrefs = { TRUE, // BOOL m_showToolbar FALSE, // BOOL m_pdfAssociateDontAskAgain TRUE, // BOOL m_pdfAssociateShouldAssociate#ifdef BUILD_RM_VERSION FALSE, // BOOL m_enableAutoUpdate#else TRUE,#endif ABOUT_BG_COLOR, // int m_bgColor FALSE, // BOOL m_escToExit NULL, // char *m_inverseSearchCmdLine NULL, // char *m_versionToSkip NULL, // char *m_lastUpdateTime#ifdef BUILD_RM_VERSION DM_CONTINUOUS, // DisplayMode m_defaultDisplayMode#else DM_SINGLE_PAGE,#endif DEFAULT_ZOOM, // double m_defaultZoom WIN_STATE_NORMAL, // int m_windowState DEFAULT_WIN_POS, // int m_windowPosX DEFAULT_WIN_POS, // int m_windowPosY DEFAULT_WIN_POS, // int m_windowDx DEFAULT_WIN_POS, // int m_windowDy DEFAULT_WIN_POS, // int m_tmpWindowPosX DEFAULT_WIN_POS, // int m_tmpWindowPosY DEFAULT_WIN_POS, // int m_tmpWindowDx DEFAULT_WIN_POS, // int m_tmpWindowDy 0 // int m_pdfsOpened};typedef struct ToolbarButtonInfo { /* information provided at compile time */ int bitmapResourceId; int cmdId; const char * toolTip; int flags; /* information calculated at runtime */ int index;} ToolbarButtonInfo;enum ToolbarButtonFlag { TBF_RESTRICTED = 0x1 };#define IDB_SEPARATOR -1#define IDB_SEPARATOR2 -2static ToolbarButtonInfo gToolbarButtons[] = { { IDB_SILK_OPEN, IDM_OPEN, _TRN("Open"), TBF_RESTRICTED, 0 }, { IDB_SEPARATOR, IDB_SEPARATOR, NULL, TBF_RESTRICTED, 0 }, { IDB_SILK_PREV, IDM_GOTO_PREV_PAGE, _TRN("Previous Page"), 0, 0 }, { IDB_SILK_NEXT, IDM_GOTO_NEXT_PAGE, _TRN("Next Page"), 0, 0 }, { IDB_SEPARATOR, IDB_SEPARATOR, NULL, 0, 0 }, { IDB_SILK_ZOOM_OUT, IDT_VIEW_ZOOMOUT, _TRN("Zoom Out"), 0, 0 }, { IDB_SILK_ZOOM_IN, IDT_VIEW_ZOOMIN, _TRN("Zoom In"), 0, 0 }, { IDB_SEPARATOR, IDB_SEPARATOR, NULL, 0, IDB_SEPARATOR }, { IDB_FIND_PREV, IDM_FIND_PREV, _TRN("Find Previous"), 0, 0 }, { IDB_FIND_NEXT, IDM_FIND_NEXT, _TRN("Find Next"), 0, 0 }, { IDB_FIND_MATCH, IDM_FIND_MATCH, _TRN("Match case"), 0, 0 }, { IDB_SEPARATOR, IDB_SEPARATOR, NULL, 0, IDB_SEPARATOR2 },};#define DEFAULT_LANGUAGE "en"#define TOOLBAR_BUTTONS_COUNT dimof(gToolbarButtons)static const char *g_currLangName;static void CreateToolbar(WindowInfo *win, HINSTANCE hInst);static void CreateTocBox(WindowInfo *win, HINSTANCE hInst);static void RebuildProgramMenus(void);static void UpdateToolbarFindText(WindowInfo *win);static void UpdateToolbarPageText(WindowInfo *win);static void UpdateToolbarToolText(void);static void OnMenuFindMatchCase(WindowInfo *win);static bool RefreshPdfDocument(const WCHAR *fileName, WindowInfo *win, DisplayState *state, bool reuseExistingWindow, bool autorefresh, bool showWin);static void WindowInfo_ShowMessage_Asynch(WindowInfo *win, const wchar_t *message, bool resize);void Find(HWND hwnd, WindowInfo *win, PdfSearchDirection direction = FIND_FORWARD);void WindowInfo_EnterFullscreen(WindowInfo *win);#define SEP_ITEM "-----"/* according to http://wiki.snap.com/index.php/User_talk:Snap, Serbian (latin) should be sp-rs and Serbian (Cyrillic) should be sr-rs */#include "LangMenuDef.h"// based on http://msdn2.microsoft.com/en-us/library/ms776260.aspxstatic const char *g_lcidLangMap[] = { "en", "0409", NULL, // English "pl", "0415", NULL, // Polish "fr", "080c", "0c0c", "040c", "140c", "180c", "100c", NULL, // French "de", "0407", "0c07", "1407", "1007", "0807", NULL, // German "tr", "041f", NULL, // Turkish "by", "0423", NULL, // Belarusian "ja", "0411", NULL, // Japanese "hu", "040e", NULL, // Hungarian "fa", "0429", NULL, // Persian "dk", "0406", NULL, // Danish "it", "0410", NULL, // Italian "nl", "0813", "0413", NULL, // Dutch "ta", "0449", NULL, // Tamil "es", "0c0a", "040a", "500a", "280a", "3c0a", "180a", "080a", "2c0a", NULL, // Spanish "hr", "101a", "041a", NULL, // Croatian "ru", "0419", NULL, // Russian "ar", "1401", "3c01", "0c01", "0801", "2c01", "3401", "3001", "1001", "1801", "2001", "4001", "0401", "2801", "1c01", "3801", "2401", NULL, // Arabic "cn", NULL, // Chinese Simplified "sv", "081d", "041d", NULL, // Swedish "cz", "0405", NULL, // Czech "gr", "0408", NULL, // Greek "th", "041e", NULL, // Thai "pt", "0816", NULL, // Portuguese (Portugal) "br", "0416", NULL, // Portuguese (Brazillian) "no", "0414", "0814", NULL, // Norwegian "sk", "041b", NULL, // Slovak "vn", "042a", NULL, // Vietnamese "lt", NULL, NULL, // Lithuanian "my", NULL, NULL, // Malaysian "fi", NULL, NULL, // Finnish "ca", NULL, NULL, // Catalan "si", NULL, NULL, // Slovenian "tw", NULL, NULL, // Chinese Traditional "ml", NULL, NULL, // Malayalam "he", NULL, NULL, // Hebrew "sp-rs", NULL, NULL, // Serbian (Latin) "id", NULL, NULL, // Indonesian "mk", NULL, NULL, // Macedonian "ro", NULL, NULL, // Romanian "sr-rs", NULL, NULL, // Serbian (Cyrillic) "kr", NULL, NULL, // Korean "gl", NULL, NULL, // Galician "bg", NULL, NULL, // Bulgarian "uk", NULL, NULL, // Ukrainian NULL};const char* CurrLangNameGet() { if (!g_currLangName) return DEFAULT_LANGUAGE; return g_currLangName;}bool CurrLangNameSet(const char* langName) { bool validLang = false; for (int i=0; i < LANGS_COUNT; i++) { if (str_eq(langName, g_langs[i]._langName)) { validLang = true; break; } } if (!validLang) return false; free((void*)g_currLangName); g_currLangName = str_dup(langName); bool ok = Translations_SetCurrentLanguage(langName); assert(ok); return true;}static void CurrLangNameFree() { free((void*)g_currLangName); g_currLangName = NULL;}static const char *GetLangFromLcid(const char *lcid){ const char *lang; const char *langLcid; int i = 0; for (;;) { lang = g_lcidLangMap[i++]; if (NULL == lang) return NULL; for (;;) { langLcid = g_lcidLangMap[i++]; if (NULL == langLcid) break; if (str_eq(lcid, langLcid)) return lang; } } assert(0); return NULL;}static void GuessLanguage(){ char langBuf[20]; int res = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ILANGUAGE, langBuf, sizeof(langBuf)); assert(0 != res); if (0 == res) return; const char *lang = GetLangFromLcid((const char*)&langBuf[0]); if (NULL != lang) CurrLangNameSet(lang);}/* Convert FILETIME to a string. Caller needs to free() the result. */char *FileTimeToStr(FILETIME* ft){ return mem_to_hexstr((unsigned char*)ft, sizeof(*ft));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -