Files
Brainstorm/Foundation TCV SWT Client/src/com/foundation/tcv/swt/client/Container.java

307 lines
9.3 KiB
Java
Raw Normal View History

2014-05-30 10:31:51 -07:00
/*
* Copyright (c) 2003,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.widgets.Control;
import org.eclipse.swt.widgets.Composite;
import com.common.util.*;
import com.foundation.tcv.swt.*;
import com.foundation.tcv.view.*;
public abstract class Container extends ScrollableComponent implements IContainer, IAbstractSwtContainer {
/** A collection of components contained by this container. */
private IList components = new LiteList(10, 30);
/** The layout used by the container. */
private Layout layout = null;
/**
* Container constructor.
*/
public Container() {
}//Container()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.IAbstractSwtContainer#getSwtComposite()
*/
public Composite getSwtComposite() {
return (Composite) getSwtControl();
}//getComposite()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.IAbstractSwtContainer#getSwtParent()
*/
public Composite getSwtParent() {
return (Composite) getSwtControl();
}//getSwtParent()//
/**
* Adds a component as a child of this container.
* @param component The component to be contained by this container.
*/
public void addComponent(Component component) {
components.add(component);
}//addComponent()//
/**
* Removes a component that was child of this container.
* @param component The component to no longer be contained by this container.
*/
public void removeComponent(Component component) {
components.remove(component);
}//removeComponent()//
/**
* Gets the collection of components contained by this container.
* @return The collection of all contained components.
*/
public IList getComponents() {
return components;
}//getComponents()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.Component#getFocusControl()
*/
protected Control getFocusControl() {
Control result = getSwtControl().isFocusControl() ? getSwtControl() : null;
if(result != null) {
for(int index = 0; (result == null) && (index < getComponents().getSize()); index++) {
Component component = (Component) getComponents().get(index);
result = component.getFocusControl();
}//for//
}//if//
return result;
}//getFocusControl()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewInitializeAll()
*/
protected void internalViewInitializeAll() {
IList components = getComponents();
IIterator iterator = components.iterator();
//Initialize all contained components that are not value holders.//
while(iterator.hasNext()) {
Component component = (Component) iterator.next();
component.internalViewInitializeAll();
}//for//
super.internalViewInitializeAll();
}//internalViewInitializeAll()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewReleaseAll()
*/
protected void internalViewReleaseAll() {
IIterator iterator = new LiteList(getComponents()).iterator();
//Release sub-components.//
while(iterator.hasNext()) {
Component component = (Component) iterator.next();
component.internalViewReleaseAll();
}//for//
super.internalViewReleaseAll();
}//internalViewReleaseAll()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewSynchronizeAll()
*/
protected void internalViewSynchronizeAll() {
IIterator iterator = components.iterator();
//Synchronize sub-components.//
while(iterator.hasNext()) {
Component component = (Component) iterator.next();
component.internalViewSynchronizeAll();
}//for//
super.internalViewSynchronizeAll();
}//internalViewSynchronizeAll()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewInitialize()
*/
protected void internalViewInitialize() {
super.internalViewInitialize();
if(layout != null) {
layout.initialize();
getSwtParent().setLayout(layout.createLayout(null));
}//if//
}//internalViewInitialize()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewRelease()
*/
protected void internalViewRelease() {
if(layout != null) {
layout.release();
}//if//
super.internalViewRelease();
}//internalViewRelease()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewSynchronize()
*/
protected void internalViewSynchronize() {
super.internalViewSynchronize();
if(layout != null) {
layout.synchronize();
}//if//
}//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_LAYOUT: {
layout();
break;
}//case//
case MESSAGE_SET_TAB_ORDER: {
int[] componentNumbers = (int[]) viewMessage.getMessageData();
Control[] array = new Control[componentNumbers.length];
for(int index = 0; index < componentNumbers.length; index++) {
array[index] = getComponent(componentNumbers[index]) instanceof Container ? ((Container) getComponent(componentNumbers[index])).getSwtParent() : ((Component) getComponent(componentNumbers[index])).getSwtControl();
}//for//
getSwtParent().setTabList(array);
break;
}//case//
case MESSAGE_CENTER: {
long[] centerOnView = (long[]) viewMessage.getMessageData();
if(centerOnView != null) {
center(centerOnView);
}//if//
else {
center();
}//else//
break;
}//case//
case MESSAGE_INHERIT_BACKGROUND: {
int inheritType = viewMessage.getMessageInteger();
int mode = inheritType == INHERIT_FORCE ? SWT.INHERIT_FORCE : inheritType == INHERIT_DEFAULT ? SWT.INHERIT_DEFAULT : SWT.INHERIT_NONE;
getSwtComposite().setBackgroundMode(mode);
if(getSwtParent() != getSwtComposite()) {
getSwtParent().setBackgroundMode(mode);
}//if//
break;
}//case//
case MESSAGE_PACK: {
if(!isSuspendingLayouts()) {
if(viewMessage.getMessageData() instanceof Boolean) {
getSwtParent().pack(((Boolean) viewMessage.getMessageData()).booleanValue());
}//if//
else {
getSwtParent().pack();
}//else//
internalPack();
}//if//
break;
}//case//
default: {
result = super.internalProcessMessage(viewMessage);
}//case//
}//switch//
return result;
}//internalProcessMessage()//
/**
* Centers the view on the primary monitor.
*/
protected void center() {
//Does nothing. This should be overloaded for subclasses which are capable of standalone behavior (window, frame, etc).//
}//center()//
/**
* Centers the view on the primary monitor.
* @param centerOnView The view to center on. If this is null then it will center on the primary monitor.
*/
protected void center(long[] centerOnView) {
//Does nothing. This should be overloaded for subclasses which are capable of standalone behavior (window, frame, etc).//
}//center()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.Component#internalSetEnabledState(boolean, boolean)
*/
protected void internalSetEnabledState(boolean isEnabled, boolean isLocal) {
IIterator iterator = getComponents().iterator();
if(isLocal) {
isLocallyEnabled = isEnabled;
}//if//
else {
isParentEnabled = isEnabled;
}//else//
if(getSwtControl().getEnabled() != isLocallyEnabled && isParentEnabled) {
//Update the control's state.//
getSwtControl().setEnabled(isLocallyEnabled && isParentEnabled);
//Enable or disable all the contained components.//
while(iterator.hasNext()) {
AbstractComponent next = (AbstractComponent) iterator.next();
if(next instanceof Component) {
((Component) next).internalSetEnabledState(isEnabled, false);
}//if//
}//while//
}//if//
}//internalSetEnabledState()//
/**
* Tells the container to layout the components contained within it.
*/
public final void layout() {
if(!isSuspendingLayouts()) {
getSwtParent().layout(true, true);
internalLayout();
}//if//
}//layout()//
/* (non-Javadoc)
* @see com.foundation.view.swt.AbstractComponent#internalPack()
*/
protected void internalPack() {
//Call internalPack on all sub-components.//
for(int index = 0; index < getComponents().getSize(); index++) {
((AbstractComponent) getComponents().get(index)).internalPack();
}//for//
}//internalPack()//
/* (non-Javadoc)
* @see com.foundation.view.swt.AbstractComponent#internalLayout()
*/
protected void internalLayout() {
//Call internalLayout on all sub-components.//
for(int index = 0; index < getComponents().getSize(); index++) {
((AbstractComponent) getComponents().get(index)).internalLayout();
}//for//
}//internalLayout()//
/**
* Called after a child resizes.
* This allows the opportunity for the container to appropriately handle the resize of children.
*/
public void postResize() {
if(getContainer() != null) {
getContainer().postResize();
}//if//
}//postResize()//
/**
* Gets the layout for this container.
* @return The container's layout.
*/
public Layout getLayout() {
return layout;
}//getLayout()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.IAbstractSwtContainer#setLayout(com.foundation.tcv.swt.client.Layout)
*/
public void setLayout(Layout layout) {
this.layout = layout;
}//setLayout()//
}//Container//