pjs/lib/libmocha/lm_bars.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
}