// ============================================================================ // // 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.widgets.composites; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; 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.Composite; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import com.amalto.workbench.detailtabs.sections.BasePropertySection; 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.providers.ListStringLabelProvider; public abstract class ListStringContentsComposite extends Composite { protected TreeViewer tvInfos; public TreeViewer getInfosTreeViewer() { return this.tvInfos; } protected Button btnAdd; protected Button btnUp; protected Button btnDown; protected Button btnRemove; protected List<String> infos = new ArrayList<String>(); protected BasePropertySection section; private boolean treeContentChanged = false; public ListStringContentsComposite(Composite parent, int style, Object[] initParas, BasePropertySection section) { super(parent, style); this.section = section; initParas(initParas); final GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 2; setLayout(gridLayout); createCandidateInfoUIArea(parent); btnAdd = new Button(this, SWT.NONE); btnAdd.setImage(ImageCache.getCreatedImage(EImage.ADD_OBJ.getPath())); btnAdd.setToolTipText(Messages._Add); tvInfos = new TreeViewer(this, SWT.FULL_SELECTION | SWT.BORDER); Tree tree = tvInfos.getTree(); tree.setLinesVisible(true); tree.setHeaderVisible(true); tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3)); tvInfos.setContentProvider(new ListContentProvider()); tvInfos.setLabelProvider(new ListStringLabelProvider()); tvInfos.setInput(infos); final TreeColumn colInfo = new TreeColumn(tree, SWT.NONE); colInfo.setWidth(300); colInfo.setText(getInfoColTitle()); btnUp = new Button(this, SWT.NONE); btnUp.setImage(ImageCache.getCreatedImage(EImage.PREV_NAV.getPath())); btnUp.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false)); btnUp.setToolTipText(Messages._Up); btnDown = new Button(this, SWT.NONE); btnDown.setImage(ImageCache.getCreatedImage(EImage.NEXT_NAV.getPath())); final GridData gd_btnDown = new GridData(SWT.CENTER, SWT.TOP, false, false); btnDown.setLayoutData(gd_btnDown); btnDown.setToolTipText(Messages._Down); btnRemove = new Button(this, SWT.NONE); btnRemove.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false)); btnRemove.setImage(ImageCache.getCreatedImage(EImage.DELETE_OBJ.getPath())); btnRemove.setToolTipText(Messages._Del); // createExtentUIArea(parent); initUIListeners(); } protected void initUIListeners() { initListenerForAddBtn(); initListenerForRemoveBtn(); initListenerForUpBtn(); initListenerForDownBtn(); } protected void initListenerForAddBtn() { btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { onAdd(); } }); } protected void initListenerForRemoveBtn() { btnRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { onRemove(); } }); } protected void initListenerForUpBtn() { btnUp.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { onMoveUp(); } }); } protected void initListenerForDownBtn() { btnDown.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { onMoveDown(); } }); } protected void onAdd() { if (!hasCandidateInfo() || infos.contains(getCandidateInfo())) { return; } addInfoToInfoTree(getCandidateInfo()); } protected void onRemove() { if (!hasSelectionInInfoTree()) { return; } removeInfoFromInfoTree(getSelectionFromInfoTree()); } protected void onMoveUp() { if (!hasSelectionInInfoTree()) { return; } moveInfoUp(getSelectionFromInfoTree()); } protected void onMoveDown() { if (!hasSelectionInInfoTree()) { return; } moveInfoDown(getSelectionFromInfoTree()); } public String[] getInfos() { return infos.toArray(new String[0]); } protected void addInfoToInfoTree(String info) { infos.add(info); setContentChanged(true); tvInfos.refresh(); if (section != null) { section.autoCommit(); } } private void removeInfoFromInfoTree(String info) { infos.remove(info); setContentChanged(true); tvInfos.refresh(); if (section != null) { section.autoCommit(); } } private boolean hasSelectionInInfoTree() { return getSelectionFromInfoTree() != null; } private String getSelectionFromInfoTree() { return getSelectionFromInfoViewer(tvInfos); } protected String getSelectionFromInfoViewer(Viewer targetViewer) { Object selectedObj = ((IStructuredSelection) targetViewer.getSelection()).getFirstElement(); if (selectedObj == null) { return null; } return selectedObj.toString(); } private void moveInfoUp(String info) { doMoveInfo(info, (infos.indexOf(info) - 1) < 0 ? 0 : (infos.indexOf(info) - 1)); } private void moveInfoDown(String info) { doMoveInfo(info, (infos.indexOf(info) == infos.size() - 1) ? (infos.size() - 1) : (infos.indexOf(info) + 1)); } private void doMoveInfo(String info, int newIndex) { infos.remove(info); infos.add(newIndex, info); tvInfos.refresh(); setContentChanged(true); if (section != null) { section.autoCommit(); } } public void setInfos(String[] infos) { initCandidateInfoUIArea(); initInfoTrees(infos); } private void initInfoTrees(String[] annotationInfos) { infos.clear(); for (String eachInfo : annotationInfos) { infos.add(eachInfo); } tvInfos.refresh(); } public boolean isContentChanged() { return treeContentChanged; } public void setContentChanged(boolean changed) { this.treeContentChanged = changed; } protected abstract String getInfoColTitle(); protected abstract void createExtentUIArea(Composite parent); protected abstract void createCandidateInfoUIArea(Composite parent); protected abstract boolean hasCandidateInfo(); protected abstract String getCandidateInfo(); protected abstract void initCandidateInfoUIArea(); protected abstract void initParas(Object[] paras); }