Prima

 view release on metacpan or  search on metacpan

class/Widget.c  view on Meta::CPAN

	list_create( &var-> widgets, 0, 8);
	var-> tabOrder = -1;

	var-> geomInfo. side = 3; /* default pack side is 'top', anchor ='center' */
	var-> geomInfo. anchorx = var-> geomInfo. anchory = 1;

	my-> update_sys_handle( self, profile);
	/* props init */
	/* font and colors */
	SvHV_Font( pget_sv( font), &Font_buffer, "Widget::init");
	my-> set_widgetClass        ( self, pget_i( widgetClass  ));
	my-> set_color              ( self, pget_i( color        ));
	my-> set_backColor          ( self, pget_i( backColor    ));
	my-> set_font               ( self, Font_buffer);
	opt_assign( optOwnerBackColor, pget_B( ownerBackColor));
	opt_assign( optOwnerColor    , pget_B( ownerColor));
	opt_assign( optOwnerFont     , pget_B( ownerFont));
	opt_assign( optOwnerHint     , pget_B( ownerHint));
	opt_assign( optOwnerShowHint , pget_B( ownerShowHint));
	opt_assign( optOwnerPalette  , pget_B( ownerPalette));
	my-> colorIndex( self, true,  ciHiliteText,   pget_i( hiliteColor)      );
	my-> colorIndex( self, true,  ciHilite,       pget_i( hiliteBackColor)  );
	my-> colorIndex( self, true,  ciDisabledText, pget_i( disabledColor)    );
	my-> colorIndex( self, true,  ciDisabled,     pget_i( disabledBackColor));
	my-> colorIndex( self, true,  ciLight3DColor, pget_i( light3DColor)     );
	my-> colorIndex( self, true,  ciDark3DColor,  pget_i( dark3DColor)      );
	my-> set_palette( self, pget_sv( palette));

	/* light props */
	my-> set_autoEnableChildren ( self, pget_B( autoEnableChildren));
	my-> set_briefKeys          ( self, pget_B( briefKeys));
	my-> set_buffered           ( self, pget_B( buffered));
	my-> set_clipChildren       ( self, pget_B( clipChildren));
	my-> set_cursorVisible      ( self, pget_B( cursorVisible));
	my-> set_dndAware           ( self, pget_sv( dndAware));
	my-> set_growMode           ( self, pget_i( growMode));
	my-> set_helpContext        ( self, pget_sv( helpContext));
	my-> set_hint               ( self, pget_sv( hint));
	my-> set_firstClick         ( self, pget_B( firstClick));
	{
		Point hotSpot;
		Handle icon = pget_H( pointerIcon);
		prima_read_point( pget_sv( pointerHotSpot), (int*)&hotSpot, 2, "Array panic on 'pointerHotSpot'");
		if ( icon != NULL_HANDLE && !kind_of( icon, CIcon)) {
			warn("Illegal object reference passed to Widget::pointerIcon");
			icon = NULL_HANDLE;
		}
		apc_pointer_set_user( self, icon, hotSpot);
	}
	my-> set_pointerType        ( self, pget_i( pointerType));
	my-> set_selectingButtons   ( self, pget_i( selectingButtons));
	my-> set_selectable         ( self, pget_B( selectable));
	my-> set_showHint           ( self, pget_B( showHint));
	my-> set_tabOrder           ( self, pget_i( tabOrder));
	my-> set_tabStop            ( self, pget_B( tabStop));
	my-> set_text               ( self, pget_sv( text));

	opt_assign( optScaleChildren, pget_B( scaleChildren));

	/* subcomponents props */
	my-> popupColorIndex( self, true, ciFore,         pget_i( popupColor)              );
	my-> popupColorIndex( self, true, ciBack,         pget_i( popupBackColor)          );
	my-> popupColorIndex( self, true, ciHiliteText,   pget_i( popupHiliteColor)        );
	my-> popupColorIndex( self, true, ciHilite,       pget_i( popupHiliteBackColor)    );
	my-> popupColorIndex( self, true, ciDisabledText, pget_i( popupDisabledColor)      );
	my-> popupColorIndex( self, true, ciDisabled,     pget_i( popupDisabledBackColor)  );
	my-> popupColorIndex( self, true, ciLight3DColor, pget_i( popupLight3DColor)       );
	my-> popupColorIndex( self, true, ciDark3DColor,  pget_i( popupDark3DColor)        );
	SvHV_Font( pget_sv( popupFont), &Font_buffer, "Widget::init");
	my-> set_popup_font  ( self, Font_buffer);
	if ( SvOK( sv = pget_sv( popupItems)))
		my-> set_popupItems( self, sv);
	if ( SvOK( sv = pget_sv( accelItems)))
		my-> set_accelItems( self, sv);

	/* size, position, enabling, visibility etc. runtime */
	{
		Point set, set2;
		AV * av;
		SV ** holder;
		NPoint ds = {1,1};

		prima_read_point( pget_sv( sizeMin), (int*)&set, 2, "Array panic on 'sizeMin'");
		prima_read_point( pget_sv( sizeMax), (int*)&set2, 2, "Array panic on 'sizeMax'");
		var-> sizeMax = set2;
		my-> set_sizeMin( self, set);
		my-> set_sizeMax( self, set2);
		prima_read_point( pget_sv( cursorSize), (int*)&set, 2, "Array panic on 'cursorSize'");
		my-> set_cursorSize( self, set);
		prima_read_point( pget_sv( cursorPos), (int*)&set, 2, "Array panic on 'cursorPos'");
		my-> set_cursorPos( self, set);

		av = ( AV *) SvRV( pget_sv( designScale));
		holder = av_fetch( av, 0, 0);
		ds. x = holder ? SvNV( *holder) : 1;
		if ( !holder) warn("Array panic on 'designScale'");
		holder = av_fetch( av, 1, 0);
		ds. y = holder ? SvNV( *holder) : 1;
		if ( !holder) warn("Array panic on 'designScale'");
		my-> set_designScale( self, ds);
	}
	my-> set_enabled     ( self, pget_B( enabled));
	if ( !pexist( originDontCare) || !pget_B( originDontCare)) {
		Point pos;
		pos. x = pget_i( left);
		pos. y = pget_i( bottom);
		my-> set_origin( self, pos);
	} else
		var-> pos = my-> get_origin( self);

	if ( !pexist( sizeDontCare  ) || !pget_B( sizeDontCare  )) {
		Point size;
		size. x = pget_i( width);
		size. y = pget_i( height);
		my-> set_size( self, size);
	} else
		var-> virtualSize = my-> get_size( self);
	var-> geomSize = var-> virtualSize;

	geometry = pget_i(geometry);
	if ( geometry == gtGrowMode ) {
		Bool x = 0, y = 0;
		if ( pget_B( centered)) { x = 1; y = 1; };
		if ( pget_B( x_centered) || ( var-> growMode & gmXCenter)) x = 1;
		if ( pget_B( y_centered) || ( var-> growMode & gmYCenter)) y = 1;
		if ( x || y) my-> set_centered( self, x, y);
		var-> geomInfo. x = x;
		var-> geomInfo. y = y;
	}

	opt_assign( optPackPropagate, pget_B( packPropagate));
	my-> set_packInfo( self, pget_sv( packInfo));

