Initial commit from SVN.
This commit is contained in:
@@ -0,0 +1,280 @@
|
||||
/*
|
||||
* 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//
|
||||
Reference in New Issue
Block a user