Files
Brainstorm/Foundation TCV SWT Client/src/com/foundation/tcv/swt/client/Spinner.java
2014-05-30 10:31:51 -07:00

211 lines
7.3 KiB
Java

/*
* Copyright (c) 2006,2008 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.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import com.common.thread.IRunnable;
import com.foundation.tcv.swt.ISpinner;
import com.foundation.tcv.view.ViewMessage;
public class Spinner extends Component implements ISpinner, SelectionListener {
/** Whether the selection should be automatically sent to the model. */
private boolean autoSynchronizeSelection = false;
/** The number of milliseconds of delay before auto synchronizing the selection. */
private long autoSynchronizeSelectionDelay = 500;
/** The task that auto synchronizes the selection after a short delay. */
protected Task autoSynchronizeSelectionTask = null;
/**
* Spinner constructor.
*/
public Spinner() {
super();
}//Spinner()//
/**
* Gets the SWT spinner that represents this spinner.
* @return The SWT spinner providing visualization for this spinner.
*/
public org.eclipse.swt.widgets.Spinner getSwtSpinner() {
return (org.eclipse.swt.widgets.Spinner) getSwtWidget();
}//getSwtSpinner()//
/**
* Determines whether the control should automatically synchronize all selections.
* @return Whether selections should automatically get sent to the server.
*/
protected boolean getAutoSynchronizeSelection() {
return autoSynchronizeSelection;
}//getAutoSynchronizeSelection()//
/**
* Gets the delay in milliseconds between the selection event and updating the model.
* @return The number of milliseconds to wait before updating the model.
*/
protected long getAutoSynchronizeSelectionDelay() {
return autoSynchronizeSelectionDelay;
}//getAutoSynchronizeSelectionDelay()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewInitialize()
*/
protected void internalViewInitialize() {
getSwtSpinner().addSelectionListener(this);
super.internalViewInitialize();
}//internalViewInitialize()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewRelease()
*/
protected void internalViewRelease() {
if(getSwtSpinner() != null && !getSwtSpinner().isDisposed()) {
getSwtSpinner().removeSelectionListener(this);
}//if//
synchronized(this) {
if(autoSynchronizeSelectionTask != null) {
removeTask(autoSynchronizeSelectionTask);
autoSynchronizeSelectionTask = null;
}//if//
}//synchronized//
super.internalViewRelease();
}//internalViewRelease()//
/* (non-Javadoc)
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewSynchronize()
*/
protected void internalViewSynchronize() {
super.internalViewSynchronize();
if(!getAutoSynchronizeSelection()) {
int selection = getSwtSpinner().getSelection();
sendMessage(MESSAGE_VIEW_SYNCHRONIZE_SELECTION, new Integer(selection));
}//if//
else {
synchronized(this) {
if(autoSynchronizeSelectionTask != null) {
removeTask(autoSynchronizeSelectionTask);
autoSynchronizeSelectionTask.execute();
}//if//
}//synchronized//
}//else if//
}//internalViewSynchronize()//
/**
* Synchronizes the selection(s) with the server.
*/
private void internalSynchronizeSelection() {
if(getAutoSynchronizeSelection()) {
if(autoSynchronizeSelectionDelay > 0) {
//Start a task to send the text to the server after a short delay.//
synchronized(this) {
final Integer selection = new Integer(getSwtSpinner().getSelection());
if(autoSynchronizeSelectionTask != null) {
removeTask(autoSynchronizeSelectionTask);
}//if//
autoSynchronizeSelectionTask = new Task() {
boolean hasRun = false;
public void execute() {
//Make sure that this task is still valid and is not being superceeded.//
synchronized(Spinner.this) {
if((autoSynchronizeSelectionTask == this) && (!hasRun)) {
hasRun = true;
//Cleanup after the task.//
autoSynchronizeSelectionTask = null;
getEventLoop().executeAsync(new IRunnable() {
public Object run() {
sendMessage(MESSAGE_VIEW_SYNCHRONIZE_SELECTION, selection);
return null;
}//run()//
});
}//if//
}//synchronized//
}//run()//
};
addTask(autoSynchronizeSelectionTask, autoSynchronizeSelectionDelay);
}//synchronized//
}//if//
else {
sendMessage(MESSAGE_VIEW_SYNCHRONIZE_SELECTION, new Integer(getSwtSpinner().getSelection()));
}//else//
}//if//
}//internalSynchronizeSelection()//
/* (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();
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.Spinner(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_SET_MAXIMUM: {
getSwtSpinner().setMaximum(((Number) viewMessage.getMessageData()).intValue());
break;
}//case//
case MESSAGE_SET_MINIMUM: {
getSwtSpinner().setMinimum(((Number) viewMessage.getMessageData()).intValue());
break;
}//case//
case MESSAGE_SET_SELECTION: {
getSwtSpinner().setSelection(((Number) viewMessage.getMessageData()).intValue());
break;
}//case//
case MESSAGE_SET_INCREMENT: {
getSwtSpinner().setIncrement(((Number) viewMessage.getMessageData()).intValue());
break;
}//case//
case MESSAGE_SET_PAGE_INCREMENT: {
getSwtSpinner().setPageIncrement(((Number) viewMessage.getMessageData()).intValue());
break;
}//case//
case MESSAGE_SET_AUTO_SYNCHRONIZE_SELECTION: {
autoSynchronizeSelection = ((Boolean) viewMessage.getMessageData()).booleanValue();
break;
}//case//
case MESSAGE_SET_AUTO_SYNCHRONIZE_SELECTION_DELAY: {
autoSynchronizeSelectionDelay = ((Long) viewMessage.getMessageData()).longValue();
break;
}//case//
default: {
retVal = super.internalProcessMessage(viewMessage);
}//default//
}//switch//
return retVal;
}//internalProcessMessage()//
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}//widgetDefaultSelected()//
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e) {
//TODO: Is there some way to determine exactly what selection or deselection occured given the event object?//
internalSynchronizeSelection();
}//widgetSelected()//
}//Spinner//