/* * Copyright (c) 2006,2009 Declarative Engineering LLC. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Declarative Engineering LLC * verson 1 which accompanies this distribution, and is available at * http://declarativeengineering.com/legal/DE_Developer_License_v1.txt */ package com.foundation.tcv.swt.client; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.ExpandItem; import com.common.util.IList; import com.common.util.LiteHashMap; import com.common.util.LiteList; import com.foundation.tcv.swt.IExpandBar; import com.foundation.tcv.view.ViewMessage; public class ExpandBar extends Container implements IExpandBar, Component.IComponentListener, ControlListener { /** A mapping of ExpandItem instances indexed by the Component displayed by the item. */ private LiteHashMap expandItemsByComponentMap = new LiteHashMap(15); /** A collection of Component instances which require initialization. */ private IList pendingItems = new LiteList(10, 50); /** * ExpandBar constructor. */ public ExpandBar() { super(); }//ExpandBar()// /** * Gets the SWT expand bar that represents this expand bar. * @return The SWT expand bar providing visualization for this expand bar. */ public org.eclipse.swt.widgets.ExpandBar getSwtExpandBar() { return (org.eclipse.swt.widgets.ExpandBar) getSwtWidget(); }//getSwtExpandBar()// /* (non-Javadoc) * @see com.foundation.tcv.swt.client.AbstractComponent#internalViewInitialize() */ protected void internalViewInitialize() { //Complete the initialization of the component items since the components should have set themselves up by now.// for(int index = 0; index < pendingItems.getSize(); index++) { internalAddItem((Component) pendingItems.get(index), -1); }//for// super.internalViewInitialize(); }//internalViewInitialize()// /* (non-Javadoc) * @see com.foundation.tcv.swt.client.AbstractComponent#internalViewRelease() */ protected void internalViewRelease() { super.internalViewRelease(); }//internalViewRelease()// /* (non-Javadoc) * @see com.foundation.tcv.swt.client.AbstractComponent#internalViewSynchronize() */ protected void internalViewSynchronize() { super.internalViewSynchronize(); }//internalViewSynchronize()// /* (non-Javadoc) * @see com.foundation.tcv.swt.client.AbstractComponent#internalProcessMessage(com.foundation.tcv.model.ViewMessage) */ public Object internalProcessMessage(ViewMessage viewMessage) { Object result = null; switch(viewMessage.getMessageNumber()) { case MESSAGE_INITIALIZE: { if(getSwtControl() == null) { int[] data = (int[]) viewMessage.getMessageData(); int style = data[1]; //Link to the parent container.// setContainer((Container) getComponent(data[0])); getContainer().addComponent(this); //Create the SWT widget.// setSwtWidget(new org.eclipse.swt.widgets.ExpandBar(getContainer().getSwtParent(), style)); getSwtWidget().setData(this); //If the container has already been initialized then force the parent to re-layout so that this component will appear.// if(getContainer().isInitialized()) { getContainer().getSwtComposite().layout(true, true); }//if// }//if// break; }//case// case MESSAGE_ADD_ITEM: { int componentNumber = viewMessage.getMessageInteger(); Component component = (Component) getComponent(componentNumber); int index = viewMessage.getMessageSecondaryInteger(); if(isInitialized()) { internalAddItem(component, index); }//if// else { if(index != -1) { pendingItems.add(index, component); }//if// else { pendingItems.add(component); }//else// }//else// break; }//case// case MESSAGE_REMOVE_ITEM: { int componentNumber = ((Integer) viewMessage.getMessageData()).intValue(); Component component = (Component) getComponent(componentNumber); if(component != null) { ExpandItem expandItem = (ExpandItem) expandItemsByComponentMap.remove(component); if(expandItem != null && !expandItem.isDisposed()) { //Note: Don't dispose of the image because it comes from the component's container-image property whose lifecycle is managed by the component.// expandItem.dispose(); }//if// component.unregisterListener(this); }//if// break; }//case// case MESSAGE_REPOSITION_ITEM: { int componentNumber = ((int[]) viewMessage.getMessageData())[0]; int newIndex = ((int[]) viewMessage.getMessageData())[1]; Component component = (Component) getComponent(componentNumber); if(component != null) { ExpandItem oldExpandItem = (ExpandItem) expandItemsByComponentMap.remove(component); if(oldExpandItem != null && !oldExpandItem.isDisposed()) { ExpandItem newExpandItem = new ExpandItem(getSwtExpandBar(), 0, newIndex); newExpandItem.setText(oldExpandItem.getText()); newExpandItem.setImage(oldExpandItem.getImage()); //SWT does not yet support tool tip text for expand items.// //newExpandItem.setToolTipText(oldExpandItem.getToolTipText()); newExpandItem.setData(oldExpandItem.getData()); newExpandItem.setControl(oldExpandItem.getControl()); oldExpandItem.dispose(); expandItemsByComponentMap.put(component, newExpandItem); }//if// }//if// break; }//case// case MESSAGE_SORT_ITEMS: { int startIndex = ((Integer) ((Object[]) viewMessage.getMessageData())[0]).intValue(); int[] mapping = (int[]) ((Object[]) viewMessage.getMessageData())[1]; ExpandItem[] oldExpandItems = new ExpandItem[mapping.length]; int nextIndex = startIndex; //Reorder the item items by adding new item items before the old ones.// for(int index = 0; index < mapping.length; index++) { int oldIndex = nextIndex + index + mapping[index]; ExpandItem oldExpandItem = getSwtExpandBar().getItem(oldIndex); ExpandItem expandItem = new org.eclipse.swt.widgets.ExpandItem(getSwtExpandBar(), 0, index); Component component = (Component) oldExpandItem.getData(); expandItem.setText(oldExpandItem.getText()); expandItem.setImage(oldExpandItem.getImage()); //SWT does not yet support tool tip text for expand items.// //expandItem.setToolTipText(oldExpandItem.getToolTipText()); expandItem.setControl(oldExpandItem.getControl()); expandItem.setData(oldExpandItem.getData()); oldExpandItems[index] = oldExpandItem; expandItemsByComponentMap.put(component, expandItem); nextIndex++; }//for// //Remove the old item items.// for(int index = 0; index < oldExpandItems.length; index++) { oldExpandItems[index].dispose(); }//for// break; }//case// case MESSAGE_SET_SPACING: { Integer spacing = (Integer) viewMessage.getMessageData(); if(spacing != null) { getSwtExpandBar().setSpacing(spacing.intValue()); }//if// resize(); break; }//case// default: { result = super.internalProcessMessage(viewMessage); }//default// }//switch// return result; }//internalProcessMessage()// /** * Adds an item to the expand bar. * @param component The component which will be placed as an expandable item. * @param index The index of the expand bar item within the expand bar item set. A value of -1 indicates a new expand bar should be created at the end. */ protected void internalAddItem(Component component, int index) { String title = component.getContainerTitle(); Image image = component.getContainerImage(); //SWT does not yet support tool tip text for expand items.// //String toolTipText = component.getToolTipText(); ExpandItem expandItem = null; if(index != -1) { expandItem = new ExpandItem(getSwtExpandBar(), 0, index); }//if// else { expandItem = new ExpandItem(getSwtExpandBar(), 0); }//else// expandItem.setText(title == null ? "" : title); expandItem.setImage(image); //SWT does not yet support tool tip text for expand items.// //expandItem.setToolTipText(toolTipText); expandItem.setData(component); expandItem.setControl(component.getSwtControl()); expandItemsByComponentMap.put(component, expandItem); component.registerListener(this); component.getSwtControl().addControlListener(this); }//internalAddItem()// /* (non-Javadoc) * @see com.foundation.tcv.swt.client.Component.IComponentListener#toolTipTextChanged(com.foundation.tcv.swt.client.Component, java.lang.String) */ public void toolTipTextChanged(Component component, String newToolTipText) { ExpandItem expandItem = (ExpandItem) expandItemsByComponentMap.get(component); if(expandItem != null && !expandItem.isDisposed()) { //SWT does not yet support tool tip text for expand items.// //expandItem.setToolTipText(newToolTipText); }//if// }//toolTipTextChanged()// /* (non-Javadoc) * @see com.foundation.tcv.swt.client.Component.IComponentListener#imageChanged(com.foundation.tcv.swt.client.Component, org.eclipse.swt.graphics.Image) */ public void imageChanged(Component container, Image image) { ExpandItem expandItem = (ExpandItem) expandItemsByComponentMap.get(container); if(expandItem != null && !expandItem.isDisposed()) { expandItem.setImage(image); }//if// }//imageChanged()// /* (non-Javadoc) * @see com.foundation.tcv.swt.client.Component.IComponentListener#titleChanged(com.foundation.tcv.swt.client.Component, java.lang.String) */ public void titleChanged(Component container, String newTitle) { ExpandItem expandItem = (ExpandItem) expandItemsByComponentMap.get(container); if(expandItem != null && !expandItem.isDisposed()) { expandItem.setText(newTitle); }//if// }//titleChanged()// /* (non-Javadoc) * @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent) */ public void controlMoved(ControlEvent e) { }//controlMoved()// /* (non-Javadoc) * @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent) */ public void controlResized(ControlEvent e) { //TODO: Is this the right place for this? ((ExpandItem) expandItemsByComponentMap.get(e.widget.getData())).setHeight(((Control) e.widget).computeSize(SWT.DEFAULT, SWT.DEFAULT).y); }//controlResized()// /* (non-Javadoc) * @see com.foundation.tcv.swt.client.Container#internalLayout() */ protected void internalLayout() { ExpandItem[] items = getSwtExpandBar().getItems(); //TODO: Is this the right place for this? //Set the height of all the expand items.// for(int index = 0; index < items.length; index++) { items[index].setHeight(items[index].getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT).y); }//for// super.internalLayout(); }//internalLayout()// }//ExpandBar//