// ============================================================================
//
// 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 com.amalto.workbench.detailtabs.sections.composites;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import com.amalto.workbench.detailtabs.sections.BasePropertySection;
import com.amalto.workbench.detailtabs.sections.model.annotationinfo.langinfo.LanguageInfo;
import com.amalto.workbench.detailtabs.sections.providers.LanguageInfoLabelProvider;
import com.amalto.workbench.detailtabs.sections.providers.LanguageInfoModifier;
import com.amalto.workbench.detailtabs.sections.providers.LanguageInfoSorter;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.image.EImage;
import com.amalto.workbench.image.ImageCache;
import com.amalto.workbench.providers.ListContentProvider;
import com.amalto.workbench.utils.Util;
public class LanguageInfoComposite extends Composite {
private final List<String> allLanguages;
private TreeViewer tvInfos;
private Text txtLabel;
private Button btnAdd;
private Button btnRemove;
private Combo comboLanguage;
private List<LanguageInfo> infos = new ArrayList<LanguageInfo>();
protected BasePropertySection section;
public LanguageInfoComposite(Composite parent, int style,BasePropertySection section) {
super(parent, style);
this.section=section;
allLanguages = Arrays.asList(Util.lang2iso.keySet().toArray(
new String[0]));
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 4;
setLayout(gridLayout);
comboLanguage = new Combo(this, SWT.READ_ONLY | SWT.DROP_DOWN
| SWT.SINGLE);
final GridData gd_comboLanguage = new GridData();
gd_comboLanguage.widthHint=120;
comboLanguage.setLayoutData(gd_comboLanguage);
txtLabel = new Text(this, SWT.BORDER);
final GridData gd_txtLabel = new GridData(SWT.FILL, SWT.CENTER, true,
false);
txtLabel.setLayoutData(gd_txtLabel);
btnAdd = new Button(this, SWT.NONE);
btnAdd.setImage(ImageCache.getCreatedImage(EImage.ADD_OBJ.getPath()));
btnAdd.setToolTipText(Messages.Add);
tvInfos = new TreeViewer(this, SWT.BORDER | SWT.FULL_SELECTION);
Tree tree = tvInfos.getTree();
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
final GridData gd_tree = new GridData(SWT.FILL, SWT.FILL, true, true,
2, 1);
gd_tree.heightHint = 80;
tree.setLayoutData(gd_tree);
final TreeColumn colLanguage = new TreeColumn(tree, SWT.NONE);
colLanguage.setWidth(120);
colLanguage.setText(Messages.LanguageInfoComposite_);
final TreeColumn colLabel = new TreeColumn(tree, SWT.NONE);
colLabel.setWidth(242);
colLabel.setText(Messages.LanguageInfoComposite_Label);
btnRemove = new Button(this, SWT.NONE);
final GridData gd_btnRemove = new GridData(SWT.LEFT, SWT.TOP, false,
false);
btnRemove.setLayoutData(gd_btnRemove);
btnRemove.setImage(ImageCache.getCreatedImage(EImage.DELETE_OBJ
.getPath()));
btnRemove.setToolTipText(Messages.LanguageInfoComposite_Del);
//
tvInfos.setContentProvider(new ListContentProvider());
tvInfos.setLabelProvider(new LanguageInfoLabelProvider());
tvInfos.setSorter(new LanguageInfoSorter());
initUIListeners();
}
public void setLanguageInfos(LanguageInfo[] initLanguageInfos) {
initUIContent(initLanguageInfos);
tvInfos.refresh();
}
public LanguageInfo[] getLanguageInfos() {
return infos.toArray(new LanguageInfo[0]);
}
private void initUIContent(LanguageInfo[] initLanguageInfos) {
initLanguageCombo();
initLanguageInfos(initLanguageInfos);
}
private void initLanguageCombo() {
comboLanguage.removeAll();
for (String eachLanguage : allLanguages)
comboLanguage.add(eachLanguage);
comboLanguage.select(0);
}
private void initLanguageInfos(LanguageInfo[] initLanguageInfos) {
infos.clear();
for (LanguageInfo eachLanguageInfo : initLanguageInfos) {
infos.add(eachLanguageInfo);
}
tvInfos.setInput(infos);
}
private void initUIListeners() {
initUIListenerOfLabelText();
initUIListenerOfAddButton();
initUIListenerOfAddRemove();
initUIListenerOfLangInfoTree();
}
private void initUIListenerOfLabelText() {
txtLabel.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
onMidifyLabelText();
}
});
}
private void initUIListenerOfLangInfoTree() {
tvInfos.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
onSelectLanguageInfoFrTree();
}
});
tvInfos.setColumnProperties(new String[] {
LanguageInfoModifier.COL_PROP_LANG,
LanguageInfoModifier.COL_PROP_LABLE });
tvInfos.setCellEditors(new CellEditor[] {
new ComboBoxCellEditor(tvInfos.getTree(), allLanguages
.toArray(new String[0])),
new TextCellEditor(tvInfos.getTree()) });
LanguageInfoModifier modifier=new LanguageInfoModifier(tvInfos, infos,
allLanguages,section);
tvInfos.setCellModifier(modifier);
}
private void initUIListenerOfAddRemove() {
btnRemove.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onRemoveLanguageInfo();
}
});
}
private void initUIListenerOfAddButton() {
btnAdd.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onAddLanguageInfo();
}
});
}
private void onSelectLanguageInfoFrTree() {
if (!isLanguageInfoSelected())
return;
LanguageInfo selectedLangInfo = getSelectedLanguageInfo();
comboLanguage.select(allLanguages.indexOf(selectedLangInfo
.getLanguage()));
txtLabel.setText(selectedLangInfo.getLabel());
}
private void onMidifyLabelText() {
LanguageInfo correspondLangInfo = getLangInfoBySelectionOfLangCombo();
if (correspondLangInfo == null)
return;
if (correspondLangInfo.getLabel().equals(txtLabel.getText().trim()))
return;
if ("".equals(txtLabel.getText().trim())) { //$NON-NLS-1$
MessageDialog.openWarning(getShell(), Messages.Warning,
Messages.LanguageInfoComposite_InfoCannotbeEmpty);
txtLabel.setText(correspondLangInfo.getLabel());
}
correspondLangInfo.setLabel(txtLabel.getText().trim());
tvInfos.refresh();
if(section!=null)section.autoCommit();
}
private void onAddLanguageInfo() {
if ("".equals(txtLabel.getText().trim())) { //$NON-NLS-1$
MessageDialog.openWarning(getShell(), Messages.Warning,
Messages.LanguageInfoComposite_InfoCannotbeEmpty);
return;
}
LanguageInfo correspondLangInfo = getLangInfoBySelectionOfLangCombo();
if (correspondLangInfo == null) {
LanguageInfo newLangInfo = new LanguageInfo(
comboLanguage.getText(), Util.lang2iso.get(comboLanguage
.getText()), txtLabel.getText().trim());
infos.add(newLangInfo);
} else {
correspondLangInfo.setLabel(txtLabel.getText().trim());
}
tvInfos.refresh();
if(section!=null)section.autoCommit();
}
private void onRemoveLanguageInfo() {
infos.remove(getSelectedLanguageInfo());
tvInfos.refresh();
if(section!=null)section.autoCommit();
}
private LanguageInfo getLangInfoBySelectionOfLangCombo() {
for (LanguageInfo eachCurLanguageInfo : infos) {
if (eachCurLanguageInfo.getLanguage().equals(
comboLanguage.getText())) {
return eachCurLanguageInfo;
}
}
return null;
}
private LanguageInfo getSelectedLanguageInfo() {
if (tvInfos.getSelection() == null || tvInfos.getSelection().isEmpty())
return null;
Object selectedObj = ((IStructuredSelection) tvInfos.getSelection())
.getFirstElement();
if (selectedObj instanceof LanguageInfo)
return (LanguageInfo) selectedObj;
return null;
}
private boolean isLanguageInfoSelected() {
return (getSelectedLanguageInfo() != null);
}
}