Как остановить расширение бесконечного дерева SWT при нажатии «*» - PullRequest
1 голос
/ 10 июня 2010

В моем приложении есть дерево SWT, которое содержит бесконечную структуру данных. Расширяя предмет, я создаю его потомков. Однако в Windows пользователи могут нажимать «*», вызывая действие «развернуть всех потомков», и мое приложение зависает.

Есть два приемлемых поведения для меня, когда пользователь нажимает "*":

  1. Развернуть все дочерние элементы выбранного элемента, но только до следующего уровня
  2. Ничего не делать

В любом случае, мне все равно потребуется возможность расширять элементы настолько глубоко, насколько это необходимо (нажав на значок [+] или нажав «+»), поэтому ограничение глубины дерева не является решением. Есть ли другой способ, которым я могу достичь любого из вышеперечисленных без изменения классов SWT?

1 Ответ

1 голос
/ 10 июня 2010

Я получил это далеко - может быть, это кому-то поможет:

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class SWTInfiniteTree {
    private boolean expanding;

    public SWTInfiniteTree() {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new GridLayout());

        Tree tree = new Tree(shell, SWT.BORDER);
        tree.setLayoutData(new GridData(GridData.FILL_BOTH));

        createItem(tree, "ITEM1");
        createItem(tree, "ITEM2");
        createItem(tree, "ITEM3");

        tree.addTreeListener(new TreeListener() {
            @Override
            public void treeExpanded(TreeEvent e) {
                TreeItem parent = (TreeItem) e.item;
                if (expanding) {
                    e.doit = false;
                } else {
                    expanding = true;
                    parent.removeAll();
                    createItem(parent, ".1");
                    createItem(parent, ".2");
                    createItem(parent, ".3");
                }
            }

            @Override
            public void treeCollapsed(TreeEvent e) {
            }
        });
        tree.addKeyListener(new KeyListener() {
            @Override
            public void keyReleased(KeyEvent e) {
                expanding = false;
            }

            @Override
            public void keyPressed(KeyEvent e) {
            }
        });
        tree.addMouseListener(new MouseListener() {
            @Override
            public void mouseUp(MouseEvent e) {
                expanding = false;
            }

            @Override
            public void mouseDown(MouseEvent e) {
            }

            @Override
            public void mouseDoubleClick(MouseEvent e) {
                expanding = false;
            }
        });

        shell.setSize(300, 200);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    private TreeItem createItem(Widget parent, String text) {
        TreeItem item;
        if (parent instanceof Tree) {
            item = new TreeItem((Tree) parent, SWT.NULL);
            item.setText(text);
        } else {
            item = new TreeItem((TreeItem) parent, SWT.NULL);
            item.setText(((TreeItem) parent).getText() + text);
        }
        // So that we have a [+] icon
        item.setItemCount(1);
        return item;
    }

    public static void main(String[] args) {
        new SWTInfiniteTree();
    }
}

Что он делает, так это расширяет первый элемент, а затем переходит в режим «не будет расширять больше», который отменяется при отпускании клавиши или кнопки мыши. Однако по какой-то причине это расширит мои недавно сгенерированные предметы.

Надеюсь, у кого-то есть лучшее решение.

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