abstractgtkcontrol.cpp
来自「这是VCF框架的代码」· C++ 代码 · 共 1,333 行 · 第 1/3 页
CPP
1,333 行
gboolean result = FALSE; if ( gtkEvent->type == GDK_EXPOSE ) { GdkEventExpose * gdkExposeEvent = ( GdkEventExpose* ) gtkEvent; GraphicsContext* gc = control_->getContext(); gc->getPeer() ->setContextID( wndHandle_->window ); if ( GTK_WIDGET_NO_WINDOW( wndHandle_ ) ) { gc->setOrigin( bounds_.left_, bounds_.top_ ); } control_->paint( gc ); repainted_ = false; return FALSE; } else if ( gtkEvent->type == GDK_CONFIGURE ) { //handle this explicitly here int i = 0; i++; GdkEventConfigure* configEv = ( GdkEventConfigure* ) gtkEvent; VCF::Point pt( configEv->x, configEv->y ); VCF::ControlEvent posEvent( control_, pt ); VCF::Size sz( configEv->width, configEv->height ); VCF::ControlEvent szEvent( control_, sz ); control_->handleEvent( &posEvent ); control_->handleEvent( &szEvent ); } else { GTKEventMsg eventMsg( gtkEvent, this->control_ ); Event* event = UIToolkit::createEventFromNativeOSEventData( ( void* ) & eventMsg ); if ( NULL != event ) { control_->handleEvent( event ); event->free(); //result = TRUE; } } return result;}AbstractGTKControl* AbstractGTKControl::getGTKControlFromWidget( GtkWidget* wndHandle ){ AbstractGTKControl * result = NULL; AbstractGTKControl::GTKControlMap::iterator found = AbstractGTKControl::gtkControlMap.find( wndHandle ); if ( found != AbstractGTKControl::gtkControlMap.end() ) { result = found->second; } return result;}void AbstractGTKControl_onCreateEvent( ComponentEvent* e ){ if ( NULL != e ) { Control * control = ( Control* ) e->getSource(); GtkWidget* widget = ( GtkWidget* ) control->getPeer() ->getHandleID(); gtk_widget_set_name( widget, control->getClassName().ansi_c_str() ); control->handleEvent( e ); }}void AbstractGTKControl::registerGTKControl( AbstractGTKControl* gtkControl ){ if ( NULL == gtkControl->wndHandle_ ) { throw InvalidPointerException( MAKE_ERROR_MSG_2( "Attemtping to register an invalid GtkWidget handle" ) ); } GTKUIToolkit* toolkit = ( GTKUIToolkit* ) UIToolkit::internal_getDefaultUIToolkit(); AbstractGTKControl::gtkControlMap[ gtkControl->wndHandle_ ] = gtkControl; gtkControl->initGdkEventHandlers(); toolkit->postEvent( new StaticEventHandlerInstance<ComponentEvent>( &AbstractGTKControl_onCreateEvent, gtkControl, "AbstractGTKControl_onCreateEvent" ), new VCF::ComponentEvent( gtkControl->getControl() , Component::COMPONENT_CREATED ), true );}void AbstractGTKControl::unRegisterGTKControl( AbstractGTKControl* gtkControl ){ AbstractGTKControl::GTKControlMap::iterator found = AbstractGTKControl::gtkControlMap.find( gtkControl->wndHandle_ ); if ( found != AbstractGTKControl::gtkControlMap.end() ) { AbstractGTKControl::gtkControlMap.erase( found ); }}void AbstractGTKControl::translateToScreenCoords( Point* pt ){ //gtk_widget_translate_coordinates}void AbstractGTKControl::translateFromScreenCoords( Point* pt ){}void AbstractGTKControl::initGdkEventHandlers(){ gtk_widget_add_events( wndHandle_, GDK_ALL_EVENTS_MASK ); g_signal_connect ( G_OBJECT ( wndHandle_ ), "event", G_CALLBACK ( AbstractGTKControl::onGdkEvent ), ( gpointer ) this );}gboolean AbstractGTKControl::onGdkEvent( GtkWidget *widget, GdkEvent *event, gpointer user_data ){ AbstractGTKControl * thisPtr = AbstractGTKControl::getGTKControlFromWidget( widget ); if ( NULL == thisPtr ) { return FALSE; } //AbstractGTKControl* thisPtr = (AbstractGTKControl*)user_data; if ( widget != thisPtr->wndHandle_ ) { throw RuntimeException( MAKE_ERROR_MSG_2( "Gdk event received for a widget that doesn't match the AbstractGTKControl's widget" ) ); } return thisPtr->handleEvent( event );}GType AbstractGTKControl::getGTKType (){ static GType container_type = 0; if ( !container_type ) { static const GTypeInfo container_info = { sizeof ( AbstractGTKControl::ContainerClass ), NULL, NULL, ( GClassInitFunc ) AbstractGTKControl::ContainerClass::init, NULL, NULL, sizeof ( AbstractGTKControl::Container ), 0, ( GInstanceInitFunc ) AbstractGTKControl::Container::init, }; container_type = g_type_register_static ( GTK_TYPE_CONTAINER, "AbstractGTKControl_Container", &container_info, ( GTypeFlags ) 0 ); } return container_type;}void AbstractGTKControl::Container::move( GtkWidget* widget, int x, int y, int width, int height ){ /* container->x = x; container->y = y; container->width = width; container->height = height; */ Rect bounds( x, y, x + width, y + height ); AbstractGTKControl* peer = AbstractGTKControl::Container::getControlPeer( widget ); if ( NULL == peer ) { throw RuntimeException( MAKE_ERROR_MSG_2( "no AbstractGTKControl instance associated with this widget!" ) ); } peer->internal_setBounds( bounds ); if ( !GTK_IS_VCF_CONTAINER ( widget ) ) { widget->allocation.x = int( bounds.left_ ); widget->allocation.y = int( bounds.top_ ); widget->allocation.width = int( bounds.getWidth() ); widget->allocation.height = int( bounds.getHeight() ); } if ( GTK_WIDGET_REALIZED ( widget ) ) { GtkWidget * gdkParent = gtk_widget_get_parent ( widget ); gtk_widget_queue_resize( gdkParent ); }}GtkWidget* AbstractGTKControl::Container::create( GtkAdjustment *adjustment, AbstractGTKControl* gtkControlPeer ){ AbstractGTKControl::Container * container; container = ( AbstractGTKControl::Container* ) g_object_new ( AbstractGTKControl::getGTKType (), NULL ); if ( !adjustment ) adjustment = ( GtkAdjustment* ) gtk_adjustment_new ( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ); AbstractGTKControl::Container::setAdjustment( container, adjustment ); container->gtkControlPeer_ = gtkControlPeer; return GTK_WIDGET ( container );}/*GtkAdjustment* AbstractGTKControl::Container::getAdjustment( AbstractGTKControl::Container *container ){ }*/void AbstractGTKControl::Container::setUpdatePolicy( AbstractGTKControl::Container *container, GtkUpdateType policy ){}void AbstractGTKControl::Container::setAdjustment( AbstractGTKControl::Container *container, GtkAdjustment *adjustment ){ g_return_if_fail ( container != NULL ); g_return_if_fail ( GTK_IS_VCF_CONTAINER ( container ) ); if ( container->adjustment ) { g_signal_handlers_disconnect_by_func ( GTK_OBJECT ( container->adjustment ), NULL, ( gpointer ) container ); g_object_unref ( GTK_OBJECT ( container->adjustment ) ); } container->adjustment = adjustment; g_object_ref ( GTK_OBJECT ( container->adjustment ) ); g_signal_connect ( GTK_OBJECT ( adjustment ), "changed", GTK_SIGNAL_FUNC ( AbstractGTKControl::Container::adjustmentChanged ), ( gpointer ) container ); g_signal_connect ( GTK_OBJECT ( adjustment ), "value_changed", GTK_SIGNAL_FUNC ( AbstractGTKControl::Container::adjustmentValueChanged ), ( gpointer ) container );}void AbstractGTKControl::Container::init( AbstractGTKControl::Container *container ){ container->gtkControlPeer_ = NULL;}void AbstractGTKControl::Container::destroy ( GtkObject *object ){ AbstractGTKControl::Container * container; g_return_if_fail ( object != NULL ); g_return_if_fail ( GTK_IS_VCF_CONTAINER ( object ) ); container = GTK_VCF_CONTAINER ( object ); if ( container->adjustment ) { g_object_unref ( GTK_OBJECT ( container->adjustment ) ); container->adjustment = NULL; } if ( GTK_OBJECT_CLASS ( internalVCFParentClass ) ->destroy ) { ( * GTK_OBJECT_CLASS ( internalVCFParentClass ) ->destroy ) ( object ); }}Rect AbstractGTKControl::Container::getBounds( GtkWidget* widget ){ Rect result; if ( GTK_IS_VCF_CONTAINER ( widget ) ) { AbstractGTKControl::Container * container = GTK_VCF_CONTAINER ( widget ); result = container->gtkControlPeer_->internal_getBounds(); } else { AbstractGTKControl* control = AbstractGTKControl::getGTKControlFromWidget( widget ); if ( NULL == control ) { throw RuntimeException( MAKE_ERROR_MSG_2( "AbstractGTKControl::getGTKControlFromWidget() returned NULL - no control associated with this GTK widget!" ) ); } result = control->internal_getBounds(); } return result;}void AbstractGTKControl::Container::moveChild( AbstractGTKControl::Container *container, GtkWidget* child, int x, int y, int width, int height ){ g_return_if_fail ( container != NULL ); g_return_if_fail ( GTK_IS_VCF_CONTAINER ( container ) ); g_return_if_fail ( child != NULL ); printf( "AbstractGTKControl::Container::moveChild called\n" ); GList *children = container->children; ContainerChild* childObj = NULL; while ( children ) { childObj = ( ContainerChild* ) children->data; if ( childObj->widget == child ) { childObj->x = x; childObj->y = y; childObj->width = width; childObj->height = height; Rect bounds( x, y, x + width, y + height ); AbstractGTKControl* peer = AbstractGTKControl::Container::getControlPeer( child ); if ( NULL == peer ) { //throw RuntimeException( MAKE_ERROR_MSG_2("no AbstractGTKControl instance associated with this widget!") ); } if ( NULL != peer ) { peer->internal_setBounds( bounds ); } gtk_widget_queue_resize ( GTK_WIDGET ( child ) ); break; } children = children->next; }}Rect AbstractGTKControl::Container::getChildBounds( AbstractGTKControl::Container *container, GtkWidget* child ){ Rect result; GList *children = container->children; ContainerChild* childObj = NULL; while ( children ) { childObj = ( ContainerChild* ) children->data; if ( childObj->widget == child ) { result.left_ = childObj->x; result.top_ = childObj->y; result.right_ = result.left_ + childObj->width; result.bottom_ = result.top_ + childObj->height; break; } children = children->next; } return result;}AbstractGTKControl* AbstractGTKControl::Container::getControlPeer( GtkWidget* widget ){ AbstractGTKControl * result = NULL; if ( GTK_IS_VCF_CONTAINER ( widget ) ) { AbstractGTKControl::Container * container = GTK_VCF_CONTAINER ( widget ); result = container->gtkControlPeer_; } else { result = AbstractGTKControl::getGTKControlFromWidget( widget ); } return result;}void AbstractGTKControl::Container::realize( GtkWidget *widget ){ AbstractGTKControl::Container * container; //printf( "gtk_absolute_container_realize\n" ); GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail ( widget != NULL ); g_return_if_fail ( GTK_IS_VCF_CONTAINER ( widget ) ); GTK_WIDGET_SET_FLAGS ( widget, GTK_REALIZED ); container = GTK_VCF_CONTAINER ( widget ); attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.window_type = GDK_WINDOW_CHILD; attributes.event_mask = gtk_widget_get_events ( widget ) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK; attributes.visual = gtk_widget_get_visual ( widget ); attributes.colormap = gtk_widget_get_colormap ( widget ); attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new ( widget->parent->window, &attributes, attributes_mask ); widget->style = gtk_style_attach ( widget->style, widget->window ); gdk_window_set_user_data ( widget->window, widget ); gtk_style_set_background ( widget->style, widget->window, GTK_STATE_ACTIVE );}void AbstractGTKControl::Container::sizeRequest( GtkWidget *widget, GtkRequisition *requisition ){ //printf( "gtk_absolute_container_size_request\n" ); g_return_if_fail ( widget != NULL ); g_return_if_fail ( GTK_IS_VCF_CONTAINER ( widget ) ); g_return_if_fail ( requisition != NULL ); StringUtils::traceWithArgs( "Container::sizeRequest widget: %p, name:%s\n", widget, widget->name ); Rect bounds = AbstractGTKControl::Container::getBounds( widget ); requisition->width = int( bounds.getWidth() );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?