/* * Copyright (c) 2005,2007 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.graphics.Image; import org.eclipse.swt.widgets.TabItem; import com.common.util.LiteHashMap; import com.foundation.tcv.swt.ITabPanel; import com.foundation.tcv.view.ViewMessage; public class TabPanel extends Container implements ITabPanel, Component.IComponentListener { /** A mapping of TabItem instances indexed by the Component displayed by the tab. */ private LiteHashMap tabItemsByComponentMap = new LiteHashMap(15); /** * TabPanel constructor. */ public TabPanel() { super(); }//TabPanel()// /** * Gets the SWT tab folder that represents this tab panel. * @return The SWT tab folder providing visualization for this tab panel. */ public org.eclipse.swt.widgets.TabFolder getSwtTabFolder() { return (org.eclipse.swt.widgets.TabFolder) getSwtWidget(); }//getSwtTabFolder()// /* (non-Javadoc) * @see com.foundation.tcv.swt.client.AbstractComponent#internalViewInitialize() */ protected void internalViewInitialize() { 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.TabFolder(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_TAB: { int componentNumber = ((int[]) viewMessage.getMessageData())[0]; Component component = (Component) getComponent(componentNumber); String title = component.getContainerTitle(); Image image = component.getContainerImage(); String toolTipText = component.getToolTipText(); TabItem tabItem = null; if(((int[]) viewMessage.getMessageData()).length > 1) { tabItem = new TabItem(getSwtTabFolder(), 0, ((int[]) viewMessage.getMessageData())[1]); }//if// else { tabItem = new TabItem(getSwtTabFolder(), 0); }//else// tabItem.setText(title == null ? "" : title); tabItem.setImage(image); tabItem.setToolTipText(toolTipText); tabItem.setData(component); tabItem.setControl(component.getSwtControl()); tabItemsByComponentMap.put(component, tabItem); component.registerListener(this); break; }//case// case MESSAGE_REMOVE_TAB: { int componentNumber = ((Integer) viewMessage.getMessageData()).intValue(); Component component = (Component) getComponent(componentNumber); if(component != null) { TabItem tabItem = (TabItem) tabItemsByComponentMap.remove(component); if(tabItem != null && !tabItem.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.// tabItem.dispose(); }//if// component.unregisterListener(this); }//if// break; }//case// case MESSAGE_REPOSITION_TAB: { int componentNumber = ((int[]) viewMessage.getMessageData())[0]; int newIndex = ((int[]) viewMessage.getMessageData())[1]; Component component = (Component) getComponent(componentNumber); if(component != null) { TabItem oldTabItem = (TabItem) tabItemsByComponentMap.remove(component); if(oldTabItem != null && !oldTabItem.isDisposed()) { TabItem newTabItem = new TabItem(getSwtTabFolder(), 0, newIndex); newTabItem.setText(oldTabItem.getText()); newTabItem.setImage(oldTabItem.getImage()); newTabItem.setToolTipText(oldTabItem.getToolTipText()); newTabItem.setData(oldTabItem.getData()); newTabItem.setControl(oldTabItem.getControl()); oldTabItem.dispose(); tabItemsByComponentMap.put(component, newTabItem); }//if// }//if// break; }//case// case MESSAGE_SORT_TABS: { int startIndex = ((Integer) ((Object[]) viewMessage.getMessageData())[0]).intValue(); int[] mapping = (int[]) ((Object[]) viewMessage.getMessageData())[1]; TabItem[] oldTabItems = new TabItem[mapping.length]; int nextIndex = startIndex; //Reorder the tab items by adding new tab items before the old ones.// for(int index = 0; index < mapping.length; index++) { int oldIndex = nextIndex + index + mapping[index]; TabItem oldTabItem = getSwtTabFolder().getItem(oldIndex); TabItem tabItem = new org.eclipse.swt.widgets.TabItem(getSwtTabFolder(), 0, index); Component component = (Component) oldTabItem.getData(); tabItem.setText(oldTabItem.getText()); tabItem.setImage(oldTabItem.getImage()); tabItem.setToolTipText(oldTabItem.getToolTipText()); tabItem.setControl(oldTabItem.getControl()); tabItem.setData(oldTabItem.getData()); oldTabItems[index] = oldTabItem; tabItemsByComponentMap.put(component, tabItem); nextIndex++; }//for// //Remove the old tab items.// for(int index = 0; index < oldTabItems.length; index++) { oldTabItems[index].dispose(); }//for// break; }//case// default: { result = super.internalProcessMessage(viewMessage); }//default// }//switch// return result; }//internalProcessMessage()// /* (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) { TabItem tabItem = (TabItem) tabItemsByComponentMap.get(component); if(tabItem != null && !tabItem.isDisposed()) { tabItem.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 component, Image image) { TabItem tabItem = (TabItem) tabItemsByComponentMap.get(component); if(tabItem != null && !tabItem.isDisposed()) { tabItem.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 component, String newTitle) { TabItem tabItem = (TabItem) tabItemsByComponentMap.get(component); if(tabItem != null && !tabItem.isDisposed()) { tabItem.setText(newTitle); }//if// }//titleChanged()// }//TabPanel//