class/Widget.c  view on Meta::CPAN


void
Widget_bring_to_front( Handle self)
{
	if ( opt_InPaint) return;
	apc_widget_set_z_order( self, NULL_HANDLE, true);
}

/*::c */
Bool
Widget_can_close( Handle self)
{
	enter_method;
	Event ev = { cmClose};
	return ( var-> stage <= csNormal) ? my-> message( self, &ev) : true;
}

Bool
Widget_can_propagate_key( Handle self)
{
	return true;
}

void
Widget_cleanup( Handle self)
{
	Handle ptr;
	enter_method;

	/* disconnect all geometry slaves */
	ptr = var-> packSlaves;
	while ( ptr) {
		PWidget( ptr)-> geometry = gtDefault;
		ptr = PWidget( ptr)-> geomInfo. next;
	}
	var-> packSlaves = NULL_HANDLE;
	ptr = var-> placeSlaves;
	while ( ptr) {
		PWidget( ptr)-> geometry = gtDefault;
		ptr = PWidget( ptr)-> geomInfo. next;
	}
	var-> placeSlaves = NULL_HANDLE;

	my-> set_geometry( self, gtDefault);

	if ( prima_guts.application && P_APPLICATION-> hintUnder == self)
		my-> set_hintVisible( self, 0);

	{
		int i;
		for ( i = 0; i < var-> widgets. count; i++)
			Object_destroy( var-> widgets. items[i]);
	}

	if ( var-> accelTable) {
		unprotect_object(var-> accelTable);
		//my-> detach( self, var-> accelTable, true);
		var-> accelTable = NULL_HANDLE;
	}

	if ( var-> popupMenu ) {
		unprotect_object(var-> popupMenu);
		//my-> detach( self, var-> popupMenu, true);
		var-> popupMenu = NULL_HANDLE;
	}

	inherited-> cleanup( self);
}


