/* * Copyright (c) 2011, Lukas Gross * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the jo-widgets.org nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL jo-widgets.org BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. */ package org.jowidgets.addons.testtool.internal; import java.util.LinkedList; import java.util.List; import org.jowidgets.addons.testtool.internal.persister.ITestDataPersister; import org.jowidgets.addons.testtool.internal.persister.TestDataXmlPersister; import org.jowidgets.api.controller.ITreePopupDetectionListener; import org.jowidgets.api.controller.ITreePopupEvent; import org.jowidgets.api.controller.ITreeSelectionEvent; import org.jowidgets.api.controller.ITreeSelectionListener; import org.jowidgets.api.model.IListItemListener; import org.jowidgets.api.model.IListItemObservable; import org.jowidgets.api.model.item.IItemModel; import org.jowidgets.api.model.item.IItemModelListener; import org.jowidgets.api.model.item.IMenuBarModel; import org.jowidgets.api.model.item.IMenuItemModel; import org.jowidgets.api.model.item.IMenuModel; import org.jowidgets.api.widgets.IButton; import org.jowidgets.api.widgets.IFrame; import org.jowidgets.api.widgets.IInputField; import org.jowidgets.api.widgets.IPopupMenu; import org.jowidgets.api.widgets.ITabFolder; import org.jowidgets.api.widgets.ITabItem; import org.jowidgets.api.widgets.IToolBar; import org.jowidgets.api.widgets.IToolBarButton; import org.jowidgets.api.widgets.IToolBarMenu; import org.jowidgets.api.widgets.IToolBarPopupButton; import org.jowidgets.api.widgets.IToolBarToggleButton; import org.jowidgets.api.widgets.ITree; import org.jowidgets.api.widgets.ITreeNode; import org.jowidgets.api.widgets.IWidget; import org.jowidgets.common.types.IVetoable; import org.jowidgets.common.widgets.IWidgetCommon; import org.jowidgets.common.widgets.controller.IActionListener; import org.jowidgets.common.widgets.controller.IInputListener; import org.jowidgets.common.widgets.controller.IItemStateListener; import org.jowidgets.common.widgets.controller.IMenuListener; import org.jowidgets.common.widgets.controller.IMouseButtonEvent; import org.jowidgets.tools.controller.MouseAdapter; import org.jowidgets.tools.controller.TabItemAdapter; import org.jowidgets.tools.controller.TreeAdapter; import org.jowidgets.tools.controller.WindowAdapter; public final class TestToolImpl implements ITestTool { private final TestToolUtilities testToolUtilities; private final ITestDataPersister persister; private final TestDataListModel listModel; private final TestPlayer player; private boolean record; private boolean replay; private boolean appStarted; private final List<ITree> trees; private final List<ITabFolder> tabFolders; public TestToolImpl() { this(""); } public TestToolImpl(final String filePath) { this.persister = new TestDataXmlPersister(filePath); this.testToolUtilities = new TestToolUtilities(); this.listModel = new TestDataListModel(); this.player = new TestPlayer(); this.record = false; this.replay = false; this.appStarted = false; this.trees = new LinkedList<ITree>(); this.tabFolders = new LinkedList<ITabFolder>(); } @Override public void record(final IWidgetCommon widget, final UserAction action, final String id) { record(widget, action, id, ""); } private void record(final IWidgetCommon widget, final UserAction action, final String id, final String value) { if (record) { final TestDataObject obj = new TestDataObject(); obj.setId(id); obj.setAction(action); obj.setType(widget.getUiReference().getClass().getSimpleName()); obj.setValue(value); listModel.addItem(obj); } } @Override public void register(final IWidgetCommon widget) { // TODO LG remove disposed widgets WidgetRegistry.getInstance().addWidget(widget); addListener(widget); } private void addListener(final IWidgetCommon widget) { // TODO LG use IFrameUi if (widget instanceof IFrame) { final IFrame frame = (IFrame) widget; frame.addWindowListener(new WindowAdapter() { @Override public void windowClosed() { record(frame, UserAction.CLOSE, testToolUtilities.createWidgetID(frame)); } @Override public void windowActivated() { if (!appStarted) { registerTreeItems(); registerMenuItems(frame); registerTabFolderItems(); appStarted = true; } } }); } if (widget instanceof IButton) { final IButton button = (IButton) widget; button.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(final IMouseButtonEvent event) { record(widget, UserAction.CLICK, testToolUtilities.createWidgetID(button)); } }); } // TODO LG use IToolBarUi if (widget instanceof IToolBar) { final IListItemObservable toolBarObs = (IListItemObservable) widget; toolBarObs.addItemContainerListener(new IListItemListener() { @Override public void itemAdded(final IWidget item) { WidgetRegistry.getInstance().addWidget(item); if (item instanceof IToolBarButton) { final IToolBarButton button = (IToolBarButton) item; button.addActionListener(new IActionListener() { @Override public void actionPerformed() { record(button, UserAction.CLICK, testToolUtilities.createWidgetID(button)); } }); } else if (item instanceof IToolBarToggleButton) { final IToolBarToggleButton button = (IToolBarToggleButton) item; button.addItemListener(new IItemStateListener() { @Override public void itemStateChanged() { record(button, UserAction.CLICK, testToolUtilities.createWidgetID(button)); } }); } else if (item instanceof IToolBarPopupButton) { final IToolBarPopupButton button = (IToolBarPopupButton) item; button.addActionListener(new IActionListener() { @Override public void actionPerformed() { record(button, UserAction.CLICK, testToolUtilities.createWidgetID(button)); } }); } else if (item instanceof IToolBarMenu) { final IToolBarMenu menu = (IToolBarMenu) item; final IPopupMenu popupMenu = menu.getPopupMenu(); WidgetRegistry.getInstance().addWidget(popupMenu); popupMenu.addMenuListener(new IMenuListener() { @Override public void menuDeactivated() { record(popupMenu, UserAction.CLICK, testToolUtilities.createWidgetID(popupMenu)); } @Override public void menuActivated() { record(popupMenu, UserAction.CLICK, testToolUtilities.createWidgetID(popupMenu)); } }); } } @Override public void itemRemoved(final IWidget item) { WidgetRegistry.getInstance().removeWidget(item); } }); } // TODO LG use ITreeUi instead of ITree if (widget instanceof ITree) { final ITree tree = (ITree) widget; trees.add(tree); tree.addTreeSelectionListener(new ITreeSelectionListener() { @Override public void selectionChanged(final ITreeSelectionEvent event) { for (final ITreeNode node : event.getSelected()) { if (!WidgetRegistry.getInstance().getWidgets().contains(node)) { WidgetRegistry.getInstance().addWidget(node); } record(widget, UserAction.SELECT, testToolUtilities.createWidgetID(node)); } } }); tree.addTreeListener(new TreeAdapter() { @Override public void nodeExpanded(final ITreeNode node) { if (!WidgetRegistry.getInstance().getWidgets().contains(node)) { WidgetRegistry.getInstance().addWidget(node); } record(widget, UserAction.EXPAND, testToolUtilities.createWidgetID(node)); } @Override public void nodeCollapsed(final ITreeNode node) { if (!WidgetRegistry.getInstance().getWidgets().contains(node)) { WidgetRegistry.getInstance().addWidget(node); } record(widget, UserAction.COLLAPSE, testToolUtilities.createWidgetID(node)); } }); tree.addTreePopupDetectionListener(new ITreePopupDetectionListener() { @Override public void popupDetected(final ITreePopupEvent event) { final ITreeNode node = event.getNode(); if (!WidgetRegistry.getInstance().getWidgets().contains(node)) { WidgetRegistry.getInstance().addWidget(node); } record(widget, UserAction.CLICK, testToolUtilities.createWidgetID(node)); } }); } // TODO LG user ITabFolderUi if (widget instanceof ITabFolder) { final ITabFolder tab = (ITabFolder) widget; tabFolders.add(tab); // TODO LG support recording/replay of TabFolder } if (widget instanceof IInputField<?>) { final IInputField<?> inputField = (IInputField<?>) widget; inputField.addMouseListener(new MouseAdapter() { @Override public void mousePressed(final IMouseButtonEvent event) { record(widget, UserAction.CLICK, testToolUtilities.createWidgetID(inputField)); } }); inputField.addInputListener(new IInputListener() { @Override public void inputChanged() { record(widget, UserAction.INPUT, testToolUtilities.createWidgetID(inputField), inputField.getText()); } }); } // TODO LG use ITableUi // TODO LG support recording/replay of table } @Override public void save(final List<TestDataObject> list, final String fileName) { persister.save(list, fileName); } @Override public List<TestDataObject> load(final String fileName) { return persister.load(fileName); } @Override public TestDataListModel getListModel() { return listModel; } @Override public void activateRecordMode() { this.record = true; this.replay = false; } @Override public void activateReplayMode() { this.record = false; this.replay = true; } @Override public void deactivateReplayAndRecord() { this.record = false; this.replay = false; } @Override public void replay(final List<TestDataObject> list, final int delay) { if (replay) { player.replayTest(list, delay); } } private void registerTreeItems() { for (final ITree tree : trees) { for (final ITreeNode node : tree.getChildren()) { WidgetRegistry.getInstance().addWidget(node); } } } private void registerTabFolderItems() { for (final ITabFolder folder : tabFolders) { for (final ITabItem item : folder.getItems()) { WidgetRegistry.getInstance().addWidget(item); item.addTabItemListener(new TabItemAdapter() { @Override public void selectionChanged(final boolean selected) { if (item.isVisible()) { record(item, UserAction.CLICK, testToolUtilities.createWidgetID(item)); } } @Override public void onClose(final IVetoable vetoable) {} }); } } } private void registerMenuItems(final IFrame frame) { final IMenuBarModel menuBarModel = frame.getMenuBarModel(); for (final IMenuModel menu : menuBarModel.getMenus()) { for (final IMenuItemModel item : menu.getChildren()) { // TODO LG add listeners to menu items item.addItemModelListener(new IItemModelListener() { @Override public void itemChanged(final IItemModel item) { } }); } } } }