// ============================================================================ // // 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.List; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; 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.graphics.Image; 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 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; public abstract class ComplexAnnotaionInfoComposite<T> extends Composite { protected TreeViewer tvInfos; protected Button btnAdd; protected Button btnRemove; protected Button btnRemoveAll; protected Button btnMoveUp; protected Button btnMoveDown; protected Button btnCopy; protected Button btnPaste; protected T copyedObj = null; protected Image nillableColImage = ImageCache.getCreatedImage(EImage.WILDCARD.getPath()); protected List<T> infos; protected BasePropertySection section; public ComplexAnnotaionInfoComposite(Composite parent, int style, Object[] initParameters, BasePropertySection section) { super(parent, style); this.section = section; initParameters(initParameters); setLayout(new GridLayout()); createTreeArea(); createBtnArea(); createExtentArea(); initUIListeners(); } protected void createTreeArea() { tvInfos = new TreeViewer(this, SWT.BORDER | SWT.FULL_SELECTION); Tree tree = tvInfos.getTree(); tree.setLinesVisible(true); tree.setHeaderVisible(true); final GridData gd_tree = new GridData(SWT.FILL, SWT.FILL, true, true); gd_tree.heightHint = 120; gd_tree.minimumHeight = 80; tree.setLayoutData(gd_tree); tvInfos.setContentProvider(new ListContentProvider()); tvInfos.setLabelProvider(getLabelProviderForViewer()); tvInfos.setColumnProperties(getColumnProperties()); tvInfos.setCellEditors(getCellEditors()); tvInfos.setCellModifier(getCellModifier()); tvInfos.setInput(getInfos()); fillColumnsInTree(tree); } protected void createBtnArea() { final Composite compBtns = new Composite(this, SWT.NONE); compBtns.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); final GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 7; compBtns.setLayout(gridLayout); btnAdd = new Button(compBtns, SWT.NONE); btnAdd.setImage(ImageCache.getCreatedImage(EImage.ADD_OBJ.getPath())); btnAdd.setToolTipText(Messages._Add); btnRemove = new Button(compBtns, SWT.NONE); btnRemove.setImage(ImageCache.getCreatedImage(EImage.DELETE_OBJ.getPath())); btnRemove.setToolTipText(Messages._Remove); btnRemoveAll = new Button(compBtns, SWT.NONE); btnRemoveAll.setImage(ImageCache.getCreatedImage(EImage.PROGRESS_REMALL.getPath())); btnRemoveAll.setToolTipText(Messages.ComplexAnnotaionXX_RemoveAll); btnMoveUp = new Button(compBtns, SWT.NONE); btnMoveUp.setImage(ImageCache.getCreatedImage(EImage.PREV_NAV.getPath())); btnMoveUp.setToolTipText(Messages.ComplexAnnotaionXX_MoveUp); btnMoveDown = new Button(compBtns, SWT.NONE); btnMoveDown.setImage(ImageCache.getCreatedImage(EImage.NEXT_NAV.getPath())); btnMoveDown.setToolTipText(Messages.ComplexAnnotaionXX_MoveDown); btnCopy = new Button(compBtns, SWT.NONE); btnCopy.setImage(ImageCache.getCreatedImage(EImage.COPY.getPath())); btnCopy.setToolTipText(Messages._Copy); btnPaste = new Button(compBtns, SWT.NONE); btnPaste.setImage(ImageCache.getCreatedImage(EImage.PASTE.getPath())); btnPaste.setToolTipText(Messages._Paste); } protected void initUIListeners() { initUIListnerForAddBtn(); initUIListenersForRemoveBtn(); initUIListenerForRemoveAllBtn(); initUIListenerForMoveUpBtn(); initUIListenerForMoveDownBtn(); initUIListenerForCopyBtn(); initUIListenerForPasteBtn(); } private void initUIListnerForAddBtn() { btnAdd.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { T createdDefaultObj = createDefaultInfoObj(); if (createdDefaultObj == null) { return; } getInfos().add(createdDefaultObj); tvInfos.refresh(); doCommit(); } }); } private void initUIListenersForRemoveBtn() { btnRemove.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (!hasSelection()) { return; } getInfos().remove(getSelection()); tvInfos.refresh(); doCommit(); } }); } private void initUIListenerForRemoveAllBtn() { btnRemoveAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { getInfos().clear(); tvInfos.refresh(); doCommit(); } }); } private void initUIListenerForMoveUpBtn() { btnMoveUp.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (!hasSelection()) { return; } moveInfoUp(getSelection()); doCommit(); } }); } private void initUIListenerForMoveDownBtn() { btnMoveDown.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (!hasSelection()) { return; } moveInfoDown(getSelection()); doCommit(); } }); } private void initUIListenerForCopyBtn() { btnCopy.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (!hasSelection()) { return; } copyedObj = getSelection(); } }); } private void initUIListenerForPasteBtn() { btnPaste.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (copyedObj == null) { return; } if (!validateBeforePaste(copyedObj)) { return; } getInfos().add(cloneCopyedObj(copyedObj)); tvInfos.refresh(); doCommit(); } }); } private boolean hasSelection() { return getSelection() != null; } @SuppressWarnings("unchecked") private T getSelection() { if (!(tvInfos.getSelection() instanceof IStructuredSelection) || ((IStructuredSelection) tvInfos.getSelection()).isEmpty()) { return null; } return (T) ((IStructuredSelection) tvInfos.getSelection()).getFirstElement(); } private void moveInfoUp(T movedObj) { doMove(movedObj, (getInfos().indexOf(movedObj) - 1) < 0 ? 0 : (getInfos().indexOf(movedObj) - 1)); } private void moveInfoDown(T movedObj) { doMove(movedObj, (getInfos().indexOf(movedObj) == getInfos().size() - 1) ? (getInfos().size() - 1) : (getInfos().indexOf(movedObj) + 1)); } private void doMove(T movedObj, int newIndex) { getInfos().remove(movedObj); getInfos().add(newIndex, movedObj); tvInfos.refresh(); } public Viewer getViewer() { return tvInfos; } public void setInfos(List<T> objs) { if (objs == null) { return; } infos = objs; tvInfos.setInput(infos); } public void setInfos(T[] objs) { infos.clear(); for (T eachInputedObj : objs) { if (eachInputedObj == null) { continue; } infos.add(eachInputedObj); } tvInfos.setInput(infos); tvInfos.refresh(); } @Override public void dispose() { super.dispose(); nillableColImage.dispose(); } protected List<T> getInfos() { return infos; } protected void doCommit() { if (section != null) { section.autoCommit(); } } protected abstract ITableLabelProvider getLabelProviderForViewer(); protected abstract void createTopExtentArea(); protected abstract void createExtentArea(); protected abstract void fillColumnsInTree(Tree tree); protected abstract T createDefaultInfoObj(); protected abstract boolean validateBeforePaste(T copyedObj); protected abstract T cloneCopyedObj(T copyedObj); protected abstract String[] getColumnProperties(); protected abstract CellEditor[] getCellEditors(); protected abstract ICellModifier getCellModifier(); protected abstract void initParameters(Object[] parameters); }