Bool
Widget_close( Handle self)
{
	Bool canClose;
	enter_method;
	if ( var-> stage > csNormal) return true;
	if (( canClose = my-> can_close( self))) {
		Object_destroy( self);
	}
	return canClose;
}

/*::d */
void
Widget_detach( Handle self, Handle objectHandle, Bool kill)
{
	enter_method;
	if ( kind_of( objectHandle, CWidget)) {
		list_delete( &var-> widgets, objectHandle);
		if ( var-> currentWidget == objectHandle && objectHandle != NULL_HANDLE)
			my-> set_currentWidget( self, NULL_HANDLE);
	}
	inherited-> detach( self, objectHandle, kill);
}

DNDResp
Widget_dnd_start(Handle self, int dnd_actions, Bool default_pointers)
{
	DNDResp ret;
	ret.action = apc_dnd_start( self, dnd_actions, default_pointers, &ret.counterpart);
	return ret;
}

/*::e */
void
Widget_end_paint( Handle self)
{
	if ( !is_opt( optInDraw)) return;
	apc_widget_end_paint( self);
	inherited-> end_paint( self);
}

void
Widget_end_paint_info( Handle self)
{
	if ( !is_opt( optInDrawInfo)) return;
	apc_widget_end_paint_info( self);
	inherited-> end_paint_info( self);
}


/*::f */

SV*

