⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmlframe.cpp

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 CPP
字号:
/* This file is part of the KDE libraries    Copyright (C) 1997 Martin Jones (mjones@kde.org)              (C) 1997 Torben Weis (weis@kde.org)    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Library General Public    License as published by the Free Software Foundation; either    version 2 of the License, or (at your option) any later version.    This library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Library General Public License for more details.    You should have received a copy of the GNU Library General Public License    along with this library; see the file COPYING.LIB.  If not, write to    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,    Boston, MA 02111-1307, USA.*/#include "htmlframe.h"#include "html.h"#include "htmlview.h"#include <kcursor.h>#include <strings.h>#include <stdlib.h>// stuck in here to get rid of some debug information ... jsk#undef debug#define debug(args...) ;HTMLFrameSet::HTMLFrameSet( QWidget *_parent, const char *_src )    : QWidget( _parent ){    lastPanner = 0L;        frameBorder = 1;    bAllowResize = TRUE;        widgetList.setAutoDelete( TRUE );        size = 0L;    cFrames = 0;        QString s = _src + 9;    StringTokenizer st;    st.tokenize( s, " >" );    while ( st.hasMoreTokens() )    {	const char* token = st.nextToken();	if ( strncasecmp( token, "COLS=", 5 ) == 0 )	{	    cols = token + 5;	}	else if ( strncasecmp( token, "ROWS=", 5 ) == 0 )	{	    rows = token + 5;	}	else if ( strncasecmp( token, "FRAMEBORDER=", 12 ) == 0 )	{	    frameBorder = atoi( token + 12 );	}	else if ( strncasecmp( token, "NORESIZE", 8 ) == 0 )	{            bAllowResize = FALSE;	}    }    if ( !cols.isNull() )	orientation = HTMLFramePanner::VERTICAL;    else	orientation = HTMLFramePanner::HORIZONTAL;    // Calculate amount of frames    elements = 1;    char *p = "";    if ( !cols.isNull() )	p = (char*)cols.data();    else if ( !rows.isNull() )	p = (char*)rows.data();    while ( ( p = strchr( p, ',' ) ) != 0 ) { p++; elements++; }     size = new int[ elements ];   }HTMLFrameSet::~HTMLFrameSet(){    widgetList.clear();    if ( size )	delete []size;}void HTMLFrameSet::append( QWidget *_w ){    // Add the 2. child of the last panner if there is one.    if ( lastPanner != 0L )    {	lastPanner->setChild2( _w );	lastPanner = 0L;    }        // Increase the number of processed frames    cFrames++;      widgetList.append( _w );           int frameborder = -1;    bool allowresize = TRUE;        if ( _w->inherits( "KHTMLView" ) )    {	KHTMLView *v = (KHTMLView*)_w;	allowresize = v->allowResize();	frameborder = v->getFrameBorder();    }    else if ( _w->inherits( "HTMLFrameSet" ) )    {      	HTMLFrameSet *f = (HTMLFrameSet*)_w;	allowresize = f->getAllowResize();	frameborder = f->getFrameBorder();    }    else	return;      if ( cFrames < elements && frameborder != 0 )    {	HTMLFramePanner *panner = new HTMLFramePanner( orientation, this );	if ( !allowresize )	{	    panner->setIsMoveable( FALSE );	}		panner->setChild1( _w );	widgetList.append( panner );	panner->show();	lastPanner = panner;    }    else    {	show();	resizeEvent( 0 );    }        _w->show();}void HTMLFrameSet::parse(){  resizeEvent( 0L );    /*  QWidget *w = 0L;  for ( w = widgetList.first(); w != 0L; w = widgetList.next() )  {    w->show();  } */}void HTMLFrameSet::resizeEvent( QResizeEvent* ){    if ( !isVisible() )	return;          if ( !cols.isNull() )    {	elements = calcSize( cols.data(), size, width() );    }    else if ( !rows.isNull() )    {	elements = calcSize( rows.data(), size, height() );    }    int j = 0;    int i = 0;    int pannerSize = frameBorder > 0 ? 5 : 0;    QWidget *w;    QWidget* next;    for ( w = widgetList.first(); w != 0L; w = next )    {	next = widgetList.next();		if ( orientation == HTMLFramePanner::HORIZONTAL )	{	    if ( w->isA( "HTMLFramePanner" ) )	    {		w->setGeometry( 0, j, width(), pannerSize );		j += pannerSize;	    }	    else	    {		if ( next && next->isA( "HTMLFramePanner" ) )		    size[i] -= pannerSize;		w->setGeometry( 0, j, width(), size[ i ] );		j += size[ i ];		i++;	    }	}	else	{	    if ( w->isA( "HTMLFramePanner" ) )	    {		w->setGeometry( j, 0, pannerSize, height() );		j += pannerSize;	    }	    else	    {		if ( next && next->isA( "HTMLFramePanner" ) )		    size[i] -= pannerSize;		w->setGeometry( j, 0, size[ i ], height() );		j += size[ i ];		i++;		    }	}    }    debug("Done Set");}int HTMLFrameSet::calcSize( const char *_str, int *size, int _max ){	    debug("Calculating size");      int value[1024];    int mode[1024];    int i = 0;        QString s = _str;    StringTokenizer st;    st.tokenize( s, "," );    while ( st.hasMoreTokens() )    {	if ( i == 1024 )	    return i;		const char* token = st.nextToken();	if ( token[0] != 0 )	{	    //printf("WIDTH='%s'\n",token);	    value[i] = atoi( token );	    if ( strchr( token, '%' ) != 0 )	    {		mode[i] = 1;		value[i] = ( value[i] * _max ) / 100;	    }	    else if ( strchr( token, '*' ) != 0 )	    {		if ( value[i] == 0 )		    value[i] = 1;		mode[i] = 2;	    }	    else		mode[i] = 0;	    	    i++;	}    }    debug("*************** CALC SIZE elements = %i ******************",i);        debug("max. width=%i   max. height=%i",width(),height() );    bool joker = FALSE;        int s1 = 0;    for ( int j = 0; j < i; j++ )    {	if ( mode[j] == 0 || mode[j] == 1 )	    s1 += value[j];	else if ( mode[j] == 2 )	    joker = TRUE;    }        //printf("s1 = %i\n", s1);    int k;    if ( s1 <= _max && !joker )    {        if (!s1)            s1 = 1;	for ( k = 0; k < i; k++ )	{	    size[k] = ( value[k] * _max ) / s1;	    //printf("%i %i %i -> %i\n",value[k],_max,s1,size[k] );	}	// Calculate the error	int s2 = 0;	for ( k = 0; k < i; k++ )	{	    s2 += size[k];	}	//printf("Error is %i\n",_max - s2);	// Add the error to the last frame	size[ i - 1 ] += _max - s2;    }    else if ( s1 <= _max && joker )    {	int s2 = 0;	int s3 = 0;	for ( k = 0; k < i; k++ )	{	    if ( mode[k] == 0 || mode[k] == 1 )	    {		size[k] = value[k];		s2 += value[k];	    }	    else		s3 += value[k];	}	for ( k = 0; k < i; k++ )	{	    if ( mode[k] == 2 )		size[k] = ( _max - s2 ) * value[k] / s3;	}    }    else    {	for ( k = 0; k < i; k++ )	{	    if ( mode[k] == 0 || mode[k] == 1 )	    {		size[k] = value[k] * _max / s1;	    }	    else		size[k] = 50;	}	// Calculate the error	int s2 = 0;	for ( k = 0; k < i; k++ )	{	    if ( mode[k] == 0 || mode[k] == 1 )		s2 += size[k];	}	//printf("Error is %i\n",_max - s2);	// Add the error to the last frame	size[ i - 1 ] += _max - s2;	    }//    for ( k = 0; k < i; k++ )	//printf("SIZE=%i\n",size[k]);	    return i;}KHTMLView* HTMLFrameSet::getSelectedFrame(){  //printf(">>>>>>>>>>>>>>>>>>>>>>>>>>> Frame 1 <<<<<<<<<<<<<<<<<<<<<<<<\n");    QWidget *w;    for ( w = widgetList.first(); w != 0L; w = widgetList.next() )    {      //printf(">>>>>>>>>>>>>>>>>>>>>>>>>>> Frame 2 '%s'<<<<<<<<<<<<<<<<<<<<<<<<\n",w->className());      if ( w->inherits( "KHTMLView" ) )      {	//printf(">>>>>>>>>>>>>>>>>>>>>>>>>>> Frame 3 <<<<<<<<<<<<<<<<<<<<<<<<\n");	KHTMLView *v = (KHTMLView*)w;	KHTMLView *ret = v->getSelectedView();	if ( ret )	  return ret;      }    }        //printf(">>>>>>>>>>>>>>>>>>>>>>>>>>> Frame 4 <<<<<<<<<<<<<<<<<<<<<<<<\n");    return 0L;}HTMLFramePanner::HTMLFramePanner( HTMLFramePanner::Orientation _orientation, QWidget *_parent, const char *_name ) :    QFrame( _parent, _name ){    setFrameStyle(QFrame::Panel | QFrame::Raised);    setLineWidth(1);    child1 = 0L;    child2 = 0L;    orientation = _orientation;    if ( orientation == HTMLFramePanner::HORIZONTAL )      setCursor( KCursor::sizeVerCursor() );    else      setCursor( KCursor::sizeHorCursor() );        moveable = TRUE;}HTMLFramePanner::~HTMLFramePanner(){}void HTMLFramePanner::setIsMoveable( bool _move ){  moveable = _move;  if ( !moveable )    setCursor( KCursor::arrowCursor() );  else if ( orientation == HTMLFramePanner::HORIZONTAL )    setCursor( KCursor::sizeVerCursor() );  else    setCursor( KCursor::sizeHorCursor() );}void HTMLFramePanner::mousePressEvent( QMouseEvent *_ev ){       if ( !moveable )        return;        if ( child1 == 0L || child2 == 0L )	return;        raise();        grabMouse();        initialX = x();    initialY = y();    initialGlobal = mapToGlobal( _ev->pos() );}void HTMLFramePanner::mouseMoveEvent( QMouseEvent *_ev ){    if ( !moveable )        return;        if ( child1 == 0L || child2 == 0L )	return;    if ( orientation == HTMLFramePanner::HORIZONTAL )    {	QPoint p = mapToGlobal( _ev->pos() );	QPoint p2 = child1->mapToGlobal( QPoint( 0, 0 + 10 ) );	QPoint p3 = child2->mapToGlobal( QPoint( 0, child2->height() - 10 - 5 ) );	int pos = p.y();	if ( pos < p2.y() )	    pos = p2.y();	else if ( pos > p3.y() )	    pos = p3.y();	move( initialX, initialY + ( pos - initialGlobal.y() ) );    }    else    {	QPoint p = mapToGlobal( _ev->pos() );	QPoint p2 = child1->mapToGlobal( QPoint( 0 + 10, 0 ) );	QPoint p3 = child2->mapToGlobal( QPoint( child2->width() - 10 - 5 , 0 ) );	int pos = p.x();	if ( pos < p2.x() )	    pos = p2.x();	else if ( pos > p3.x() )	    pos = p3.x();	move( initialX + ( pos - initialGlobal.x() ), initialY );    }}void HTMLFramePanner::mouseReleaseEvent( QMouseEvent * ){    if ( !moveable )        return;    if ( child1 == 0L || child2 == 0L )	return;        releaseMouse();    if ( orientation == HTMLFramePanner::HORIZONTAL )    {	child1->setGeometry( child1->x(), child1->y(), child1->width(), y() - child1->y() );		child2->setGeometry( child2->x(), y() + 5, child2->width(),			     child2->y() + child2->height() - ( y() + 5 ) );    }    else    {	child1->setGeometry( child1->x(), child1->y(), x() - child1->x(), child1->height() );		child2->setGeometry( x() + 5, child2->y(), child2->x() + child2->width() - ( x() + 5 ),			     child2->height() );    }    raise();}#include "htmlframe.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -