void IGUIObject::RegisterScriptHandler(const CStr& Action, const CStr& Code, CGUI* pGUI) { if(!GetGUI()) throw PSERROR_GUI_OperationNeedsGUIObject(); JSContext* cx = pGUI->GetScriptInterface()->GetContext(); JSAutoRequest rq(cx); JS::RootedValue globalVal(cx, pGUI->GetGlobalObject()); JS::RootedObject globalObj(cx, &globalVal.toObject()); const int paramCount = 1; const char* paramNames[paramCount] = { "mouse" }; // Location to report errors from CStr CodeName = GetName()+" "+Action; // Generate a unique name static int x = 0; char buf[64]; sprintf_s(buf, ARRAY_SIZE(buf), "__eventhandler%d (%s)", x++, Action.c_str()); JS::CompileOptions options(cx); options.setFileAndLine(CodeName.c_str(), 0); options.setCompileAndGo(true); JS::RootedFunction func(cx, JS_CompileFunction(cx, globalObj, buf, paramCount, paramNames, Code.c_str(), Code.length(), options)); if (!func) return; // JS will report an error message JS::RootedObject funcObj(cx, JS_GetFunctionObject(func)); SetScriptHandler(Action, funcObj); }
nsresult nsCommandHandler::GetCommandHandler(nsICommandHandler **aCommandHandler) { NS_ENSURE_ARG_POINTER(aCommandHandler); *aCommandHandler = nsnull; if (mWindow == nsnull) { return NS_ERROR_FAILURE; } nsCOMPtr<nsIScriptGlobalObject> globalObj( do_QueryInterface(mWindow) ); if (!globalObj) { return NS_ERROR_FAILURE; } // Get the document tree owner nsCOMPtr<nsIDocShellTreeItem> docShellAsTreeItem = do_QueryInterface(globalObj->GetDocShell()); nsIDocShellTreeOwner *treeOwner = nsnull; docShellAsTreeItem->GetTreeOwner(&treeOwner); // Make sure the tree owner is an an nsDocShellTreeOwner object // by QI'ing for a hidden interface. If it doesn't have the interface // then it's not safe to do the casting. nsCOMPtr<nsICDocShellTreeOwner> realTreeOwner(do_QueryInterface(treeOwner)); if (realTreeOwner) { nsDocShellTreeOwner *tree = NS_STATIC_CAST(nsDocShellTreeOwner *, treeOwner); if (tree->mTreeOwner) { nsresult rv; rv = tree->mTreeOwner->QueryInterface(NS_GET_IID(nsICommandHandler), (void **)aCommandHandler); NS_RELEASE(treeOwner); return rv; } NS_RELEASE(treeOwner); } *aCommandHandler = nsnull; return NS_OK; }
///---------------------------------------------------------------------- /// BGを描画する void timeline_draw_bg(tTJSVariant item, tTJSVariant view, tjs_int y, tjs_int fromTime, tjs_int toTime) { ncbPropAccessor itemObj(item); ncbPropAccessor viewObj(view); ncbPropAccessor rootObj(itemObj.GetValue(L"root", ncbTypedefs::Tag<tTJSVariant>(), 0, &rootHint)); ncbPropAccessor ownerObj(rootObj.GetValue(L"owner", ncbTypedefs::Tag<tTJSVariant>(), 0, &ownerHint)); tjs_int fps = ownerObj.GetValue(L"framePerSecond", ncbTypedefs::Tag<tjs_int>(), 0 ,&framePerSecondHint); iTJSDispatch2 *global = TVPGetScriptDispatch(); ncbPropAccessor globalObj(global); global->Release(); tjs_int TIMELINE_FRAME_WIDTH = itemObj.GetValue(L"TIMELINE_FRAME_WIDTH", ncbTypedefs::Tag<tjs_int>(), 0, &timeLineFrameWidthHint); tjs_int TIMELINE_FRAME_HEIGHT = globalObj.GetValue(L"TIMELINE_FRAME_HEIGHT", ncbTypedefs::Tag<tjs_int>(), 0, &timelineFrameHeightHint); tTJSVariant oneSecondFrameBgLayer, halfSecondFrameBgLayer, fifthFrameBgLayer, normalFrameBgLayer; // バックグラウンドを描画 for (tjs_int time = fromTime; time < toTime; time ++) { tjs_int x = time * TIMELINE_FRAME_WIDTH; tTJSVariant layer; if (time % fps == 0) { if (oneSecondFrameBgLayer.Type() == tvtVoid) oneSecondFrameBgLayer = viewObj.GetValue(L"oneSecondFrameBgLayer", ncbTypedefs::Tag<tTJSVariant>(), 0, &oneSecondFrameBgLayerHint); layer = oneSecondFrameBgLayer; } else if (time % fps * 2 == fps) { if (halfSecondFrameBgLayer.Type() == tvtVoid) halfSecondFrameBgLayer = viewObj.GetValue(L"halfSecondFrameBgLayer", ncbTypedefs::Tag<tTJSVariant>(), 0, &halfSecondFrameBgLayerHint); layer = halfSecondFrameBgLayer; } else if (time % 5 == 0) { if (fifthFrameBgLayer.Type() == tvtVoid) fifthFrameBgLayer = viewObj.GetValue(L"fifthFrameBgLayer", ncbTypedefs::Tag<tTJSVariant>(), 0, &fifthFrameBgLayerHint); layer = fifthFrameBgLayer; } else { if (normalFrameBgLayer.Type() == tvtVoid) normalFrameBgLayer = viewObj.GetValue(L"normalFrameBgLayer", ncbTypedefs::Tag<tTJSVariant>(), 0, &normalFrameBgLayerHint); layer = normalFrameBgLayer; } viewObj.FuncCall(0, L"copyRect", ©RectHint, NULL, x, y, layer, 0, 0, TIMELINE_FRAME_WIDTH, TIMELINE_FRAME_HEIGHT); } }
///---------------------------------------------------------------------- // タイムラインを描画する void timeline_draw_timeline(tTJSVariant item, tTJSVariant view, tjs_int fromTime, tjs_int toTime) { ncbPropAccessor itemObj(item); ncbPropAccessor viewObj(view); tTJSVariant layer = itemObj.GetValue(L"layer", ncbTypedefs::Tag<tTJSVariant>(), 0, &layerHint); ncbPropAccessor layerObj(layer); iTJSDispatch2 *global = TVPGetScriptDispatch(); ncbPropAccessor globalObj(global); global->Release(); tjs_int y = layerObj.GetValue(L"top", ncbTypedefs::Tag<tjs_int>(), 0, &topHint); tTJSVariant frameList = itemObj.GetValue(L"frameList", ncbTypedefs::Tag<tTJSVariant>(), 0, &frameListHint); ncbPropAccessor frameListObj(frameList); tjs_int frameListCount = frameListObj.GetArrayCount(); // 描画範囲を確定 tjs_int fromFrame = timeline_find_frame(frameList, fromTime, true); tjs_int toFrame = timeline_find_frame(frameList, toTime, true); // バックグラウンドを描画 if (fromFrame < 0 && toFrame < 0) { timeline_draw_bg(item, view, y, fromTime, toTime); } else { if (fromFrame < 0) timeline_draw_bg(item, view, y, fromTime, ncbPropAccessor(frameListObj.GetValue(0, ncbTypedefs::Tag<tTJSVariant>())).GetValue(L"time", ncbTypedefs::Tag<tjs_int>(), 0, &timeHint)); if (toFrame == frameListCount - 1) timeline_draw_bg(item, view, y, ncbPropAccessor(frameListObj.GetValue(-1, ncbTypedefs::Tag<tTJSVariant>())).GetValue(L"time", ncbTypedefs::Tag<tjs_int>(), 0, &timeHint), toTime); } // フレームを描画 for (tjs_int i = fromFrame; i <= toFrame; i++) { if (i == -1) continue; tTJSVariant frame = frameListObj.GetValue(i, ncbTypedefs::Tag<tTJSVariant>()); ncbPropAccessor frameObj(frame); tjs_int headTime, tailTime; headTime = frameObj.GetValue(L"time", ncbTypedefs::Tag<tjs_int>(), 0, &timeHint); if (i < frameListCount - 1) { tTJSVariant nextFrame = frameListObj.GetValue(i + 1, ncbTypedefs::Tag<tTJSVariant>()); ncbPropAccessor nextFrameObj(nextFrame); tailTime = nextFrameObj.GetValue(L"time", ncbTypedefs::Tag<tjs_int>(), 0, &timeHint); } else tailTime = headTime; if (! (tailTime < fromTime || headTime > toTime)) { itemObj.FuncCall(0, L"drawFrame", &drawFrameHint, NULL, view, y, frame, tailTime - headTime); } } // 選択範囲描画 tTJSVariant selection = itemObj.GetValue(L"selection", ncbTypedefs::Tag<tTJSVariant>(), 0, &selectionHint); if (selection.Type() != tvtVoid) { tjs_int TIMELINE_FRAME_WIDTH = itemObj.GetValue(L"TIMELINE_FRAME_WIDTH", ncbTypedefs::Tag<tjs_int>(), 0, &timeLineFrameWidthHint); tjs_int TIMELINE_FRAME_HEIGHT = globalObj.GetValue(L"TIMELINE_FRAME_HEIGHT", ncbTypedefs::Tag<tjs_int>(), 0, &timelineFrameHeightHint); ncbPropAccessor selectionObj(selection); viewObj.FuncCall(0, L"colorRect", &colorRectHint, NULL, selectionObj.getIntValue(0) * TIMELINE_FRAME_WIDTH, y, (selectionObj.getIntValue(1) - selectionObj.getIntValue(0)) * TIMELINE_FRAME_WIDTH, TIMELINE_FRAME_HEIGHT, selectionObj.getIntValue(2) ? 0xFF0000 : 0, 128); } }
///---------------------------------------------------------------------- /// フレームを描画する void timeline_draw_frame(tTJSVariant item, tTJSVariant view, tjs_int y, tTJSVariant frame, tjs_int length, tjs_uint markerMask) { ncbPropAccessor itemObj(item); ncbPropAccessor viewObj(view); ncbPropAccessor frameObj(frame); iTJSDispatch2 *global = TVPGetScriptDispatch(); ncbPropAccessor globalObj(global); global->Release(); tjs_int WIN_DARKEN2 = globalObj.GetValue(L"WIN_DARKEN2", ncbTypedefs::Tag<tjs_uint>(), 0, &winDarken2Hint); tjs_int TIMELINE_FRAME_WIDTH = itemObj.GetValue(L"TIMELINE_FRAME_WIDTH", ncbTypedefs::Tag<tjs_int>(), 0, &timeLineFrameWidthHint); tjs_int TIMELINE_FRAME_HEIGHT = globalObj.GetValue(L"TIMELINE_FRAME_HEIGHT", ncbTypedefs::Tag<tjs_int>(), 0, &timelineFrameHeightHint); tjs_int frameType = frameObj.GetValue(L"type", ncbTypedefs::Tag<tjs_int>(), 0, &typeHint); tjs_int frameTime = frameObj.GetValue(L"time", ncbTypedefs::Tag<tjs_int>(), 0, &timeHint); switch (frameType) { case TIMELINE_FRAME_TYPE_NULL: timeline_draw_bg(item, view, y, frameTime, frameTime + length); return; case TIMELINE_FRAME_TYPE_SINGLE: { timeline_draw_bg(item, view, y, frameTime + 1, frameTime + length); tjs_int singleFrameLeftColor = itemObj.GetValue(L"_singleFrameLeftColor", ncbTypedefs::Tag<tjs_int>(), 0, &_singleFrameLeftColorHint); tjs_int singleFrameRightColor = itemObj.GetValue(L"_singleFrameRightColor", ncbTypedefs::Tag<tjs_int>(), 0, &_singleFrameRightColorHint); singleFrameLeftColor |= 0xFF000000; singleFrameRightColor |= 0xFF000000; viewObj.FuncCall(0, L"fillGradientRectLR", &fillGradientRectLRHint, NULL, frameTime * TIMELINE_FRAME_WIDTH, y, TIMELINE_FRAME_WIDTH - 1, TIMELINE_FRAME_HEIGHT - 1, singleFrameLeftColor, singleFrameRightColor); return; } case TIMELINE_FRAME_TYPE_CONTINUOUS: case TIMELINE_FRAME_TYPE_TWEEN: { tjs_int leftColor, rightColor; if (frameType == TIMELINE_FRAME_TYPE_CONTINUOUS) { leftColor = itemObj.GetValue(L"_continuousFrameLeftColor", ncbTypedefs::Tag<tjs_int>(), 0, &_continuousFrameLeftColorHint); rightColor = itemObj.GetValue(L"_continuousFrameRightColor", ncbTypedefs::Tag<tjs_int>(), 0, &_continuousFrameRightColorHint); } else { leftColor = itemObj.GetValue(L"_tweenFrameLeftColor", ncbTypedefs::Tag<tjs_int>(), 0, &_tweenFrameLeftColorHint); rightColor = itemObj.GetValue(L"_tweenFrameRightColor", ncbTypedefs::Tag<tjs_int>(), 0, &_tweenFrameRightColorHint); } leftColor |= 0xFF000000; rightColor |= 0xFF000000; // BG描画 viewObj.FuncCall(0, L"fillRect", &fillRectHint, NULL, (frameTime + length) * TIMELINE_FRAME_WIDTH - 1, y, 1, TIMELINE_FRAME_HEIGHT, WIN_DARKEN2); viewObj.FuncCall(0, L"fillRect", &fillRectHint, NULL, frameTime * TIMELINE_FRAME_WIDTH, y + TIMELINE_FRAME_HEIGHT - 1, length * TIMELINE_FRAME_WIDTH, 1, WIN_DARKEN2); viewObj.FuncCall(0, L"fillGradientRectLR", &fillGradientRectLRHint, NULL, frameTime * TIMELINE_FRAME_WIDTH, y, length * TIMELINE_FRAME_WIDTH - 1, TIMELINE_FRAME_HEIGHT - 1, leftColor, rightColor); bool leftMarker = (markerMask & TIMELINE_MARKER_MASK_LEFT) != 0; bool rightMarker = (markerMask & TIMELINE_MARKER_MASK_RIGHT) != 0; if (rightMarker && leftMarker && length == 1) rightMarker = false; // 左マーカー描画 if (leftMarker) { tTJSVariant frameLeftMarkerLayer = viewObj.GetValue(L"frameLeftMarkerLayer", ncbTypedefs::Tag<tTJSVariant>(), 0, &frameLeftMarkerLayerHint); ncbPropAccessor frameLeftMarkerLayerObj(frameLeftMarkerLayer); tjs_int mw = frameLeftMarkerLayerObj.GetValue(L"width", ncbTypedefs::Tag<tjs_int>(), 0, &widthHint); tjs_int mh = frameLeftMarkerLayerObj.GetValue(L"height", ncbTypedefs::Tag<tjs_int>(), 0, &heightHint); viewObj.FuncCall(0, L"operateRect", &operateRectHint, NULL, frameTime * TIMELINE_FRAME_WIDTH, y, frameLeftMarkerLayer, 0, 0, mw, mh); } // 右マーカー描画 if (rightMarker) { tTJSVariant frameRightMarkerLayer = viewObj.GetValue(L"frameRightMarkerLayer", ncbTypedefs::Tag<tTJSVariant>(), 0, &frameRightMarkerLayerHint); ncbPropAccessor frameRightMarkerLayerObj(frameRightMarkerLayer); tjs_int mw = frameRightMarkerLayerObj.GetValue(L"width", ncbTypedefs::Tag<tjs_int>(), 0, &widthHint); tjs_int mh = frameRightMarkerLayerObj.GetValue(L"height", ncbTypedefs::Tag<tjs_int>(), 0, &heightHint); viewObj.FuncCall(0, L"operateRect", &operateRectHint, NULL, (frameTime + length) * TIMELINE_FRAME_WIDTH - mw, y, frameRightMarkerLayer, 0, 0, mw, mh); } // トゥイーンの破線描画 tjs_int fromTime = frameTime + (leftMarker ? 1 : 0), toTime = frameTime + length - (rightMarker ? 1 : 0); if (frameType == TIMELINE_FRAME_TYPE_TWEEN) { tTJSVariant dashLineApp = viewObj.GetValue(L"dashLineApp", ncbTypedefs::Tag<tTJSVariant>(), 0, &dashLineAppHint); if (dashLineApp.Type() != tvtVoid) { viewObj.FuncCall(0, L"drawLine", &drawLineHint, NULL, dashLineApp, fromTime * TIMELINE_FRAME_WIDTH, y + TIMELINE_FRAME_HEIGHT / 2 - 1, toTime * TIMELINE_FRAME_WIDTH, y + TIMELINE_FRAME_HEIGHT / 2 - 1); } else { for (tjs_int i = fromTime; i < toTime; i++) { viewObj.FuncCall(0, L"fillRect", &fillRectHint, NULL, i * TIMELINE_FRAME_WIDTH, y + TIMELINE_FRAME_HEIGHT / 2 - 1, TIMELINE_FRAME_WIDTH / 2 - 2, 1, WIN_DARKEN2); viewObj.FuncCall(0, L"fillRect", &fillRectHint, NULL, i * TIMELINE_FRAME_WIDTH + TIMELINE_FRAME_WIDTH / 2, y + TIMELINE_FRAME_HEIGHT / 2 - 1, TIMELINE_FRAME_WIDTH / 2 - 2, 1, WIN_DARKEN2); } } } // フレーム数描画 if (length > 2) { tTJSVariant canvas = viewObj.GetValue(L"canvas", ncbTypedefs::Tag<tTJSVariant>(), 0, &canvasHint); ncbPropAccessor canvasObj(canvas); tjs_int fontHeight = TIMELINE_FRAME_HEIGHT - 4; canvasObj.SetValue(L"fontHeight", fontHeight, 0, &fontHeightHint); ttstr text(length); tTJSVariant textWidth; tTJSVariant font = canvasObj.GetValue(L"font", ncbTypedefs::Tag<tTJSVariant>(), 0, &fontHint); ncbPropAccessor fontObj(font); fontObj.FuncCall(0, L"getTextWidth", &getTextWidthHint, &textWidth, text); tjs_int l = frameTime * TIMELINE_FRAME_WIDTH + ((length * TIMELINE_FRAME_WIDTH) - tjs_int(textWidth)) / 2; tjs_int t = y + int((TIMELINE_FRAME_HEIGHT - fontHeight) / 2) - 1; viewObj.FuncCall(0, L"setClip", &setClipHint, NULL, l - 1, t - 1, tjs_int(textWidth) + 2, fontHeight + 2); viewObj.FuncCall(0, L"fillGradientRectLR", &fillGradientRectLRHint, NULL, frameTime * TIMELINE_FRAME_WIDTH, y, length * TIMELINE_FRAME_WIDTH - 1, TIMELINE_FRAME_HEIGHT - 1, leftColor, rightColor); viewObj.FuncCall(0, L"setClip", &setClipHint, NULL); viewObj.FuncCall(0, L"drawText", &drawTextHint, NULL, l, t, text, tjs_int(WIN_DARKEN2 & 0xFFFFFF)); } return; } } }