class/Widget.c  view on Meta::CPAN

				values[ iHEIGHT] = values[ iTOP] - values[ iBOTTOM];
				exists[ iTOP]    = 0;
			}

			if (
				( count == 2) &&
				(
					( exists[ iLEFT]  && exists[ iBOTTOM]) ||
					( exists[ iWIDTH] && exists[ iHEIGHT])
				)
				) {
				Point p;
				if ( exists[ iLEFT]) {
					p. x = values[ iLEFT];
					p. y = values[ iBOTTOM];
					my-> set_origin( self, p);
				} else {
					p. x = values[ iWIDTH];
					p. y = values[ iHEIGHT];
					my-> set_size( self, p);
				}
			} else {
				Rect r;
				if ( !exists[ iWIDTH] || !exists[ iHEIGHT]) {
					Point sz;
					sz = my-> get_size( self);
					if ( !exists[ iWIDTH])  values[ iWIDTH]  = sz. x;
					if ( !exists[ iHEIGHT]) values[ iHEIGHT] = sz. y;
					exists[ iWIDTH] = exists[ iHEIGHT] = 1;
				}
				if ( ( !exists[ iLEFT]   && !exists[ iRIGHT]) ||
					( !exists[ iBOTTOM] && !exists[ iTOP])) {
					Point pos;
					pos = my-> get_origin( self);
					if ( !exists[ iLEFT])   values[ iLEFT]   = pos. x;
					if ( !exists[ iBOTTOM]) values[ iBOTTOM] = pos. y;
					exists[ iLEFT] = exists[ iBOTTOM] = 1;
				}
				if ( !exists[ iLEFT]) {
					exists[ iLEFT] = 1;
					values[ iLEFT] = values[ iRIGHT] - values[ iWIDTH];
				}
				if ( !exists[ iBOTTOM]) {
					exists[ iBOTTOM] = 1;
					values[ iBOTTOM] = values[ iTOP] - values[ iHEIGHT];
				}
				r. left   = values[ iLEFT];
				r. bottom = values[ iBOTTOM];
				r. right  = values[ iLEFT] + values[ iWIDTH];
				r. top    = values[ iBOTTOM] + values[ iHEIGHT];
				my-> set_rect( self, r);
			}
			pdelete( left);
			pdelete( right);
			pdelete( top);
			pdelete( bottom);
			pdelete( width);
			pdelete( height);
		} /* count > 1 */
	}
	if ( pexist( popupFont))
	{
		SvHV_Font( pget_sv( popupFont), &Font_buffer, "Widget::set");
		my-> set_popup_font( self, Font_buffer);
		pdelete( popupFont);
	}
	if ( pexist( pointerIcon) && pexist( pointerHotSpot))
	{
		Point hotSpot;
		Handle icon = pget_H( pointerIcon);
		prima_read_point( pget_sv( pointerHotSpot), (int*)&hotSpot, 2, "Array panic on 'pointerHotSpot'");
		if ( icon != NULL_HANDLE && !kind_of( icon, CIcon)) {
			warn("Illegal object reference passed to Widget.set_pointer_icon");
			icon = NULL_HANDLE;
		}
		apc_pointer_set_user( self, icon, hotSpot);
		if ( var-> pointerType == crUser) my-> first_that( self, (void*)sptr, NULL);
		pdelete( pointerIcon);
		pdelete( pointerHotSpot);
	}
	if ( pexist( designScale))
	{
		AV * av = ( AV *) SvRV( pget_sv( designScale));
		SV ** holder = av_fetch( av, 0, 0);
		NPoint ds = {1,1};
		ds. x = holder ? SvNV( *holder) : 1;
		if ( !holder) warn("Array panic on 'designScale'");
		holder = av_fetch( av, 1, 0);
		ds. y = holder ? SvNV( *holder) : 1;
		if ( !holder) warn("Array panic on 'designScale'");
		my-> set_designScale( self, ds);
		pdelete( designScale);
	}
	if ( pexist( sizeMin)) {
		Point set;
		prima_read_point( pget_sv( sizeMin), (int*)&set, 2, "Array panic on 'sizeMin'");
		my-> set_sizeMin( self, set);
		pdelete( sizeMin);
	}
	if ( pexist( sizeMax)) {
		Point set;
		prima_read_point( pget_sv( sizeMax), (int*)&set, 2, "Array panic on 'sizeMax'");
		my-> set_sizeMax( self, set);
		pdelete( sizeMax);
	}
	if ( pexist( cursorSize)) {
		Point set;
		prima_read_point( pget_sv( cursorSize), (int*)&set, 2, "Array panic on 'cursorSize'");
		my-> set_cursorSize( self, set);
		pdelete( cursorSize);
	}
	if ( pexist( cursorPos)) {
		Point set;
		prima_read_point( pget_sv( cursorPos), (int*)&set, 2, "Array panic on 'cursorPos'");
		my-> set_cursorPos( self, set);
		pdelete( cursorPos);
	}
	if ( pexist( geomSize))
	{
		Point set;
		prima_read_point( pget_sv( geomSize), (int*)&set, 2, "Array panic on 'geomSize'");
		my-> set_geomSize( self, set);
		pdelete( geomSize);
	}

class/Widget.c  view on Meta::CPAN

		my-> set_cursorVisible( self, true);
		var-> cursorLock = 0;
	}
}

/*::t */
/*::u */

static Bool
repaint_all( Handle owner, Handle self, void * dummy)
{
	enter_method;
	my-> repaint( self);
	my-> first_that( self, (void*)repaint_all, NULL);
	return false;
}

Bool
Widget_unlock( Handle self)
{
	if ( --var-> lockCount <= 0) {
		var-> lockCount = 0;
		repaint_all( var-> owner, self, NULL);
	}
	return true;
}

void
Widget_update_view( Handle self)
{
	if ( !opt_InPaint) apc_widget_update( self);
}

/*::v */

Bool
Widget_validate_owner( Handle self, Handle * owner, HV * profile)
{
	dPROFILE;
	*owner = pget_H( owner);
	if ( !kind_of( *owner, CWidget)) return false;
	return inherited-> validate_owner( self, owner, profile);
}

