Initial commit from SVN.
This commit is contained in:
@@ -0,0 +1,421 @@
|
||||
/*
|
||||
* 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.events.*;
|
||||
import org.eclipse.swt.graphics.*;
|
||||
import org.eclipse.swt.widgets.Event;
|
||||
|
||||
import com.foundation.tcv.client.view.ResourceHolder;
|
||||
import com.foundation.tcv.swt.*;
|
||||
import com.foundation.tcv.view.ViewMessage;
|
||||
import com.foundation.view.JefImage;
|
||||
|
||||
public class Frame extends Container implements IDecoration, IFrame, Component.IComponentListener {
|
||||
/** A holder for the value of the container images. */
|
||||
private ResourceHolder containerImagesHolder = new ResourceHolder(this);
|
||||
/** The swt images used by the container of this component to represent the component. */
|
||||
private Image[] swtContainerImages = null;
|
||||
private Menu menuBar = null;
|
||||
/** Whether to send closed events to the server. */
|
||||
private boolean sendClosedEvent = false;
|
||||
/** Whether to send activated or deactivated events to the server. */
|
||||
private boolean sendActivatedEvents = false;
|
||||
/**
|
||||
* Frame constructor.
|
||||
*/
|
||||
public Frame() {
|
||||
super();
|
||||
}//Frame()//
|
||||
/**
|
||||
* Gets the SWT decorations that represents this frame.
|
||||
* @return The decorations providing visualization for this frame.
|
||||
*/
|
||||
public org.eclipse.swt.widgets.Decorations getSwtDecorations() {
|
||||
return (org.eclipse.swt.widgets.Decorations) getSwtControl();
|
||||
}//getSwtDecorations()//
|
||||
/**
|
||||
* Gets the frame's default button.
|
||||
* @return The default button in this container.
|
||||
*/
|
||||
public Button getDefaultButton() {
|
||||
return (Button) getSwtDecorations().getDefaultButton().getData();
|
||||
}//getDefaultButton()//
|
||||
/**
|
||||
* Sets the frame's default button.
|
||||
* @param defaultButton The default button in this container.
|
||||
*/
|
||||
public void setDefaultButton(Button defaultButton) {
|
||||
getSwtDecorations().setDefaultButton(defaultButton != null ? defaultButton.getSwtButton() : null);
|
||||
}//setDefaultButton()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.IDecoration#getMenuBar()
|
||||
*/
|
||||
public Menu getMenuBar() {
|
||||
return menuBar;
|
||||
}//getMenuBar()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.IDecoration#setMenuBar(com.foundation.view.swt.Menu)
|
||||
*/
|
||||
public void setMenuBar(Menu menuBar) {
|
||||
this.menuBar = menuBar;
|
||||
}//setMenuBar()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.Container#center()
|
||||
*/
|
||||
public void center() {
|
||||
Rectangle window = getSwtDecorations().getBounds();
|
||||
Rectangle screen = getSwtDecorations().getMonitor().getBounds();
|
||||
int x = (int) ((screen.width / 2) - (window.width / 2));
|
||||
int y = (int) ((screen.height / 2) - (window.height / 2));
|
||||
|
||||
if(x < screen.x) {
|
||||
x = screen.x;
|
||||
}//if//
|
||||
|
||||
if(y < screen.y) {
|
||||
y = screen.y;
|
||||
}//if//
|
||||
|
||||
getSwtDecorations().setLocation(x, y);
|
||||
}//center()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.Container#center(long[])
|
||||
*/
|
||||
public void center(long[] centerOnView) {
|
||||
Frame frame = (Frame) getComponent(centerOnView);
|
||||
Rectangle windowRect = getSwtDecorations().getBounds();
|
||||
Rectangle screen = getSwtDecorations().getDisplay().getBounds();
|
||||
Rectangle componentRect = frame.getSwtDecorations().getBounds();
|
||||
|
||||
int x = (int) ((componentRect.width / 2) - (windowRect.width / 2) + componentRect.x);
|
||||
int y = (int) ((componentRect.height / 2) - (windowRect.height / 2) + componentRect.y);
|
||||
|
||||
if((x + windowRect.width) - screen.x > screen.width) {
|
||||
x = (int) (screen.width - windowRect.width + screen.x);
|
||||
}//if//
|
||||
|
||||
if((y + windowRect.height) - screen.y > screen.height) {
|
||||
y = (int) (screen.height - windowRect.height + screen.y);
|
||||
}//if//
|
||||
|
||||
if(x < screen.x) {
|
||||
x = screen.x;
|
||||
}//if//
|
||||
|
||||
if(y < screen.y) {
|
||||
y = screen.y;
|
||||
}//if//
|
||||
|
||||
getSwtDecorations().setLocation(x, y);
|
||||
}//center()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewInitializeAll()
|
||||
*/
|
||||
protected void internalViewInitializeAll() {
|
||||
super.internalViewInitializeAll();
|
||||
|
||||
if(getMenuBar() != null) {
|
||||
getMenuBar().internalViewInitializeAll();
|
||||
}//if//
|
||||
}//internalViewInitializeAll()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewReleaseAll()
|
||||
*/
|
||||
protected void internalViewReleaseAll() {
|
||||
super.internalViewReleaseAll();
|
||||
|
||||
if(getMenuBar() != null) {
|
||||
getMenuBar().internalViewReleaseAll();
|
||||
}//if//
|
||||
}//internalViewReleaseAll()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewSynchronizeAll()
|
||||
*/
|
||||
protected void internalViewSynchronizeAll() {
|
||||
super.internalViewSynchronizeAll();
|
||||
|
||||
if(getMenuBar() != null) {
|
||||
getMenuBar().internalViewSynchronizeAll();
|
||||
}//if//
|
||||
}//internalViewSynchronizeAll()//
|
||||
/**
|
||||
* Registers the listener(s) necessary to capture shell events.
|
||||
*/
|
||||
protected void registerShellListeners() {
|
||||
/*
|
||||
getSwtDecorations().addControlListener(new ControlListener() {
|
||||
private boolean wasLastMaximized = false;
|
||||
|
||||
public void controlResized(ControlEvent e) {
|
||||
boolean isMaximized = getSwtDecorations().getMaximized();
|
||||
|
||||
if(isMaximized != wasLastMaximized) {
|
||||
wasLastMaximized = isMaximized;
|
||||
shellMaximized(isMaximized);
|
||||
}//if//
|
||||
}//controlResized()//
|
||||
public void controlMoved(ControlEvent e) {
|
||||
}//controlMoved()//
|
||||
});
|
||||
getSwtDecorations().addListener(SWT.Iconify, new org.eclipse.swt.widgets.Listener() {
|
||||
public void handleEvent(Event event) {
|
||||
shellIconified(event);
|
||||
}//handleEvent()//
|
||||
});
|
||||
getSwtDecorations().addListener(SWT.Deiconify, new org.eclipse.swt.widgets.Listener() {
|
||||
public void handleEvent(Event event) {
|
||||
shellDeiconified(event);
|
||||
}//handleEvent()//
|
||||
});
|
||||
*/
|
||||
|
||||
/* GCJ Doesn't like this... since it isn't used I am commenting it.
|
||||
getSwtDecorations().addListener(SWT.Close, new org.eclipse.swt.widgets.Listener() {
|
||||
public void handleEvent(Event event) {
|
||||
shellClosed(event);
|
||||
event.doit = false;
|
||||
}//handleEvent()//
|
||||
});
|
||||
getSwtDecorations().addListener(SWT.Activate, new org.eclipse.swt.widgets.Listener() {
|
||||
public void handleEvent(Event event) {
|
||||
shellActivated(event);
|
||||
}//handleEvent()//
|
||||
});
|
||||
getSwtDecorations().addListener(SWT.Deactivate, new org.eclipse.swt.widgets.Listener() {
|
||||
public void handleEvent(Event event) {
|
||||
shellDeactivated(event);
|
||||
}//handleEvent()//
|
||||
});
|
||||
*/
|
||||
}//registerShellListeners()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewInitialize()
|
||||
*/
|
||||
protected void internalViewInitialize() {
|
||||
//Add this component as a shell listener so we get shell events.//
|
||||
registerShellListeners();
|
||||
//Register for image and title changes. Note: it is not necessary to initialize the title & image since they will be updated on the container's refresh and an event will fire if they are anything other than null.//
|
||||
registerListener(this);
|
||||
|
||||
if(getContainerTitle() != null) {
|
||||
getSwtDecorations().setText(getContainerTitle());
|
||||
}//if//
|
||||
|
||||
super.internalViewInitialize();
|
||||
}//internalViewInitialize()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewRelease()
|
||||
*/
|
||||
protected void internalViewRelease() {
|
||||
containerImagesHolder.release();
|
||||
|
||||
if(swtContainerImages != null) {
|
||||
destroyImages(swtContainerImages);
|
||||
swtContainerImages = null;
|
||||
}//if//
|
||||
|
||||
super.internalViewRelease();
|
||||
unregisterListener(this);
|
||||
}//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.Component#internalResourceHolderChanged(com.foundation.tcv.client.view.ResourceHolder, java.lang.Object, java.lang.Object)
|
||||
*/
|
||||
protected void internalResourceHolderChanged(ResourceHolder resource, Object oldValue, Object newValue, int flags) {
|
||||
if(resource == containerImagesHolder) {
|
||||
destroyImages(swtContainerImages);
|
||||
swtContainerImages = createImages(containerImagesHolder.getValue() instanceof JefImage ? new JefImage[] {(JefImage) containerImagesHolder.getValue()} : (JefImage[]) containerImagesHolder.getValue());
|
||||
getSwtDecorations().setImages(swtContainerImages == null ? new Image[0] : swtContainerImages);
|
||||
}//if//
|
||||
else {
|
||||
super.internalResourceHolderChanged(resource, oldValue, newValue, flags);
|
||||
}//else//
|
||||
}//internalOnAssociationChanged()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.AbstractComponent#internalProcessMessage(com.foundation.tcv.model.ViewMessage)
|
||||
*/
|
||||
public Object internalProcessMessage(ViewMessage viewMessage) {
|
||||
Object retVal = null;
|
||||
|
||||
switch(viewMessage.getMessageNumber()) {
|
||||
case MESSAGE_INITIALIZE: {
|
||||
if(getSwtControl() == null) {
|
||||
int[] data = (int[]) viewMessage.getMessageData();
|
||||
|
||||
setContainer((Container) getComponent(data[0]));
|
||||
setSwtWidget(new org.eclipse.swt.widgets.Decorations(getContainer().getSwtComposite(), data[1]));
|
||||
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//
|
||||
|
||||
registerListener(this);
|
||||
}//if//
|
||||
break;
|
||||
}//case//
|
||||
case MESSAGE_REQUEST_CLOSED_NOTIFICATION: {
|
||||
sendClosedEvent = ((Boolean) viewMessage.getMessageData()).booleanValue();
|
||||
break;
|
||||
}//case//
|
||||
case MESSAGE_MAXIMIZE: {
|
||||
boolean isMaximized = ((Boolean) viewMessage.getMessageData()).booleanValue();
|
||||
|
||||
if(getSwtDecorations().getMaximized() != isMaximized) {
|
||||
getSwtDecorations().setMaximized(isMaximized);
|
||||
}//if//
|
||||
break;
|
||||
}//case//
|
||||
case MESSAGE_MINIMIZE: {
|
||||
boolean isMinimized = ((Boolean) viewMessage.getMessageData()).booleanValue();
|
||||
|
||||
if(getSwtDecorations().getMinimized() != isMinimized) {
|
||||
getSwtDecorations().setMinimized(isMinimized);
|
||||
}//if//
|
||||
break;
|
||||
}//case//
|
||||
case MESSAGE_SHOW: {
|
||||
if(getSwtDecorations().getMinimized()) {
|
||||
getSwtDecorations().setMinimized(false);
|
||||
}//if//
|
||||
|
||||
resize();
|
||||
getSwtDecorations().setVisible(true);
|
||||
getSwtDecorations().setFocus();
|
||||
break;
|
||||
}//case//
|
||||
case MESSAGE_SEND_ACTIVATED_EVENTS: {
|
||||
sendActivatedEvents = ((Boolean) viewMessage.getMessageData()).booleanValue();
|
||||
break;
|
||||
}//case//
|
||||
case MESSAGE_SET_DEFAULT_BUTTON: {
|
||||
setDefaultButton(viewMessage.getMessageData() != null ? (Button) getComponent(((Integer) viewMessage.getMessageData()).intValue()) : null);
|
||||
break;
|
||||
}//case//
|
||||
case MESSAGE_SET_CONTAINER_IMAGES: {
|
||||
containerImagesHolder.setValue(viewMessage.getMessageData());
|
||||
break;
|
||||
}//case//
|
||||
default: {
|
||||
retVal = super.internalProcessMessage(viewMessage);
|
||||
}//case//
|
||||
}//switch//
|
||||
|
||||
return retVal;
|
||||
}//internalProcessMessage()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ShellListener#shellClosed(org.eclipse.swt.events.ShellEvent)
|
||||
*/
|
||||
public void shellClosed(ShellEvent e) {
|
||||
if(sendClosedEvent) {
|
||||
sendRoundTripMessage(MESSAGE_IS_CLOSED, null, null);
|
||||
}//if//
|
||||
|
||||
e.doit = false;
|
||||
}//shellClosed()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ShellListener#shellClosed(org.eclipse.swt.events.ShellEvent)
|
||||
*/
|
||||
public void shellClosed(Event e) {
|
||||
//TODO: Why have two shell closed methods? Which gets called?//
|
||||
if(sendClosedEvent) {
|
||||
sendRoundTripMessage(MESSAGE_IS_CLOSED, null, null);
|
||||
}//if//
|
||||
|
||||
e.doit = false;
|
||||
}//shellClosed()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ShellListener#shellActivated(org.eclipse.swt.events.ShellEvent)
|
||||
*/
|
||||
public void shellActivated(ShellEvent e) {
|
||||
if(sendActivatedEvents) {
|
||||
sendMessage(MESSAGE_IS_ACTIVATED, Boolean.TRUE);
|
||||
}//if//
|
||||
}//shellActivated()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ShellListener#shellActivated(org.eclipse.swt.events.ShellEvent)
|
||||
*/
|
||||
public void shellActivated(Event e) {
|
||||
if(sendActivatedEvents) {
|
||||
sendMessage(MESSAGE_IS_ACTIVATED, Boolean.TRUE);
|
||||
}//if//
|
||||
}//shellActivated()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ShellListener#shellDeactivated(org.eclipse.swt.events.ShellEvent)
|
||||
*/
|
||||
public void shellDeactivated(ShellEvent e) {
|
||||
if(sendActivatedEvents) {
|
||||
sendMessage(MESSAGE_IS_ACTIVATED, Boolean.FALSE);
|
||||
}//if//
|
||||
}//shellDeactivated()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ShellListener#shellDeactivated(org.eclipse.swt.events.ShellEvent)
|
||||
*/
|
||||
public void shellDeactivated(Event e) {
|
||||
if(sendActivatedEvents) {
|
||||
sendMessage(MESSAGE_IS_ACTIVATED, Boolean.FALSE);
|
||||
}//if//
|
||||
}//shellDeactivated()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ShellListener#shellDeiconified(org.eclipse.swt.events.ShellEvent)
|
||||
*/
|
||||
public void shellDeiconified(ShellEvent e) {
|
||||
//if(!suspendResizeEvents) {
|
||||
// sendMessage(MESSAGE_SET_MINIMIZED, Boolean.FALSE);
|
||||
//}//if//
|
||||
}//shellDeiconified()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ShellListener#shellDeiconified(org.eclipse.swt.events.ShellEvent)
|
||||
*/
|
||||
public void shellDeiconified(Event e) {
|
||||
//if(!suspendResizeEvents) {
|
||||
// sendMessage(MESSAGE_SET_MINIMIZED, Boolean.FALSE);
|
||||
//}//if//
|
||||
}//shellDeiconified()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ShellListener#shellIconified(org.eclipse.swt.events.ShellEvent)
|
||||
*/
|
||||
public void shellIconified(ShellEvent e) {
|
||||
//if(!suspendResizeEvents) {
|
||||
// sendMessage(MESSAGE_SET_MINIMIZED, Boolean.TRUE);
|
||||
//}//if//
|
||||
}//shellIconified()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ShellListener#shellIconified(org.eclipse.swt.events.ShellEvent)
|
||||
*/
|
||||
public void shellIconified(Event e) {
|
||||
//if(!suspendResizeEvents) {
|
||||
// sendMessage(MESSAGE_SET_MINIMIZED, Boolean.TRUE);
|
||||
//}//if//
|
||||
}//shellIconified()//
|
||||
/* (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 newImage) {
|
||||
getSwtDecorations().setImage(newImage);
|
||||
}//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) {
|
||||
getSwtDecorations().setText(newTitle);
|
||||
}//titleChanged()//
|
||||
/* (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) {
|
||||
getSwtDecorations().setToolTipText(newToolTipText);
|
||||
}//toolTipTextChanged()//
|
||||
}//Frame//
|
||||
Reference in New Issue
Block a user