205 lines
7.6 KiB
Java
205 lines
7.6 KiB
Java
|
|
/*
|
||
|
|
* 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//
|