/*******************************************************************************
* 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.eclipse.ui.inspector;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import com.windowtester.internal.runtime.PropertySet;
import com.windowtester.internal.runtime.PropertySet.PropertyMapping;
import com.windowtester.recorder.event.user.IWidgetDescription;
/**
* Properties Section.
*/
public class PropertiesSection extends AbstractSection {
private static class LinkHandler extends HyperlinkAdapter {
private final IWidgetDescription widget;
public LinkHandler(IWidgetDescription widget) {
this.widget = widget;
}
public void linkActivated(HyperlinkEvent e) {
widget.getProperties().flag(PropertyMapping.fromString((String)e.getHref()));
}
}
public void addTo(IWidgetDescription description, final ScrolledForm form, InspectorFormToolkit toolkit) {
Section section = createSection(form, toolkit, Section.DESCRIPTION);
section.setText(getExpandedTitle());
addTableContent(description, form, toolkit, section);
// addTextContent(description, form, toolkit, section);
}
private static class Flagger {
private final PropertyMapping mapping;
private final TableItem item;
private final IWidgetDescription widget;
private final Link link;
public Flagger(TableItem item, Link link, IWidgetDescription widget, PropertyMapping mapping) {
this.item = item;
this.link = link;
this.widget = widget;
this.mapping = mapping;
}
void flag(boolean toFlag) {
PropertySet propertySet = widget.getProperties();
System.out.println("flag: " + toFlag);
if (toFlag) {
propertySet.flag(mapping);
} else {
propertySet.unflag(mapping);
}
updateAssertTooltipData(link, !toFlag);
updateAssertTooltipData(item, !toFlag);
}
}
private static class LinkListener implements Listener, SelectionListener {
private final TableItem item;
private final Flagger flagger;
public LinkListener(TableItem item, Link link, IWidgetDescription widget, PropertyMapping mapping) {
this.item = item;
this.flagger = new Flagger(item, link, widget, mapping);
}
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event event) {
System.out.println("Selection: " + event.text);
doFlag(!item.getChecked());
toggleCheck();
}
private void toggleCheck() {
item.setChecked(!item.getChecked());
item.getParent().forceFocus();
}
private void doFlag(boolean toFlag) {
flagger.flag(toFlag);
}
public void widgetDefaultSelected(SelectionEvent e) {
System.out.println(".widgetDefaultSelected()");
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
if (e.item != item)
return;
System.out.println(".widgetSelected()");
doFlag(item.getChecked());
}
}
private void addTableContent(final IWidgetDescription widget, final ScrolledForm form, InspectorFormToolkit toolkit, final Section section) {
final Table table = toolkit.createTable(section, SWT.CHECK);
section.setClient(table);
Object layoutData = setLayout(section);
section.setLayoutData(layoutData);
section.setDescription("Specify properties to assert.");
//table.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));
final ToolTipHandler tooltip = new ToolTipHandler(section.getShell());
tooltip.activateHoverHelp(table);
final PropertyMapping[] properties = widget.getProperties().toArray();
for (int i = 0; i < properties.length; i++) {
PropertyMapping property = properties[i];
final TableItem item = new TableItem (table, SWT.CHECK);
item.setImage(getIdeaIcon());
updateAssertTooltipData(item, true);
TableEditor editor = new TableEditor (table);
final Link link = new Link (table, SWT.NONE);
link.setLayoutData(layoutData);
toolkit.adapt(link, true, true);
String assertion = new StringBuffer().append(" <a href=").append(quoted(property.asString())).append(">Assert ").append(getPropertyDescription(property)).append("</a>").toString();
link.setText(assertion);
updateAssertTooltipData(link, true);
tooltip.activateHoverHelp(link);
link.pack ();
LinkListener listener = new LinkListener(item, link, widget, property);
link.addListener(SWT.Selection, listener);
table.addSelectionListener(listener);
item.setData(new Flagger(item, link, widget, property));
// if (i %2 != 0)
// link.setBackground(toolkit.getColors().getColor(IFormColors.TB_BG));
editor.minimumWidth = link.getSize ().x;
// editor.minimumWidth = 500;
editor.horizontalAlignment = SWT.LEFT;
editor.setEditor (link, item, 0);
}
section.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
if (e.getState() == false) {
section.setText("Properties (" + properties.length +") ...");
section.layout();
} else {
section.setText(getExpandedTitle());
section.layout();
}
table.layout();
form.getShell().pack(true);
}
});
MenuManager mm = new MenuManager();
mm.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
PropertiesSection.this.fillContextMenu(manager, table);
}
});
mm.setRemoveAllWhenShown(true);
Menu menu = mm.createContextMenu(table);
table.setMenu(menu);
section.setMenu(menu);
//createContextMenu(section, table);
}
protected void fillContextMenu(IMenuManager manager, final Table table) {
final boolean toSelect = !testForSelections(table);
manager.add(new Action((toSelect ? "Select" : "Deselect") + " all") {
public void run() {
TableItem[] items = table.getItems();
for (int i = 0; i < items.length; i++) {
TableItem item = items[i];
Object data = item.getData();
if (data instanceof Flagger) {
((Flagger)data).flag(toSelect);
}
item.setChecked(toSelect);
}
}
});
}
private void createContextMenu(final Section section, final Table table) {
final boolean toSelect = !testForSelections(table);
Menu menu = new Menu(section.getShell());
MenuItem menuItem = new MenuItem(menu, SWT.NONE);
menuItem.setText((toSelect ? "Select" : "Deselect") + " all");
menuItem.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
}
public void widgetSelected(SelectionEvent e) {
TableItem[] items = table.getItems();
for (int i = 0; i < items.length; i++) {
TableItem item = items[i];
Object data = item.getData();
if (data instanceof Flagger) {
((Flagger)data).flag(toSelect);
}
item.setChecked(toSelect);
}
}
});
table.setMenu(menu);
}
private boolean testForSelections(Table table) {
TableItem[] items = table.getItems();
for (int i = 0; i < items.length; i++) {
TableItem item = items[i];
if (item.getChecked())
return true;
}
return false;
}
private static void updateAssertTooltipData(Widget item, boolean doAssert) {
String text = doAssert ? "Add assertion to recording" : "Remove assertion from recording";
ToolTipHandler.setTextForItem(text, item);
Image img = doAssert ? getAssertIcon() : getRemoveAssertIcon();
ToolTipHandler.setImageForItem(img, item);
}
private String getExpandedTitle() {
return "Properties";
}
private void addTextContent(IWidgetDescription description,
final ScrolledForm form, InspectorFormToolkit toolkit,
Section section) {
final FormText text = createText(toolkit, section);
section.setClient(text);
Object layoutData = setLayout(section);
StringBuffer buffer = new StringBuffer();
buffer.append("<form>"); //$NON-NLS-1$
appendDetails(description, buffer);
text.setImage("idea", getIdeaIcon()); //$NON-NLS-1$
buffer.append("</form>"); //$NON-NLS-1$
text.setText(buffer.toString(), true, false);
text.setLayoutData(layoutData);
text.addHyperlinkListener(new LinkHandler(description));
text.layout();
section.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
text.layout();
form.getShell().pack(true);
}
});
}
private void appendDetails(IWidgetDescription widget, StringBuffer buffer) {
PropertyMapping[] properties = widget.getProperties().toArray();
for (int i = 0; i < properties.length; i++) {
PropertyMapping property = properties[i];
buffer.append("<p>").append(property.getName()).append("</p>"); //$NON-NLS-1$
appendAssertionAction(buffer, property);
}
}
private void appendAssertionAction(StringBuffer buffer, PropertyMapping property) {
buffer.append("<li bindent=\"3\" style=\"image\" value=\"idea\">"); //$NON-NLS-1$
buffer.append("<a href=").append(quoted(property.asString())).append("> Add assertion: ").append(getPropertyDescription(property)).append("</a>");
buffer.append("</li>"); //$NON-NLS-1$
}
private String getPropertyDescription(PropertyMapping property) {
String value = property.getValue();
String detail = "";
if (property.isBoolean()) {
if ("false".equals(value))
detail = " (false)";
} else {
detail = " \"" + value +'"';
}
return property.getKey() + detail;
}
private static Image getIdeaIcon() {
return ImageManager.getImage("idea.gif");
}
private static Image getAssertIcon() {
return ImageManager.getImage("assertion.gif");
}
private static Image getRemoveAssertIcon() {
return ImageManager.getImage("remove_assertion.gif");
}
}