/*::w */
/*::x */
/*::y */
/*::z */

/* get_props() */

Font
Widget_get_default_font( char * dummy)
{
	Font font;
	apc_widget_default_font( &font);
	return font;
}

Font
Widget_get_default_popup_font( char * dummy)
{
	Font f;
	apc_popup_default_font( &f);
	return f;
}


NPoint
Widget_designScale( Handle self, Bool set, NPoint designScale)
{
	if ( !set)
		return var-> designScale;
	if ( designScale. x < 0) designScale. x = 0;
	if ( designScale. y < 0) designScale. y = 0;
	var-> designScale = designScale;
	return designScale;
}

int
Widget_growMode( Handle self, Bool set, int growMode)
{
	enter_method;
	Bool x = false, y = false;
	if ( !set)
		return var-> growMode;
	var-> growMode = growMode;
	if ( var-> growMode & gmXCenter) x = true;
	if ( var-> growMode & gmYCenter) y = true;
	if ( var-> geometry == gtGrowMode && (x || y)) my-> set_centered( self, x, y);
	return var-> growMode;
}

SV *
Widget_get_handle( Handle self)
{
	char buf[ 256];
	snprintf( buf, 256, PR_HANDLE_FMT, apc_widget_get_handle( self));
	return newSVpv( buf, 0);
}

SV *
Widget_get_parent_handle( Handle self)
{
	char buf[ 256];
	snprintf( buf, 256, PR_HANDLE_FMT, apc_widget_get_parent_handle( self));
	return newSVpv( buf, 0);
}

int
Widget_hintVisible( Handle self, Bool set, int hintVisible)
{
	Bool wantVisible;
	if ( !set)
		return P_APPLICATION-> hintVisible;
	if ( var-> stage >= csDead) return false;
	wantVisible = ( hintVisible != 0);
	if ( wantVisible == P_APPLICATION-> hintVisible) return false;
	if ( wantVisible) {
		if ( !SvOK(var->hint) || (SvCUR( var-> hint) == 0)) return false;
		if ( hintVisible > 0) P_APPLICATION-> hintActive = -1; /* immediate */
	}
	C_APPLICATION-> set_hint_action( prima_guts.application, self, wantVisible, false);
	return false;
}

Bool
Widget_get_locked( Handle self)
{
	while ( self) {
		if ( var-> lockCount != 0) return true;
		self = var-> owner;
	}
	return false;
}


Handle
Widget_get_parent( Handle self)
{
	enter_method;
	return my-> get_clipOwner( self) ? var-> owner : prima_guts.application;
}

Point
Widget_get_pointer_size( char*dummy)
{
	return apc_pointer_get_size( NULL_HANDLE);
}

Font
Widget_get_popup_font( Handle self)
{
	return var-> popupFont;
}

Handle
Widget_get_selectee( Handle self)
{
	if ( var-> stage > csFrozen) return NULL_HANDLE;
	if ( is_opt( optSelectable))
		return self;
	else if ( var-> currentWidget) {
		PWidget w = ( PWidget) var-> currentWidget;
		if ( w-> options. optSystemSelectable && !w-> self-> get_clipOwner(( Handle) w))
			return ( Handle) w;
		else
			return w-> self-> get_selectee(( Handle) w);
	} else if ( is_opt( optSystemSelectable))
		return self;
	else
		return find_tabfoc( self);
}

Point
Widget_get_virtual_size( Handle self)
{
	return var-> virtualSize;
}

/* set_props() */

Bool
Widget_set_capture( Handle self, Bool capture, Handle confineTo)
{
	if ( opt_InPaint) return false;
	return apc_widget_set_capture( self, capture, confineTo);
}

