📄 mgjs_main.cpp
字号:
eventType = mgjsDOMEvent::MOUSEOVER; break; case WINDOWEVENTOWNER_ONMOUSEOUT: eventType = mgjsDOMEvent::MOUSEOUT; break; case WINDOWEVENTOWNER_ONKEYDOWN: eventType = mgjsDOMEvent::KEYDOWN; break; case WINDOWEVENTOWNER_ONKEYUP: eventType = mgjsDOMEvent::KEYUP; break; case WINDOWEVENTOWNER_ONKEYPRESS: eventType = mgjsDOMEvent::KEYPRESS; break; case WINDOWEVENTOWNER_ONMOUSEMOVE: eventType = mgjsDOMEvent::MOUSEMOVE; break; case WINDOWEVENTOWNER_ONFOCUS: eventType = mgjsDOMEvent::FOCUS; break; case WINDOWEVENTOWNER_ONBLUR: eventType = mgjsDOMEvent::BLUR; break; case WINDOWEVENTOWNER_ONSUBMIT: eventType = mgjsDOMEvent::SUBMIT; break; case WINDOWEVENTOWNER_ONRESET: eventType = mgjsDOMEvent::RESET; break; case WINDOWEVENTOWNER_ONCHANGE: eventType = mgjsDOMEvent::CHANGE; break; case WINDOWEVENTOWNER_ONSELECT: eventType = mgjsDOMEvent::SELECT; break; case WINDOWEVENTOWNER_ONUNLOAD: eventType = mgjsDOMEvent::UNLOAD; break; case WINDOWEVENTOWNER_ONCLOSE:// eventType = mgjsDOMEvent::CLOSE; break; case WINDOWEVENTOWNER_ONABORT: eventType = mgjsDOMEvent::ABORT; break; case WINDOWEVENTOWNER_ONERROR: eventType = mgjsDOMEvent::ERROR; break; case WINDOWEVENTOWNER_ONPAINT:// eventType = mgjsDOMEvent::PAINT; break; case WINDOWEVENTOWNER_ONDRAGDROP: eventType = mgjsDOMEvent::DRAGDROP; break; case WINDOWEVENTOWNER_ONRESIZE: eventType = mgjsDOMEvent::RESIZE; break; case WINDOWEVENTOWNER_ONSCROLL: eventType = mgjsDOMEvent::SCROLL; break; } if(eventType)return mgJsSetEvent(cx,obj,vp,eventType); } }//endof:switch }//endof:if return JS_TRUE;}static JSBool WindowScrollTo (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ HWND hWnd=mgJSGethWnd(cx); int x, y,w,h; RECT rc; x = JSVAL_TO_INT(argv[0]); y = JSVAL_TO_INT(argv[1]); GetWindowRect (hWnd,&rc); w=rc.right-rc.left; h=rc.bottom-rc.top; MoveWindow (hWnd,x,y,w,h,true); return JS_TRUE;}static JSBool WindowScrollBy (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ HWND hWnd=mgJSGethWnd(cx); int iOffx, iOffy;RECT rc1, rc2; GetWindowRect (hWnd,&rc1); rc2=rc1; iOffx = JSVAL_TO_INT(argv[0]); iOffy = JSVAL_TO_INT(argv[1]); ScrollWindow (hWnd, iOffx, iOffy, &rc1,NULL); return JS_TRUE;} static JSBool WindowGetSelection(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ //TODO: return JS_TRUE;}static JSBool WindowScrollByLines(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return JS_TRUE;}static JSBool WindowInternalDump(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ //TODO: return JS_TRUE;}static JSBool WindowScrollByPages(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return JS_TRUE;}static JSBool WindowInternalAlert (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString* text; HWND hWnd=mgJSGethWnd(cx); if(argc<1)return JS_FALSE; if (!(text = JS_ValueToString (cx, argv[0]))) return JS_FALSE; MessageBox (hWnd, JS_GetStringBytes (text), MGJS_TEXT_BROWSER, MB_OK | MB_ICONEXCLAMATION); return JS_TRUE;} static JSBool WindowInternalConfirm (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSString* text; HWND hWnd=mgJSGethWnd(cx); if(argc<1)return JS_FALSE; if (!(text = JS_ValueToString (cx, argv[0]))) return JS_FALSE; if (MessageBox (hWnd, JS_GetStringBytes (text),MGJS_TEXT_BROWSER, MB_YESNO | MB_ICONQUESTION) == IDYES) { *rval = BOOLEAN_TO_JSVAL (TRUE); } else *rval = BOOLEAN_TO_JSVAL (FALSE); return JS_TRUE;}static JSBool WindowInternalPrompt(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ char* entry; JSString* prompt; JSString* text; int ret; HWND hWnd=mgJSGethWnd(cx); myWINENTRY entries [] = { { " ", &entry, 0, 0 }, { NULL, NULL, 0, 0 } }; myWINBUTTON buttons[] = { { "OK", IDOK, BS_DEFPUSHBUTTON }, { "Cancel", IDCANCEL, BS_PUSHBUTTON }, { NULL, 0, 0} }; if(argc<2)return JS_FALSE; if (!(prompt = JS_ValueToString (cx, argv[0]))) return JS_FALSE; if (!(text = JS_ValueToString (cx, argv[1]))) return JS_FALSE; entry = JS_GetStringBytes (text); ret = myWinEntries(hWnd, MGJS_TEXT_BROWSER, JS_GetStringBytes (prompt), 10, 10, FALSE, entries, buttons); if (ret == IDOK && entry) *rval = STRING_TO_JSVAL (JS_NewStringCopyZ (cx, entry)); else *rval = STRING_TO_JSVAL (JS_NewStringCopyZ (cx, "")); free (entry); return JS_TRUE;}static JSBool WindowInternalOpen(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ MGHTMLView *view = mgJSGetView(cx); char url[TEMPSTRINGMAX+1],strWndName[TEMPSTRINGMAX+1],strFeatureList[TEMPSTRINGMAX+1]; JSString* jss; url[0] = 0; strWndName[0] = 0; strFeatureList[0] = 0; if(argc<1)goto fail; if ((jss = JS_ValueToString (cx, argv[0]))) strncpy(url,JS_GetStringBytes (jss),TEMPSTRINGMAX); else goto fail; if(argc>=2){ if ((jss = JS_ValueToString (cx, argv[1]))) strncpy(strWndName,JS_GetStringBytes (jss),TEMPSTRINGMAX); } if(argc>=3){ if ((jss = JS_ValueToString (cx, argv[2]))) strncpy(strFeatureList,JS_GetStringBytes (jss),TEMPSTRINGMAX); } view->setURL( url );// SendNotifyMessage(view->getHwnd(), MSG_OPENURL, 0 ,0); return JS_TRUE;fail: return JS_FALSE; }static JSBool WindowInternalClose(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ //TODO: it seems nothing to do. return JS_TRUE;}static JSBool WindowInternalSetTimeout(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ MGHTMLView *view = mgJSGetView(cx); // HWND hWnd=mgJSGethWnd(cx); int speed,expLength; char expression[TEMPSTRINGMAX+1]; JSString *jss; // jsval jval; expression[0]=0; if(argc<2)return JS_FALSE; //TODO: arg[2]..arg[n] are expression's arguments. if ((jss = JS_ValueToString (cx, argv[0]))) strncpy(expression,JS_GetStringBytes (jss),TEMPSTRINGMAX); expLength=strlen(expression); speed = JSVAL_TO_INT(argv[1]); if(!(SetTimer(view->getParent(),view->m_JsTimerId,speed))) { return JS_FALSE; } JsTimerStruct *aJsTimer=new JsTimerStruct; if(!aJsTimer) return JS_FALSE; *rval=INT_TO_JSVAL(view->m_JsTimerId); aJsTimer->id = view->m_JsTimerId++; aJsTimer->exp =(char*) malloc( sizeof(char) * (expLength+1) ); if(aJsTimer->exp == NULL) return JS_FALSE; aJsTimer->exp[expLength] = 0; aJsTimer->expLength = expLength; strncpy(aJsTimer->exp,expression,expLength); view->m_JsTimer.append(aJsTimer); return JS_TRUE;}static JSBool WindowInternalClearTimeout(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ MGHTMLView *view = mgJSGetView(cx); JsTimerStruct *aJsTimer; char *exp; int id; if(argc<1)return JS_FALSE; id = JSVAL_TO_INT(argv[0]); if(mgJsLocateTimer(view,id)) { aJsTimer = view->m_JsTimer.current(); KillTimer(view->getParent(),id); view->m_JsTimer.remove(); exp = aJsTimer->exp; free(aJsTimer); free(exp); } return JS_TRUE;}bool mgJsLocateTimer(MGHTMLView* view,int id){ bool bFind=0; JsTimerStruct *aJsTimer; if(!view)return 0; for(aJsTimer=view->m_JsTimer.first();aJsTimer!=0;aJsTimer=view->m_JsTimer.next()) if(aJsTimer->id==id) { bFind=1;break; } return bFind;}bool mgJsFreeAllTimer(MGHTMLView* view){ JsTimerStruct *aJsTimer; char *exp; if(!view)return 0; for(aJsTimer=view->m_JsTimer.first();aJsTimer!=0;aJsTimer=view->m_JsTimer.next()) { KillTimer(view->getParent(),aJsTimer->id); exp = aJsTimer->exp; free(aJsTimer); free(exp); } view->m_JsTimer.setAutoDelete(0); view->m_JsTimer.clear(); return TRUE;}bool TimerEvaluateJavaScript(JSContext** jsc,JSObject** jso,MGHTMLView* view,int id){ char exp[TEMPSTRINGMAX+1]; QString qs; JsTimerStruct *aJsTimer; if(!mgJsLocateTimer(view,id)) return FALSE; aJsTimer = view->m_JsTimer.current(); strncpy(exp,aJsTimer->exp,TEMPSTRINGMAX); exp[TEMPSTRINGMAX] = 0; qs = (const char * ) exp; return EvaluateJavaScript(qs,jsc,jso,0);}JSBool mgJsSetEvent(JSContext *cx, JSObject *obj, jsval *vp, int EventType){ MGHTMLView *view = mgJSGetView(cx); JsEventStruct *aJsEvent; if( mgJsLocateEvent(view,EventType) ) mgJsFreeCurrentEvent(view); aJsEvent=new JsEventStruct; if( !aJsEvent ) return JS_FALSE; aJsEvent->type=EventType; aJsEvent->value=*vp; view->m_JsEvent.append(aJsEvent); return JS_TRUE;}bool mgJsLocateEvent(MGHTMLView* view,int type){ bool bFind=0; JsEventStruct *aJsEvent; if(!view)return 0; for(aJsEvent=view->m_JsEvent.first();aJsEvent!=0;aJsEvent=view->m_JsEvent.next()) if(aJsEvent->type==type) { bFind=1;break; } return bFind;}bool mgJsFreeCurrentEvent(MGHTMLView* view){ JsEventStruct *aJsEvent; if(!view)return FALSE; aJsEvent=view->m_JsEvent.current(); if(!aJsEvent)return FALSE; view->m_JsEvent.remove(); free(aJsEvent); return TRUE;}bool mgJsFreeAllEvent(MGHTMLView* view){ JsEventStruct *aJsEvent; if(!view)return 0; for(aJsEvent=view->m_JsEvent.first();aJsEvent!=0;aJsEvent=view->m_JsEvent.next()) { free(aJsEvent); } view->m_JsEvent.setAutoDelete(0); view->m_JsEvent.clear(); return TRUE;}bool EventEvaluateJavaScript(JSContext** jsc,JSObject** jso,MGHTMLView* view){ JsEventStruct *aJsEvent; uintN argc; jsval argv; jsval rval; JSBool jsb; JSFunction *jsf; if(!view->m_JsEventType) return TRUE; if(!mgJsLocateEvent(view,view->m_JsEventType)) return FALSE; aJsEvent = view->m_JsEvent.current(); jsf=JS_ValueToFunction(*jsc,aJsEvent->value); if(jsf==NULL) return FALSE; argc=1; argv=OBJECT_TO_JSVAL(mgJSGetEventObj(*jsc)); jsb=JS_CallFunction(*jsc,*jso,jsf,argc,&argv,&rval); view->m_JsEventType = 0; return (jsb==JS_TRUE);}static JSBool WindowInternalBlur(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return JS_TRUE;}static JSBool WindowInternalFocus(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -