зеркало из https://github.com/mozilla/pjs.git
259 строки
6.2 KiB
C
259 строки
6.2 KiB
C
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
|
|
/*
|
|
* JS event class.
|
|
*/
|
|
#include "lm.h"
|
|
#include "lo_ele.h"
|
|
#include "pa_tags.h"
|
|
#include "xp.h"
|
|
#include "prtypes.h"
|
|
|
|
typedef enum JSBarType {
|
|
JSBAR_MENU, JSBAR_TOOL, JSBAR_LOCATION, JSBAR_PERSONAL, JSBAR_STATUS,
|
|
JSBAR_SCROLL
|
|
} JSBarType;
|
|
|
|
const char *barnames[] = {
|
|
"menubar", "toolbar", "locationbar", "personalbar", "statusbar",
|
|
"scrollbars"
|
|
};
|
|
|
|
typedef struct JSBar {
|
|
MochaDecoder *decoder;
|
|
JSBarType bartype;
|
|
} JSBar;
|
|
|
|
enum bar_tinyid {
|
|
BAR_VISIBLE = -1
|
|
};
|
|
|
|
static JSPropertySpec bar_props[] = {
|
|
{"visible" , BAR_VISIBLE, JSPROP_ENUMERATE},
|
|
{0}
|
|
};
|
|
|
|
extern JSClass lm_bar_class;
|
|
|
|
PR_STATIC_CALLBACK(JSBool)
|
|
bar_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
|
{
|
|
JSBar * bar;
|
|
MWContext *context;
|
|
Chrome *chrome;
|
|
|
|
if (!JSVAL_IS_INT(id))
|
|
return JS_TRUE;
|
|
|
|
if (JSVAL_TO_INT(id) != BAR_VISIBLE)
|
|
return JS_TRUE;
|
|
|
|
bar = JS_GetInstancePrivate(cx, obj, &lm_bar_class, NULL);
|
|
if (!bar)
|
|
return JS_TRUE;
|
|
context = bar->decoder->window_context;
|
|
if (!context)
|
|
return JS_TRUE;
|
|
|
|
chrome = XP_NEW_ZAP(Chrome);
|
|
if (!chrome) {
|
|
JS_ReportOutOfMemory(cx);
|
|
return JS_FALSE;
|
|
}
|
|
ET_PostQueryChrome(context, chrome);
|
|
|
|
switch (bar->bartype) {
|
|
case JSBAR_MENU:
|
|
*vp = BOOLEAN_TO_JSVAL(chrome->show_menu);
|
|
break;
|
|
case JSBAR_TOOL:
|
|
*vp = BOOLEAN_TO_JSVAL(chrome->show_button_bar);
|
|
break;
|
|
case JSBAR_LOCATION:
|
|
*vp = BOOLEAN_TO_JSVAL(chrome->show_url_bar);
|
|
break;
|
|
case JSBAR_PERSONAL:
|
|
*vp = BOOLEAN_TO_JSVAL(chrome->show_directory_buttons);
|
|
break;
|
|
case JSBAR_STATUS:
|
|
*vp = BOOLEAN_TO_JSVAL(chrome->show_bottom_status_bar);
|
|
break;
|
|
case JSBAR_SCROLL:
|
|
*vp = BOOLEAN_TO_JSVAL(chrome->show_scrollbar);
|
|
break;
|
|
}
|
|
XP_FREE(chrome);
|
|
return JS_TRUE;
|
|
}
|
|
|
|
PR_STATIC_CALLBACK(JSBool)
|
|
bar_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
|
{
|
|
JSBar * bar;
|
|
MWContext *context;
|
|
JSBool show;
|
|
Chrome *chrome;
|
|
|
|
if (!lm_CanAccessTarget(cx, JSTARGET_UNIVERSAL_BROWSER_WRITE))
|
|
return JS_TRUE;
|
|
|
|
if (!JSVAL_IS_INT(id))
|
|
return JS_TRUE;
|
|
|
|
if (JSVAL_TO_INT(id) != BAR_VISIBLE)
|
|
return JS_TRUE;
|
|
|
|
bar = JS_GetInstancePrivate(cx, obj, &lm_bar_class, NULL);
|
|
if (!bar)
|
|
return JS_TRUE;
|
|
context = bar->decoder->window_context;
|
|
if (!context)
|
|
return JS_TRUE;
|
|
|
|
if (!JS_ValueToBoolean(cx, *vp, &show))
|
|
return JS_FALSE;
|
|
|
|
chrome = XP_NEW_ZAP(Chrome);
|
|
if (!chrome) {
|
|
JS_ReportOutOfMemory(cx);
|
|
return JS_FALSE;
|
|
}
|
|
ET_PostQueryChrome(context, chrome);
|
|
|
|
switch (bar->bartype) {
|
|
case JSBAR_MENU:
|
|
chrome->show_menu = show;
|
|
if (show)
|
|
chrome->disable_commands = FALSE;
|
|
break;
|
|
case JSBAR_TOOL:
|
|
chrome->show_button_bar = show;
|
|
break;
|
|
case JSBAR_LOCATION:
|
|
chrome->show_url_bar = show;
|
|
break;
|
|
case JSBAR_PERSONAL:
|
|
chrome->show_directory_buttons = show;
|
|
break;
|
|
case JSBAR_STATUS:
|
|
chrome->show_bottom_status_bar = show;
|
|
break;
|
|
case JSBAR_SCROLL:
|
|
chrome->show_scrollbar = show;
|
|
break;
|
|
}
|
|
|
|
ET_PostUpdateChrome(context, chrome);
|
|
XP_FREE(chrome);
|
|
return JS_TRUE;
|
|
}
|
|
|
|
PR_STATIC_CALLBACK(void)
|
|
bar_finalize(JSContext *cx, JSObject *obj)
|
|
{
|
|
JSBar *bar;
|
|
|
|
bar = JS_GetPrivate(cx, obj);
|
|
if (!bar)
|
|
return;
|
|
DROP_BACK_COUNT(bar->decoder);
|
|
JS_free(cx, bar);
|
|
}
|
|
|
|
JSClass lm_bar_class = {
|
|
"Bar", JSCLASS_HAS_PRIVATE,
|
|
JS_PropertyStub, JS_PropertyStub, bar_getProperty, bar_setProperty,
|
|
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, bar_finalize
|
|
};
|
|
|
|
PR_STATIC_CALLBACK(JSBool)
|
|
Bar(JSContext *cx, JSObject *obj, uint argc, jsval *argv, jsval *rval)
|
|
{
|
|
return JS_TRUE;
|
|
}
|
|
|
|
static JSBool
|
|
define_bar(JSContext *cx, MochaDecoder *decoder, JSBarType type)
|
|
{
|
|
JSBar *bar;
|
|
JSObject *obj;
|
|
|
|
if (!(bar = JS_malloc(cx, sizeof(JSBar))))
|
|
return JS_FALSE;
|
|
|
|
obj = JS_DefineObject(cx, decoder->window_object, barnames[type],
|
|
&lm_bar_class, decoder->bar_prototype,
|
|
JSPROP_ENUMERATE|JSPROP_READONLY);
|
|
if (!obj || !JS_SetPrivate(cx, obj, bar)) {
|
|
JS_free(cx, bar);
|
|
return JS_FALSE;
|
|
}
|
|
|
|
bar->decoder = HOLD_BACK_COUNT(decoder);
|
|
bar->bartype = type;
|
|
return JS_TRUE;
|
|
}
|
|
|
|
JSBool
|
|
lm_DefineBarClasses(MochaDecoder *decoder)
|
|
{
|
|
JSContext *cx;
|
|
JSObject *prototype;
|
|
|
|
cx = decoder->js_context;
|
|
prototype = JS_InitClass(cx, decoder->window_object, NULL, &lm_bar_class,
|
|
Bar, 0, bar_props, NULL, NULL, NULL);
|
|
if (!prototype)
|
|
return JS_FALSE;
|
|
decoder->bar_prototype = prototype;
|
|
return JS_TRUE;
|
|
}
|
|
|
|
JSBool
|
|
lm_ResolveBar(JSContext *cx, MochaDecoder *decoder, const char *name)
|
|
{
|
|
#define FROB0(BAR, EXTRA) { \
|
|
if (XP_STRCMP(name, barnames[BAR]) == 0) { \
|
|
if (!define_bar(cx, decoder, BAR)) \
|
|
return JS_FALSE; \
|
|
EXTRA; \
|
|
return JS_TRUE; \
|
|
} \
|
|
}
|
|
#define FROB(BAR) FROB0(BAR, (void)0)
|
|
#define FROB2(BAR, EXTRA) FROB0(BAR, EXTRA)
|
|
|
|
FROB(JSBAR_MENU);
|
|
FROB(JSBAR_TOOL);
|
|
FROB(JSBAR_LOCATION);
|
|
FROB2(JSBAR_PERSONAL,
|
|
if (!JS_AliasProperty(cx, decoder->window_object,
|
|
barnames[JSBAR_PERSONAL],
|
|
"directories")) {
|
|
return JS_FALSE;
|
|
})
|
|
FROB(JSBAR_STATUS);
|
|
FROB(JSBAR_SCROLL);
|
|
|
|
return JS_TRUE;
|
|
|
|
#undef FROB
|
|
}
|