void
Widget_set_centered( Handle self, Bool x, Bool y)
{
	enter_method;
	Handle parent = my-> get_parent( self);
	Point size    = CWidget( parent)-> get_size( parent);
	Point mysize  = my-> get_size ( self);
	Point mypos   = my-> get_origin( self);
	Point delta   = {0,0};

	if ( !x && !y ) return;

	if ( parent == prima_guts.application ) {
		int i, nrects = 0;
		Point mouse = apc_pointer_get_pos(prima_guts.application);
		Box *best = NULL, *rects = apc_application_get_monitor_rects( prima_guts.application, &nrects);
		for ( i = 0; i < nrects; i++) {
			Box * curr = rects + i;
			if (
				curr->x <= mouse.x &&
				curr->y <= mouse.y &&
				curr->x + curr->width > mouse.x &&
				curr->y + curr->height > mouse.y
			) {
				best = curr;
				break;
			}
		}
		if ( best ) {
			delta.x = best->x;
			delta.y = best->y;
			size.x  = best->width;
			size.y  = best->height;
		}
	}
	if ( x) mypos. x = ( size. x - mysize. x) / 2 + delta.x;
	if ( y) mypos. y = ( size. y - mysize. y) / 2 + delta.y;
	my-> set_origin( self, mypos);
}

void
Widget_set_font( Handle self, Font font)
{
	enter_method;
	if ( var-> stage > csFrozen) return;
	if ( !opt_InPaint) my-> first_that( self, (void*)prima_font_notify, &font);
	if ( var-> handle == NULL_HANDLE) return; /* aware of call from Drawable::init */
	if ( opt_InPaint) {
		inherited->set_font(self, font);
	}
	else {
		apc_font_pick( self, &font, & var-> font);
		opt_clear( optOwnerFont);
		apc_widget_set_font( self, & var-> font);
		my-> repaint( self);
	}
}

void
Widget_set_popup_font( Handle self, Font font)
{
	apc_font_pick( self, &font, &var-> popupFont);
}


/* static iterators */
static Handle
find_tabfoc( Handle self)
{
	int i;
	Handle toRet;
	for ( i = 0; i < var-> widgets. count; i++) {
		PWidget w = ( PWidget)( var-> widgets. items[ i]);
		if (
			w-> self-> get_selectable(( Handle) w) &&
			w-> self-> get_enabled(( Handle) w)
		)
			return ( Handle) w;
	}
	for ( i = 0; i < var-> widgets. count; i++)
		if (( toRet = find_tabfoc( var-> widgets. items[ i])))
			return toRet;
	return NULL_HANDLE;
}


static Bool
get_top_current( Handle self)
{
	PWidget o  = ( PWidget) var-> owner;
	Handle  me = self;
	while ( o) {
		if ( o-> currentWidget != me)
			return false;
		me = ( Handle) o;
		o  = ( PWidget) o-> owner;
	}
	return true;
}

static Bool
sptr( Handle window, Handle self, void * v)
{
	enter_method;
	/* does nothing but refreshes system pointer */
	if ( var-> pointerType == crDefault)
		my-> set_pointerType( self, crDefault);
	return false;
}

/* static iterators for ownership notifications */

Bool
prima_font_notify ( Handle self, Handle child, void * font)
{
	if ( his-> options. optOwnerFont) {
		his-> self-> set_font ( child, *(( PFont) font));
		his-> options. optOwnerFont = 1;
	}
	return false;
}

class/Widget.c  view on Meta::CPAN

	if ( !set) {
		HV * profile = newHV();
		Handle icon = Object_create( "Prima::Icon", profile);
		sv_free(( SV *) profile);
		apc_pointer_get_bitmap( self, icon);
		--SvREFCNT( SvRV((( PAnyObject) icon)-> mate));
		return icon;
	}

	if ( icon != NULL_HANDLE && !kind_of( icon, CIcon)) {
		warn("Illegal object reference passed to Widget::pointerIcon");
		return NULL_HANDLE;
	}
	hotSpot = my-> get_pointerHotSpot( self);
	apc_pointer_set_user( self, icon, hotSpot);
	if ( var-> pointerType == crUser) my-> first_that( self, (void*)sptr, NULL);
	return NULL_HANDLE;
}

Point
Widget_pointerHotSpot( Handle self, Bool set, Point hotSpot)
{
	enter_method;
	Handle icon;
	if ( !set)
		return apc_pointer_get_hot_spot( self);
	if ( var-> stage > csFrozen) return hotSpot;
	icon = my-> get_pointerIcon( self);
	apc_pointer_set_user( self, icon, hotSpot);
	if ( var-> pointerType == crUser) my-> first_that( self, (void*)sptr, NULL);
	return hotSpot;
}

