/* -*- 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. */ /* RDFChromeTreeView.cpp -- view of rdf data Created: Stephen Lamm , 5-Nov-97. */ #include "RDFChromeTreeView.h" #include "RDFUtils.h" #include "Command.h" #include "xfe2_extern.h" #include "xpgetstr.h" #include "felocale.h" #include "intl_csi.h" //#include "RDFImage.h" #include #include #include #include #include #define TREE_NAME "RdfTree" #define MM_PER_INCH (25.4) #define POINTS_PER_INCH (72.0) extern "C" RDF_NCVocab gNavCenter; #ifdef DEBUG_slamm #define D(x) x #else #define D(x) #endif #define SECONDS_PER_DAY 86400L typedef struct _closeRdfViewCBStruct { XFE_RDFChromeTreeView * rdfview; XFE_NavCenterView * ncview; } closeRdfViewCBStruct; extern "C" { CL_Compositor *fe_create_compositor (MWContext *context); XFE_Frame * fe_getFrameFromContext(MWContext* context); void fe_url_exit (URL_Struct *url, int status, MWContext *context); void htmlPaneExposeEH(Widget, XtPointer, XEvent *, Boolean *); void kdebug_printWidgetTree(Widget w, int column); void fe_set_scrolled_default_size(MWContext *); void fe_get_final_context_resources(MWContext *); void fe_find_scrollbar_sizes(MWContext *); MWContext * fe_CreateNewContext(MWContextType, Widget, fe_colormap * , XP_Bool); } ////////////////////////////////////////////////////////////////////////// XFE_RDFChromeTreeView::XFE_RDFChromeTreeView(XFE_Component * toplevel, Widget parent, XFE_View * parent_view, ERDFPaneMode mode, MWContext * context) : XFE_RDFTreeView(toplevel, parent, parent_view, context), _viewLabel(NULL), _controlToolBar(NULL), _addBookmarkControl(NULL), _closeControl(NULL), _manageControl(NULL), _htmlPaneForm(NULL), _divider(NULL), _htmlPane(NULL), _paneMode(mode) { if (getPaneMode() == RDF_PANE_DOCKED) createViewLabel(); createDivider(); createTree(); if (getPaneMode() != RDF_PANE_STANDALONE) createControlToolbar(); doAttachments(); } ////////////////////////////////////////////////////////////////////////// XFE_RDFChromeTreeView::~XFE_RDFChromeTreeView() { } ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::createControlToolbar() { XP_ASSERT( _controlToolBar == NULL ); XP_ASSERT( XfeIsAlive(getBaseWidget()) ); // Control Tool Bar _controlToolBar = XtVaCreateManagedWidget("controlToolBar", xfeToolBarWidgetClass, getBaseWidget(), XmNorientation, XmHORIZONTAL, XmNusePreferredWidth, True, XmNusePreferredHeight, True, NULL); if (getPaneMode() == RDF_PANE_POPUP) { // Add Bookmark _addBookmarkControl = XtVaCreateManagedWidget("addBookmark", xfeButtonWidgetClass, _controlToolBar, NULL); } // Close _closeControl = XtVaCreateManagedWidget("close", xfeButtonWidgetClass, _controlToolBar, NULL); if (getPaneMode() == RDF_PANE_POPUP) { // Mode _manageControl = XtVaCreateManagedWidget("Manage", xfeButtonWidgetClass, _controlToolBar, NULL); } XtAddCallback(_closeControl, XmNactivateCallback, (XtCallbackProc)closeRdfView_cb , (void *)this); } ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::createViewLabel() { XP_ASSERT( XfeIsAlive(getBaseWidget()) ); XP_ASSERT( _viewLabel == NULL ); // View label _viewLabel = XtVaCreateManagedWidget("viewLabel", xmLabelWidgetClass, getBaseWidget(), XmNalignment, XmALIGNMENT_BEGINNING, NULL); } ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::createDivider() { XP_ASSERT( XfeIsAlive(getBaseWidget()) ); XP_ASSERT( _divider == NULL ); // Divider _divider = XtVaCreateManagedWidget("divider", xfeDividerWidgetClass, getBaseWidget(), // Form constraints XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, // Divider resources XmNorientation, XmVERTICAL, XmNdividerType, XmDIVIDER_PERCENTAGE, XmNdividerTarget, 1, NULL); if (_viewLabel) { XtVaSetValues(_divider, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, _viewLabel, NULL); } else { XtVaSetValues(_divider, XmNtopAttachment, XmATTACH_FORM, NULL); } } ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::createHtmlPaneFromResources() { void * data=NULL; PRUint32 htmlPaneHeight=0; Boolean isPercentage = False; char * htmlPaneURL = NULL; HT_GetTemplateData(HT_TopNode(_ht_view), gNavCenter->RDF_HTMLHeight, HT_COLUMN_STRING, &data); if (data) { char * answer = (char *) data; char * t=NULL; if (XP_STRSTR(answer, "%")) { // Using % method to determine the height t = '\0'; isPercentage = True; htmlPaneHeight = atoi(answer); D(printf("htmlPane Percent height = %d\n", htmlPaneHeight);); } else htmlPaneHeight = atoi(answer); } // Just for testing purposes now, isPercentage = True; htmlPaneHeight = 50; if (!htmlPaneHeight) // Height is 0. No HTML Pane. return; HT_GetTemplateData(HT_TopNode(_ht_view), gNavCenter->RDF_HTMLURL, HT_COLUMN_STRING, &data); if (data) { htmlPaneURL = (char *) data; D(printf("HTMlURL = %s\n", (char *) data);); } else // Just for testing purposes now. htmlPaneURL = "http://www.mozilla.org"; if (!htmlPaneURL) // No URL. No Pane. return; if (isPercentage) { createHtmlPanePercent(htmlPaneHeight, htmlPaneURL); } else { createHtmlPaneFixed(htmlPaneHeight, htmlPaneURL); } } ////////////////////////////////////////////////////////////////////////// // // Set the HTML pane height (as a percentage of the view) // ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::createHtmlPanePercent(PRUint32 heightPercent, char * htmlUrl) { int percentage = (int) heightPercent; // Make sure its not more than 100% if (percentage > 100) { percentage = 100; } // Create the html pane if needed (for the first time) if ((heightPercent > 0) && (_htmlPane == NULL)) { createHtmlPane(htmlUrl); } XP_ASSERT( _htmlPaneForm != NULL ); // XP_ASSERT( _htmlPane != NULL ); XtVaSetValues(_divider, XmNdividerType, XmDIVIDER_PERCENTAGE, XmNdividerPercentage, percentage, NULL); } ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::createHtmlPaneFixed(PRUint32 heightFixed, char * htmlUrl) { Dimension height = (Dimension) heightFixed; // Create the html pane if needed (for the first time) if ((heightFixed > 0) && (_htmlPane == NULL)) { createHtmlPane(htmlUrl); } XP_ASSERT( _htmlPaneForm != NULL ); // XP_ASSERT( _htmlPane != NULL ); XtVaSetValues(_divider, XmNdividerType, XmDIVIDER_FIXED_SIZE, XmNdividerFixedSize, height, NULL); } ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::createHtmlPane(char * url) { XP_ASSERT( XfeIsAlive(_divider) ); XP_ASSERT( _htmlPaneForm == NULL ); XP_ASSERT( _htmlPane == NULL ); MWContext * context = NULL; XFE_Frame * frame = fe_getFrameFromContext(getContext()); _htmlPaneForm = XtVaCreateManagedWidget("htmlPaneForm", xmFormWidgetClass, _divider, XmNshadowThickness, 0, NULL); context = fe_CreateNewContext(MWContextPane, _htmlPaneForm, CONTEXT_DATA(getContext())->colormap, TRUE); ViewGlue_addMapping(frame, context); /* For some reason these 2 functions are not called in the context * creation call. So call them explicitly. */ fe_init_image_callbacks(context); fe_InitColormap(context); _htmlPane = new XFE_HTMLView(m_toplevel, _htmlPaneForm, this, context); addView(_htmlPane); XtVaSetValues(_htmlPane->getBaseWidget(), XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); _htmlPane->show(); XtRealizeWidget(getBaseWidget()); // Create the compositor context->compositor = fe_create_compositor(context); XtVaSetValues (CONTEXT_DATA (context)->scrolled, XmNinitialFocus, CONTEXT_DATA (context)->drawing_area, 0); // Do the required scroller voodoo fe_set_scrolled_default_size(context); fe_get_final_context_resources(context); fe_find_scrollbar_sizes(context); fe_InitScrolling(context); // Load the URL if (url) NET_GetURL(NET_CreateURLStruct(url, NET_DONT_RELOAD), FO_CACHE_AND_PRESENT, context, fe_url_exit); /* XtAddEventHandler((_htmlPane->getBaseWidget()), StructureNotifyMask, True, (XtEventHandler) htmlPaneExposeEH, (XtPointer) _htmlPane); */ } ////////////////////////////////////////////////////////////////////////// /* virtual */ void XFE_RDFChromeTreeView::doAttachments() { if (_controlToolBar) { // Control toolbar on top XtVaSetValues(_controlToolBar, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_NONE, XmNbottomAttachment, XmATTACH_NONE, NULL); } if (_viewLabel) { // View label XtVaSetValues(_viewLabel, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, _controlToolBar, XmNrightAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, NULL); } } ////////////////////////////////////////////////////////////////////////// ERDFPaneMode XFE_RDFChromeTreeView::getPaneMode() { return _paneMode; } ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::updateRoot() { char * label = HT_GetViewName(_ht_view); if (_viewLabel) { XFE_RDFUtils::setLabelString(_viewLabel, label); // Set the HT properties setHTTitlebarProperties(_ht_view); setHTControlbarProperties(_ht_view); createHtmlPaneFromResources(); } XFE_RDFTreeView::updateRoot(); } ////////////////////////////////////////////////////////////////////////// Widget XFE_RDFChromeTreeView::getTreeParent() { XP_ASSERT( XfeIsAlive(_divider) ); return _divider; } ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::notify(HT_Resource n, HT_Event whatHappened) { D(debugEvent(n, whatHappened,"RV");); // HT_EVENT_VIEW_SELECTED if (whatHappened == HT_EVENT_VIEW_SELECTED) { setHTView(HT_GetView(n)); } XFE_RDFTreeView::notify(n, whatHappened); } ////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::closeRdfView_cb(Widget /* w */, XtPointer clientData, XtPointer /* callData */) { XFE_RDFChromeTreeView * obj = (XFE_RDFChromeTreeView *) clientData; Widget parent = XtParent(obj->getBaseWidget()); XtUnmanageChild(parent); } ////////////////////////////////////////////////////////////////////////// // // XFE_RDFChromeTreeView public methods. // ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::setHTTitlebarProperties(HT_View view) { Arg av[30]; Cardinal ac=0; void * data=NULL; Pixel pixel; PRBool gotit=False; //////////////// TITLEBAR PROPERTIES /////////////////// ac = 0; /* titleBarFGColor */ HT_GetTemplateData(HT_TopNode(view), gNavCenter->titleBarFGColor, HT_COLUMN_STRING, &data); if (data) { gotit = fe_GetPixelFromRGBString(getContext(), (char *) data, &pixel); if (gotit) XtSetArg(av[ac], XmNforeground, pixel); ac++; } /* titleBarBGColor */ HT_GetTemplateData(HT_TopNode(view), gNavCenter->titleBarBGColor, HT_COLUMN_STRING, &data); if (data) { gotit = fe_GetPixelFromRGBString(getContext(), (char *) data, &pixel); if (gotit) XtSetArg(av[ac], XmNbackground, pixel); ac++; } /* titleBarBGURL */ HT_GetTemplateData(HT_TopNode(view), gNavCenter->titleBarBGURL, HT_COLUMN_STRING, &data); if (!data) data = "http://people.netscape.com/radha/sony/grn005.gif"; if (data) { XFE_RDFImage * rdfImage = NULL; Pixmap image=(Pixmap)NULL, mask=(Pixmap)NULL; rdfImage = XFE_RDFImage::isImageAvailable((char *)data); if (rdfImage) { image = rdfImage->getPixmap(); mask = rdfImage->getMask(); XtSetArg(av[ac], XmNbackgroundPixmap, image); ac++; } else { // Create the image object and register callback rdfImage = new XFE_RDFImage(m_toplevel, (void *) this, (char *)data, CONTEXT_DATA(getContext())->colormap, _viewLabel); rdfImage->setCompleteCallback((completeCallbackPtr)RDFImage_complete_cb, (void *) _viewLabel); rdfImage->loadImage(); } } XtSetValues(_viewLabel, av, ac); } ////////////////////////////////////////////////////////////////////////// void XFE_RDFChromeTreeView::setHTControlbarProperties(HT_View view) { Arg av[30]; Cardinal ac=0; void * data=NULL; Pixel pixel; PRBool gotit=False; //////////////// CONTROLBAR PROPERTIES /////////////////// ac = 0; /* controlStripFGColor */ HT_GetTemplateData(HT_TopNode(view), gNavCenter->controlStripFGColor, HT_COLUMN_STRING, &data); if (data) { gotit = fe_GetPixelFromRGBString(getContext(), (char *) data, &pixel); if (gotit) XtSetArg(av[ac], XmNforeground, pixel); ac++; } /* controlStripBGColor */ HT_GetTemplateData(HT_TopNode(view), gNavCenter->controlStripBGColor, HT_COLUMN_STRING, &data); if (data) { gotit = fe_GetPixelFromRGBString(getContext(), (char *) data, &pixel); if (gotit) XtSetArg(av[ac], XmNbackground, pixel); ac++; } /* controlStripBGURL */ HT_GetTemplateData(HT_TopNode(view), gNavCenter->controlStripBGURL, HT_COLUMN_STRING, &data); if (!data) data = "http://people.netscape.com/radha/sony/grn005.gif"; if (data) { XFE_RDFImage * rdfImage = NULL; Pixmap image=(Pixmap)NULL, mask=(Pixmap)NULL; rdfImage = XFE_RDFImage::isImageAvailable((char *)data); if (rdfImage) { image = rdfImage->getPixmap(); mask = rdfImage->getMask(); XtSetArg(av[ac], XmNbackgroundPixmap, image); ac++; } else { // Create the image object and register callback rdfImage = new XFE_RDFImage(m_toplevel, (void *) this, (char *)data, CONTEXT_DATA(getContext())->colormap, _controlToolBar); rdfImage->setCompleteCallback((completeCallbackPtr)RDFImage_complete_cb, (void *) _controlToolBar); rdfImage->loadImage(); } } XtSetValues(_controlToolBar, av, ac); #ifdef NOT_YET /* controlStripAddText */ HT_GetTemplateData(HT_TopNode(view), gNavCenter->controlStripAddText, HT_COLUMN_STRING, &data); if (data) { str = fe_ConvertToXmString((unsigned char *) data, INTL_GetCSIWinCSID(charSetInfo) , NULL, XmFONT_IS_FONT, &font_list); XtVaSetValues(_addBookmarkControl, XmNlabelString, str, NULL); } /* controlStripEditText */ HT_GetTemplateData(HT_TopNode(view), gNavCenter->controlStripEditText, HT_COLUMN_STRING, &data); if (data) { str = fe_ConvertToXmString((unsigned char *) data, INTL_GetCSIWinCSID(charSetInfo) , NULL, XmFONT_IS_FONT, &font_list); XtVaSetValues(_manageControl, XmNlabelString, str, NULL); } #endif /* controlStripCloseText */ HT_GetTemplateData(HT_TopNode(view), gNavCenter->controlStripCloseText, HT_COLUMN_STRING, &data); if (data) { XFE_RDFUtils::setLabelString(_closeControl, (char*) data); } } ////////////////////////////////////////////////////////////////////////// extern "C" void htmlPaneExposeEH(Widget w, XtPointer clientData, XEvent * event, Boolean* continue_to_dispatch) { XFE_HTMLView * htmlview = (XFE_HTMLView *)clientData; MWContext * context = htmlview->getContext(); char * url = getenv("HTMLPANEURL"); if (!url) url = "http://www.mozilla.org"; if (event && (event->type == MapNotify)) { // We only need this event handler to be called once XtRemoveEventHandler(w,StructureNotifyMask,True, htmlPaneExposeEH, clientData); if (!XtIsRealized(w)) XtRealizeWidget(w); // Create the compositor context->compositor = fe_create_compositor(context); XtVaSetValues (CONTEXT_DATA (context)->scrolled, XmNinitialFocus, CONTEXT_DATA (context)->drawing_area, 0); // Do the required scroller voodoo fe_set_scrolled_default_size(context); fe_get_final_context_resources(context); fe_find_scrollbar_sizes(context); fe_InitScrolling(context); // Load the URL if (url) NET_GetURL(NET_CreateURLStruct(url, NET_DONT_RELOAD), FO_CACHE_AND_PRESENT, context, fe_url_exit); } } /* htmlPaneExposeEH */ ////////////////////////////////////////////////////////////////////////// /*static*/ void XFE_RDFChromeTreeView::RDFImage_complete_cb(XtPointer client_data) { callbackClientData * cb = (callbackClientData *) client_data; Widget w = (Widget )cb->widget; XtVaSetValues(w, XmNbackgroundPixmap, cb->image, NULL); XP_FREE(cb); }