Получить управление курсором для отключенного управления - PullRequest
0 голосов
/ 05 мая 2020

Я хочу получить управление при наведении курсора мыши, что обычно делает Display#getCursorControl. Однако, когда один элемент управления в иерархии отключен, этот метод больше не работает:

Пример:

public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setSize(400, 300);
    shell.setLayout(new GridLayout(2, false));

    final Label mouseControl = new Label(shell, SWT.BORDER);
    mouseControl.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).grab(true, true).create());
    display.addFilter(SWT.MouseMove,
            e -> mouseControl.setText("" + e.display.getCursorControl()));

    final Group enabledGroup = new Group(shell, SWT.NONE);
    enabledGroup.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
    enabledGroup.setText("Enabled Group");
    createControls(enabledGroup);

    final Group disabledGroup = new Group(shell, SWT.NONE);
    disabledGroup.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
    disabledGroup.setText("Disabled Group");
    disabledGroup.setEnabled(false);
    createControls(disabledGroup);

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

private static void createControls(Composite parent) {
    parent.setLayout(new GridLayout());

    final Label label = new Label(parent, SWT.NONE);
    label.setText("Label");

    final Text text = new Text(parent, SWT.BORDER);
    text.setText("Text");
}

Наведите указатель мыши на левую метку и затем над правым. Элемент управления отображается только для включенного родителя, иначе отображается оболочка.

Как мне получить элемент управления под указателем мыши? Должен ли я сам реализовать эту функцию? Существуют ли какие-либо методы, которые могут мне помочь, или мне нужно вычислить границы каждого элемента управления внутри дерева и проверить, находится ли он в позиции мыши?

1 Ответ

1 голос
/ 05 мая 2020

Я не вижу в Display ничего, что могло бы помочь.

Следующее будет искать в дочерних элементах Shell элемент управления, содержащий курсор и работающий с отключенными элементами управления:

static Control findCursorinShellChildren(final Shell shell)
{
  return findLocationInCompositeChildren(shell, shell.getDisplay().getCursorLocation());
}


static Control findLocationInCompositeChildren(final Composite composite, final Point displayLoc)
{
  final var compositeRelativeLoc = composite.toControl(displayLoc);

  for (final var child : composite.getChildren())
   {
     if (child.getBounds().contains(compositeRelativeLoc))
      {
        if (child instanceof Composite)
         {
           final var containedControl = findLocationInCompositeChildren((Composite)child, displayLoc);
           return containedControl != null ? containedControl : child;
         }

        return child;
      }
   }

  return null;
}

Я предполагаю, что это будет значительно медленнее, чем Display.getCursorControl

...