/** * Logback-beagle: The logback Console Plugin for Eclipse * Copyright (C) 2006-2012, QOS.ch. All rights reserved. * * This program and the accompanying materials are licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation. */ package ch.qos.logback.beagle.menu; import org.eclipse.nebula.widgets.grid.Grid; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MenuListener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import ch.qos.logback.beagle.Constants; import ch.qos.logback.beagle.util.SelectionUtil; import ch.qos.logback.beagle.visual.CallerDataTIS; import ch.qos.logback.beagle.visual.ClassicTISBuffer; import ch.qos.logback.beagle.visual.ITableItemStub; import ch.qos.logback.beagle.visual.LoggingEventTIS; public class DynamicMenuEnabler implements MenuListener { final Grid table; final ClassicTISBuffer visualElementBuffer; public DynamicMenuEnabler(ClassicTISBuffer visualElementBuffer) { this.visualElementBuffer = visualElementBuffer; this.table = visualElementBuffer.getGrid(); } @Override public void menuHidden(MenuEvent e) { } MenuItem findMenuItemByIndex(Menu menu, int index) { MenuItem[] miArray = menu.getItems(); if (index < 0 || index >= miArray.length) { throw new IllegalArgumentException(index + " is not a valid menu index"); } return miArray[index]; } void enableMenuItem(Menu menu, int index) { MenuItem mi = findMenuItemByIndex(menu, index); mi.setEnabled(true); } void disableMenuItem(Menu menu, int index) { MenuItem mi = findMenuItemByIndex(menu, index); mi.setEnabled(false); } void defaultState(Menu menu) { disableMenuItem(menu, GridMenuBuilder.JUMP_TO_CALLER_MENU_INDEX); disableMenuItem(menu, GridMenuBuilder.SHOW_CALLERS_MENU_INDEX); MenuItem mi = findMenuItemByIndex(menu, GridMenuBuilder.SHOW_CALLERS_MENU_INDEX); mi.setText(GridMenuBuilder.EXPLAND_CALLERS_MENU_TEXT); } @Override public void menuShown(MenuEvent e) { int selCount = table.getSelectionCount(); Menu menu = (Menu) e.widget; defaultState(menu); if (selCount == 1) { int selectionIndex = SelectionUtil.getUniqueSelection(table); if (selectionIndex == Constants.NA) { return; } ITableItemStub iVisualElement = visualElementBuffer.get(selectionIndex); if (iVisualElement.supportsJump()) { enableMenuItem(menu, GridMenuBuilder.JUMP_TO_CALLER_MENU_INDEX); } MenuItem callersMenuItem = findMenuItemByIndex(menu, GridMenuBuilder.SHOW_CALLERS_MENU_INDEX); if (iVisualElement instanceof LoggingEventTIS) { LoggingEventTIS leve = (LoggingEventTIS) iVisualElement; if (alreadyCallerExpanded(selectionIndex)) { callersMenuItem.setText(GridMenuBuilder.COLLAPSE_CALLERS_MENU_TEXT); callersMenuItem.setEnabled(true); } else if (leve.supportsJump()) { callersMenuItem.setEnabled(true); } } else if (iVisualElement instanceof CallerDataTIS) { callersMenuItem.setEnabled(true); callersMenuItem.setText(GridMenuBuilder.COLLAPSE_CALLERS_MENU_TEXT); } } } boolean alreadyCallerExpanded(int index) { int next = index + 1; if (next >= visualElementBuffer.size()) { return false; } ITableItemStub visualElem = visualElementBuffer.get(next); return (visualElem instanceof CallerDataTIS); } boolean isCallerDataVisualElement(int selectionIndex) { return (visualElementBuffer.get(selectionIndex) instanceof CallerDataTIS); } }