Как обновить вид свойств в Eclipse RCP? - PullRequest
3 голосов
/ 04 июня 2010

Я использую представление свойств в RCP, т.е. org.eclipse.ui.views.properties.PropertySheet.

Я хочу иметь возможность обновлять содержимое этих свойств программным способом. Кажется, что RCP ориентирован на случай использования, где это меняется только при изменении выбора.

Можно ли как-нибудь запустить фиктивное событие, чтобы обновить его (без уродливых артефактов пользовательского интерфейса, таких как видимое переключение между частями)?

Ответы [ 2 ]

3 голосов
/ 10 июня 2010

Основная проблема заключается в том, что API скрывает все страницы (PropertySheetPage) и, следовательно, средства просмотра (PropertySheetViewer) в представлении свойств.

Хорошая новость заключается в том, что вы можете указать представлению свойств использовать страницу по вашему желанию. Поэтому я предоставляю страницу, которую она обычно использует по умолчанию (PropertySheetPage), за исключением случаев, когда я предоставляю ее, я сохраняю ссылку на нее (очевидно), а затем вы можете вызвать propertySheetPageRef.refresh() для обновления модели (к счастью, этот метод общедоступен ).

public Object getAdapter(Class adapter) {
        if (adapter == IPropertySource.class) {
            return resultProvider;
        } else if (adapter == IPropertySheetPage.class) {
            return propertySheetPage;
        }
        return null;
    }
2 голосов
/ 12 ноября 2010

Исправление в ответе geejay: метод getAdapter находится в представлении (не в объекте, для которого вы показываете свойства).

Пример реализации (в классе вашего представления):

//IPropertySheetPage doesn't implement refresh()
private PropertySheetPage propertyPage;

/**
 * If called from UI thread, refreshes property page from model
 * (an IPropertySource). If called from non-UI thread, does nothing.
 */
public void refreshPropertyPage() {
    if (propertyPage != null) {
        propertyPage.refresh();
    }
}

@Override
public Object getAdapter(Class adapter) {
    if (adapter == IPropertySheetPage.class) {
        if (propertyPage == null) {
            propertyPage = new PropertySheetPage();
        }
        return propertyPage;
    }
    //use platform's adapter manager for other classes
    return super.getAdapter(adapter);
}
...