/* $Id: QtBrowserContext.cpp,v 1.1 1998-09-25 18:01:28 ramiro%netscape.com Exp $ * * 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. Portions * created by Warwick Allison, Kalle Dalheimer, Eirik Eng, Matthias * Ettrich, Arnt Gulbrandsen, Haavard Nord and Paul Olav Tvete are * Copyright (C) 1998 Warwick Allison, Kalle Dalheimer, Eirik Eng, * Matthias Ettrich, Arnt Gulbrandsen, Haavard Nord and Paul Olav * Tvete. All Rights Reserved. */ #include "QtBrowserContext.h" #include "OpenDialog.h" #include "FindDialog.h" #include "SecurityDialog.h" #include "toolbars.h" #include "DialogPool.h" #include "menus.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "layers.h" #include "libimg.h" /* Image Library public API. */ #include "libevent.h" /* Image Library public API. */ #include "il_util.h" /* Colormap/Colorspace API. */ #include "il_icons.h" /* Image icon enumeration. */ #include "prtypes.h" #include "prefapi.h" #include "QtPrefs.h" #include "contextmenu.h" //#include "QtHistoryContext.h" static unsigned char handmask_bits[] = { 0xfe,0x01,0x00,0x00, 0xff,0x03,0x00,0x00, 0xff,0x07,0x00,0x00, 0xff,0x0f,0x00,0x00, 0xfe,0x1f,0x00,0x00, 0xf8,0x1f,0x00,0x00, 0xfc,0x1f,0x00,0x00, 0xf8,0x3f,0x00,0x00, 0xfc,0x7f,0x00,0x00, 0xf8,0xff,0x00,0x00, 0xf0,0x7f,0x00,0x00, 0xe0,0x3f,0x00,0x00, 0xc0,0x1f,0x00,0x00, 0x80,0x0f,0x00,0x00, 0x00,0x07,0x00,0x00, 0x00,0x02,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 }; static unsigned char hand_bits[] = { 0x00,0x00,0x00,0x00, 0xfe,0x01,0x00,0x00, 0x01,0x02,0x00,0x00, 0x7e,0x04,0x00,0x00, 0x08,0x08,0x00,0x00, 0x70,0x08,0x00,0x00, 0x08,0x08,0x00,0x00, 0x70,0x14,0x00,0x00, 0x08,0x22,0x00,0x00, 0x30,0x41,0x00,0x00, 0xc0,0x20,0x00,0x00, 0x40,0x12,0x00,0x00, 0x80,0x08,0x00,0x00, 0x00,0x05,0x00,0x00, 0x00,0x02,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00 }; static QCursor *handcursor = 0; static void unimplemented( const char*, ... ) { // debug( string ); } class QtBrowserScrollView : public QScrollView { QtContext* context; public: QtBrowserScrollView(QtContext* cx, QWidget* parent, const char* name) : QScrollView(parent, name, WPaintClever), context(cx) { setResizePolicy( Manual ); viewport()->setFocusProxy( this ); viewport()->setFocusPolicy( ClickFocus ); } virtual void viewportPaintEvent( QPaintEvent* pe ) { QPainter* p = context->painter(); // Some compositor code doesn't like width or height being 1. QRect r = pe->rect(); //if ( r.width() < 2 ) r.setWidth(2); //if ( r.height() < 2 ) r.setHeight(2); p->setClipRect(r); int cx = r.x() + contentsX(); int cy = r.y() + contentsY(); int cw = r.width(); int ch = r.height(); context->updateRect( cx, cy, cw, ch ); context->clearPainter(); // or should we save/restore? } virtual void keyPressEvent( QKeyEvent* ); QPainter* makePainter() { return new QPainter(viewport()); } QWidget* contentWidget() { return viewport(); } }; void QtBrowserScrollView::keyPressEvent( QKeyEvent* e ) { switch( e->key() ) { case Key_Left: scrollBy( -fontMetrics().width('m'), 0 ); break; case Key_Right: scrollBy( fontMetrics().width('m'), 0 ); break; default: e->ignore(); break; } } QtBrowserContext::QtBrowserContext(MWContext *cx, Chrome *decor, QWidget* parent, const char* name, WFlags f, int _scrolling_policy, int _bw) : QtContext(cx) { unimplemented( "QtBrowserContext::QtBrowserContext, not using Chrome %p", decor ); browserWidget = new QMainWindow( parent, name, f ); if ( !parent ) { // use -geometry, etc. as if we are the main widget QWidget* desktop = QApplication::desktop(); browserWidget->resize( QMIN(600, desktop->width()*4/5), QMIN(700, desktop->height()*4/5) ); qApp->setMainWidget(browserWidget); // but there isn't one - multiple browsers all equal. qApp->setMainWidget(0); browserWidget->setUsesBigPixmaps( TRUE ); browserWidget->setRightJustification( TRUE ); populateMenuBar( browserWidget->menuBar() ); toolbars = new Toolbars( this, browserWidget ); connect( this, SIGNAL(messengerMessage(const char *, int)), browserWidget->statusBar(), SLOT(message(const char *, int)) ); connect( this, SIGNAL(messengerMessageClear()), browserWidget->statusBar(), SLOT(clear()) ); QAccel * accel = new QAccel( browserWidget ); // up, down, page-up, page-down accel->connectItem( accel->insertItem( Key_Up ), this, SLOT(scrollUp()) ); accel->connectItem( accel->insertItem( Key_Down ), this, SLOT(scrollDown()) ); accel->connectItem( accel->insertItem( Key_PageUp ), this, SLOT(pageUp()) ); accel->connectItem( accel->insertItem( Key_PageDown ), this, SLOT(pageDown()) ); // ctrl/alt right, left accel->connectItem( accel->insertItem( CTRL+Key_Left ), this, SLOT(cmdBack()) ); accel->connectItem( accel->insertItem( ALT+Key_Left ), this, SLOT(cmdBack()) ); accel->connectItem( accel->insertItem( CTRL+Key_Right ), this, SLOT(cmdForward()) ); accel->connectItem( accel->insertItem( ALT+Key_Right ), this, SLOT(cmdForward()) ); } else { toolbars = 0; } messageFlickerTimer = new QTimer( this ); connect( messageFlickerTimer, SIGNAL(timeout()), this, SIGNAL(messengerMessageClear()) ); contextMenu = 0; scrollView = new QtBrowserScrollView( this, browserWidget, "content" ); // set the scrollbar policiy. Default is AUTO scrolling_policy = _scrolling_policy; if ( scrolling_policy == LO_SCROLL_NO || scrolling_policy == LO_SCROLL_NEVER){ // fprintf(stderr, "SCROLLBAR: nope \n"); scrollView->setHScrollBarMode(QScrollView::AlwaysOff); scrollView->setVScrollBarMode(QScrollView::AlwaysOff); } else if ( scrolling_policy == LO_SCROLL_YES ){ // fprintf(stderr, "SCROLLBAR: yes \n"); scrollView->setHScrollBarMode(QScrollView::AlwaysOn); scrollView->setVScrollBarMode(QScrollView::AlwaysOn); } bw = _bw; scrollView->contentWidget()->installEventFilter( this ); browserWidget->installEventFilter( this ); scrollView->contentWidget()->setMouseTracking(true); connect(scrollView, SIGNAL(contentsMoving(int,int)), this, SLOT(viewMoved(int,int))); browserWidget->setCentralWidget( scrollView ); browserWidget->show(); refreshURLTimer = 0; initImageCallbacks(); } QtBrowserContext::~QtBrowserContext() { clearPainter(); LO_DiscardDocument (mwContext()); /* Destroy the compositor associated with the context. */ if (mwContext()->compositor) { CL_DestroyCompositor(mwContext()->compositor); mwContext()->compositor = 0; } /* clean the context somewhat. Probabaly incomplete */ IL_RemoveGroupObserver(mwContext()->img_cx, imageGroupObserver, (void *)mwContext()); IL_DestroyGroupContext(mwContext()->img_cx); mwContext()->img_cx = 0; delete topLevelWidget(); } QPainter* QtBrowserContext::makePainter() { return scrollView->makePainter(); } QWidget *QtBrowserContext::contentWidget() const { return scrollView->contentWidget(); } QWidget *QtBrowserContext::topLevelWidget() const { return browserWidget; } int QtBrowserContext::documentWidth() const { return scrollView->contentsWidth(); } int QtBrowserContext::documentHeight() const { return scrollView->contentsHeight(); } int QtBrowserContext::visibleWidth() const { return scrollView->width()-16; } int QtBrowserContext::visibleHeight() const { return scrollView->height(); } int QtBrowserContext::documentXOffset() const { return scrollView->contentsX(); } int QtBrowserContext::documentYOffset() const { return scrollView->contentsY(); } int QtBrowserContext::scrollWidth() const { return scrollView->width(); } int QtBrowserContext::scrollHeight() const { return scrollView->height(); } void QtBrowserContext::documentSetContentsPos( int x, int y ) { scrollView->setContentsPos( x, y ); } bool QtBrowserContext::eventFilter( QObject *o, QEvent *e ) { if (o==scrollView->contentWidget()){ switch (e->type()) { case Event_MouseButtonPress: if ( ((QMouseEvent*)e)->button() == RightButton && mwContext()->compositor ) { CL_Event event; event.fe_event_size = 0; event.fe_event = 0; event.type = CL_EVENT_MOUSE_BUTTON_DOWN; event.which = 3; event.x = ((QMouseEvent*) e)->pos().x() + documentXOffset(); event.y = ((QMouseEvent*) e)->pos().y() + documentYOffset(); CL_DispatchEvent(mwContext()->compositor, &event); } break; case Event_MouseButtonRelease: if ( ((QMouseEvent*)e)->button() == LeftButton && mwContext()->compositor ) { CL_Event event; event.fe_event_size = 0; event.fe_event = 0; event.type = CL_EVENT_MOUSE_BUTTON_UP; event.which = 1; event.x = ((QMouseEvent*) e)->pos().x() + documentXOffset(); event.y = ((QMouseEvent*) e)->pos().y() + documentYOffset(); CL_DispatchEvent(mwContext()->compositor, &event); } break; case Event_MouseMove: if ( mwContext()->compositor ) { CL_Event event; event.fe_event_size = 0; event.fe_event = 0; event.type = CL_EVENT_MOUSE_MOVE; //#warning Matthias: think about drag and drop event.which = 0; // a lie event.x = ((QMouseEvent*) e)->pos().x() + documentXOffset(); event.y = ((QMouseEvent*) e)->pos().y() + documentYOffset(); CL_DispatchEvent(mwContext()->compositor, &event); } break; case Event_Resize: adjustCompositorSize(); break; default: break; } } else if (o==topLevelWidget()){ switch (e->type()) { case Event_Resize: { MWContext *top_context = XP_GetNonGridContext( mwContext() ); if (top_context == mwContext()){ if (top_context->url){ XP_InterruptContext(top_context); URL_Struct *url = SHIST_CreateURLStructFromHistoryEntry( top_context, SHIST_GetCurrent( &(top_context->hist ) )); #if 0//defined DEBUG_paul debug( "##### resize-> NET_GetURL" ); #endif if (url) NET_GetURL( url, FO_CACHE_AND_PRESENT, top_context, url_exit);} } } break; default: break; } } return FALSE; } void QtBrowserContext::viewMoved(int, int) { adjustCompositorPosition(); } /* Returns the URL string of the LO_Element, if it has one. Returns "" for LO_ATTR_ISFORM, which are a total kludge... */ static char * qtfe_url_of_xref (MWContext *context, LO_Element *xref, long x, long y) { switch (xref->type) { case LO_TEXT: if (xref->lo_text.anchor_href) { return (char *) xref->lo_text.anchor_href->anchor; } else { return (char *) NULL; } case LO_IMAGE: if (xref->lo_image.is_icon && xref->lo_image.icon_number == IL_IMAGE_DELAYED) { long width, height; width = height = 40; //########### // fe_IconSize(IL_IMAGE_DELAYED, &width, &height); unimplemented( "please implement fe_IconSize()" ); if (xref->lo_image.alt && xref->lo_image.alt_len && (x > xref->lo_image.x + xref->lo_image.x_offset + 1 + 4 + width)) { if (xref->lo_image.anchor_href) { return (char *) xref->lo_image.anchor_href->anchor; } else { return (char *) NULL; } } else { return (char *) xref->lo_image.image_url; } } else if (xref->lo_image.image_attr->attrmask & LO_ATTR_ISFORM) { return ""; } /* * This would be a client-side usemap image. */ else if (xref->lo_image.image_attr->usemap_name != NULL) { LO_AnchorData *anchor_href; long ix = xref->lo_image.x + xref->lo_image.x_offset; long iy = xref->lo_image.y + xref->lo_image.y_offset; long mx = x - ix - xref->lo_image.border_width; long my = y - iy - xref->lo_image.border_width; anchor_href = LO_MapXYToAreaAnchor(context, (LO_ImageStruct *)xref, mx, my); if (anchor_href) { if (anchor_href->alt) { return (char *) anchor_href->alt; } else { return (char *) anchor_href->anchor; } } else { return (char *) NULL; } } else { if (xref->lo_image.anchor_href) { return (char *) xref->lo_image.anchor_href->anchor; } else { return (char *) NULL; } } default: return 0; } } extern void // in forms.cpp submitForm(MWContext *context, LO_Element *element, int32 /*event*/, void * /*closure*/, ETEventStatus status); bool QtBrowserContext::handleLayerEvent(CL_Layer *layer, CL_Event *layer_event) { switch (layer_event->type){ case CL_EVENT_MOUSE_BUTTON_DOWN: if ( layer_event->which == 3 ) { if ( contextMenu ) delete contextMenu; LO_Element* le = LO_XYToElement(mwContext(), layer_event->x, layer_event->y, layer); QString linkToURL, imageURL; if ( le && le->type == LO_TEXT ) { LO_AnchorData* ad = le->lo_text.anchor_href; if ( ad ) linkToURL = (char *)(ad->anchor); } else if ( le && le->type == LO_IMAGE ) { LO_AnchorData* ad = le->lo_image.anchor_href; if ( ad ) linkToURL = (char *)(ad->anchor); imageURL = (char *)(le->lo_image.image_url); } QPoint p( layer_event->x - documentXOffset(), layer_event->y - documentYOffset() ); p = scrollView->contentWidget()->mapToGlobal( p ); contextMenu = new ContextMenu( this, p, linkToURL, imageURL ); connect( contextMenu, SIGNAL(destroyed()), this, SLOT(contextMenuDied()) ); contextMenu->show(); } break; case CL_EVENT_MOUSE_BUTTON_UP: { long x, y; x = layer_event->x; y = layer_event->y; LO_Element* le = LO_XYToElement(mwContext(), x, y, layer); #if 0// defined DEBUG_ettrich || defined DEBUG_paul if (le){ printf("QtBrowserContext::handleLayerEvent we have a le of type = %d\n", le->type); } else { printf("QtBrowserContext::handleLayerEvent no le \n"); } #endif if ( le ) { char* anchor = qtfe_url_of_xref( mwContext(), le, x, y ); long mx = -1; long my = -1; if (anchor) { if ( le->type == LO_IMAGE ) { long ix = le->lo_image.x + le->lo_image.x_offset; long iy = le->lo_image.y + le->lo_image.y_offset; mx = x - ix - le->lo_image.border_width; my = y - iy - le->lo_image.border_width; if ( le->lo_image.image_attr->attrmask & LO_ATTR_ISFORM ) { QPoint p(mx,my); submitForm( mwContext(), le, 0, &p, EVENT_OK ); goto nogeturl; } else if ( le->lo_image.image_attr->usemap_name != NULL ) { LO_AnchorData *anchor_href = LO_MapXYToAreaAnchor(mwContext(), (LO_ImageStruct *)le, mx, my); if ( anchor_href && anchor_href->anchor ) anchor = (char *) anchor_href->anchor; } else if ( le->lo_image.image_attr->attrmask & LO_ATTR_ISMAP ) { if ( le->lo_image.anchor_href ) anchor = (char *) le->lo_image.anchor_href->anchor; } } { URL_Struct * url = NET_CreateURLStruct (anchor, NET_DONT_RELOAD); if ( mx >= 0 && my >= 0 ) NET_AddCoordinatesToURLStruct (url, mx, my ); MWContext *top_context = XP_GetNonGridContext( mwContext() ); qt(top_context)->getURL(url); } nogeturl: ; } } } break; case CL_EVENT_MOUSE_MOVE: { long x, y; x = layer_event->x; y = layer_event->y; LO_Element* le = LO_XYToElement(mwContext(), x, y, layer); char* anchor = 0; if ( le ) anchor = qtfe_url_of_xref( mwContext(), le, x, y ); setupToolbarSignals(); if ( anchor && currentMessage == anchor ) { // nothing } else if ( anchor ) { if (!handcursor) handcursor = new QCursor(QBitmap(32,32,hand_bits,TRUE), QBitmap(32,32,handmask_bits,TRUE), 0,2); contentWidget()->setCursor(*handcursor); setMessage( anchor ); } else if ( !currentMessage.isEmpty() ) { contentWidget()->setCursor(ArrowCursor); messageFlickerTimer->start( 150, TRUE ); currentMessage = 0; } } default: return false; break; } return true; } void QtBrowserContext::setDocDimension(int /*iLocation*/, int32 iWidth, int32 iLength) { scrollView->resizeContents( iWidth, iLength ); } void QtBrowserContext::setDocPosition(int /*iLocation*/, int32 x, int32 y) { scrollView->setContentsPos(x,y); } void imageGroupObserver(XP_Observable observable, XP_ObservableMsg message, void *message_data, void *closure) { //IL_GroupMessageData *data = (IL_GroupMessageData*)message_data; MWContext *context = (MWContext *)closure; #if defined DEBUG_ettrich printf("ImageGroupObserver**********************\n"); switch (message) { case IL_STARTED_LOADING: printf("IL_STARTED_LOADING \n"); break; case IL_ABORTED_LOADING: printf("IL_ABORTED_LOADING \n"); break; case IL_FINISHED_LOADING: /* Note: This means that all images currently in the context have finished loading. If network activity has not ceased, then new images could start to load in the image context. */ printf("IL_FINISHED_LOADING \n"); break; case IL_STARTED_LOOPING: printf("IL_STARTED_LOOPING \n"); break; case IL_FINISHED_LOOPING: /* Note: This means that all loaded images currently in the context have finished looping. If network activity has not ceased, then new images could start to loop in the image context. */ printf("IL_FINISHED_LOOPING\n"); break; default: break; } #endif QtContext::qt(context)->updateStopState(); } /* Create and initialize the Image Library JMC callback interface. Also create an IL_GroupContext for the current context. */ bool QtBrowserContext::initImageCallbacks() { IL_GroupContext *img_cx; IMGCB* img_cb; JMCException *exc = 0; mwContext()->convertPixX = mwContext()->convertPixY = 1; IL_RGBBits rgb; /* RGB bit allocation and shifts. */ rgb.green_bits = 8; rgb.blue_bits = 8; rgb.red_bits = 8; rgb.green_shift = 8; rgb.red_shift = 0; rgb.blue_shift = 16; mwContext()->color_space = IL_CreateTrueColorSpace(&rgb, 32); if (!mwContext()->img_cx) { PRBool observer_added_p; img_cb = IMGCBFactory_Create(&exc); /* JMC Module */ if (exc) { JMC_DELETE_EXCEPTION(&exc); /* XXXM12N Should really return exception */ return false; } /* Create an Image Group Context. IL_NewGroupContext augments the reference count for the JMC callback interface. The opaque argument to IL_NewGroupContext is the Front End's display context, which will be passed back to all the Image Library's FE callbacks. */ img_cx = IL_NewGroupContext((void*)mwContext(), (IMGCBIF *)img_cb); /* Attach the IL_GroupContext to the FE's display context. */ mwContext()->img_cx = img_cx; // probably temporary (Matthias) IL_DisplayData dpy_data; dpy_data.color_space = mwContext()->color_space; dpy_data.progressive_display = (PRBool)TRUE; dpy_data.dither_mode = IL_Auto; uint32 display_prefs = IL_COLOR_SPACE | IL_PROGRESSIVE_DISPLAY | IL_DITHER_MODE; IL_SetDisplayMode (img_cx, display_prefs, &dpy_data); /* Add an image group observer to the IL_GroupContext. */ observer_added_p = IL_AddGroupObserver(img_cx, imageGroupObserver, (void *)mwContext()); } return true; } void QtBrowserContext::setDocTitle(char *title) { MWContext *top_context = XP_GetNonGridContext( mwContext() ); char *url; QString s; History_entry *he; he = SHIST_GetCurrent (&top_context->hist); url = (he && he->address ? he->address : 0); SHIST_SetTitleOfCurrentDoc (&top_context->hist, title); s.sprintf("%s (Mozilla)", title); browserWidget->setCaption(s); } void QtBrowserContext::refreshURLNow() { killRefreshURLTimer(); URL_Struct *url = NET_CreateURLStruct(refreshURL, NET_NORMAL_RELOAD); // debug( "QtBrowserContext::refreshURLNow: Timer expired, now getURL"); getURL( url ); } /* Header file comment: */ /* This is how the libraries ask the front end to load a URL just as if the user had typed/clicked it (thermo and busy-cursor and everything.) NET_GetURL doesn't do all this stuff. */ /* From ./xfe.c: */ int QtBrowserContext::getURL(URL_Struct *url) { #if 0//defined DEBUG_paul debug( "QtBrowserContext::getUrl %s", url?url->address : "" ); #endif MWContext *context = mwContext(); int32 x,y; if (url && XP_FindNamedAnchor (context, url, &x, &y)) { setupToolbarSignals(); emit urlChanged( url->address ); mwContext()->url = qstrdup(url->address); setDocPosition( 0, x, y ); //### what is an iLocation ??? return 0; } else { XP_InterruptContext(context); setupToolbarSignals(); emit urlChanged( url->address ); mwContext()->url = qstrdup(url->address); return NET_GetURL( url, FO_CACHE_AND_PRESENT, mwContext(), url_exit); } } void QtBrowserContext::browserGetURL( const char* address ) { #if 0//defined DEBUG_paul debug( "browserGetURL %s", address ); #endif getURL( NET_CreateURLStruct( address, NET_DONT_RELOAD )); } void QtBrowserContext::editorEdit( Chrome*, const char* address ) { unimplemented( "QtBrowserContext::editEditor %s", address ); } void QtBrowserContext::setRefreshURLTimer(uint32 secs, char *url) { killRefreshURLTimer(); refreshURL = url; if ( secs <= 0 ) { refreshURLNow(); } else { refreshURLTimer = new QTimer( this ); connect( refreshURLTimer, SIGNAL(timeout()), SLOT(refreshURLNow()) ); refreshURLTimer->start( secs*1000, TRUE /* single shot */ ); } } void QtBrowserContext::killRefreshURLTimer() { delete refreshURLTimer; refreshURLTimer = 0; } void QtBrowserContext::setBackgroundColor(uint8 red, uint8 green, uint8 blue) { contentWidget()->setBackgroundColor( QColor(red,green,blue) ); // We should set the tranparent_pixel somewhere } bool QtBrowserContext::securityDialog( int state, char *prefs_toggle ) { SecurityDialog* dlg = new SecurityDialog( state, prefs_toggle, contentWidget(), "securitydialog" ); int ret = dlg->exec(); *prefs_toggle = dlg->prefsToggleState(); delete dlg; return ret == QDialog::Accepted ? true : false; } /* From ./src/context_funcs.cpp: */ int QtBrowserContext::enableBackButton() { if (toolbars) toolbars->setBackButtonEnabled( true ); if (browserWidget->menuBar()) browserWidget->menuBar()->setItemEnabled( MENU_BF_GO_BACK, true ); if ( contextMenu ) contextMenu->setItemEnabled( ContextMenu::Back, true ); return 0; } /* From ./src/context_funcs.cpp: */ int QtBrowserContext::enableForwardButton() { if (toolbars) toolbars->setForwardButtonEnabled( true ); if (browserWidget->menuBar()) browserWidget->menuBar()->setItemEnabled( MENU_BF_GO_FORWARD, true ); if ( contextMenu ) contextMenu->setItemEnabled( ContextMenu::Forward, true ); return 0; } /* From ./src/context_funcs.cpp: */ int QtBrowserContext::disableBackButton() { if (toolbars) toolbars->setBackButtonEnabled( false ); if (browserWidget->menuBar()) browserWidget->menuBar()->setItemEnabled( MENU_BF_GO_BACK, false ); if ( contextMenu ) contextMenu->setItemEnabled( ContextMenu::Back, false ); return 0; } /* From ./src/context_funcs.cpp: */ int QtBrowserContext::disableForwardButton() { if (toolbars) toolbars->setForwardButtonEnabled( false ); if (browserWidget->menuBar()) browserWidget->menuBar()->setItemEnabled( MENU_BF_GO_FORWARD, false ); if ( contextMenu ) contextMenu->setItemEnabled( ContextMenu::Forward, true ); return 0; } void QtBrowserContext::cmdOpenBrowser() { char* address = NULL; URL_Struct* url = NULL; if( address != NULL ) { url = NET_CreateURLStruct( address, NET_DONT_RELOAD ); } else { QString clb( QApplication::clipboard()->text() ); if ( clb.find( "http://", 0, FALSE ) == 0 || clb.find( "www.", 0, TRUE ) == 0 ) { clb = clb.simplifyWhiteSpace(); url = NET_CreateURLStruct( clb, NET_DONT_RELOAD ); } } unimplemented( "Where do we get these parameters from? Kalle" ); makeNewWindow( url, 0, 0, 0 ); } void QtBrowserContext::cmdComposeMessage() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdComposeMessage" ); } void QtBrowserContext::cmdNewBlank() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdNewBlank" ); } void QtBrowserContext::cmdNewTemplate() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdNewTemplate" ); } void QtBrowserContext::cmdNewWizard() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdNewWizard" ); } void QtBrowserContext::cmdOpenPage() { if( !dialogpool->opendialog ) dialogpool->opendialog = new OpenDialog( this, browserWidget ); dialogpool->opendialog->exec(); } void QtBrowserContext::cmdSaveFrameAs() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdSaveFrameAs" ); } void QtBrowserContext::cmdSendPage() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdSendPage" ); } void QtBrowserContext::cmdSendLink() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdSendLink" ); } void QtBrowserContext::cmdEditFrame() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdEditFrame" ); } void QtBrowserContext::cmdEditPage() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdEditPage" ); } void QtBrowserContext::cmdUploadFile() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdUploadFile" ); } void QtBrowserContext::cmdClose() { //window->close(); unimplemented( "Sorry not implemented: QtBrowserContext::cmdClose" ); } void QtBrowserContext::cmdUndo() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdUndo" ); } void QtBrowserContext::cmdRedo() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdRedo" ); } void QtBrowserContext::cmdCut() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdCut" ); } void QtBrowserContext::cmdCopy() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdCopy" ); } void QtBrowserContext::cmdPaste() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdPaste" ); } void QtBrowserContext::cmdSelectAll() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdSelectAll" ); } void QtBrowserContext::cmdFindInObject() { if( !dialogpool->finddialog ) dialogpool->finddialog = new FindDialog( this, 0 ); if( !dialogpool->finddialog->isVisible() ) dialogpool->finddialog->show(); else dialogpool->finddialog->raise(); } void QtBrowserContext::cmdFindAgain() { static firstFind = true; if( firstFind ) { firstFind = false; cmdFindInObject(); } else { if( find_data.find_in_headers ) { XP_ASSERT(find_data.context->type == MWContextMail || find_data.context->type == MWContextNews ); if( find_data.context->type == MWContextMail || find_data.context->type == MWContextNews ) { return; } } dialogpool->finddialog->find(); } } void QtBrowserContext::cmdSearch() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdSearch" ); } void QtBrowserContext::cmdSearchAddress() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdSearchAddress" ); } void QtBrowserContext::cmdEditPreferences() { QtPrefs::editPreferences( this ); } void QtBrowserContext::cmdToggleNavigationToolbar() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdToggleNavigationToolbar" ); } void QtBrowserContext::cmdToggleLocationToolbar() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdToggleLocationToolbar" ); } void QtBrowserContext::cmdTogglePersonalToolbar() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdTogglePersonalToolbar" ); } void QtBrowserContext::cmdIncreaseFont() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdIncreaseFont" ); } void QtBrowserContext::cmdDecreaseFont() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdDecreaseFont" ); } void QtBrowserContext::cmdReload() { if (mwContext()->url){ URL_Struct* url = NET_CreateURLStruct (mwContext()->url, NET_NORMAL_RELOAD); getURL(url); } } void QtBrowserContext::cmdSuperReload() { if (mwContext()->url){ URL_Struct* url = NET_CreateURLStruct (mwContext()->url, NET_SUPER_RELOAD); getURL(url); } } void QtBrowserContext::cmdShowImages() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdShowImages" ); } void QtBrowserContext::cmdRefresh() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdRefresh" ); } void QtBrowserContext::cmdStopLoading() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdStopLoading" ); } void QtBrowserContext::cmdViewPageSource() { History_entry *h; URL_Struct *url = 0; char *new_url_add=0; h = SHIST_GetCurrent (&mwContext()->hist); url = SHIST_CreateURLStructFromHistoryEntry(mwContext(), h); if (! url) { FE_Alert (mwContext(), tr( "No document has yet been loaded in this window." ) ); return; } /* check to make sure it doesn't already have a view-source * prefix. If it does then this window is already viewing * the source of another window. In this case just * show the same thing by reloading the url... */ if(strncmp( VIEW_SOURCE_URL_PREFIX, url->address, sizeof(VIEW_SOURCE_URL_PREFIX)-1)) { /* prepend VIEW_SOURCE_URL_PREFIX to the url to * get the netlib to display the source view */ StrAllocCopy(new_url_add, VIEW_SOURCE_URL_PREFIX); StrAllocCat(new_url_add, url->address); free(url->address); url->address = new_url_add; } /* make damn sure the form_data slot is zero'd or else all * hell will break loose */ XP_MEMSET (&url->savedData, 0, sizeof (SHIST_SavedData)); #ifdef EDITOR // if (EDT_IS_EDITOR(mwContext()) && !FE_CheckAndSaveDocument(mwContext())) // return; #endif getURL( url ); } #define DOCINFO "about:document" #define HTTP_OFF 42 void QtBrowserContext::cmdViewPageInfo() { char buf [1024], *in, *out; for (in = DOCINFO, out = buf; *in; in++, out++) *out = *in - HTTP_OFF; *out = 0; #ifdef EDITOR // if (EDT_IS_EDITOR(mwContext()) && !FE_CheckAndSaveDocument(mwContext())) // return; #endif /* @@@@ this is the proper way to do it but I dont' * know the encoding scheme * fe_GetURL (context,NET_CreateURLStruct(buf, FALSE), FALSE); */ getURL ( NET_CreateURLStruct( DOCINFO, NET_DONT_RELOAD ) ); #ifdef EDITOR // fe_EditorRefresh(context); #endif } void QtBrowserContext::cmdPageServices() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdPageServices" ); } void QtBrowserContext::cmdBack() { MWContext *top_context = XP_GetNonGridContext( mwContext() ); URL_Struct *url; if( isGridParent( top_context ) ) { if( LO_BackInGrid( top_context ) ) { return; } } //#warning Implement reordering of contexts. Kalle. // fe_UserActivity( top_context ); url = SHIST_CreateURLStructFromHistoryEntry( top_context, SHIST_GetPrevious( top_context ) ); if (url) { qt(top_context)->getURL(url); } else { FE_Alert( top_context, tr( "No previous document." ) ); } } void QtBrowserContext::cmdForward() { MWContext *top_context = XP_GetNonGridContext( mwContext() ); URL_Struct *url; if( isGridParent( top_context ) ) { if( LO_ForwardInGrid( top_context ) ) { return; } } //#warning Implement reordering of contexts. Kalle. // fe_UserActivity( top_context ); url = SHIST_CreateURLStructFromHistoryEntry( top_context, SHIST_GetNext( top_context ) ); if (url) { qt(top_context)->getURL(url); } else { FE_Alert( top_context, tr( "No previous document." ) ); } } void QtBrowserContext::cmdHome() { URL_Struct *url; #define BUF_SIZ 1024 int bufsiz = BUF_SIZ; char buf[ BUF_SIZ ]; if( PREF_GetCharPref( "browser.startup.homepage", buf, &bufsiz ) < 0 || !strlen(buf) ) { clearView( 0 ); alert( tr( "No home document specified." ) ); return; } url = NET_CreateURLStruct ( buf, NET_DONT_RELOAD ); // ########hanord getURL ( url ); } void QtBrowserContext::cmdOpenNavCenter() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdOpenNavCenter" ); } void QtBrowserContext::cmdOpenOrBringUpBrowser() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdOpenOrBringUpBrowser" ); } void QtBrowserContext::cmdOpenInbox() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdOpenInbox" ); } void QtBrowserContext::cmdOpenNewsgroups() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdOpenNewsgroups" ); } void QtBrowserContext::cmdOpenEditor() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdOpenEditor" ); } void QtBrowserContext::cmdOpenConference() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdOpenConference" ); } void QtBrowserContext::cmdCalendar() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdCalendar" ); } void QtBrowserContext::cmdHostOnDemand() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdHostOnDemand" ); } void QtBrowserContext::cmdNetcaster() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdNetcaster" ); } void QtBrowserContext::cmdToggleTaskbarShowing() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdToggleTaskbarShowing" ); } void QtBrowserContext::cmdOpenFolders() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdOpenFolders" ); } void QtBrowserContext::cmdOpenAddressBook() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdOpenAdressBook" ); } void QtBrowserContext::cmdOpenHistory() { // QtHistoryContext *hist = QtHistoryContext::ptr(); // hist->show(); unimplemented( "Sorry not implemented: QtBrowserContext::cmdOpenHistory" ); } void QtBrowserContext::cmdJavaConsole() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdOpenHistory" ); } void QtBrowserContext::cmdViewSecurity() { unimplemented( "Sorry not implemented: QtBrowserContext::cmnViewSecurity" ); } void QtBrowserContext::cmdAboutNetscape() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdAboutNetscape" ); } void QtBrowserContext::cmdAboutMozilla() { unimplemented( "Sorry not implemented: QtBrowserContext::cmdAboutMozilla" ); } void QtBrowserContext::cmdAboutQt() { QMessageBox::aboutQt( 0 ); } void QtBrowserContext::cmdGuide() { unimplemented( "Sorry, not implemented: QtBrowserContext::cmdGuide" ); } #include "SecurityDialog.h" #include void QtBrowserContext::cmdSecurityDialog1() { char prefs = true; SecurityDialog dlg( SD_INSECURE_POST_FROM_SECURE_DOC, &prefs, 0 ); dlg.exec(); } void QtBrowserContext::cmdSecurityDialog2() { char prefs = true; SecurityDialog dlg( SD_INSECURE_POST_FROM_INSECURE_DOC, &prefs, 0 ); dlg.exec(); } void QtBrowserContext::cmdSecurityDialog3() { char prefs = true; SecurityDialog dlg( SD_ENTERING_SECURE_SPACE, &prefs, 0 ); dlg.exec(); } void QtBrowserContext::cmdSecurityDialog4() { char prefs = true; SecurityDialog dlg( SD_LEAVING_SECURE_SPACE, &prefs, 0 ); dlg.exec(); } void QtBrowserContext::cmdSecurityDialog5() { char prefs = true; SecurityDialog dlg( SD_INSECURE_POST_FROM_INSECURE_DOC, &prefs, 0 ); dlg.exec(); } void QtBrowserContext::cmdSecurityDialog6() { char prefs = true; SecurityDialog dlg( SD_REDIRECTION_TO_INSECURE_DOC, &prefs, 0 ); dlg.exec(); } void QtBrowserContext::cmdSecurityDialog7() { char prefs = true; SecurityDialog dlg( SD_REDIRECTION_TO_SECURE_SITE, &prefs, 0 ); dlg.exec(); } void QtBrowserContext::setMessage( const char *m, int timeout ) { messageFlickerTimer->stop(); emit messengerMessage( m, timeout ); currentMessage = m; } void QtBrowserContext::setStopButtonEnabled( bool enable ) { if (toolbars) toolbars->setStopButtonEnabled( enable ); } void QtBrowserContext::setLoadImagesButtonEnabled( bool enable ) { if (toolbars) toolbars->setLoadImagesButtonEnabled( enable ); } void QtBrowserContext::contextMenuDied() { contextMenu = 0; } void QtBrowserContext::showSubWidget( QWidget* w, bool y ) { scrollView->showChild( w, y ); } void QtBrowserContext::moveSubWidget( QWidget* w, int x, int y ) { scrollView->addChild( w, x, y ); scrollView->showChild( w, TRUE ); } void QtBrowserContext::setupToolbarSignals() { if ( !have_tried_progress && toolbars) { QObjectListIt it( *browserWidget->children() ); QObject * o; while( (o=it.current()) != 0 ) { ++it; if ( o->inherits( "Toolbars" ) ) { connect( this, SIGNAL(progressStarting(int)), o, SLOT(setupProgress(int)) ); connect( this, SIGNAL(progressMade(int)), o, SLOT(signalProgress(int)) ); connect( this, SIGNAL(progressMade()), o, SLOT(signalProgress()) ); connect( this, SIGNAL(progressFinished()), o, SLOT(endProgress()) ); connect( this, SIGNAL(progressReport(const char *)), o, SLOT(setMessage(const char *)) ); connect( this, SIGNAL(canStop(bool)), o, SLOT(setStopButtonEnabled(bool)) ); connect( this, SIGNAL(urlChanged(const char *)), o, SLOT(setComboText(const char *)) ); } } } have_tried_progress = TRUE; } void QtBrowserContext::scrollUp() { scrollView->scrollBy( 0, -scrollView->fontMetrics().height() ); } void QtBrowserContext::scrollDown() { scrollView->scrollBy( 0, scrollView->fontMetrics().height() ); } void QtBrowserContext::pageUp() { scrollView->scrollBy( 0, -scrollView->viewport()->height() ); } void QtBrowserContext::pageDown() { scrollView->scrollBy( 0, scrollView->viewport()->height() ); }