int
Widget_pointerType( Handle self, Bool set, int type)
{
	enter_method;
	if ( var-> stage > csFrozen) return 0;
	if ( !set)
		return var-> pointerType;
	var-> pointerType = type;
	apc_pointer_set_shape( self, type);
	my-> first_that( self, (void*)sptr, NULL);
	return type;
}

Point
Widget_pointerPos( Handle self, Bool set, Point p)
{
	if ( !set) {
		p = apc_pointer_get_pos( self);
		apc_widget_map_points( self, false, 1, &p);
		return p;
	}
	apc_widget_map_points( self, true, 1, &p);
	apc_pointer_set_pos( self, p. x, p. y);
	return p;
}

Handle
Widget_popup( Handle self, Bool set, Handle popup)
{
	if ( var-> stage > csFrozen) return NULL_HANDLE;
	if ( !set)
		return var-> popupMenu;

	if ( popup && !kind_of( popup, CPopup)) return NULL_HANDLE;
	if ( var->popupMenu ) unprotect_object(var-> popupMenu);
	var-> popupMenu = popup;
	if ( var->popupMenu ) protect_object(var-> popupMenu);
	return NULL_HANDLE;
}

Color
Widget_popupColorIndex( Handle self, Bool set, int index, Color color)
{
	if (( index < 0) || ( index > ciMaxId)) return clInvalid;
	if ( !set)
		return var-> popupColor[ index];
	if ((( color & clSysFlag) != 0) && (( color & wcMask) == 0)) color |= wcPopup;
	var-> popupColor[ index] = color;
	return color;
}

SV *
Widget_popupItems( Handle self, Bool set, SV * popupItems)
{
	dPROFILE;
	enter_method;
	if ( var-> stage > csFrozen) return NULL_SV;
	if ( !set)
		return var-> popupMenu ?
			CAbstractMenu( var-> popupMenu)-> get_items( var-> popupMenu, "", true) : NULL_SV;

	if ( var-> popupMenu == NULL_HANDLE) {
		if ( SvTYPE( popupItems)) {
			HV * profile = newHV();
			pset_sv( items, popupItems);
			pset_H ( owner, self);
			my-> set_popup( self, create_instance( "Prima::Popup"));
			sv_free(( SV *) profile);
		}
	}
	else
		CAbstractMenu(var-> popupMenu)-> set_items(var-> popupMenu, popupItems);
	return popupItems;
}


Rect
Widget_rect( Handle self, Bool set, Rect r)
{
	enter_method;
	if ( !set) {
		Point p   = my-> get_origin( self);
		Point s   = my-> get_size( self);
		r. left   = p. x;
		r. bottom = p. y;
		r. right  = p. x + s. x;
		r. top    = p. y + s. y;
	} else
		apc_widget_set_rect( self, r. left, r. bottom, r. right - r. left, r. top - r. bottom);
	return r;
}

int
Widget_right( Handle self, Bool set, int right)
{
	enter_method;
	Point p;
	Rect r = my-> get_rect( self);
	if ( !set)
		return r. right;
	p. x = r. left - r. right + right;
	p. y = r. bottom;
	my-> set_origin( self, p);
	return 0;
}

Bool
Widget_scaleChildren( Handle self, Bool set, Bool scaleChildren)
{
	if ( !set)
		return is_opt( optScaleChildren);
	opt_assign( optScaleChildren, scaleChildren);
	return false;
}

Bool
Widget_selectable( Handle self, Bool set, Bool selectable)
{
	if ( !set)
		return is_opt( optSelectable);
	opt_assign( optSelectable, selectable);
	return false;
}

Bool
Widget_selected( Handle self, Bool set, Bool selected)
{
	enter_method;
	if ( !set)
		return my-> get_selectedWidget( self) != NULL_HANDLE;

	if ( var-> stage > csFrozen) return selected;
	if ( selected) {



( run in 1.067 second using v1.01-cache-2.11-cpan-364913b4093 )