// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dataprofiler.core.ui.editor.composite;
import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
*
* DOC zshen class global comment. Detailled comment
*/
public class MultipleSelectionCombo extends Composite {
private Text textContent = null;
private java.util.List<String> items = new ArrayList<String>();
private int[] usrSelection = null;
private Shell floatShell = null;
private List itemList = null;
private Button arrowButton;
private Color gray = null;
public MultipleSelectionCombo(Composite parent, int style) {
super(parent, style);
init();
}
public MultipleSelectionCombo(Composite parent, String[] items, int[] selection, int style) {
super(parent, style);
usrSelection = selection;
this.items = Arrays.asList(items);
init();
}
private void init() {
usrSelection = new int[] {};
GridLayout layout = new GridLayout();
layout.marginBottom = 0;
layout.marginTop = 0;
layout.marginLeft = 0;
layout.marginRight = 0;
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.numColumns = 2;
layout.horizontalSpacing = 0;
setLayout(layout);
textContent = new Text(this, SWT.BORDER | SWT.READ_ONLY);
gray = textContent.getBackground();
textContent.setLayoutData(new GridData(GridData.FILL_BOTH));
displayText();
textContent.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent event) {
super.mouseDown(event);
initFloatShell();
}
});
arrowButton = new Button(this, SWT.ARROW | SWT.DOWN);
arrowButton.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL));
arrowButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent event) {
super.mouseDown(event);
initFloatShell();
}
});
}
private void initFloatShell() {
Point p = textContent.getParent().toDisplay(textContent.getLocation());
Point textsize = textContent.getSize();
Point arrowSize = arrowButton.getSize();
Rectangle shellRect = new Rectangle(p.x, p.y + textsize.y, textsize.x + arrowSize.x, 0);
floatShell = new Shell(MultipleSelectionCombo.this.getShell(), SWT.NO_TRIM);
GridLayout gl = new GridLayout();
gl.marginBottom = 2;
gl.marginTop = 2;
gl.marginRight = 2;
gl.marginLeft = 2;
gl.marginWidth = 0;
gl.marginHeight = 0;
floatShell.setLayout(gl);
itemList = new List(floatShell, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
for (String value : items) {
itemList.add(value);
}
itemList.setSelection(usrSelection);
GridData gd = new GridData(GridData.FILL_BOTH);
itemList.setLayoutData(gd);
floatShell.setSize(shellRect.width, 100);
floatShell.setLocation(shellRect.x, shellRect.y);
itemList.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent event) {
super.mouseUp(event);
usrSelection = itemList.getSelectionIndices();
if ((event.stateMask & SWT.CTRL) == 0) {
floatShell.dispose();
displayText();
}
}
});
floatShell.addShellListener(new ShellAdapter() {
public void shellDeactivated(ShellEvent arg0) {
if (floatShell != null && !floatShell.isDisposed()) {
usrSelection = itemList.getSelectionIndices();
displayText();
floatShell.dispose();
}
}
});
floatShell.open();
}
private void displayText() {
if (usrSelection != null && usrSelection.length > 0) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < usrSelection.length; i++) {
if (i > 0)
sb.append(",");//$NON-NLS-1$
sb.append(items.get(usrSelection[i]));
}
textContent.setText(sb.toString());
} else {
textContent.setText("");//$NON-NLS-1$
}
}
public void removeAll() {
if (itemList != null && !itemList.isDisposed()) {
itemList.removeAll();
}
this.items.clear();
}
public void addModifyListener(ModifyListener listener) {
textContent.addModifyListener(listener);
}
public void add(String string) {
if (itemList != null && !itemList.isDisposed()) {
this.itemList.add(string);
this.items = Arrays.asList(this.itemList.getItems());
} else {
if (this.items == null) {
this.items = new ArrayList<String>();
}
this.items.add(string);
}
}
public int getItemCount() {
return this.items.size();
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (enabled) {
textContent.setBackground(new Color(null, 255, 255, 255));
} else {
textContent.setBackground(gray);
}
textContent.setEnabled(enabled);
arrowButton.setEnabled(enabled);
}
}