Exemplo n.º 1
0
static int
TextBox_ScrollBar_UpdatePos( LCUI_Widget *widget )
/* 更新滚动条的位置 */
{
	static ScrollBar_Data scrollbar_data;
	static LCUI_Pos area_pos;
	static LCUI_Size layer_size, area_size;
	static LCUI_Widget *scrollbar[2];
	static LCUI_TextLayer *layer;
	
	area_size = Widget_GetContainerSize( widget ); 
	//_DEBUG_MSG("area_size: (%d,%d)\n", area_size.w, area_size.h);
	scrollbar[0] = TextBox_GetScrollbar( widget, 0 );
	scrollbar[1] = TextBox_GetScrollbar( widget, 1 ); 
	if( scrollbar[0]->visible ) {
		area_size.w -= Widget_GetWidth( scrollbar[0] );
	}
	if( scrollbar[1]->visible ) {
		area_size.h -= Widget_GetHeight( scrollbar[1] );
	}
	
	if( area_size.h <= 0 || area_size.w <= 0 ) {
		return -1;
	}
	
	layer = TextBox_GetTextLayer( widget );
	if( !layer->enable_multiline ) {
		return 1;
	}
	layer_size = TextLayer_GetSize( layer );
	//_DEBUG_MSG("layer_size: (%d,%d)\n", layer_size.w, layer_size.h);
	if( layer_size.h <= 0 || layer_size.w <= 0 ) {
		return -2;
	}
	area_pos = TextBox_ViewArea_GetPos( widget );
	//_DEBUG_MSG("area_pos: (%d,%d)\n", area_pos.x, area_pos.y);
	ScrollBar_SetMaxNum( scrollbar[0], layer_size.h - area_size.h );
	
	if( area_pos.y + area_size.h > layer_size.h ) {
		area_pos.y = layer_size.h - area_size.h;
	}
	if( area_pos.x + area_size.w > layer_size.w ) {
		area_pos.x = layer_size.w - area_size.w;
	}
	if( area_pos.y < 0 ) {
		area_pos.y = 0;
	}
	if( area_pos.x < 0 ) {
		area_pos.x = 0;
	}
	ScrollBar_SetCurrentValue( scrollbar[0], area_pos.y ); 
	scrollbar_data = ScrollBar_GetData( scrollbar[0] );
	TextBox_TextLayer_VertScroll( scrollbar_data, widget );
	
	ScrollBar_SetMaxNum( scrollbar[1], layer_size.w - area_size.w );
	ScrollBar_SetCurrentValue( scrollbar[1], area_pos.x );
	scrollbar_data = ScrollBar_GetData( scrollbar[1] );
	TextBox_HoriScroll_TextLayer( scrollbar_data, widget );
	return 0;
}
Exemplo n.º 2
0
TextBox_ViewArea_Update( LCUI_Widget *widget )
/* 更新文本框的文本显示区域 */
{
	static int cursor_h;
	static ScrollBar_Data scrollbar_data;
	static LCUI_Pos cursor_pos, area_pos;
	static LCUI_Size layer_size, area_size;
	static LCUI_Widget *scrollbar[2];
	static LCUI_TextLayer *layer;
	//_DEBUG_MSG("enter\n");
	/* 获取显示区域的尺寸 */
	area_size = Widget_GetContainerSize( widget );
	/* 获取滚动条 */
	scrollbar[0] = TextBox_GetScrollbar( widget, 0 );
	scrollbar[1] = TextBox_GetScrollbar( widget, 1 );
	/* 如果滚动条可见,那么区域尺寸就需要减去滚动条占用的尺寸 */
	if( scrollbar[0]->visible ) {
		area_size.w -= Widget_GetWidth( scrollbar[0] );
	}
	if( scrollbar[1]->visible ) {
		area_size.h -= Widget_GetHeight( scrollbar[1] );
	}
	
	if( area_size.h <= 0 || area_size.w <= 0 ) {
		return -1;
	}
	
	layer = TextBox_GetTextLayer( widget );
	layer_size = TextLayer_GetSize( layer );
	if( layer_size.h <= 0 || layer_size.w <= 0 ) {
		return -2;
	}
	/* 获取显示区域的位置 */
	area_pos = TextBox_ViewArea_GetPos( widget );
	/* 获取光标的坐标 */
	cursor_pos = TextLayer_Cursor_GetFixedPixelPos( layer );
	/* 获取当前行的最大高度作为光标的高度 */
	cursor_h = TextLayer_CurRow_GetMaxHeight( layer );
	
	/* 设定滚动条的数据中的最大值 */
	ScrollBar_SetMaxNum( scrollbar[0], layer_size.h - area_size.h );
	
	//_DEBUG_MSG("cursor_pos: %d,%d\n", cursor_pos.x, cursor_pos.y);
	//_DEBUG_MSG("area_rect: %d,%d,%d,%d\n", 
	//	area_pos.x, area_pos.y,area_size.w, area_size.h );
	//_DEBUG_MSG("layer_size: %d,%d\n", layer_size.w, layer_size.h);
	
	/* 检测光标Y轴坐标是否超出显示区域的范围 */
	if( cursor_pos.y < area_pos.y ) {
		area_pos.y = cursor_pos.y;
	}
	if(cursor_pos.y + cursor_h > area_pos.y + area_size.h ) {
		area_pos.y = cursor_pos.y + cursor_h - area_size.h;
	}
	/* 如果显示区域在Y轴上超过文本图层的范围 */
	if( area_pos.y + area_size.h > layer_size.h ) {
		area_pos.y = layer_size.h - area_size.h;
	}
	if( area_pos.y < 0 ) {
		area_pos.y = 0;
	}
	/* 设定滚动条的数据中的当前值 */
	ScrollBar_SetCurrentValue( scrollbar[0], area_pos.y );
	/* 获取滚动条的数据,供滚动文本层利用 */
	scrollbar_data = ScrollBar_GetData( scrollbar[0] );
	
	//_DEBUG_MSG("scrollbar_data: size: %d / %d, num: %d / %d\n", 
	//scrollbar_data.current_size, scrollbar_data.max_size, 
	//scrollbar_data.current_num, scrollbar_data.max_num);
	/* 根据数据,滚动文本图层至响应的位置,也就是移动文本显示区域 */
	TextBox_TextLayer_VertScroll( scrollbar_data, widget );
	
	/* 设定滚动条的数据中的最大值 */
	ScrollBar_SetMaxNum( scrollbar[1], layer_size.w - area_size.w );
	
	if( cursor_pos.x < area_pos.x ) {
		area_pos.x = cursor_pos.x;
	}
	if(cursor_pos.x +5 > area_pos.x + area_size.w ) {
		area_pos.x = cursor_pos.x+5 - area_size.w;
	}
	if( area_pos.x + area_size.w > layer_size.w ) {
		area_pos.x = layer_size.w - area_size.w;
	}
	if( area_pos.x < 0 ) {
		area_pos.x = 0;
	}
	/* 设定滚动条的数据中的当前值 */
	ScrollBar_SetCurrentValue( scrollbar[1], area_pos.x );
	/* 获取滚动条的数据,供滚动文本层利用 */
	scrollbar_data = ScrollBar_GetData( scrollbar[1] );
	
	//_DEBUG_MSG("scrollbar_data: size: %d / %d, num: %d / %d\n", 
	//scrollbar_data.current_size, scrollbar_data.max_size, 
	//scrollbar_data.current_num, scrollbar_data.max_num);
	TextBox_HoriScroll_TextLayer( scrollbar_data, widget );
	//_DEBUG_MSG("quit\n");
	return 0;
}
Exemplo n.º 3
0
static void 
TextBox_ScrollBar_UpdateSize( LCUI_Widget *widget )
/* 更新滚动条的长度 */
{
	int tmp;
	char size_str[15];
	LCUI_Size area_size, layer_size;
	LCUI_Widget *scrollbar[2], *label;
	LCUI_TextLayer *layer;
	
	label = TextBox_GetLabel( widget );
	/* 获取文本图层 */
	layer = TextBox_GetTextLayer( widget );
	
	/* 获取文本图层和文本框区域的尺寸 */
	layer_size = TextLayer_GetSize( layer );
	area_size = Widget_GetContainerSize( widget );
	/* 获取纵向和横向滚动条 */
	scrollbar[0] = TextBox_GetScrollbar( widget, 0 );
	scrollbar[1] = TextBox_GetScrollbar( widget, 1 );
	
	/* 如果文本图层高度超过显示区域 */
	if( layer->enable_multiline && area_size.h > 0 
	  && layer_size.h > area_size.h ) {
		tmp = area_size.w - Widget_GetWidth( scrollbar[0] );
#ifdef LCUI_BUILD_IN_LINUX
		snprintf( size_str, sizeof(size_str)-1, "%dpx", tmp );
#else
		sprintf_s( size_str, sizeof(size_str)-1, "%dpx", tmp );
#endif
		Widget_SetSize( label, size_str, NULL );
		
		/* 修改滚动条中记录的最大值和当前值,让滚动条在更新后有相应的长度 */
		ScrollBar_SetMaxSize( scrollbar[0], layer_size.h );
		ScrollBar_SetCurrentSize( scrollbar[0], area_size.h );
		Widget_Show( scrollbar[0] );
		/* 如果横向滚动条可见 */
		if( scrollbar[1]->visible ) {
			tmp = area_size.h - Widget_GetHeight( scrollbar[1] );
#ifdef LCUI_BUILD_IN_LINUX
			snprintf( size_str, sizeof(size_str)-1, "%dpx", tmp );
#else
			sprintf_s( size_str, sizeof(size_str)-1, "%dpx", tmp );
#endif
			Widget_SetSize( scrollbar[0], NULL, size_str );
		} else {
			Widget_SetSize( scrollbar[0], NULL, "100%" );
		}
	} else {
		/* 不需要显示滚动条 */
		Widget_Hide( scrollbar[0] );
		Widget_SetSize( label, "100%", NULL );
	}
	/* 和上面的处理基本一样,这个是处理横向滚动条 */
	if( layer->enable_multiline &&
	 area_size.w > 0 && layer_size.w > area_size.w ) {
		tmp = area_size.h - Widget_GetHeight( scrollbar[1] );
#ifdef LCUI_BUILD_IN_LINUX
		snprintf( size_str, sizeof(size_str)-1, "%dpx", tmp );
#else
		sprintf_s( size_str, sizeof(size_str)-1, "%dpx", tmp );
#endif
		Widget_SetSize( label, NULL, size_str );
		
		ScrollBar_SetMaxSize( scrollbar[1], layer_size.w );
		ScrollBar_SetCurrentSize( scrollbar[1], area_size.w );
		Widget_Show( scrollbar[1] );
		
		if( scrollbar[0]->visible ) {
			tmp = area_size.w - Widget_GetWidth( scrollbar[0] );
#ifdef LCUI_BUILD_IN_LINUX
			snprintf( size_str, sizeof(size_str)-1, "%dpx", tmp );
#else
			sprintf_s( size_str, sizeof(size_str)-1, "%dpx", tmp );
#endif
			Widget_SetSize( scrollbar[1], size_str, NULL );
		} else {
			Widget_SetSize( scrollbar[1], "100%", NULL );
		}
	} else {
		Widget_SetSize( label, NULL, "100%" );
		Widget_Hide( scrollbar[1] );
	}
}
Exemplo n.º 4
0
static void
Window_ExecUpdate( LCUI_Widget *win_p )
{
	LCUI_Size size;
	LCUI_Graph *graph;
	LCUI_Border border;
	LCUI_Widget *titlebar, *btn, *client_area;
	LCUI_RGB border_color, back_color;
	
	btn = Window_GetCloseButton(win_p);
	titlebar = Window_GetTitleBar(win_p);
	client_area = Window_GetClientArea(win_p);
	graph = Widget_GetSelfGraph( win_p );
	/* 按不同的风格来处理 */ 
	switch( win_p->style_id ) {
	    case WINDOW_STYLE_NONE:  /* 没有边框 */
		/* 先计算坐标和尺寸 */
		Widget_SetDock( client_area, DOCK_TYPE_FILL );
		Widget_Hide( titlebar );/* 隐藏标题栏 */
		Widget_Show( client_area );/* 客户区需要显示 */
		break;
			
	    case WINDOW_STYLE_LINE: /* 线条边框 */
		Widget_SetBorder(win_p,
		 Border(1, BORDER_STYLE_SOLID, RGB(50,50,50)));
		Widget_SetPadding( win_p, Padding(1,1,1,1) );
		Widget_SetDock( client_area, DOCK_TYPE_FILL );
		Widget_Hide( titlebar );
		Widget_Show( client_area );
		break;

	    case WINDOW_STYLE_PURE_BLUE: 
		back_color = RGB(30,160,225); 
		border_color = RGB(0,130,195);
		goto union_draw_method;
	    case WINDOW_STYLE_PURE_GREEN:
		back_color = RGB(140,190,40);
		border_color = RGB(110,160,10);
		goto union_draw_method;
	    case WINDOW_STYLE_PURE_RED: 
		back_color = RGB(230,20,0);
		border_color = RGB(200,0,0);
		goto union_draw_method;
	    case WINDOW_STYLE_PURE_ORANGE: 
		back_color = RGB(240,150,10);
		border_color = RGB(210,120,0); 
		goto union_draw_method;
	    case WINDOW_STYLE_PURE_PURPLE:
		back_color = RGB(110,20,95);
		border_color = RGB(80,0,65); 
union_draw_method:;
		/* 若窗口未获得焦点 */
		if( !Widget_GetFocus( win_p ) ) {
			back_color = RGB(235,235,235);
			border_color = RGB(211,211,211);
		}
		/* 更新窗口标题栏上的关闭按钮 */
		Widget_Update( btn );
		border = Border(1, BORDER_STYLE_SOLID, border_color);
		Widget_SetBorder( client_area, border);
		Widget_SetBorder( win_p, border);
		Widget_SetBackgroundColor( win_p, back_color );
		Graph_FillColor( graph, back_color );
		Widget_SetBackgroundColor( client_area, RGB(255,255,255) );
		Widget_SetBackgroundImage( titlebar, NULL );
		Widget_SetBackgroundLayout( titlebar, 0 );
		Widget_SetBackgroundTransparent( titlebar, TRUE );
		Widget_SetBackgroundTransparent( client_area, FALSE );
		Widget_SetPadding( win_p, Padding(1,4,4,4) );
		Widget_SetPadding( client_area, Padding(1,1,1,1) );
		size = Widget_GetContainerSize( win_p );
		Widget_Resize( titlebar, Size(size.h, 25) );
		Widget_Resize( client_area, Size(size.w, size.h - 25) );
		Widget_SetDock( titlebar, DOCK_TYPE_TOP ); 
		Widget_SetDock( client_area, DOCK_TYPE_BOTTOM );
		Widget_Show( titlebar );
		Widget_Show( client_area ); 
		break;
	    default:
			//
		break;
	}
}