Initial commit from SVN.
This commit is contained in:
@@ -0,0 +1,374 @@
|
||||
/*
|
||||
* 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.events.*;
|
||||
|
||||
import com.common.thread.IRunnable;
|
||||
import com.foundation.tcv.swt.*;
|
||||
import com.foundation.tcv.swt.client.cell.CellComponent;
|
||||
import com.foundation.tcv.view.*;
|
||||
|
||||
public class ComboBox extends IndexedCollectionComponent implements SelectionListener, IComboBox, ModifyListener {
|
||||
/** Used to stop selection events from being handled while the items are being changed. */
|
||||
private boolean suspendSelectionEvents = false;
|
||||
/**
|
||||
* ComboBox constructor.
|
||||
*/
|
||||
public ComboBox() {
|
||||
super();
|
||||
}//ComboBox()//
|
||||
/**
|
||||
* Gets the SWT combo that represents this combo box.
|
||||
* @return The SWT combo providing visualization for this combo box.
|
||||
*/
|
||||
public org.eclipse.swt.widgets.Combo getSwtCombo() {
|
||||
return (org.eclipse.swt.widgets.Combo) getSwtWidget();
|
||||
}//getSwtCombo()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewInitialize()
|
||||
*/
|
||||
protected void internalViewInitialize() {
|
||||
getSwtCombo().addSelectionListener(this);
|
||||
getSwtCombo().addModifyListener(this);
|
||||
super.internalViewInitialize();
|
||||
}//internalViewInitialize()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.AbstractComponent#internalViewRelease()
|
||||
*/
|
||||
protected void internalViewRelease() {
|
||||
if((getSwtCombo() != null) && (!getSwtCombo().isDisposed())) {
|
||||
getSwtCombo().removeSelectionListener(this);
|
||||
getSwtCombo().removeModifyListener(this);
|
||||
}//if//
|
||||
|
||||
super.internalViewRelease();
|
||||
}//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(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.Combo(getContainer().getSwtParent(), style));
|
||||
getSwtWidget().setData(this);
|
||||
//Set the allows user items flag.//
|
||||
setAllowUserItems(!((style & SWT.READ_ONLY) > 0));
|
||||
|
||||
//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_TEXT_LIMIT: {
|
||||
getSwtCombo().setTextLimit(((Integer) viewMessage.getMessageData()).intValue());
|
||||
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 event) {
|
||||
widgetSelected(event);
|
||||
}//widgetDefaultSelected()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
|
||||
*/
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
updateSelectionLinks();
|
||||
|
||||
if(getAutoSynchronizeSelection()) {
|
||||
if(getAutoSynchronizeSelectionDelay() > 0) {
|
||||
//TODO: Multiple selections are never allowed for a combo...
|
||||
int[] selectedObjectIds = getAllowMultiSelection() ? getSelectedObjectIds() : null;
|
||||
int selectedObjectId = !getAllowMultiSelection() && !hasCustomSelection() ? getSelectedObjectId() : -1;
|
||||
String customSelection = !getAllowMultiSelection() && hasCustomSelection() ? controlGetText() : null;
|
||||
|
||||
if((selectedObjectIds != null) || ((customSelection != null) && (!customSelection.equals(getCustomSelectionOnServer()))) || (selectedObjectId != getSelectedObjectIdOnServer())) {
|
||||
final Object selection = customSelection != null ? (Object) customSelection : selectedObjectIds != null ? (Object) selectedObjectIds : selectedObjectId != -1 ? new Integer(selectedObjectId) : null;
|
||||
|
||||
//Update the known server state.//
|
||||
if(selectedObjectIds == null) {
|
||||
setSelectedObjectIdOnServer(selectedObjectId);
|
||||
setCustomSelectionOnServer(customSelection);
|
||||
}//if//
|
||||
|
||||
//Start a task to send the selection to the server after a short delay. This will reduce the overhead of auto synchronizing the selection.//
|
||||
synchronized(this) {
|
||||
if(autoSynchronizeSelectionTask != null) {
|
||||
removeTask(autoSynchronizeSelectionTask);
|
||||
}//if//
|
||||
|
||||
autoSynchronizeSelectionTask = new Task() {
|
||||
public void execute() {
|
||||
//Make sure that this task is still valid and is not being superceeded.//
|
||||
synchronized(ComboBox.this) {
|
||||
if(autoSynchronizeSelectionTask == this) {
|
||||
//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, getAutoSynchronizeSelectionDelay());
|
||||
}//synchronized//
|
||||
}//if//
|
||||
}//if//
|
||||
else {
|
||||
synchronizeSelection();
|
||||
}//else//
|
||||
}//if//
|
||||
}//widgetSelected()//
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
|
||||
*/
|
||||
public void modifyText(ModifyEvent event) {
|
||||
if(!suspendSelectionEvents) {
|
||||
//TODO: Should we remove this if block? Shouldn't widgetSelected(null) be called regardless?
|
||||
if(controlGetSelection() == -1) {
|
||||
widgetSelected(null);
|
||||
}//if//
|
||||
}//if//
|
||||
}//modifyText()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlRemoveAll()
|
||||
*/
|
||||
protected void controlRemoveAll() {
|
||||
suspendSelectionEvents = true;
|
||||
|
||||
try {
|
||||
getSwtCombo().removeAll();
|
||||
}//try//
|
||||
finally {
|
||||
suspendSelectionEvents = false;
|
||||
}//finally//
|
||||
}//controlRemoveAll()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlSetItems(String[])
|
||||
*/
|
||||
protected void controlSetItems(Object[] items) {
|
||||
String[] itemTexts = new String[items.length];
|
||||
|
||||
System.arraycopy(items, 0, itemTexts, 0, itemTexts.length);
|
||||
suspendSelectionEvents = true;
|
||||
|
||||
try {
|
||||
getSwtCombo().setItems(itemTexts);
|
||||
}//try//
|
||||
finally {
|
||||
suspendSelectionEvents = false;
|
||||
}//finally//
|
||||
}//controlSetItems()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlSetItem(int, Object)
|
||||
*/
|
||||
protected void controlSetItem(int index, Object itemData) {
|
||||
suspendSelectionEvents = true;
|
||||
|
||||
try {
|
||||
getSwtCombo().setItem(index, (String) itemData);
|
||||
}//try//
|
||||
finally {
|
||||
suspendSelectionEvents = false;
|
||||
}//finally//
|
||||
}//controlSetItem()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlAddItem(Object, int)
|
||||
*/
|
||||
protected void controlAddItem(Object itemData, int index) {
|
||||
suspendSelectionEvents = true;
|
||||
|
||||
try {
|
||||
getSwtCombo().add((String) itemData, index);
|
||||
}//try//
|
||||
finally {
|
||||
suspendSelectionEvents = false;
|
||||
}//finally//
|
||||
}//controlAddItem()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlAddItem(Object)
|
||||
*/
|
||||
protected void controlAddItem(Object itemData) {
|
||||
suspendSelectionEvents = true;
|
||||
|
||||
try {
|
||||
getSwtCombo().add((String) itemData);
|
||||
}//try//
|
||||
finally {
|
||||
suspendSelectionEvents = false;
|
||||
}//finally//
|
||||
}//controlAddItem()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlRemoveItem(int)
|
||||
*/
|
||||
protected void controlRemoveItem(int index) {
|
||||
suspendSelectionEvents = true;
|
||||
|
||||
try {
|
||||
getSwtCombo().remove(index);
|
||||
}//try//
|
||||
finally {
|
||||
suspendSelectionEvents = false;
|
||||
}//finally//
|
||||
}//controlRemoveItem()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlGetSelections()
|
||||
*/
|
||||
protected int[] controlGetSelections() {
|
||||
//return getSwtCombo().getSelectionIndices();
|
||||
throw new RuntimeException("Method not supported - controlGetSelections");
|
||||
}//controlGetSelections()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlGetSelection()
|
||||
*/
|
||||
protected int controlGetSelection() {
|
||||
return getSwtCombo().getSelectionIndex();
|
||||
}//controlGetSelection()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlSetSelections()
|
||||
*/
|
||||
protected void controlSetSelections(int[] indices) {
|
||||
//getSwtCombo().setSelection(indices);
|
||||
throw new RuntimeException("Method not supported - controlSetSelections");
|
||||
}//controlSetSelections()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlSetSelection()
|
||||
*/
|
||||
protected void controlSetSelection(int index) {
|
||||
suspendSelectionEvents = true;
|
||||
|
||||
try {
|
||||
if(index == -1) {
|
||||
getSwtCombo().deselectAll();
|
||||
}//if//
|
||||
else {
|
||||
getSwtCombo().select(index);
|
||||
}//else//
|
||||
}//try//
|
||||
finally {
|
||||
suspendSelectionEvents = false;
|
||||
}//finally//
|
||||
}//controlSetSelection()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.IndexedCollectionComponent#controlSetSelection(java.lang.String)
|
||||
*/
|
||||
protected void controlSetSelection(String text) {
|
||||
suspendSelectionEvents = true;
|
||||
|
||||
try {
|
||||
if(text == null) {
|
||||
getSwtCombo().deselectAll();
|
||||
}//if//
|
||||
else {
|
||||
getSwtCombo().deselectAll();
|
||||
getSwtCombo().setText(text);
|
||||
}//else//
|
||||
}//try//
|
||||
finally {
|
||||
suspendSelectionEvents = false;
|
||||
}//finally//
|
||||
}//controlSetSelection()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlAddSelection()
|
||||
*/
|
||||
protected void controlAddSelection(int index) {
|
||||
//getSwtCombo().select(index);
|
||||
throw new RuntimeException("Method not supported - controlAddSelection");
|
||||
}//controlAddSelection()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlRemoveSelection()
|
||||
*/
|
||||
protected void controlRemoveSelection(int index) {
|
||||
suspendSelectionEvents = true;
|
||||
|
||||
try {
|
||||
getSwtCombo().deselect(index);
|
||||
}//try//
|
||||
finally {
|
||||
suspendSelectionEvents = false;
|
||||
}//finally//
|
||||
}//controlRemoveSelection()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlRemoveAllSelections()
|
||||
*/
|
||||
protected void controlRemoveAllSelections() {
|
||||
suspendSelectionEvents = true;
|
||||
getSwtCombo().deselectAll();
|
||||
suspendSelectionEvents = false;
|
||||
}//controlRemoveAllSelections()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlIsSelected()
|
||||
*/
|
||||
protected boolean controlIsSelected(int index) {
|
||||
return getSwtCombo().getSelectionIndex() == index;
|
||||
}//controlIsSelected()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlGetText()
|
||||
*/
|
||||
protected String controlGetText() {
|
||||
return getSwtCombo().getText();
|
||||
}//controlGetText()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.view.swt.CollectionComponent#controlSetText(String)
|
||||
*/
|
||||
protected void controlSetText(String text) {
|
||||
suspendSelectionEvents = true;
|
||||
|
||||
if(text == null) {
|
||||
getSwtCombo().deselectAll();
|
||||
}//if//
|
||||
else {
|
||||
getSwtCombo().setText(text);
|
||||
}//else//
|
||||
|
||||
suspendSelectionEvents = false;
|
||||
}//controlSetText()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.CollectionComponent#controlGetSelectionCount()
|
||||
*/
|
||||
protected int controlGetSelectionCount() {
|
||||
return getSwtCombo().getText().length() > 0 ? 1 : 0;
|
||||
}//controlGetSelectionCount()//
|
||||
/**
|
||||
* Forces the selection event handler to be called.
|
||||
*/
|
||||
protected void forceSelectionEvent() { //Should call widgetSelected implemented by the subclass. This name may need to change.//
|
||||
widgetSelected(null);
|
||||
}//forceSelectionEvent()//
|
||||
/* (non-Javadoc)
|
||||
* @see com.foundation.tcv.swt.client.ICellContainer#addComponent(com.foundation.tcv.swt.client.cell.CellComponent)
|
||||
*/
|
||||
public void addComponent(CellComponent component) {
|
||||
//Never used.//
|
||||
}//addComponent()//
|
||||
}//ComboBox//
|
||||
Reference in New Issue
Block a user