192 lines
5.9 KiB
Java
192 lines
5.9 KiB
Java
|
|
/*
|
||
|
|
* 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.Composite;
|
||
|
|
import org.eclipse.swt.widgets.Control;
|
||
|
|
|
||
|
|
import com.foundation.tcv.swt.*;
|
||
|
|
import com.foundation.tcv.view.*;
|
||
|
|
import com.foundation.tcv.client.controller.SessionViewController;
|
||
|
|
|
||
|
|
public class Window extends Frame implements ShellListener, IWindow {
|
||
|
|
private Window parent = null; //The parent in this case is not the container, but used for dialog like functionality.//
|
||
|
|
private boolean setInitialVisibility = true;
|
||
|
|
private boolean setInitialFocus = true;
|
||
|
|
/**
|
||
|
|
* Window constructor.
|
||
|
|
*/
|
||
|
|
public Window() {
|
||
|
|
super();
|
||
|
|
}//Window()//
|
||
|
|
/**
|
||
|
|
* Gets the SWT shell that represents this frame.
|
||
|
|
* @return The shell providing visualization for this frame.
|
||
|
|
*/
|
||
|
|
public org.eclipse.swt.widgets.Shell getSwtShell() {
|
||
|
|
return (org.eclipse.swt.widgets.Shell) getSwtControl();
|
||
|
|
}//getSwtShell()//
|
||
|
|
/* (non-Javadoc)
|
||
|
|
* @see com.foundation.tcv.swt.client.Frame#registerShellListeners()
|
||
|
|
*/
|
||
|
|
protected void registerShellListeners() {
|
||
|
|
//Add this component as a shell listener so we get shell events.//
|
||
|
|
getSwtShell().addShellListener(this);
|
||
|
|
}//registerShellListeners()//
|
||
|
|
/* (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() {
|
||
|
|
try {
|
||
|
|
if((getSwtShell() != null) && (!getSwtShell().isDisposed())) {
|
||
|
|
//Add this component as a shell listener so we get shell events.//
|
||
|
|
getSwtShell().addShellListener(this);
|
||
|
|
}//if//
|
||
|
|
|
||
|
|
super.internalViewRelease();
|
||
|
|
}//try//
|
||
|
|
finally {
|
||
|
|
if(parent != null) {
|
||
|
|
//TODO: Find a way to bring the window to the forefront.//
|
||
|
|
// parent.getSwtShell().setEnabled(true);
|
||
|
|
parent.getSwtShell().setFocus();
|
||
|
|
parent = null;
|
||
|
|
}//if//
|
||
|
|
}//finally//
|
||
|
|
}//internalViewRelease()//
|
||
|
|
/* (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(getSwtWidget() == null) {
|
||
|
|
long[] parentId = (long[]) viewMessage.getMessageData();
|
||
|
|
int style = viewMessage.getMessageInteger();
|
||
|
|
Window parent = (Window) (parentId != null ? getComponent(parentId) : null);
|
||
|
|
|
||
|
|
if(parent != null) {
|
||
|
|
this.parent = parent;
|
||
|
|
// parent.getSwtShell().setEnabled(false);
|
||
|
|
setSwtWidget(new org.eclipse.swt.widgets.Shell(parent.getSwtShell(), style));
|
||
|
|
}//if//
|
||
|
|
else {
|
||
|
|
setSwtWidget(new org.eclipse.swt.widgets.Shell(getDisplay(), style));
|
||
|
|
}//else//
|
||
|
|
|
||
|
|
getSwtWidget().setData(this);
|
||
|
|
}//if//
|
||
|
|
break;
|
||
|
|
}//case//
|
||
|
|
case MESSAGE_SET_IS_VISIBLE: {
|
||
|
|
if(setInitialVisibility && ((Boolean) viewMessage.getMessageData()).booleanValue()) {
|
||
|
|
setInitialVisibility = false;
|
||
|
|
centerOnParent();
|
||
|
|
}//if//
|
||
|
|
|
||
|
|
retVal = super.internalProcessMessage(viewMessage);
|
||
|
|
break;
|
||
|
|
}//case//
|
||
|
|
case MESSAGE_SET_FOCUS: {
|
||
|
|
grabFocus();
|
||
|
|
break;
|
||
|
|
}//case//
|
||
|
|
default: {
|
||
|
|
retVal = super.internalProcessMessage(viewMessage);
|
||
|
|
}//default//
|
||
|
|
}//switch//
|
||
|
|
|
||
|
|
return retVal;
|
||
|
|
}//internalProcessMessage()//
|
||
|
|
/**
|
||
|
|
* Grabs focus.
|
||
|
|
*/
|
||
|
|
protected void grabFocus() {
|
||
|
|
if(setInitialFocus) {
|
||
|
|
Control focusControl = locateInitialFocusControl(getSwtComposite());
|
||
|
|
|
||
|
|
setInitialFocus = false;
|
||
|
|
|
||
|
|
if(focusControl != null) {
|
||
|
|
focusControl.setFocus();
|
||
|
|
}//if//
|
||
|
|
}//if//
|
||
|
|
else {
|
||
|
|
getSwtDecorations().setFocus();
|
||
|
|
}//else//
|
||
|
|
}//grabFocus()//
|
||
|
|
/**
|
||
|
|
* Recursively searches for the initial focus control.
|
||
|
|
* @param parent The parent composite to look in.
|
||
|
|
* @return The initial focus control.
|
||
|
|
*/
|
||
|
|
private Control locateInitialFocusControl(Composite parent) {
|
||
|
|
Control[] tabList = parent.getTabList();
|
||
|
|
Control result = null;
|
||
|
|
|
||
|
|
if(tabList != null && tabList.length > 0) {
|
||
|
|
for(int index = 0; result == null && index < tabList.length; index++) {
|
||
|
|
if(tabList[index] instanceof Composite) {
|
||
|
|
result = locateInitialFocusControl((Composite) tabList[index]);
|
||
|
|
}//if//
|
||
|
|
else {
|
||
|
|
result = tabList[index];
|
||
|
|
}//else//
|
||
|
|
}//for//
|
||
|
|
}//if//
|
||
|
|
|
||
|
|
return result;
|
||
|
|
}//locateInitialFocusControl()//
|
||
|
|
/**
|
||
|
|
* Centers the view on its parent if there is one.
|
||
|
|
*/
|
||
|
|
protected void centerOnParent() {
|
||
|
|
if(parent != null) { //Center the window on the parent if there is one. TODO: Allow a way to turn this centering off?//
|
||
|
|
Rectangle parentBounds = parent.getShell().getBounds();
|
||
|
|
Point size = getSwtShell().getSize();
|
||
|
|
Rectangle displayArea = getSwtShell().getDisplay().getClientArea();
|
||
|
|
int x = ((parentBounds.width - size.x) >> 1) + parentBounds.x;
|
||
|
|
int y = ((parentBounds.height - size.y) >> 1) + parentBounds.y;
|
||
|
|
|
||
|
|
if((x + size.x) - parentBounds.x > displayArea.width) {
|
||
|
|
x = (displayArea.width - size.x) + parentBounds.x;
|
||
|
|
}//if//
|
||
|
|
|
||
|
|
if((y + size.y) - parentBounds.y > displayArea.height) {
|
||
|
|
y = (displayArea.height - size.y) + parentBounds.y;
|
||
|
|
}//if//
|
||
|
|
|
||
|
|
if(x - parentBounds.x < 0) {
|
||
|
|
x = parentBounds.x;
|
||
|
|
}//if//
|
||
|
|
|
||
|
|
if(y - parentBounds.y < 0) {
|
||
|
|
y = parentBounds.y;
|
||
|
|
}//if//
|
||
|
|
|
||
|
|
getSwtShell().setLocation(x, y);
|
||
|
|
}//if//
|
||
|
|
}//centerOnParent()//
|
||
|
|
/* (non-Javadoc)
|
||
|
|
* @see com.foundation.tcv.client.view.IAbstractClientViewComponent#initialize(int, com.foundation.tcv.client.controller.SessionViewController)
|
||
|
|
*/
|
||
|
|
public void initialize(int number, SessionViewController sessionViewController) {
|
||
|
|
//Perform the general initialization first.//
|
||
|
|
super.initialize(number, sessionViewController);
|
||
|
|
}//initialize()//
|
||
|
|
}//Window//
|