static void geometry_hook(Widget wid, Widget hooked_widget, XtGeometryHookData call_data) { XtWidgetGeometry *request; JNIEnv *env; struct ChoiceData *cdata; struct WidgetInfo *winfo = NULL; jobject target; jobject parent; jint y, height; if ((call_data->widget == hooked_widget) && (call_data->type == XtHpostGeometry) && (call_data->result == XtGeometryYes)) { request = call_data->request; env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); DASSERT(env != NULL); winfo=findWidgetInfo(hooked_widget); if (winfo != NULL && XmIsRowColumn(hooked_widget)) { target = (*env)->GetObjectField(env, (jobject)winfo->peer, mComponentPeerIDs.target); cdata = (struct ChoiceData *) JNU_GetLongFieldAsPtr(env, (jobject)winfo->peer, mComponentPeerIDs.pData); DASSERT(target != NULL); DASSERT(cdata != NULL && cdata->comp.widget != NULL) if (request->request_mode & CWHeight) { height = (*env)->GetIntField(env, target, componentIDs.height); if (request->height > 0 && request->height != height) { parent = (*env)->CallObjectMethod(env, target, componentIDs.getParent); if ((parent != NULL) && ((*env)->GetObjectField(env, parent, containerIDs.layoutMgr) != NULL)) { y = cdata->bounds_y; if (request->height < cdata->bounds_height) { y += (cdata->bounds_height - request->height) / 2; } XtVaSetValues(hooked_widget, XmNy, y, NULL); (*env)->SetIntField(env, target, componentIDs.y, y); } if (parent != NULL) { (*env)->DeleteLocalRef(env, parent); } } (*env)->SetIntField(env, target, componentIDs.height, request->height); } if (request->request_mode & CWWidth) { (*env)->SetIntField(env, target, componentIDs.width, request->width); } (*env)->DeleteLocalRef(env, target); }
//-------------------------------------------------------------------------------------- const MyGUI::WidgetInfo* BaseLayout::findWidgetInfo(const String& _widgetName, const MyGUI::VectorWidgetInfo& _vectorInfo) { for (MyGUI::VectorWidgetInfo::const_iterator iter = _vectorInfo.begin(); iter != _vectorInfo.end(); ++iter) { // check name if(iter->name == _widgetName) return &*iter; // iterate children const MyGUI::WidgetInfo* childFind = findWidgetInfo(_widgetName, iter->childWidgetsInfo); if(childFind) return childFind; } // found nothing return nullptr; }
//-------------------------------------------------------------------------------------- MyGUI::Widget* BaseLayout::loadLayoutPart(const String& _layoutName, const String& _mainWidgetName, const String& _prefix, MyGUI::Widget* _parent) { // load "*.layout" file MyGUI::ResourceLayout* resourceLayout = MyGUI::LayoutManager::getInstance().getByName(_layoutName, false); if (!resourceLayout) { MyGUI::ResourceManager::getInstance().load(_layoutName); resourceLayout = MyGUI::LayoutManager::getInstance().getByName(_layoutName, false); } GOTHOGRE_ASSERT(resourceLayout != nullptr, "Layout '" << _layoutName << "' couldn't be loaded"); // find main widget's info const MyGUI::WidgetInfo* widgetInfo = findWidgetInfo(_mainWidgetName, resourceLayout->getLayoutData()); GOTHOGRE_ASSERT(widgetInfo != nullptr, "Root widget '" << _mainWidgetName << "' in layout '" << _layoutName << "' not found."); // create main widget and its children MyGUI::Widget* widget = resourceLayout->createWidget(*widgetInfo, _prefix, _parent); GOTHOGRE_ASSERT(widget != nullptr, "Could not create root widget '" << _mainWidgetName << "' in layout '" << _layoutName << "'."); return widget; }