Запретить GWT Tree от закрытия ветви с выбранным узлом - PullRequest
0 голосов
/ 18 февраля 2012

Проблема в том, что я не хочу, чтобы пользователь мог закрыть ветку дерева, если эта ветвь имеет текущий выбранный узел. Основная проблема в том, что GWT Tree, кажется, забывает выбор, когда вы закрываете ветку. Это смущает. Я смотрел на обработчики событий, такие как CloseHandler, но я не думаю, что смогу предотвратить закрытие (или я должен попытаться немедленно открыть этот же узел?)

Для контекста, вот дерево, о котором я говорю:

http://google -web-toolkit.googlecode.com / SVN / Javadoc / 1,6 / ком / Google / GWT / пользователь / клиент / щ / tree.html

1 Ответ

3 голосов
/ 18 февраля 2012

Из прочтения того, как работают Tree и TreeItem, похоже, что наилучшим вариантом является создание подкласса TreeItem и переопределение setState(boolean, boolean) для раннего возврата, если выполняется какое-либо условие

public class CustomTreeItem extends TreeItem {
    @Override
    public void setState(boolean open, boolean fireEvents) {
        //check if we want to allow the item to close
        if (!open && !mayClose()) {
            return;
        }
        super.setState(boolean open, boolean fireEvents);
    }
    /**
     * Returns true if the item may be closed, due to some specific rules
     */
    public boolean mayClose() {
        // your check goes here
    }
}

Недостатком этого является то, что вам нужно будет создать один из ваших собственных экземпляров, где бы вы ни хотели, чтобы эта логика работала. Один из способов сделать это проще - переопределить различные методы addItem(...) и addTextItem(...), чтобы всегда создавать экземпляры этого подкласса.


CloseEvent запускается (если смотреть на GWT 2.4.0, в старых версиях это может отличаться) из метода Tree.fireStateChanged(TreeItem, boolean. Это защищенный пакет, поэтому недоступный, а не метод, который не требует значительных усилий при смене домена.

Tree.fireStateChanged вызывается из TreeItem.setState, метода, переопределенного выше. Этот метод кажется ответственным не только за проверку, имеет ли смысл открывать, но также за предотвращение перерисовки, если не нужно, и за выполнение реальной перерисовки. Он призывает Древо, чтобы попросить его запустить события. Изменение этого кода гарантирует, что даже в тех случаях, когда события не запускаются (их нет в коде GWT, они могут быть), они все равно будут выполнять вашу логику.

TreeItem.setState(boolean,boolean) вызывается из двух мест в GWT, одно из TreeItem.setState(boolean), для удобства, и один раз, когда пользователь щелкает элемент (см. Tree.elementClicked(Element)). Другое переопределение TreeItem.setState(boolean) вызывается из трех мест, связанных с навигацией с помощью клавиатуры. Исходя из этого, мы можем быть уверены, что это основные методы, связанные с изменением состояния развертывания / свертывания дерева, и мы можем быть уверены, что его изменение правильно повлияет на поведение дерева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...