示例#1
0
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;
}