Mozilla/mozilla/cmd/xfe/src/NavCenterView.cpp
radha%netscape.com 83f0974449 While creating, RDFChromeView, Pass the frame handle as toplevel component
instead of the NavCenterView


git-svn-id: svn://10.0.0.236/trunk@12760 18797224-902f-48f8-a5cc-f745e15eee43
1998-10-14 00:22:57 +00:00

498 lines
14 KiB
C++

/* -*- Mode: C++; tab-width: 4; 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.
*/
/*
NavCenterView.cpp - Aurora/NavCenter view class
Created: Stephen Lamm <slamm@netscape.com>, 05-Nov-97.
*/
#include "NavCenterView.h"
#include "HTMLView.h"
#include "RDFChromeTreeView.h"
#include "IconGroup.h"
#include "xp_ncent.h"
#include <Xm/Form.h>
#ifdef MOZ_SELECTOR_BAR
#include <Xfe/ToolScroll.h>
#endif
#if DEBUG_slamm
#define D(x) x
#else
#define D(x)
#endif
//////////////////////////////////////////////////////////////////////////
XFE_NavCenterView::XFE_NavCenterView(XFE_Component *toplevel_component,
Widget parent, XFE_View *parent_view,
MWContext *context)
: XFE_View(toplevel_component, parent_view, context),
XFE_RDFBase(),
#ifdef MOZ_SELECTOR_BAR
_selector(0),
#endif
_rdftree(0),
_isStandalone(0)
{
m_viewType = VIEW_NAVCENTER;
_isStandalone = (parent_view == NULL);
// Register the MWContext in the XP list.
XP_SetLastActiveContext(context);
Widget navCenterMainForm =
XtVaCreateManagedWidget("navCenterMainForm",
xmFormWidgetClass,
parent,
NULL);
setBaseWidget(navCenterMainForm);
#ifdef MOZ_SELECTOR_BAR
/* Create the selector bar only in the docked mode */
if (!_isStandalone)
createSelectorBar();
#endif
createTree();
doAttachments();
#ifdef MOZ_SELECTOR_BAR
if (_selector)
newPane();
#endif
addView(_rdftree);
#ifdef MOZ_SELECTOR_BAR
if (_selector)
XtManageChild(_selector);
#endif /*MOZ_SELECTOR_BAR*/
_rdftree->show();
}
XFE_NavCenterView::~XFE_NavCenterView()
{
// Remove yourself from XFE_RDFImage's listener list
XFE_RDFImage::removeListener(this);
}
//////////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::notify(HT_Resource n,
HT_Event whatHappened)
{
D(debugEvent(n, whatHappened,"NCV"););
switch (whatHappened) {
case HT_EVENT_VIEW_CLOSED:
break;
case HT_EVENT_VIEW_SELECTED:
{
HT_View view = HT_GetView(n);
selectHTView(view);
}
break;
case HT_EVENT_VIEW_ADDED:
{
#ifdef MOZ_SELECTOR_BAR
if (!_isStandalone && _selector) {
HT_View view = HT_GetView(n);
addHTView(view);
}
#endif
}
break;
case HT_EVENT_NODE_ADDED:
case HT_EVENT_NODE_DELETED_DATA:
case HT_EVENT_NODE_DELETED_NODATA:
case HT_EVENT_NODE_VPROP_CHANGED:
case HT_EVENT_NODE_SELECTION_CHANGED:
case HT_EVENT_NODE_OPENCLOSE_CHANGED:
case HT_EVENT_NODE_OPENCLOSE_CHANGING:
break;
default:
D(printf("HT_Event(%d): Unknown type on %s\n",whatHappened,HT_GetNodeName(n)););
break;
}
XFE_RDFBase::notify(n, whatHappened);
}
//////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::finishPaneCreate()
{
#ifdef MOZ_SELECTOR_BAR
if (_selector) {
HT_SetPaneFEData(_ht_pane, this);
_ht_view = HT_GetSelectedView(_ht_pane);
}
else
XFE_RDFBase::finishPaneCreate();
#else
XFE_RDFBase::finishPaneCreate();
#endif
// This function takes a valid MWContext argument only when the
// NavCenterView is docked. However, we need a HT_Pane-to-context
// mapping for properties and Find context menus to work. I think this
// function should take a valid MWContext even in standalone mode
// because we need these menu options to work in standalone mode too.
// Maybe sitemaps will be screwed up when we start to use them.
XP_RegisterNavCenter(_ht_pane, m_contextData);
// Need to figure out what to do in popup state
if (!_isStandalone)
XP_DockNavCenter(_ht_pane, m_contextData);
}
//////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::deletePane()
{
if (_ht_pane)
{
if (!_isStandalone)
XP_UndockNavCenter(_ht_pane);
XP_UnregisterNavCenter(_ht_pane);
}
XFE_RDFBase::deletePane();
}
//////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::selectHTView(HT_View view)
{
if (view != HT_GetSelectedView(_ht_pane))
{
HT_SetSelectedView(_ht_pane, view);
}
_ht_view = view;
_rdftree->setHTView(view);
#ifdef MOZ_SELECTOR_BAR
// The following block of code is to make sure that the view that is
// currently selected appears as selected in the selector bar. This
// is primarily useful when the user makes a node in the Rdftree as
// a workspace. But it is currently broken since for some reason,
// the selector bar is not responding to the
// XfeToolBarSetSelectedButton() call
Widget toolbar;
if (_selector) {
XtVaGetValues(_selector, XmNtoolBar, &toolbar, NULL);
Widget button = XtNameToWidget(toolbar, HT_GetViewName(view));
if (toolbar && button)
{
XfeToolBarSetSelectedButton(toolbar, button);
}
}
#endif
}
//////////////////////////////////////////////////////////////////////
#ifdef MOZ_SELECTOR_BAR
void
XFE_NavCenterView::addHTView(HT_View htview)
{
// static int counter=1;
XFE_RDFImage * rdfImage = NULL;
char * imageURL = "http://people.netscape.com/radha/sony/images/LocationProxy.gif";
Pixmap image = (Pixmap)NULL;
Pixmap mask = (Pixmap)NULL;
PRInt32 w,h;
XP_ASSERT(htview);
if (!htview) return;
Widget toolbar;
XtVaGetValues(_selector,XmNtoolBar,&toolbar,NULL);
char *label = HT_GetViewName(htview);
char *icon_url = HT_GetWorkspaceLargeIconURL(htview);
char name[8];
int ret = sscanf(icon_url, "icon/large:workspace,%s", name);
if (ret != 0) {
icon_url = XP_Cat("about:",name,".gif",NULL);
// Load the icon here.
// copy windows(navcntr.cpp)? call IL_GetImage? or IL_GetImagePixmap?
XP_FREE(icon_url);
}
uint32 index = HT_GetViewIndex(htview);
char widget_name[128];
sprintf(widget_name,"button%d", index);
// Temp bookmark title hack
if (XP_STRNCMP(label,"Bookmarks for", 13) == 0)
{
label = "Bookmarks";
}
// similar hack for Navigator internals
if (XP_STRCASECMP(label,"Navigator internals") == 0)
{
label = "Nav Internals";
}
Widget button =
XtVaCreateManagedWidget(label,
xfeButtonWidgetClass,
toolbar,
NULL);
/* Check if the image is already available in the
* RDFImage Cache. If so, use it
*/
rdfImage = XFE_RDFImage::isImageAvailable(imageURL);
if (rdfImage) {
image = rdfImage->getPixmap();
mask = rdfImage->getMask();
XtVaGetValues(button,
XmNwidth, &w,
XmNheight, &h,
NULL);
XtVaSetValues(button,
XmNpixmap, image,
XmNpixmapMask, mask,
XmNwidth, (unsigned int)(w = rdfImage->getImageWidth()),
XmNheight, (unsigned int)(h = rdfImage->getImageHeight()),
/* XmNbuttonLayout, XmBUTTON_PIXMAP_ONLY, */
NULL);
}
else {
// Create the image object and register callback
rdfImage = new XFE_RDFImage(m_toplevel, (void *) this, imageURL,
CONTEXT_DATA(m_contextData)->colormap,
button);
rdfImage->setCompleteCallback((completeCallbackPtr)image_complete_cb,
(void *) button);
rdfImage->loadImage();
}
XfeSetXmStringPSZ(button, XmNlabelString,
XmFONTLIST_DEFAULT_TAG, label);
XtAddCallback(button,
XmNactivateCallback,
&XFE_NavCenterView::selector_activate_cb,
(XtPointer) htview);
}
//////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::selector_activate_cb(Widget /* w */,
XtPointer clientData ,
XtPointer /* callData */)
{
HT_View htView = (HT_View)clientData;
HT_Pane htPane = HT_GetPane(htView);
XFE_NavCenterView * nc = (XFE_NavCenterView *)HT_GetPaneFEData(htPane);
nc->setRdfTree(htView);
}
//////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::setRdfTree(HT_View view)
{
Widget toolbar;
// WidgetList tool_items = NULL;
XtVaGetValues(_selector,XmNtoolBar,&toolbar,NULL);
//XfeToolBarSetSelectedButton(toolbar, xxx);
HT_SetSelectedView(_ht_pane, view);
_ht_view = view;
}
//////////////////////////////////////////////////////////////////////
Widget
XFE_NavCenterView::getSelector(void)
{
return _selector;
}
#endif /* MOZ_SELECTOR_BAR */
//////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::handleDisplayPixmap(Widget w, IL_Pixmap * image, IL_Pixmap * mask, PRInt32 width, PRInt32 height)
{
XFE_RDFImage * rdfImage;
#ifdef DEBUG_radha
printf("In NavCenterView:handleDisplayPixmap\n");
#endif
// Get handle to the RDFImage object from the cache
rdfImage = XFE_RDFImage::getRDFImageObject(w);
if (rdfImage)
rdfImage->RDFDisplayPixmap(image, mask, width, height);
}
//////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::handleNewPixmap(Widget w, IL_Pixmap * image, Boolean mask)
{
XFE_RDFImage * rdfImage;
#ifdef DEBUG_radha
printf("In NavCenterView:handlenewPixmap\n");
#endif
// Get handle to the RDFImage object from the cache
rdfImage = XFE_RDFImage::getRDFImageObject(w);
if (rdfImage)
rdfImage->RDFNewPixmap(image, (PRBool)mask);
}
//////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::handleImageComplete(Widget w, IL_Pixmap * image)
{
XFE_RDFImage * rdfImage;
#ifdef DEBUG_radha
printf("In NavCenterView:handleImageComplete\n");
#endif
// Get handle to the RDFImage object from the cache
rdfImage = XFE_RDFImage::getRDFImageObject(w);
if (rdfImage)
rdfImage->RDFImageComplete(image);
}
//////////////////////////////////////////////////////////////////////
#ifdef MOZ_SELECTOR_BAR
/*static*/ void
XFE_NavCenterView::image_complete_cb(XtPointer client_data)
{
callbackClientData * cb = (callbackClientData *) client_data;
Widget button = (Widget )cb->widget;
Dimension b_width=0, b_height=0;
#ifdef DEBUG_radha
printf("Inside image_complete_cb\n");
#endif
XtUnmanageChild(button);
XtVaGetValues(button, XmNwidth, &b_width, XmNheight, &b_height, NULL);
XtVaSetValues(button, /* XmNheight,(cb->height + b_height),*/
XmNpixmap, cb->image,
XmNpixmapMask, cb->mask,
XmNbuttonLayout, XmBUTTON_PIXMAP_ONLY,
NULL);
XtManageChild(button);
XP_FREE(cb);
}
#endif /*MOZ_SELECTOR_BAR*/
//////////////////////////////////////////////////////////////////////////
#ifdef MOZ_SELECTOR_BAR
void
XFE_NavCenterView::createSelectorBar()
{
_selector = XtVaCreateManagedWidget("selector",
xfeToolScrollWidgetClass,
getBaseWidget(),
XmNtopOffset, 0,
XmNbottomOffset, 0,
XmNleftOffset, 0,
XmNrightOffset, 0,
XmNspacing, 0,
XmNshadowThickness, 0,
XmNselectionPolicy, XmTOOL_BAR_SELECT_SINGLE,
NULL);
Widget toolbar;
XtVaGetValues(_selector,XmNtoolBar,&toolbar,NULL);
XtVaSetValues(toolbar,
XmNshadowThickness, 0,
NULL);
}
#endif /*MOZ_SELECTOR_BAR*/
//////////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::createTree()
{
_rdftree = new XFE_RDFChromeTreeView(m_toplevel, getBaseWidget(),
this, _isStandalone ? RDF_PANE_STANDALONE : RDF_PANE_DOCKED, m_contextData);
_rdftree->setStandAlone(_isStandalone);
}
//////////////////////////////////////////////////////////////////////////
void
XFE_NavCenterView::doAttachments()
{
#ifdef MOZ_SELECTOR_BAR
if (_selector) {
XtVaSetValues(_selector,
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
NULL);
XtVaSetValues(_rdftree->getBaseWidget(),
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, _selector,
XmNrightAttachment, XmATTACH_FORM,
NULL);
}
else
#endif
{
XtVaSetValues(_rdftree->getBaseWidget(),
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_FORM,
NULL);
}
}
//////////////////////////////////////////////////////////////////////////