/******************************************************************************* * Copyright (c) 2012 Google, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Google, Inc. - initial API and implementation *******************************************************************************/ package com.windowtester.swt.event.model; import java.util.HashMap; import java.util.Map; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.TableTreeItem; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.CoolItem; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.TrayItem; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; public class WidgetState implements IWidgetState { /** The state map */ private final Map _map = new HashMap(); /** The associated widget */ private final Widget _widget; /** The data associated with the underlying Widget at time of state storing */ private final Object _data; /** * Create an instance. * @param widget */ public WidgetState(Widget widget) { put(IWidgetStateConstants.DISPOSED, widget.isDisposed()); _data = widget.getData(); _widget = widget; } /** * Create an instance -- a convenience constructor for controls. * @param w - the widget * @param c - its control */ public WidgetState(Widget w, Control c) { this(w); put(IWidgetStateConstants.ENABLED, c.isEnabled()); put(IWidgetStateConstants.VISIBLE, c.isVisible()); } /** * A factory method that captures and returns the Widget state for a given control. * * TODO: state collection needs to be sanity-checked */ public static WidgetState get(Widget w) { //A base state object, which will have state added or returned as the default WidgetState base = new WidgetState(w); if (w instanceof Control) { Control c = (Control)w; return new WidgetState(w, c); } //- Items --------------------------------------------------------------------------------------- else if (w instanceof MenuItem) { MenuItem mi = (MenuItem)w; base.put(IWidgetStateConstants.ENABLED, mi.isEnabled()); } else if (w instanceof CoolItem) { CoolItem ci = (CoolItem)w; Control c = ci.getControl(); return new WidgetState(w, c); } else if (w instanceof CTabItem) { CTabItem cti = (CTabItem)w; Control c = cti.getControl(); return new WidgetState(w, c); } else if (w instanceof TabItem) { TabItem ti = (TabItem)w; Control c = ti.getControl(); return new WidgetState(w, c); } else if (w instanceof TableColumn) { TableColumn tc = (TableColumn)w; base.put(IWidgetStateConstants.TEXT, tc.getText()); } else if (w instanceof TableTreeItem) { TableTreeItem tti = (TableTreeItem)w; //but other stuff is: grayed, expanded, etc. base.put(IWidgetStateConstants.CHECKED, tti.getChecked()); base.put(IWidgetStateConstants.GRAYED, tti.getGrayed()); base.put(IWidgetStateConstants.EXPANDED, tti.getExpanded()); base.put(IWidgetStateConstants.TEXT, tti.getText()); } else if (w instanceof ToolItem) { ToolItem ti = (ToolItem)w; Control c = ti.getControl(); return new WidgetState(w, c); } else if (w instanceof TrayItem) { TrayItem tri = (TrayItem)w; base.put(IWidgetStateConstants.TEXT, tri.getText()); } else if (w instanceof TreeItem) { TreeItem tre = (TreeItem)w; base.put(IWidgetStateConstants.CHECKED, tre.getChecked()); base.put(IWidgetStateConstants.GRAYED, tre.getGrayed()); base.put(IWidgetStateConstants.EXPANDED, tre.getExpanded()); base.put(IWidgetStateConstants.TEXT, tre.getText()); } //----------------------------------------------------------------------------------------------- else if (w instanceof Control) { Control c = (Control)w; return new WidgetState(w, c); } else if (w instanceof Menu) { Menu m = (Menu)w; base.put(IWidgetStateConstants.ENABLED, m.isEnabled()); base.put(IWidgetStateConstants.VISIBLE, m.isVisible()); } else if (w instanceof ScrollBar) { ScrollBar sb = (ScrollBar)w; base.put(IWidgetStateConstants.ENABLED, sb.isEnabled()); base.put(IWidgetStateConstants.VISIBLE, sb.isVisible()); } //a fall-through return new WidgetState(w); //ignoring (for now): Tray, Tracker, Caret, Drag{Source,Target} } /** * A convenience method that converts the boolean value to a Boolean */ private void put(Object key, boolean value) { put(key, Boolean.valueOf(value)); } /* (non-Javadoc) * @see com.windowtester.swt.event.model.IWidgetState#put(java.lang.Object, * java.lang.Object) */ public void put(Object key, Object value) { _map.put(key, value); } /* (non-Javadoc) * @see com.windowtester.swt.event.model.IWidgetState#getData() */ public Object getData() { return _data; } /* (non-Javadoc) * @see com.windowtester.swt.event.model.IWidgetState#getWidget() */ public Widget getWidget() { return _widget; } /* (non-Javadoc) * @see com.windowtester.swt.event.model.IWidgetState#getStateMap() */ public Map getStateMap() { return _map; } /** * Create a state object for the given widget, capturing its current state data. * @param widget * @return */ public static IWidgetState create(Widget widget) { return new WidgetState(widget); } /* (non-Javadoc) * @see java.lang.Object#toString() */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append(_widget.toString()).append(" data: ").append(_data).append(" state map: ").append(_map); return sb.toString(); } }