/******************************************************************************* * Copyright (c) 2010, 2011 Tom Seidel, Remus Software * 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: * Tom Seidel - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.htmltext; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; import org.eclipse.mylyn.htmltext.commands.Command; import org.eclipse.mylyn.htmltext.commands.GetHtmlCommand; import org.eclipse.mylyn.htmltext.commands.SetHtmlCommand; import org.eclipse.mylyn.htmltext.configuration.Configuration; import org.eclipse.mylyn.htmltext.events.NodeSelectionEvent; import org.eclipse.mylyn.htmltext.listener.NodeSelectionChangeListener; import org.eclipse.mylyn.htmltext.model.TriState; import org.eclipse.mylyn.htmltext.util.ColorConverter; import org.eclipse.swt.SWTException; import org.eclipse.swt.accessibility.Accessible; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.BrowserFunction; import org.eclipse.swt.browser.OpenWindowListener; import org.eclipse.swt.browser.ProgressAdapter; import org.eclipse.swt.browser.ProgressEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.HelpListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.graphics.Region; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Monitor; import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.swt.widgets.Shell; /** * @author Tom Seidel <tom.seidel@remus-software.org> */ public class HtmlComposer { /** * A function which is called if the content of the editor has changed. * <p> * Unfortunately the underlying ckeditor cannot guarantee that every * modification will be notified to the appended listeners. There is an * additional polling mechanismus which tracks modifications. * </p> * * @author Tom Seidel <tom.seidel@remus-software.org> */ private class ModifiedFunction extends BrowserFunction { public ModifiedFunction(Browser browser) { super(browser, "_delegate_modified"); } @Override public Object function(Object[] arguments) { if (arguments.length > 0) { String identifier = (String) arguments[0]; Event event = new Event(); event.widget = getBrowser(); event.data = this; ModifyEvent modifyEvent = new ModifyEvent(event); if (pendingListenerCallBackMap.get(identifier) != null) { List<ModifyListener> list = pendingListenerCallBackMap .get(identifier); for (ModifyListener modifyListener : list) { modifyListener.modifyText(modifyEvent); } } else { if (modifyListenerList.size() > 0) { for (ModifyListener listener : modifyListenerList) { listener.modifyText(modifyEvent); } } } pendingListenerCallBackMap.remove(identifier); } return null; } } /** * BrowserFunction that is called if the wrapped Ckeditor is initialized. * * @author Tom Seidel <tom.seidel@remus-software.org> */ private class RenderCompleteFunction extends BrowserFunction { public RenderCompleteFunction(Browser browser) { super(browser, "_delegate_init"); } @Override public Object function(Object[] arguments) { initialize(); return null; } } /** * BrowserFunction that delegates the event from ckeditor that is thrown if * the selected dom-node changed. * * @author Tom Seidel <tom.seidel@remus-software.org> */ private class SelectionChangedFunction extends BrowserFunction { public SelectionChangedFunction(Browser browser) { super(browser, "_delegate_selectionChanged"); } @Override public Object function(Object[] arguments) { // check if listeners are registered. Could be that in the near // future the construction of NodeSelectionEvent is not so cheap // like at the moment. if (selectionListenerList.size() > 0) { NodeSelectionEvent nodeSelectionEvent = new NodeSelectionEvent( null); for (NodeSelectionChangeListener listener : selectionListenerList) { listener.selectedNodeChanged(nodeSelectionEvent); } } if (trackedCommands.size() > 0) { Set<String> keySet = trackedCommands.keySet(); for (String string : keySet) { String valueOf = String .valueOf(evaluate("return integration.editor.getCommand('" + string + "').state;")); TriState fromString = TriState.fromString(valueOf); if (fromString != trackedCommands.get(string).getState()) { trackedCommands.get(string).setState(fromString); } } } return null; } } /** * The wrapped browser widget. */ private final Browser browser; /** * A list of listeners which fire if the selected node within the html is * changed. */ private transient List<NodeSelectionChangeListener> selectionListenerList = new ArrayList<NodeSelectionChangeListener>(); private transient List<ModifyListener> modifyListenerList = new ArrayList<ModifyListener>(); /** * a temporary collection of commands that are executed before the ckeditor * was initialized. If the ckeditor finishes its initialization all commands * are executed. * * @see HtmlComposer#initialize() */ private final List<Command> pendingCommands = Collections .synchronizedList(new ArrayList<Command>()); /** * A map of commands that were executed before the widget was initialized * and their appending listeners which are still waiting for an event. */ private Map<Command, List<ModifyListener>> pendingListeners = new HashMap<Command, List<ModifyListener>>(); /** * A map of callback-Ids and their appended Listeners. This is */ private Map<String, List<ModifyListener>> pendingListenerCallBackMap = new HashMap<String, List<ModifyListener>>(); /** * Tracked {@link Command}s. */ private final Map<String, Command> trackedCommands = new HashMap<String, Command>(); /** * Flag if the ckeditor finishes its initialization and is ready for * receiving commands. */ private boolean initialized; /** * Constructs a new instance of a {@link Browser} and includes a ckeditor * instance. * * @param parent * a composite control which will be the parent of the new * instance (cannot be null) * @param style * the style of control to construct * @see Browser#Browser(Composite, int) * */ public HtmlComposer(final Composite parent, final int style) { this(parent, style, null); } /** * Constructs a new instance of a {@link Browser} and includes a ckeditor * instance. * * @param parent * a composite control which will be the parent of the new * instance (cannot be null) * @param style * the style of control to construct * @param config the configuration for the html-widget * @see Browser#Browser(Composite, int) * @since 0.8 */ public HtmlComposer(final Composite parent, final int style, Configuration config) { browser = new Browser(parent, style); browser.setMenu(new Menu(browser)); new RenderCompleteFunction(browser); URL baseUrl; try { baseUrl = FileLocator.resolve(FileLocator.find(HtmlTextActivator .getDefault().getBundle(), new Path( "/eclipsebridge/base.html"), Collections.emptyMap())); browser.setUrl(baseUrl.toString() + (config != null ? "?" + config.toQuery() : "")); browser.addProgressListener(new ProgressAdapter() { @Override public void completed(ProgressEvent event) { browser.execute("integration.eclipseRunning = true;"); browser.removeProgressListener(this); } }); } catch (IOException e) { throw new RuntimeException(e); } } /** * @param listener * @see org.eclipse.swt.widgets.Control#addControlListener(org.eclipse.swt.events.ControlListener) */ public void addControlListener(final ControlListener listener) { browser.addControlListener(listener); } /** * @param listener * @see org.eclipse.swt.widgets.Widget#addDisposeListener(org.eclipse.swt.events.DisposeListener) */ public void addDisposeListener(final DisposeListener listener) { browser.addDisposeListener(listener); } /** * @param listener * @see org.eclipse.swt.widgets.Control#addFocusListener(org.eclipse.swt.events.FocusListener) */ public void addFocusListener(final FocusListener listener) { browser.addFocusListener(listener); } /** * @param listener * @see org.eclipse.swt.widgets.Control#addHelpListener(org.eclipse.swt.events.HelpListener) */ public void addHelpListener(final HelpListener listener) { browser.addHelpListener(listener); } public void addModifyListener(ModifyListener listener) { modifyListenerList.add(listener); } public void addNodeSelectionChangeListener( NodeSelectionChangeListener listener) { selectionListenerList.add(listener); } /** * @param listener * @see org.eclipse.swt.widgets.Control#addPaintListener(org.eclipse.swt.events.PaintListener) */ public void addPaintListener(final PaintListener listener) { browser.addPaintListener(listener); } /** * @param listener * @see org.eclipse.swt.widgets.Control#addTraverseListener(org.eclipse.swt.events.TraverseListener) */ public void addTraverseListener(final TraverseListener listener) { browser.addTraverseListener(listener); } /** * @param wHint * @param hHint * @return * @see org.eclipse.swt.widgets.Control#computeSize(int, int) */ public Point computeSize(final int wHint, final int hHint) { return browser.computeSize(wHint, hHint); } /** * @param wHint * @param hHint * @param changed * @return * @see org.eclipse.swt.widgets.Composite#computeSize(int, int, boolean) */ public Point computeSize(final int wHint, final int hHint, final boolean changed) { return browser.computeSize(wHint, hHint, changed); } /** * @param x * @param y * @param width * @param height * @return * @see org.eclipse.swt.widgets.Scrollable#computeTrim(int, int, int, int) */ public Rectangle computeTrim(final int x, final int y, final int width, final int height) { return browser.computeTrim(x, y, width, height); } /** * @see org.eclipse.swt.widgets.Widget#dispose() */ public void dispose() { Collection<Command> values = trackedCommands.values(); for (Command command : values) { command.dispose(); } browser.dispose(); } /** * @param script * @return * @throws SWTException * @see org.eclipse.swt.browser.Browser#evaluate(java.lang.String) */ public Object evaluate(String script) throws SWTException { return browser.evaluate(script); } /** * @param script * @return * @see org.eclipse.swt.browser.Browser#execute(java.lang.String) */ public boolean execute(String script) { return browser.execute(script); } /** * Executes a given command * * @param command * the command to execute */ public void execute(Command command) { if (initialized) { /* * if the command was executed while the ckeditor was not * initialized yet. this is required to keep track of the listeners * that needs to be notified if a command is executed before the * widget was initialized but also to filter the listeners that were * added to the widget after the originating command was scheduled. */ if (pendingListeners.get(command) != null) { String nanoTime = String.valueOf(System.nanoTime()); pendingListenerCallBackMap.put(nanoTime, pendingListeners.get(command)); execute("integration.pendingCommandIdentifier = \'" + nanoTime + "\';"); execute(command.getCommand()); pendingListeners.remove(command); } else { execute("integration.pendingCommandIdentifier = \'\';"); execute(command.getCommand()); } } else { pendingListeners.put(command, new ArrayList<ModifyListener>( modifyListenerList)); pendingCommands.add(command); } } /** * Execute a command wit a result. * * @param command * the command to execute * @return the result of the execution. */ public Object executeWithReturn(Command command) { if (initialized) { return evaluate(command.getCommand()); } return null; } /** * @return * @see org.eclipse.swt.widgets.Control#forceFocus() */ public boolean forceFocus() { return browser.forceFocus(); } /** * @return * @see org.eclipse.swt.widgets.Control#getAccessible() */ public Accessible getAccessible() { return browser.getAccessible(); } /** * @return * @see org.eclipse.swt.widgets.Control#getBackground() */ public Color getBackground() { return browser.getBackground(); } /** * @return * @see org.eclipse.swt.widgets.Control#getBackgroundImage() */ public Image getBackgroundImage() { return browser.getBackgroundImage(); } /** * @return * @see org.eclipse.swt.widgets.Composite#getBackgroundMode() */ public int getBackgroundMode() { return browser.getBackgroundMode(); } /** * @return * @see org.eclipse.swt.widgets.Control#getBorderWidth() */ public int getBorderWidth() { return browser.getBorderWidth(); } /** * @return * @see org.eclipse.swt.widgets.Control#getBounds() */ public Rectangle getBounds() { return browser.getBounds(); } public Browser getBrowser() { return browser; } /** * @return * @see org.eclipse.swt.widgets.Composite#getChildren() */ public Control[] getChildren() { return browser.getChildren(); } /** * @return * @see org.eclipse.swt.widgets.Scrollable#getClientArea() */ public Rectangle getClientArea() { return browser.getClientArea(); } /** * @return * @see org.eclipse.swt.widgets.Control#getCursor() */ public Cursor getCursor() { return browser.getCursor(); } /** * @return * @see org.eclipse.swt.widgets.Widget#getData() */ public Object getData() { return browser.getData(); } /** * @param key * @return * @see org.eclipse.swt.widgets.Widget#getData(java.lang.String) */ public Object getData(final String key) { return browser.getData(key); } /** * @return * @see org.eclipse.swt.widgets.Widget#getDisplay() */ public Display getDisplay() { return browser.getDisplay(); } /** * @return * @see org.eclipse.swt.widgets.Control#getEnabled() */ public boolean getEnabled() { return browser.getEnabled(); } /** * @return * @see org.eclipse.swt.widgets.Control#getFont() */ public Font getFont() { return browser.getFont(); } /** * @return * @see org.eclipse.swt.widgets.Control#getForeground() */ public Color getForeground() { return browser.getForeground(); } /** * @return * @see org.eclipse.swt.widgets.Scrollable#getHorizontalBar() */ public ScrollBar getHorizontalBar() { return browser.getHorizontalBar(); } /** * Returns the current html content of the widget * * @return the html */ public String getHtml() { GetHtmlCommand getHtmlCommand = new GetHtmlCommand(); getHtmlCommand.setComposer(this); Object executeWithReturn = executeWithReturn(getHtmlCommand); if (executeWithReturn != null) { return String.valueOf(executeWithReturn); } return null; } /** * @return * @see org.eclipse.swt.widgets.Composite#getLayout() */ public Layout getLayout() { return browser.getLayout(); } /** * @return * @see org.eclipse.swt.widgets.Control#getLayoutData() */ public Object getLayoutData() { return browser.getLayoutData(); } /** * @return * @see org.eclipse.swt.widgets.Composite#getLayoutDeferred() */ public boolean getLayoutDeferred() { return browser.getLayoutDeferred(); } /** * @param eventType * @return * @see org.eclipse.swt.widgets.Widget#getListeners(int) */ public Listener[] getListeners(final int eventType) { return browser.getListeners(eventType); } /** * @return * @see org.eclipse.swt.widgets.Control#getLocation() */ public Point getLocation() { return browser.getLocation(); } /** * @return * @see org.eclipse.swt.widgets.Control#getMenu() */ public Menu getMenu() { return browser.getMenu(); } /** * @return * @see org.eclipse.swt.widgets.Control#getMonitor() */ public Monitor getMonitor() { return browser.getMonitor(); } /** * @return * @see org.eclipse.swt.widgets.Control#getParent() */ public Composite getParent() { return browser.getParent(); } /** * @return * @see org.eclipse.swt.widgets.Control#getRegion() */ public Region getRegion() { return browser.getRegion(); } /** * @return * @see org.eclipse.swt.widgets.Control#getShell() */ public Shell getShell() { return browser.getShell(); } /** * @return * @see org.eclipse.swt.widgets.Control#getSize() */ public Point getSize() { return browser.getSize(); } /** * @return * @see org.eclipse.swt.browser.Browser#getStyle() */ public int getStyle() { return browser.getStyle(); } /** * @return * @see org.eclipse.swt.widgets.Composite#getTabList() */ public Control[] getTabList() { return browser.getTabList(); } /** * @return * @see org.eclipse.swt.widgets.Scrollable#getVerticalBar() */ public ScrollBar getVerticalBar() { return browser.getVerticalBar(); } /** * @return * @see org.eclipse.swt.widgets.Control#getVisible() */ public boolean getVisible() { return browser.getVisible(); } /** * @return * @see org.eclipse.swt.browser.Browser#getWebBrowser() */ public Object getWebBrowser() { return browser.getWebBrowser(); } void initialize() { new SelectionChangedFunction(browser); new ModifiedFunction(browser); initialized = true; for (Command command : pendingCommands) { execute(command); } pendingCommands.clear(); } /** * @return * @see org.eclipse.swt.widgets.Widget#isDisposed() */ public boolean isDisposed() { return browser.isDisposed(); } /** * @return * @see org.eclipse.swt.widgets.Control#isEnabled() */ public boolean isEnabled() { return browser.isEnabled(); } /** * @return * @see org.eclipse.swt.browser.Browser#isFocusControl() */ public boolean isFocusControl() { return browser.isFocusControl(); } /** * @return * @see org.eclipse.swt.widgets.Composite#isLayoutDeferred() */ public boolean isLayoutDeferred() { return browser.isLayoutDeferred(); } /** * @param eventType * @return * @see org.eclipse.swt.widgets.Widget#isListening(int) */ public boolean isListening(final int eventType) { return browser.isListening(eventType); } /** * @return * @see org.eclipse.swt.widgets.Control#isReparentable() */ public boolean isReparentable() { return browser.isReparentable(); } /** * @return * @see org.eclipse.swt.widgets.Control#isVisible() */ public boolean isVisible() { return browser.isVisible(); } /** * @see org.eclipse.swt.widgets.Composite#layout() */ public void layout() { browser.layout(); } /** * @param changed * @see org.eclipse.swt.widgets.Composite#layout(boolean) */ public void layout(final boolean changed) { browser.layout(changed); } /** * @param changed * @param all * @see org.eclipse.swt.widgets.Composite#layout(boolean, boolean) */ public void layout(final boolean changed, final boolean all) { browser.layout(changed, all); } /** * @param changed * @see org.eclipse.swt.widgets.Composite#layout(org.eclipse.swt.widgets.Control[]) */ public void layout(final Control[] changed) { browser.layout(changed); } /** * @param control * @see org.eclipse.swt.widgets.Control#moveAbove(org.eclipse.swt.widgets.Control) */ public void moveAbove(final Control control) { browser.moveAbove(control); } /** * @param control * @see org.eclipse.swt.widgets.Control#moveBelow(org.eclipse.swt.widgets.Control) */ public void moveBelow(final Control control) { browser.moveBelow(control); } /** * @param eventType * @param event * @see org.eclipse.swt.widgets.Widget#notifyListeners(int, * org.eclipse.swt.widgets.Event) */ public void notifyListeners(final int eventType, final Event event) { browser.notifyListeners(eventType, event); } /** * @see org.eclipse.swt.widgets.Control#pack() */ public void pack() { browser.pack(); } /** * @param changed * @see org.eclipse.swt.widgets.Control#pack(boolean) */ public void pack(final boolean changed) { browser.pack(changed); } /** * @param gc * @return * @see org.eclipse.swt.widgets.Control#print(org.eclipse.swt.graphics.GC) */ public boolean print(final GC gc) { return browser.print(gc); } /** * @see org.eclipse.swt.widgets.Control#redraw() */ public void redraw() { browser.redraw(); } /** * @param x * @param y * @param width * @param height * @param all * @see org.eclipse.swt.widgets.Control#redraw(int, int, int, int, boolean) */ public void redraw(final int x, final int y, final int width, final int height, final boolean all) { browser.redraw(x, y, width, height, all); } /** * @see org.eclipse.swt.browser.Browser#refresh() */ public void refresh() { browser.refresh(); } /** * @param listener * @see org.eclipse.swt.widgets.Widget#removeDisposeListener(org.eclipse.swt.events.DisposeListener) */ public void removeDisposeListener(final DisposeListener listener) { browser.removeDisposeListener(listener); } /** * @param listener * @see org.eclipse.swt.widgets.Control#removeFocusListener(org.eclipse.swt.events.FocusListener) */ public void removeFocusListener(final FocusListener listener) { browser.removeFocusListener(listener); } /** * @param listener * @see org.eclipse.swt.widgets.Control#removeHelpListener(org.eclipse.swt.events.HelpListener) */ public void removeHelpListener(final HelpListener listener) { browser.removeHelpListener(listener); } public void removeModifyListener(ModifyListener listener) { modifyListenerList.remove(listener); } public void removeNodeSelectionChangeListener( NodeSelectionChangeListener listener) { selectionListenerList.remove(listener); } /** * @param listener * @see org.eclipse.swt.browser.Browser#removeOpenWindowListener(org.eclipse.swt.browser.OpenWindowListener) */ public void removeOpenWindowListener(final OpenWindowListener listener) { browser.removeOpenWindowListener(listener); } /** * @param listener * @see org.eclipse.swt.widgets.Control#removePaintListener(org.eclipse.swt.events.PaintListener) */ public void removePaintListener(final PaintListener listener) { browser.removePaintListener(listener); } /** * @param listener * @see org.eclipse.swt.widgets.Control#removeTraverseListener(org.eclipse.swt.events.TraverseListener) */ public void removeTraverseListener(final TraverseListener listener) { browser.removeTraverseListener(listener); } /** * @param color * @see org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics.Color) */ public void setBackground(final Color color) { browser.setBackground(color); execute(new Command() { @Override public String getCommandIdentifier() { return "set_background_internal"; } @Override public String getCommand() { String hexValue = color != null ? "#" +ColorConverter .convertRgbToHex(color.getRGB()) : ""; return "document.getElementById(\'cke_editor1_arialbl\').nextSibling.style.backgroundColor = \'" + hexValue + "\';"; } }); } /** * @param image * @see org.eclipse.swt.widgets.Control#setBackgroundImage(org.eclipse.swt.graphics.Image) */ public void setBackgroundImage(final Image image) { browser.setBackgroundImage(image); } /** * @param mode * @see org.eclipse.swt.widgets.Composite#setBackgroundMode(int) */ public void setBackgroundMode(final int mode) { browser.setBackgroundMode(mode); } /** * @param x * @param y * @param width * @param height * @see org.eclipse.swt.widgets.Control#setBounds(int, int, int, int) */ public void setBounds(final int x, final int y, final int width, final int height) { browser.setBounds(x, y, width, height); } /** * @param rect * @see org.eclipse.swt.widgets.Control#setBounds(org.eclipse.swt.graphics.Rectangle) */ public void setBounds(final Rectangle rect) { browser.setBounds(rect); } /** * @param capture * @see org.eclipse.swt.widgets.Control#setCapture(boolean) */ public void setCapture(final boolean capture) { browser.setCapture(capture); } /** * @param cursor * @see org.eclipse.swt.widgets.Control#setCursor(org.eclipse.swt.graphics.Cursor) */ public void setCursor(final Cursor cursor) { browser.setCursor(cursor); } /** * @param data * @see org.eclipse.swt.widgets.Widget#setData(java.lang.Object) */ public void setData(final Object data) { browser.setData(data); } /** * @param key * @param value * @see org.eclipse.swt.widgets.Widget#setData(java.lang.String, * java.lang.Object) */ public void setData(final String key, final Object value) { browser.setData(key, value); } /** * @param enabled * @see org.eclipse.swt.widgets.Control#setEnabled(boolean) */ public void setEnabled(final boolean enabled) { browser.setEnabled(enabled); } /** * @return * @see org.eclipse.swt.widgets.Composite#setFocus() */ public boolean setFocus() { boolean setFocus = browser.setFocus(); browser.execute("integration.editor.focus();"); return setFocus; } /** * @param font * @see org.eclipse.swt.widgets.Control#setFont(org.eclipse.swt.graphics.Font) */ public void setFont(final Font font) { browser.setFont(font); } /** * @param color * @see org.eclipse.swt.widgets.Control#setForeground(org.eclipse.swt.graphics.Color) */ public void setForeground(final Color color) { browser.setForeground(color); } /** * Replaces the current content of the widget with the given html. For * inserting html at the current selection use: * * <pre> * HtmlComposer.execute("integration.editor.insertHtml('myHtmlToInsert');"); * </pre> * * @param html */ public void setHtml(String html) { SetHtmlCommand setHtmlCommand = new SetHtmlCommand(); setHtmlCommand.setComposer(this); setHtmlCommand.setHtml(html); execute(setHtmlCommand); } /** * @param layout * @see org.eclipse.swt.widgets.Composite#setLayout(org.eclipse.swt.widgets.Layout) */ public void setLayout(final Layout layout) { browser.setLayout(layout); } /** * @param layoutData * @see org.eclipse.swt.widgets.Control#setLayoutData(java.lang.Object) */ public void setLayoutData(final Object layoutData) { browser.setLayoutData(layoutData); } /** * @param defer * @see org.eclipse.swt.widgets.Composite#setLayoutDeferred(boolean) */ public void setLayoutDeferred(final boolean defer) { browser.setLayoutDeferred(defer); } /** * @param x * @param y * @see org.eclipse.swt.widgets.Control#setLocation(int, int) */ public void setLocation(final int x, final int y) { browser.setLocation(x, y); } /** * @param location * @see org.eclipse.swt.widgets.Control#setLocation(org.eclipse.swt.graphics.Point) */ public void setLocation(final Point location) { browser.setLocation(location); } /** * @param menu * @see org.eclipse.swt.widgets.Control#setMenu(org.eclipse.swt.widgets.Menu) */ public void setMenu(final Menu menu) { browser.setMenu(menu); } /** * @param parent * @return * @see org.eclipse.swt.widgets.Control#setParent(org.eclipse.swt.widgets.Composite) */ public boolean setParent(final Composite parent) { return browser.setParent(parent); } /** * @param redraw * @see org.eclipse.swt.widgets.Control#setRedraw(boolean) */ public void setRedraw(final boolean redraw) { browser.setRedraw(redraw); } /** * @param region * @see org.eclipse.swt.widgets.Control#setRegion(org.eclipse.swt.graphics.Region) */ public void setRegion(final Region region) { browser.setRegion(region); } /** * @param width * @param height * @see org.eclipse.swt.widgets.Control#setSize(int, int) */ public void setSize(final int width, final int height) { browser.setSize(width, height); } /** * @param size * @see org.eclipse.swt.widgets.Control#setSize(org.eclipse.swt.graphics.Point) */ public void setSize(final Point size) { browser.setSize(size); } /** * @param tabList * @see org.eclipse.swt.widgets.Composite#setTabList(org.eclipse.swt.widgets.Control[]) */ public void setTabList(final Control[] tabList) { browser.setTabList(tabList); } /** * @param visible * @see org.eclipse.swt.widgets.Control#setVisible(boolean) */ public void setVisible(final boolean visible) { browser.setVisible(visible); } /** * @param x * @param y * @return * @see org.eclipse.swt.widgets.Control#toControl(int, int) */ public Point toControl(final int x, final int y) { return browser.toControl(x, y); } /** * @param point * @return * @see org.eclipse.swt.widgets.Control#toControl(org.eclipse.swt.graphics.Point) */ public Point toControl(final Point point) { return browser.toControl(point); } /** * @param x * @param y * @return * @see org.eclipse.swt.widgets.Control#toDisplay(int, int) */ public Point toDisplay(final int x, final int y) { return browser.toDisplay(x, y); } /** * @param point * @return * @see org.eclipse.swt.widgets.Control#toDisplay(org.eclipse.swt.graphics.Point) */ public Point toDisplay(final Point point) { return browser.toDisplay(point); } /** * @return * @see org.eclipse.swt.widgets.Widget#toString() */ @Override public String toString() { return browser.toString(); } public void trackCommand(Command command) { trackedCommands.put(command.getCommandIdentifier(), command); } /** * @param traversal * @return * @see org.eclipse.swt.widgets.Control#traverse(int) */ public boolean traverse(final int traversal) { return browser.traverse(traversal); } public void untrackCommand(Command command) { trackedCommands.remove(command.getCommandIdentifier()); } }