/* -*- 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. */ /* URLBar.cpp -- The text field chrome above an HTMLView, used in BrowserFrames. Created: Chris Toshok , 1-Nov-96. */ #include "mozilla.h" #include "xfe.h" #include "hk_funcs.h" #include "URLBar.h" #include "Button.h" #include "ProxyIcon.h" #include "BookmarkMenu.h" // Need for bookmark context. #include "MozillaApp.h" #include "Logo.h" #include "prefapi.h" #include "felocale.h" #include #include #include #include "DtWidgets/ComboBox.h" #include #include #include "libmocha.h" // For LM_StripWysiwygURLPrefix(). #include #ifdef URLBAR_POPUP #include "View.h" #endif /* URLBAR_POPUP */ extern int XFE_URLBAR_FILE_HEADER; extern "C" void fe_NeutralizeFocus(MWContext *context); #define BOOKMARK_BUTTON_NAME "bookmarkQuickfile" #define LOCATION_LABEL_NAME "urlLocationLabel" #define LOCATION_PROXY_ICON_NAME "urlLocationProxyIcon" #define URL_COMBO_BOX_NAME "urlComboBox" #define URL_BAR_NAME "urlBarItem" #define MAIN_FORM_NAME "urlBarMainForm" #define LOGO_NAME "logo" const char *XFE_URLBar::navigateToURL = "XFE_URLBar::navigateToURL"; // Quickfile Menu Spec /* static */ MenuSpec XFE_URLBar::quickfile_menu_spec[] = { { xfeCmdAddBookmark, PUSHBUTTON }, { "fileBookmarksSubmenu", DYNA_FANCY_CASCADEBUTTON, NULL, NULL, False, (void *) True, // Only headers XFE_BookmarkMenu::generate }, { xfeCmdOpenBookmarks, PUSHBUTTON }, MENU_SEPARATOR, { "bookmarkPlaceHolder", DYNA_MENUITEMS, NULL, NULL, False, (void *) False, // Only headers XFE_BookmarkMenu::generateQuickfile }, { NULL } }; #ifdef URLBAR_POPUP MenuSpec XFE_URLBar::ccp_popup_spec[] = { // { xfeCmdUndo, PUSHBUTTON }, // { xfeCmdRedo, PUSHBUTTON }, // MENU_SEPARATOR, { xfeCmdCut, PUSHBUTTON }, { xfeCmdCopy, PUSHBUTTON }, { xfeCmdPaste, PUSHBUTTON }, // { xfeCmdDeleteItem, PUSHBUTTON }, MENU_SEPARATOR, { xfeCmdSelectAll, PUSHBUTTON }, { NULL }, }; #endif /* URLBAR_POPUP */ XFE_URLBar::XFE_URLBar(XFE_Frame * parent_frame, XFE_Toolbox * parent_toolbox, History_entry * first_entry) : XFE_ToolboxItem(parent_frame,parent_toolbox), m_editedLabelString(NULL), m_uneditedLabelString(NULL), m_netsiteLabelString(NULL), m_parentFrame(parent_frame), m_bookmarkButton(NULL), m_locationProxyIcon(NULL), m_locationLabel(NULL), m_urlComboBox(NULL), m_labelBeingFrobbed(False), m_proxyIconDragSite(NULL), m_bookmarkDropSite(NULL) #ifdef URLBAR_POPUP ,m_popup(NULL) #endif /* URLBAR_POPUP */ { Widget main_form; // Create the base widget - a tool item m_widget = XtVaCreateWidget(URL_BAR_NAME, xfeToolItemWidgetClass, parent_toolbox->getBaseWidget(), XmNuserData, this, NULL); // Create the main form main_form = XtVaCreateManagedWidget(MAIN_FORM_NAME, xmFormWidgetClass, m_widget, NULL); // Create the bookmark button createBookmarkButton(main_form); XP_ASSERT( m_bookmarkButton != NULL ); // Show the bookmark button m_bookmarkButton->show(); // Create the proxy icon createProxyIcon(main_form); XP_ASSERT( m_locationProxyIcon != NULL ); XP_ASSERT( XfeIsAlive(m_locationLabel) ); // Show the proxy icon and label m_locationProxyIcon->show(); XtManageChild(m_locationLabel); // Create the url text combo box createUrlComboBox(main_form,first_entry); XP_ASSERT( XfeIsAlive(m_urlComboBox) ); // Create the logo if needed if (XfeChildIsEnabled(m_widget,LOGO_NAME,"Logo",True)) { m_logo = new XFE_Logo(m_parentFrame,m_widget,LOGO_NAME); m_logo->setSize(XFE_ANIMATION_SMALL); } // Show the url text XtManageChild(m_urlComboBox); // Attach and configure the logo configureLogo(); // Show the main form XtManageChild(main_form); // Register url bar widgets for dragging addDragWidget(getFormWidget()); addDragWidget(getUrlLabel()); installDestroyHandler(); #ifdef URLBAR_POPUP Widget text_field; XtVaGetValues(m_urlComboBox, XmNtextField, &text_field, 0); // Add popup menu post event handler to floating task bar items XtAddEventHandler( text_field, ButtonPressMask, True, &XFE_URLBar::comboBoxButtonPressEH, (XtPointer *)this ); #endif /* URLBAR_POPUP */ } ////////////////////////////////////////////////////////////////////////// void XFE_URLBar::createBookmarkButton(Widget parent) { XP_ASSERT( XfeIsAlive(parent) ); XP_ASSERT( m_bookmarkButton == NULL ); // Bookmark quickfile button. m_bookmarkButton = new XFE_Button(m_parentFrame, parent, BOOKMARK_BUTTON_NAME, XFE_URLBar::quickfile_menu_spec, &BM_QFile_group); // Configure the bookmark button m_bookmarkButton->setPretendSensitive(True); // Place the bookmark quickfile to the far left XtVaSetValues(m_bookmarkButton->getBaseWidget(), XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_NONE, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, NULL); // Add the submenu torn callbacks XtAddCallback(m_bookmarkButton->getBaseWidget(), XmNsubmenuTearCallback, &XFE_URLBar::bookmarkCascadeTearCB, (XtPointer) this); // Keep track of changes in the top level shell title Widget frame_shell = m_parentFrame->getBaseWidget(); if (XfeIsAlive(frame_shell) && XfeIsFrameShell(frame_shell)) { Boolean allow_tear; XtVaGetValues(m_bookmarkButton->getBaseWidget(), XmNallowTearOff,&allow_tear, NULL); if (allow_tear) { XtAddCallback(frame_shell, XmNtitleChangedCallback, &XFE_URLBar::frameTitleChangedCB, (XtPointer) this); } } // The XFE_BookmarkMenu class overrides the XmNinstancePointer which was // originally set in XFE_Button. This is really horrible. XFE_BookmarkMenu * quickfileMenu = (XFE_BookmarkMenu *) XfeInstancePointer(m_bookmarkButton->getBaseWidget()); XP_ASSERT( quickfileMenu != NULL ); // Create and enable the quickfile drop site m_bookmarkDropSite = new XFE_QuickfileDrop(m_bookmarkButton->getBaseWidget(),quickfileMenu); m_bookmarkDropSite->enable(); } ////////////////////////////////////////////////////////////////////////// // URL Label string resources ( for Location: Netsite: etc ) /* static */ XtResource XFE_URLBar::_urlLabelResources[] = { { "editedLabelString", XmCXmString, XmRXmString, sizeof(XmString), XtOffset(XFE_URLBar *, m_editedLabelString), XtRString, "Error!" }, { "uneditedLabelString", XmCXmString, XmRXmString, sizeof(XmString), XtOffset(XFE_URLBar *, m_uneditedLabelString), XtRString, "Error!" }, { "netsiteLabelString", XmCXmString, XmRXmString, sizeof(XmString), XtOffset(XFE_URLBar *, m_netsiteLabelString), XtRString, "Error!" } }; void XFE_URLBar::createProxyIcon(Widget parent) { XP_ASSERT( XfeIsAlive(parent) ); XP_ASSERT( m_locationProxyIcon == NULL ); XP_ASSERT( m_locationLabel == NULL ); // Proxy icon m_locationProxyIcon = new XFE_Button(m_parentFrame, parent, LOCATION_PROXY_ICON_NAME, &LocationProxy_group); // Configure the bookmark button m_locationProxyIcon->setPretendSensitive(True); // Location label m_locationLabel = XtVaCreateManagedWidget(LOCATION_LABEL_NAME, xmLabelWidgetClass, parent, NULL); // Load the url label strings XtGetApplicationResources(m_locationLabel, (XtPointer) this, XFE_URLBar::_urlLabelResources, XtNumber(XFE_URLBar::_urlLabelResources), 0, 0); // Place the proxy icon right after the bookmark quickfile XtVaSetValues(m_locationProxyIcon->getBaseWidget(), XmNleftAttachment, XmATTACH_WIDGET, XmNrightAttachment, XmATTACH_NONE, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_NONE, XmNleftWidget, m_bookmarkButton->getBaseWidget(), NULL); // Place the location label right after the proxy icon XtVaSetValues(m_locationLabel, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, m_locationProxyIcon->getBaseWidget(), XmNrightAttachment, XmATTACH_NONE, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, NULL); m_proxyIconDragSite = new XFE_LocationDrag(m_locationProxyIcon->getBaseWidget()); // Register proxy icon to have a tooltip. fe_WidgetAddToolTips(m_locationProxyIcon->getBaseWidget()); } ////////////////////////////////////////////////////////////////////////// void XFE_URLBar::createUrlComboBox(Widget parent,History_entry * first_entry) { XP_ASSERT( XfeIsAlive(parent) ); XP_ASSERT( m_urlComboBox == NULL ); Arg av[22]; Cardinal ac = 0; Visual * visual = 0; Colormap cmap = 0; Cardinal depth = 0; Widget text_field; XtVaGetValues(m_parentFrame->getBaseWidget(), XtNvisual, &visual, XtNcolormap, &cmap, XtNdepth, &depth, NULL); ac = 0; XtSetArg(av[ac],XmNmoveSelectedItemUp, True); ac++; XtSetArg(av[ac],XmNarrowType, XmMOTIF); ac++; XtSetArg(av[ac],XmNtype, XmDROP_DOWN_COMBO_BOX); ac++; XtSetArg(av[ac],XmNvisibleItemCount, 10 ); ac++; XtSetArg(av[ac],XmNvisual, visual); ac++; XtSetArg(av[ac],XmNcolormap, cmap); ac++; XtSetArg(av[ac],XmNdepth, depth); ac++; XtSetArg(av[ac],XmNmarginHeight, 0); ac++; XtSetArg(av[ac],XmNleftAttachment, XmATTACH_WIDGET); ac++; XtSetArg(av[ac],XmNleftWidget, m_locationLabel); ac++; XtSetArg(av[ac],XmNtopAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac],XmNbottomAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac],XmNrightAttachment, XmATTACH_FORM); ac++; XtSetArg(av[ac],XmNrightOffset, 0); ac++; // The combo box calls XmNactivateCallback for both its text and // arrow. This is very confusing since clicking on the arrow does // not really "activate" the combo box...so i added a combo box // boolean resource to avoid calling this callback. This fixes bug // 71097 (browser reload by just posting the url combo box). XtSetArg(av[ac],XmNnoCallbackForArrow, True); ac++; /* Create a combobox for storing typed in url history */ /* This replaces the old text field */ /* Combobox is only for MWContextBrowser */ m_urlComboBox = DtCreateComboBox(parent, URL_COMBO_BOX_NAME, av,ac); XtVaGetValues(m_urlComboBox, XmNtextField, &text_field, 0); /* Loads the previous session history list from a designated file ("~/.netscape/history.list") */ readUserHistory(); XtAddCallback(text_field, XmNmodifyVerifyCallback, url_text_modify_cb, (XtPointer) this); String value = ""; if (first_entry && first_entry->address) { value = first_entry->address; } XtVaSetValues (text_field, XmNcursorPosition, 0, 0); fe_SetTextField (text_field, value); XtAddCallback(m_urlComboBox, XmNselectionCallback, url_text_selection_cb, (XtPointer) this); XtAddCallback(m_urlComboBox, XmNactivateCallback, url_text_cb, (XtPointer) this); XFE_MozillaApp::theApp()->registerInterest( XFE_MozillaApp::addURLtoURLBarHistory, this, (XFE_FunctionNotification)_recordURL_cb); XFE_MozillaApp::theApp()->registerInterest( XFE_MozillaApp::clearURLBarHistory, this, (XFE_FunctionNotification)_clearAll_cb); } ////////////////////////////////////////////////////////////////////////// XFE_URLBar::~XFE_URLBar() { #ifdef URLBAR_POPUP if (m_popup) { delete m_popup; m_popup = NULL; } #endif /* URLBAR_POPUP */ if (m_proxyIconDragSite) { delete m_proxyIconDragSite; m_proxyIconDragSite = NULL; } if (m_bookmarkDropSite) { delete m_bookmarkDropSite; m_bookmarkDropSite = NULL; } XFE_MozillaApp::theApp()->unregisterInterest( XFE_MozillaApp::addURLtoURLBarHistory, this, (XFE_FunctionNotification)_recordURL_cb); XFE_MozillaApp::theApp()->unregisterInterest( XFE_MozillaApp::clearURLBarHistory, this, (XFE_FunctionNotification)_clearAll_cb); } ////////////////////////////////////////////////////////////////////////// Widget XFE_URLBar::getBookMarkButton() { return m_bookmarkButton->getBaseWidget(); } ////////////////////////////////////////////////////////////////////////// Widget XFE_URLBar::getProxyIcon() { return m_locationProxyIcon->getBaseWidget(); } ////////////////////////////////////////////////////////////////////////// Widget XFE_URLBar::getUrlLabel() { return m_locationLabel; } ////////////////////////////////////////////////////////////////////////// Widget XFE_URLBar::getFormWidget() { return XtParent(m_locationLabel); } ////////////////////////////////////////////////////////////////////////// void XFE_URLBar::recordURL(URL_Struct *url) { if ( !url->address ) return; // Notify all frames to add this URL XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::addURLtoURLBarHistory,(void*)url); /* Save to history */ saveUserHistory(); } ////////////////////////////////////////////////////////////////////////// XFE_CALLBACK_DEFN(XFE_URLBar, _recordURL)(XFE_NotificationCenter*, void*, void* callData) { XmString str; int itemCount = 0; Widget list; int *posList; int poscnt; Boolean found = False; URL_Struct *url = (URL_Struct*)callData; str = XmStringCreateLtoR(url->address, XmSTRING_DEFAULT_CHARSET); XtVaGetValues(m_urlComboBox, XmNlist, &list, 0); found = XmListGetMatchPos(list, str, &posList, &poscnt); if ( found ) { XmListDeletePos(list,posList[0]); } { XtVaGetValues(list, XmNitemCount, &itemCount, 0 ); if ( itemCount >= 10 ) { XmListDeleteItemsPos(list,1,10); } XmListAddItem(list,str, 1); XmListSelectPos(list, 1, False); XmListSetPos(list, 1); /* Scroll to top */ } } ////////////////////////////////////////////////////////////////////////// void XFE_URLBar::setURLString(URL_Struct *url) { /* Fixing a bug in motif that sends junk values if SetValues is done on a widget that has modifyVerifyCallback And I really hate the way XtCallbackList is being handled. There is no way to easily copy one. I prefer to use explicitly XtCallbackRec * instead of hiding this and using XtCallbackList. Makes this code more readable. */ /* update ProxyIcon drag object with new URL */ if (m_proxyIconDragSite) m_proxyIconDragSite->setTextStringFromURL(url); XtCallbackRec *cblist, *text_cb; int i; Widget text; XtVaGetValues(m_urlComboBox, XmNtextField, &text, 0); if (!text ) return; if (!url || (sploosh && url && !strcmp (url->address, sploosh)) || (url && !strcmp (url->address, "about:blank"))) url = 0; XP_ASSERT(!m_labelBeingFrobbed); /* Inhibit fe_url_text_modify_cb() for this call. */ m_labelBeingFrobbed = True; XtVaSetValues (text, XmNcursorPosition, 0, 0); /* Get and save the modifyVerifyCallbacklist */ XtVaGetValues (text, XmNmodifyVerifyCallback, &text_cb, 0); for(i=0; text_cb[i].callback != NULL; i++); i++; cblist = (XtCallbackRec *) malloc(sizeof(XtCallbackRec)*i); for(i=0; text_cb[i].callback != NULL; i++) cblist[i] = text_cb[i]; cblist[i] = text_cb[i]; /* NULL the modifyVerifyCallback before doing setvalues */ XtVaSetValues (text, XmNmodifyVerifyCallback, NULL, 0); fe_SetTextField (text, (url && url->address ? // Check for JavaScript wysiwyg mangling // Fixes bug 28035. (LM_StripWysiwygURLPrefix(url->address) ? LM_StripWysiwygURLPrefix(url->address) : url->address) : "")); /* Setback the modifyVerifyCallback List from our saved List */ XtVaSetValues (text, XmNmodifyVerifyCallback, cblist, 0); XP_FREE(cblist); m_labelBeingFrobbed = False; frob_label (False, url && url->is_netsite); #ifdef notyet fe_store_url_prop(context, url); #endif /* notyet */ } ////////////////////////////////////////////////////////////////////////// /*static*/ void XFE_URLBar::clearAll() { // Notify all frames to clear the URLBar (handled by _clearAll below) XFE_MozillaApp::theApp()->notifyInterested(XFE_MozillaApp::clearURLBarHistory, NULL); eraseUserHistory(); } ////////////////////////////////////////////////////////////////////////// XFE_CALLBACK_DEFN(XFE_URLBar, _clearAll)(XFE_NotificationCenter*, void*, void*) { XP_ASSERT(m_urlComboBox); Widget text_field; char * text; // Toss out the combo list, // but save the text in the textfield XtVaGetValues (m_urlComboBox, XmNtextField, &text_field, 0); XP_ASSERT(text_field); text = fe_GetTextField(text_field); /* return via XtMalloc */ DtComboBoxDeleteAllItems(m_urlComboBox); if (text) { fe_SetTextField(text_field, text); XtFree(text); } } ////////////////////////////////////////////////////////////////////////// XP_Bool XFE_URLBar::readUserHistory() { XmString xmstr; char *value; char buffer[1024]; FILE *fp = fopen(fe_globalPrefs.user_history_file,"r"); if ( !fp ) return FALSE; if ( !fgets(buffer, 1024, fp) ) *buffer = 0; while ( fgets(buffer, 1024, fp ) ) { value = XP_StripLine(buffer); if (strlen(value)==0 || *value == '#') continue; xmstr = XmStringCreateLtoR(value, XmSTRING_DEFAULT_CHARSET); DtComboBoxAddItem( m_urlComboBox, xmstr,0, True ); XmStringFree(xmstr); } fclose(fp); return TRUE; } ////////////////////////////////////////////////////////////////////////// /* For saving out the user typed in url history list to a file*/ XP_Bool XFE_URLBar::saveUserHistory() { int i,itemCount; XmStringTable itemList; char *urlStr; char *filename = fe_globalPrefs.user_history_file; FILE *fp = fopen(filename,"w"); if ( !fp ) return FALSE; fprintf (fp, XP_GetString(XFE_URLBAR_FILE_HEADER), fe_version); XtVaGetValues(m_urlComboBox, XmNitemCount, &itemCount, XmNitems, &itemList, NULL); for ( i = 0; i < itemCount; i++ ) { XmStringGetLtoR( itemList[i], XmSTRING_DEFAULT_CHARSET, &urlStr); fputs(urlStr, fp); fputc('\n', fp); } fclose(fp); return TRUE; } ////////////////////////////////////////////////////////////////////////// /*static*/ XP_Bool XFE_URLBar::eraseUserHistory() { // Write an empty history file char *filename = fe_globalPrefs.user_history_file; FILE *fp = fopen(filename,"w"); if ( !fp ) return FALSE; fprintf (fp, XP_GetString(XFE_URLBAR_FILE_HEADER), fe_version); fclose(fp); return TRUE; } ////////////////////////////////////////////////////////////////////////// void XFE_URLBar::frob_label(XP_Bool edited_p, XP_Bool netsite_p) { // MWContext *context = m_parentFrame->getContext(); XmString old_string = 0; XmString new_string = (edited_p ? m_editedLabelString : (netsite_p ? m_netsiteLabelString : m_uneditedLabelString)); XP_ASSERT(new_string); XtVaGetValues (m_locationLabel, XmNlabelString, &old_string, 0); if (!XmStringByteCompare (old_string, new_string)) XtVaSetValues (m_locationLabel, XmNlabelString, new_string, 0); XmStringFree (old_string); } void XFE_URLBar::url_text(XtPointer callData) { URL_Struct *url_struct; XmAnyCallbackStruct *cb = (XmAnyCallbackStruct *) callData; Widget text_field; char *text = 0; if (cb->reason != XmCR_ACTIVATE) abort (); XtVaGetValues (m_urlComboBox, XmNtextField, &text_field, 0); text = fe_GetTextField(text_field); /* return via XtMalloc */ if (*text) { char *old_text = 0; char *new_text; int32 id; if (m_parentFrame->getContext() != NULL) { id = XP_CONTEXTID(m_parentFrame->getContext()); } else { id = 0; } if (HK_CallHook(HK_LOCATION, NULL, id, text, &new_text)) { if (new_text != NULL) { old_text = text; text = new_text; } } url_struct = NET_CreateURLStruct (text, NET_DONT_RELOAD); notifyInterested(XFE_URLBar::navigateToURL, (void*)url_struct); if (old_text) { XP_FREE(text); text = old_text; } } fe_NeutralizeFocus(m_parentFrame->getContext()); if ( text ) XtFree(text); } void XFE_URLBar::url_text_modify() { if (!m_labelBeingFrobbed) frob_label (True, False); } void XFE_URLBar::url_text_selection(XtPointer callData) { XmString str; char* text = 0; URL_Struct *url_struct; DtComboBoxCallbackStruct *cbData = (DtComboBoxCallbackStruct *)callData; Widget list; if (cbData->reason == XmCR_SELECT ) { str= cbData->item_or_text; XmStringGetLtoR( str, XmSTRING_DEFAULT_CHARSET, &text); XtVaGetValues(m_urlComboBox, XmNlist, &list, 0); if ( *text ) { url_struct = NET_CreateURLStruct (text, NET_DONT_RELOAD); notifyInterested(XFE_URLBar::navigateToURL, (void*)url_struct); } XtFree(text); } } void XFE_URLBar::url_text_cb(Widget, XtPointer closure, XtPointer callData) { XFE_URLBar *obj = (XFE_URLBar*)closure; obj->url_text(callData); } void XFE_URLBar::url_text_modify_cb (Widget, XtPointer closure, XtPointer) { XFE_URLBar *obj = (XFE_URLBar*)closure; obj->url_text_modify(); } void XFE_URLBar::url_text_selection_cb(Widget, XtPointer closure, XtPointer callData) { XFE_URLBar *obj = (XFE_URLBar*)closure; obj->url_text_selection(callData); } ////////////////////////////////////////////////////////////////////////// #ifdef URLBAR_POPUP void XFE_URLBar::doPopup(XEvent *event) { Widget widget = XtWindowToWidget(event->xany.display, event->xany.window); /* Posting the popup puts focus on the URLBar (needed for paste) */ XmProcessTraversal (widget, XmTRAVERSE_CURRENT); if (widget == NULL) widget = m_widget; if (!m_popup) { m_popup = new XFE_PopupMenu("popup",(XFE_Frame*)m_toplevel, widget, (MenuSpec *)NULL); m_popup->addMenuSpec(ccp_popup_spec); } m_popup->position(event); m_popup->show(); } ////////////////////////////////////////////////////////////////////////// /* static */ void XFE_URLBar::comboBoxButtonPressEH(Widget /* w */, XtPointer clientData, XEvent * event, Boolean * cont) { XFE_URLBar *obj = (XFE_URLBar*)clientData; // Make sure Button3 was pressed if (event->type == ButtonPress && event->xbutton.button == Button3) { obj->doPopup(event); } *cont = True; } #endif /* URLBAR_POPUP */ ////////////////////////////////////////////////////////////////////////// /* static */ void XFE_URLBar::bookmarkCascadeTearCB(Widget /* cascade */, XtPointer clientData, XtPointer callData) { XFE_URLBar * obj = (XFE_URLBar *) clientData; XfeSubmenuTearCallbackStruct * data = (XfeSubmenuTearCallbackStruct *) callData; obj->handleBookmarkCascadeTear(data->torn); } ////////////////////////////////////////////////////////////////////////// /* static */ void XFE_URLBar::frameTitleChangedCB(Widget frame_shell, XtPointer clientData, XtPointer /*callData*/) { XFE_URLBar * obj = (XFE_URLBar *) clientData; String title; XtVaGetValues(frame_shell,XmNtitle,&title,NULL); XtVaGetValues(frame_shell,XmNtitle,&title,NULL); obj->handleFrameTitleChanged(title); // Dont free the title, cause it returns a private pointer } ////////////////////////////////////////////////////////////////////////// void XFE_URLBar::handleBookmarkCascadeTear(XP_Bool torn) { if (m_bookmarkButton && m_bookmarkButton->isAlive()) { // While the bookmarks submenu is posted, the button cant be used m_bookmarkButton->setSensitive(!torn); // Make the torn shell's title the same as the frame if (torn && m_parentFrame && m_parentFrame->isAlive()) { XtVaSetValues(m_bookmarkButton->getBaseWidget(), XmNtornShellTitle, m_parentFrame->getTitle(), NULL); } } } ////////////////////////////////////////////////////////////////////////// void XFE_URLBar::handleFrameTitleChanged(String title) { if (m_bookmarkButton && m_bookmarkButton->isAlive()) { Boolean torn; XtVaGetValues(m_bookmarkButton->getBaseWidget(),XmNtorn,&torn,NULL); if (torn) { XtVaSetValues(m_bookmarkButton->getBaseWidget(), XmNtornShellTitle, title, NULL); } } } ////////////////////////////////////////////////////////////////////////// void XFE_URLBar::clearText() { XP_ASSERT(m_urlComboBox); Widget text_field; XtVaGetValues(m_urlComboBox,XmNtextField,&text_field,NULL); XP_ASSERT(text_field); fe_SetTextField(text_field,""); } //////////////////////////////////////////////////////////////////////////