Beispiel #1
0
void drawbuttons(void *wgt)
{
	widget *data = (widget *)wgt;

	if (ismouseover(data) == TRUE)
	{
		if (data->clicked != FALSE)
		{
			data->imgpos.x = data->width;
			data->imgpos.y = 0;
		}
		else
		{
			data->imgpos.y = 0;
			data->imgpos.x = 2 * data->width;
		}
	}
	else
	{
		data->imgpos.y = 0;
		data->imgpos.x = 0;
	}

	drawwidget(data);
}
Beispiel #2
0
void MCNativeTheme::drawSlider(MCDC *dc, const MCWidgetInfo &winfo,
                               const MCRectangle &drect)
{
	if (winfo.datatype != WTHEME_DATA_SCROLLBAR &&
	        winfo.type != WTHEME_TYPE_SMALLSCROLLBAR)
		return;

	//draw arrows
	MCWidgetInfo twinfo = winfo;
	MCRectangle sbincarrowrect, sbdecarrowrect, sbthumbrect,
	sbinctrackrect, sbdectrackrect;
	MCRectangle rangerect;
	getscrollbarrects(winfo, drect,
	                  sbincarrowrect, sbdecarrowrect,
	                  sbthumbrect,
	                  sbinctrackrect, sbdectrackrect);
	getwidgetrect(winfo, WTHEME_METRIC_DRAWSIZE, drect, rangerect);
	uint4 sbpartdefaultstate = winfo.state & WTHEME_STATE_DISABLED ? WTHEME_STATE_DISABLED : WTHEME_STATE_CLEAR;
	memset(&twinfo, 0, sizeof(MCWidgetInfo));	//clear widget info
	twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL
	              ? WTHEME_TYPE_SLIDER_TRACK_VERTICAL
	              : WTHEME_TYPE_SLIDER_TRACK_HORIZONTAL;
	twinfo.state = sbpartdefaultstate;
	if (winfo.part == WTHEME_PART_TRACK_DEC)
		twinfo.state = winfo.state;
	drawwidget(dc, twinfo, rangerect);
	if(sbthumbrect.height && sbthumbrect.width)
	{
		//draw thumb
		twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL
		              ? WTHEME_TYPE_SCROLLBAR_THUMB_VERTICAL
		              : WTHEME_TYPE_SCROLLBAR_THUMB_HORIZONTAL;
		twinfo.state = sbpartdefaultstate;
		if (winfo.part == WTHEME_PART_THUMB)
			twinfo.state = winfo.state;
		drawwidget(dc, twinfo, sbthumbrect);
	}

}
Beispiel #3
0
Boolean MCNativeTheme::drawwidget(MCDC *dc, const MCWidgetInfo & winfo,
                                  const MCRectangle & drect)
{
	GC gc ;
	
	MCThemeDrawInfo di ;

	MCDC * t_dc = dc ;	
	Boolean ret = False;
	
	static MCRectangle gtkpixrect = {0,0,0,0};

	Display *display = MCdpy;

	GdkRectangle rect;
	GdkRectangle cliprect;

	MCRectangle trect = drect;
	MCRectangle crect = drect;

	if (winfo.type == WTHEME_TYPE_TAB)
		crect.height--; //make sure tab doesn't draw over tab pane
	

	
	rect = MCRectangleToGdkRectangle(trect);
	cliprect = MCRectangleToGdkRectangle(crect);
	rect.x = cliprect.x = 0;
	rect.y = cliprect.y = 0;


	if (rect.width <= 0 || rect.height <= 0)
		return False;
	GtkThemeWidgetType  moztype;
	gint flags = 0;
	GtkWidgetState state = getpartandstate(winfo, moztype, flags);

	
	
	switch(winfo.type)
	{
	case WTHEME_TYPE_TABPANE:
		state.curpos = 0;
		if(winfo.attributes & WTHEME_ATT_TABPOSBOTTOM
		        || winfo.attributes & WTHEME_ATT_TABPOSTOP)
			state.maxpos = rect.width;
		else if(winfo.attributes & WTHEME_ATT_TABPOSLEFT
		        || winfo.attributes & WTHEME_ATT_TABPOSRIGHT)
			state.maxpos = rect.height;
		else
			state.maxpos = rect.width; // XXX therefore default tabpos is top

		if(winfo.datatype == WTHEME_DATA_TABPANE)
		{

			MCWidgetTabPaneInfo *inf = (MCWidgetTabPaneInfo*)winfo.data;

			state.curpos = inf->gap_start - 1;
			state.maxpos = inf->gap_length + 2;

		}
		
		make_theme_info ( di, moztype, gtkpix, &rect, &cliprect, state, flags, crect);
		t_dc -> drawtheme ( THEME_DRAW_TYPE_GTK, &di ) ;
		
		ret = True;
		break;
		
		
	case WTHEME_TYPE_COMBO:
		{
			MCWidgetInfo twinfo = winfo;
			MCRectangle comboentryrect,combobuttonrect;
			//draw text box
			twinfo.part = WTHEME_PART_COMBOTEXT;
			getwidgetrect(twinfo, WTHEME_METRIC_PARTSIZE,drect,comboentryrect);
			twinfo.part = WTHEME_PART_COMBOBUTTON;
			getwidgetrect(twinfo, WTHEME_METRIC_PARTSIZE,drect,combobuttonrect);
			twinfo.type = WTHEME_TYPE_TEXTFIELD_FRAME;
			drawwidget(dc, twinfo, comboentryrect);
			twinfo.type = WTHEME_TYPE_COMBOBUTTON;
			drawwidget(dc, twinfo, combobuttonrect);
			return True;
		}
		
	
	
#define B_WIDTH 3
		
	case WTHEME_TYPE_TEXTFIELD_FRAME:
	{
		GtkWidgetState t_old_state;
		t_old_state = state;

		MCRectangle t_old_clip;
		t_old_clip = dc -> getclip();

		// crect is the target rectangle for the whole control
		// cliprect and rect are essentially the same
		
		GdkRectangle t_bounds;
		MCRectangle t_dst_bounds;
		MCRectangle t_clip;
		
		// First render the top and bottom borders. We render a control 8 pixels
		// high, but clipped to the border width.

		t_bounds . x = 0;
		t_bounds . y = 0;
		t_bounds . width = rect . width;
		t_bounds . height = 8;

		MCU_set_rect(t_dst_bounds, crect . x, crect . y, crect . width, 8);
		MCU_set_rect(t_clip, crect . x, crect . y, crect . width, B_WIDTH);
		make_theme_info(di, moztype, gtkpix, &t_bounds, &t_bounds, state, flags, t_dst_bounds);
		dc -> setclip(t_clip);
		dc -> drawtheme(THEME_DRAW_TYPE_GTK, &di);
		MCU_set_rect(t_dst_bounds, crect . x, crect . y + crect . height - 8, crect . width, 8);
		MCU_set_rect(t_clip, crect . x, crect . y + crect . height - B_WIDTH, crect . width, B_WIDTH);
		make_theme_info(di, moztype, gtkpix, &t_bounds, &t_bounds, state, flags, t_dst_bounds);
		dc -> setclip(t_clip);
		dc -> drawtheme(THEME_DRAW_TYPE_GTK, &di);
		
		// Now render the left and right borders. We render a control 8 pixels
		// wide, but clipped to the border width

		t_bounds . x = 0;
		t_bounds . y = 0;
		t_bounds . width = 8;
		t_bounds . height = rect . height;

		MCU_set_rect(t_dst_bounds, crect . x, crect . y, 8, crect . height);
		MCU_set_rect(t_clip, crect . x, crect . y + B_WIDTH, B_WIDTH, crect . height - 2 * B_WIDTH);
		make_theme_info(di, moztype, gtkpix, &t_bounds, &t_bounds, state, flags, t_dst_bounds);
		dc -> setclip(t_clip);
		dc -> drawtheme(THEME_DRAW_TYPE_GTK, &di);
		MCU_set_rect(t_dst_bounds, crect . x + crect . width - 8, crect . y, 8, crect . height);
		MCU_set_rect(t_clip, crect . x + crect . width - B_WIDTH, crect . y + B_WIDTH, B_WIDTH, crect . height - 2 * B_WIDTH);
		make_theme_info(di, moztype, gtkpix, &t_bounds, &t_bounds, state, flags, t_dst_bounds);
		dc -> setclip(t_clip);
		dc -> drawtheme(THEME_DRAW_TYPE_GTK, &di);

		dc -> setclip(t_old_clip);
	}
	break ;

		
	case WTHEME_TYPE_SLIDER:
		drawSlider(dc, winfo, drect);
		return True;
		break;
		
		
	case WTHEME_TYPE_SCROLLBAR:
		drawScrollbar(dc, winfo, drect);
		return True;
		break;
		
		
	case WTHEME_TYPE_PROGRESSBAR:
		ret = drawprogressbar(dc, winfo, drect);
		return ret;
		break;
		
		
	case WTHEME_TYPE_GROUP_FRAME:
		
		make_theme_info ( di, moztype, gtkpix, &rect, &cliprect, state, flags, crect);
		t_dc -> drawtheme ( THEME_DRAW_TYPE_GTK, &di ) ;
		ret = True;
		
	break;
		
		
	default:

		make_theme_info ( di, moztype, gtkpix, &rect, &cliprect, state, flags, crect);
		t_dc -> drawtheme ( THEME_DRAW_TYPE_GTK, &di ) ;
		ret = True;
	}
	
	return ret;
}
Beispiel #4
0
void MCNativeTheme::drawScrollbar(MCDC *dc, const MCWidgetInfo &winfo,
                                  const MCRectangle &drect)
{
	if (winfo.datatype != WTHEME_DATA_SCROLLBAR &&
	        winfo.type != WTHEME_TYPE_SMALLSCROLLBAR)
		return;

	//draw arrows
	MCWidgetInfo twinfo = winfo;
	MCRectangle sbincarrowrect, sbdecarrowrect, sbthumbrect,
	sbinctrackrect, sbdectrackrect;
	MCRectangle rangerect;
	int sliderWidth, troughBorder, stepperSize, stepperSpacing,
	minSliderSize, focusLineWidth, focusPadding;

	moz_gtk_get_scrollbar_metrics(&sliderWidth,
	                              &troughBorder,
	                              &stepperSize,
	                              &stepperSpacing,
	                              &minSliderSize,
	                              &focusLineWidth,
	                              &focusPadding);


	getscrollbarrects(winfo, drect,
	                  sbincarrowrect, sbdecarrowrect,
	                  sbthumbrect,
	                  sbinctrackrect, sbdectrackrect);


	getwidgetrect(winfo, WTHEME_METRIC_DRAWSIZE, drect, rangerect);

	uint4 sbpartdefaultstate = winfo.state & WTHEME_STATE_DISABLED ? WTHEME_STATE_DISABLED : WTHEME_STATE_CLEAR;
	memset(&twinfo, 0, sizeof(MCWidgetInfo));	//clear widget info

	// Crux needs the track to be the same size as the actual scroll bar, so we
	// paint that first.
	twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL
	              ? WTHEME_TYPE_SCROLLBAR_TRACK_VERTICAL
	              : WTHEME_TYPE_SCROLLBAR_TRACK_HORIZONTAL;
	twinfo.state = sbpartdefaultstate;
	if (winfo.part == WTHEME_PART_TRACK_DEC)
		twinfo.state = winfo.state;

	drawwidget(dc, twinfo, rangerect);



	twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL
	              ? WTHEME_TYPE_SCROLLBAR_BUTTON_UP
	              : WTHEME_TYPE_SCROLLBAR_BUTTON_LEFT;
	twinfo.state = sbpartdefaultstate;
	if (winfo.part == WTHEME_PART_ARROW_DEC)
		twinfo.state = winfo.state;

	drawwidget(dc, twinfo, sbdecarrowrect);

	twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL
	              ? WTHEME_TYPE_SCROLLBAR_BUTTON_DOWN
	              : WTHEME_TYPE_SCROLLBAR_BUTTON_RIGHT;
	twinfo.state = sbpartdefaultstate;
	if (winfo.part == WTHEME_PART_ARROW_INC)
		twinfo.state = winfo.state;

	drawwidget(dc, twinfo, sbincarrowrect);

	//TS - 2007-10-25 - theme adjustments
	if ( winfo.attributes & WTHEME_ATT_SBVERTICAL )
		sbthumbrect.height ++  ;
	else 
		sbthumbrect.width ++ ;
	
	
	if (sbthumbrect.height && sbthumbrect.width)
	{
		//draw thumb
		twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL
		              ? WTHEME_TYPE_SCROLLBAR_THUMB_VERTICAL
		              : WTHEME_TYPE_SCROLLBAR_THUMB_HORIZONTAL;
		twinfo.state = sbpartdefaultstate;
		if (winfo.part == WTHEME_PART_THUMB)
			twinfo.state = winfo.state;

		drawwidget(dc, twinfo, sbthumbrect);

	}
}
Beispiel #5
0
Boolean MCNativeTheme::drawprogressbar(MCDC *dc, const MCWidgetInfo &winfo, const MCRectangle &drect)
{
	Boolean vertical = winfo.attributes & WTHEME_ATT_SBVERTICAL ? True : False;
	if (winfo.datatype != WTHEME_DATA_SCROLLBAR)
		return False;
	uint4 pbpartdefaultstate = winfo.state & WTHEME_STATE_DISABLED
	                           ? WTHEME_STATE_DISABLED
	                           : WTHEME_STATE_CLEAR;
	MCWidgetScrollBarInfo *sbinfo = (MCWidgetScrollBarInfo *)winfo.data;
	MCWidgetInfo twinfo = winfo;
	twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL
	              ? WTHEME_TYPE_PROGRESSBAR_VERTICAL
	              : WTHEME_TYPE_PROGRESSBAR_HORIZONTAL;
	twinfo.state = pbpartdefaultstate;
	drawwidget(dc, twinfo, drect);
	MCRectangle progressbarrect;

	getwidgetrect(twinfo,WTHEME_METRIC_CONTENTSIZE,drect,progressbarrect);
	uint1 bordersize = drect.width - progressbarrect.width;
	if(vertical)
	{
		progressbarrect.height = drect.height;
	}
	else
	{
		progressbarrect.width = drect.width;
	}
	if (progressbarrect.width && progressbarrect.height)
	{
		int2 endpos = 0;
		if (winfo.attributes & WTHEME_ATT_SBVERTICAL)
		{
			endpos = (int2)(sbinfo->thumbpos
			                / (sbinfo->endvalue - sbinfo->startvalue)
			                * (real8)progressbarrect.height) + progressbarrect.y;
			uint2 ty = (progressbarrect.y+progressbarrect.height) - (endpos - progressbarrect.y);
			progressbarrect.height =  endpos - progressbarrect.y - bordersize;
			
			//TS-2007-08-10 Added to stop underflow if progress bar's current value = 0 
			if ( (endpos - progressbarrect.y - bordersize)  < 0 ) 
				progressbarrect . height = 0 ;
			progressbarrect.y = ty;
		}
		else
		{
			endpos = (int2)(sbinfo->thumbpos / (sbinfo->endvalue - sbinfo->startvalue)
			                * (real8)progressbarrect.width) + progressbarrect.x;
			progressbarrect.width =  endpos - progressbarrect.x - bordersize;
			
			//TS-2007-08-10 Added to stop underflow if progress bar's current value = 0 
			if ( ( endpos - progressbarrect.x - bordersize ) < 0 ) 
				progressbarrect . width = 0 ;
		}
		twinfo.type = winfo.attributes & WTHEME_ATT_SBVERTICAL
		              ? WTHEME_TYPE_PROGRESSBAR_CHUNK_VERTICAL
		              : WTHEME_TYPE_PROGRESSBAR_CHUNK;
		twinfo.state = pbpartdefaultstate;

		drawwidget(dc, twinfo, progressbarrect);
	}
	return True;
}