// ============================================================================ // // 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.dialog; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; 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.events.SelectionListener; import org.eclipse.swt.events.TreeAdapter; import org.eclipse.swt.events.TreeEvent; 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.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.eclipse.ui.dialogs.SelectionStatusDialog; import org.eclipse.ui.progress.UIJob; import org.talend.core.model.properties.Property; import org.talend.core.model.repository.ISubRepositoryObject; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.model.nodes.foldernode.ColumnFolderNode; import org.talend.dataprofiler.core.model.nodes.foldernode.TableFolderNode; import org.talend.dataprofiler.core.model.nodes.foldernode.ViewFolderNode; import org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage; import org.talend.dataprofiler.core.ui.filters.AbstractViewerFilter; import org.talend.dataprofiler.core.ui.views.provider.ResourceViewContentProvider; import org.talend.dq.helper.PropertyHelper; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.nodes.DBCatalogRepNode; import org.talend.dq.nodes.DBColumnRepNode; import org.talend.dq.nodes.DBConnectionRepNode; import org.talend.dq.nodes.DBSchemaRepNode; import org.talend.dq.nodes.DBTableRepNode; import org.talend.dq.nodes.DBViewRepNode; import org.talend.dq.nodes.DQRepositoryNode; import org.talend.repository.model.IRepositoryNode; import orgomg.cwm.objectmodel.core.ModelElement; /** * A class to select elements out of a tree structure. * * @since 2.0 */ public abstract class TwoPartCheckSelectionDialog extends SelectionStatusDialog implements ISelectionChangedListener { private CheckboxTreeViewer fViewer; protected ILabelProvider fLabelProvider; protected ITreeContentProvider fContentProvider; private CheckboxTableViewer sTableViewer; protected ILabelProvider sLabelProvider; protected IStructuredContentProvider sContentProvider; private ISelectionStatusValidator fValidator = null; private ViewerComparator fComparator; private String fEmptyListMessage = DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.noEntriesAvailable"); //$NON-NLS-1$ private IStatus fCurrStatus = new Status(IStatus.OK, PlatformUI.PLUGIN_ID, 0, "", null); //$NON-NLS-1$ private List<ViewerFilter> fFilters; private Object fInput; private boolean fIsEmpty; private int fWidth = 60; private int fHeight = 18; protected boolean fContainerMode; private Object[] fExpandedElements; // ADD msjian 2011-7-8 feature 22206: Add filters private Text leftFilterText; private Text rightFilterText; private Label messageLabel; public Object[] getfExpandedElements() { return this.fExpandedElements; } public void setfExpandedElements(Object[] fExpandedElements) { this.fExpandedElements = fExpandedElements; } private AbstractAnalysisMetadataPage metadataFormPage; protected int dialogType; public int getDialogType() { return dialogType; } public void setDialogType(int dialogType) { this.dialogType = dialogType; } public static final int DIALOG_TYPE_COLUMN = 1; public static final int DIALOG_TYPE_TABLE = 2; protected IRepositoryNode selectedTreeRepoNode; private boolean addConnFilter = true; /** * Constructs an instance of <code>ElementTreeSelectionDialog</code>. * * @param parent The shell to parent from. * @param labelProvider the label provider to render the entries * @param contentProvider the content provider to evaluate the tree structure */ public TwoPartCheckSelectionDialog(AbstractAnalysisMetadataPage metadataFormPage, Shell parent, String message) { this(metadataFormPage, parent, message, true); } public TwoPartCheckSelectionDialog(AbstractAnalysisMetadataPage metadataFormPage, Shell parent, String message, boolean addConnFilter) { super(parent); setResult(new ArrayList(0)); setStatusLineAboveButtons(true); fContainerMode = true; fExpandedElements = null; this.metadataFormPage = metadataFormPage; this.addConnFilter = addConnFilter; int shellStyle = getShellStyle(); setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE); setMessage(message); initProvider(); // MOD mzhao 2009-05-05, bug 6587. if (addConnFilter) { addConnFilterListener(); } } /** * Init the LabelProvider or ContentProvider for treeViewer and tableViewer. */ protected abstract void initProvider(); /** * If set, the checked /gray state of containers (inner nodes) is derived from the checked state of its leaf nodes. * * @param containerMode The containerMode to set */ public void setContainerMode(boolean containerMode) { fContainerMode = containerMode; } /** * Sets the message to be displayed if the list is empty. * * @param message the message to be displayed. */ public void setEmptyListMessage(String message) { fEmptyListMessage = message; } /** * Sets the sorter used by the tree viewer. * * @param sorter * @deprecated since 3.3, use {@link TwoPartCheckSelectionDialog#setComparator(ViewerComparator)} instead */ @Deprecated public void setSorter(ViewerSorter sorter) { fComparator = sorter; } /** * Sets the comparator used by the tree viewer. * * @param comparator * @since 3.3 */ public void setComparator(ViewerComparator comparator) { fComparator = comparator; } /** * Adds a filter to the tree viewer. * * @param filter a filter. */ public void addFilter(ViewerFilter filter) { if (fFilters == null) { fFilters = new ArrayList<ViewerFilter>(4); } fFilters.add(filter); } /** * Sets an optional validator to check if the selection is valid. The validator is invoked whenever the selection * changes. * * @param validator the validator to validate the selection. */ public void setValidator(ISelectionStatusValidator validator) { fValidator = validator; } /** * Sets the tree input. * * @param input the tree input. */ public void setInput(Object input) { fInput = input; } public void setOutput(Object output) { sTableViewer.setInput(output); } /** * Expands elements in the tree. * * @param elements The elements that will be expanded. */ public void setExpandedElements(Object[] elements) { fExpandedElements = elements; } /** * Sets the size of the tree in unit of characters. * * @param width the width of the tree. * @param height the height of the tree. */ public void setSize(int width, int height) { fWidth = width; fHeight = height; } /** * Validate the receiver and update the status with the result. * */ protected void updateOKStatus() { if (!fIsEmpty) { if (fValidator != null) { fCurrStatus = fValidator.validate(fViewer.getCheckedElements()); updateStatus(fCurrStatus); } else if (!fCurrStatus.isOK()) { fCurrStatus = new Status(IStatus.OK, PlatformUI.PLUGIN_ID, IStatus.OK, "", //$NON-NLS-1$ null); } } else { fCurrStatus = new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, IStatus.OK, fEmptyListMessage, null); } updateStatus(fCurrStatus); } /* * (non-Javadoc) * * @see org.eclipse.jface.window.Window#open() */ @Override public int open() { fIsEmpty = evaluateIfTreeEmpty(fInput); super.open(); return getReturnCode(); } /** * Handles cancel button pressed event. */ @Override protected void cancelPressed() { setResult(null); super.cancelPressed(); } /* * @see SelectionStatusDialog#computeResult() */ @Override protected void computeResult() { setResult(Arrays.asList(fViewer.getCheckedElements())); } private void parentCreate() { super.create(); } /* * (non-Javadoc) * * @see org.eclipse.jface.window.Window#create() */ @Override public void create() { BusyIndicator.showWhile(null, new Runnable() { public void run() { parentCreate(); fViewer.setCheckedElements(getInitialElementSelections().toArray()); fViewer.getTree().addTreeListener(new TreeAdapter() { @Override public void treeExpanded(TreeEvent e) { TreeItem item = (TreeItem) e.item; handleTreeExpanded(item); super.treeExpanded(e); } }); updateOKStatus(); } }); } protected void handleTreeExpanded(TreeItem item) { if (!item.getText().endsWith(")")) { //$NON-NLS-1$ Object obj = item.getData(); if (obj instanceof TableFolderNode || obj instanceof ViewFolderNode || obj instanceof ColumnFolderNode) { item.setText(item.getText() + "(" + item.getItemCount() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ fViewer.getTree().layout(); } } } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets .Composite) */ @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); messageLabel = createMessageArea(composite); messageLabel.setText(this.getMessage()); Composite twoPartComp = new Composite(composite, 0); GridLayout layout = new GridLayout(2, true); layout.marginHeight = 0; layout.marginWidth = 0; layout.verticalSpacing = 0; twoPartComp.setLayout(layout); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(twoPartComp); CheckboxTreeViewer treeViewer = createFirstPart(twoPartComp); sTableViewer = createSecondPart(twoPartComp); // ADD msjian 2011-7-8 feature 22206: Add filters // create the filter composite Control filterComposite = createFilterTexts(composite); // MOD klliu bug TDQ-4159 2012-03-07 GridDataFactory.fillDefaults().hint(0, 30).applyTo(filterComposite); Control buttonComposite = createSelectionButtons(composite); GridData data = new GridData(GridData.FILL_BOTH); data.widthHint = convertWidthInCharsToPixels(fWidth); data.heightHint = convertHeightInCharsToPixels(fHeight); Tree treeWidget = treeViewer.getTree(); treeWidget.setLayoutData(data); treeWidget.setFont(parent.getFont()); if (fIsEmpty) { messageLabel.setEnabled(false); treeWidget.setEnabled(false); // ADD msjian 2011-7-8 feature 22206: Add filters filterComposite.setEnabled(false); buttonComposite.setEnabled(false); } addCheckedListener(); // MOD mzhao bug 9240 unfoldToCheckedElements(); return composite; } /** * Add the checked listener for treeviewer or tableviewer. */ protected abstract void addCheckedListener(); /** * DOC mzhao 2009-05-05 bug: 6587, Add connection metadata filter. */ private void addConnFilterListener() { AbstractViewerFilter connFiler = new AbstractViewerFilter() { @Override public int getId() { return 0; } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof DBConnectionRepNode) { DBConnectionRepNode node = (DBConnectionRepNode) element; Integer selectIndex = metadataFormPage.getConnCombo().getSelectionIndex(); Integer connectionIndex = null; Property property = (node.getObject()).getProperty(); ModelElement modelelement = PropertyHelper.getModelElement(property); String dataKey = property.getDisplayName() + RepositoryNodeHelper.getConnectionType(node); Object value = metadataFormPage.getConnCombo().getData(modelelement == null ? "" : dataKey); //$NON-NLS-1$ if (value != null && value instanceof Integer) { connectionIndex = (Integer) value; } return (connectionIndex != null && selectIndex.intValue() == connectionIndex.intValue()); } return true; } }; addFilter(connFiler); } /** * Creates the tree viewer. * * @param parent the parent composite * @return the tree viewer */ protected CheckboxTreeViewer createFirstPart(Composite parent) { if (fContainerMode) { if (DIALOG_TYPE_TABLE == this.getDialogType()) { fViewer = new TableSelectionViewer(parent, SWT.BORDER); } else if (!this.addConnFilter) { fViewer = new MatchColumnSelectionViewer(parent, SWT.BORDER); } else { fViewer = new ColumnSelectionViewer(parent, SWT.BORDER); } // { // // protected void handleTreeExpand(TreeEvent event) { // super.handleTreeExpand(event); // checkElementChecked(); // } // }; } else { fViewer = new CheckboxTreeViewer(parent, SWT.BORDER) { @Override protected void handleTreeExpand(TreeEvent event) { super.handleTreeExpand(event); // checkElementChecked(); } }; } fViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); applyDialogFont(fViewer.getTree()); fViewer.setContentProvider(fContentProvider); // mod gdbu 2011-7-25 bug 23220 ((ResourceViewContentProvider) fContentProvider).setTreeViewer(fViewer); // ~23220 fViewer.setLabelProvider(fLabelProvider); fViewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { updateOKStatus(); } }); fViewer.setComparator(fComparator); if (fFilters != null) { for (int i = 0; i != fFilters.size(); i++) { fViewer.addFilter(fFilters.get(i)); } } fViewer.setInput(fInput); // fViewer. fViewer.addSelectionChangedListener(this); return fViewer; } // protected void checkElementChecked() { // } protected CheckboxTableViewer createSecondPart(Composite parent) { CheckboxTableViewer viewer = CheckboxTableViewer.newCheckList(parent, SWT.MULTI | SWT.BORDER); viewer.setLabelProvider(this.sLabelProvider); viewer.setContentProvider(this.sContentProvider); viewer.addSelectionChangedListener(this); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(viewer.getTable()); return viewer; } /** * Returns the tree viewer. * * @return the tree viewer */ protected CheckboxTreeViewer getTreeViewer() { return fViewer; } protected CheckboxTableViewer getTableViewer() { return sTableViewer; } /** * Adds the selection and deselection buttons to the dialog. * * @param composite the parent composite * @return Composite the composite the buttons were created in. */ protected Composite createSelectionButtons(Composite composite) { Composite buttonComposite = new Composite(composite, SWT.RIGHT); GridLayout layout = new GridLayout(); layout.numColumns = 2; buttonComposite.setLayout(layout); buttonComposite.setFont(composite.getFont()); GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL); data.grabExcessHorizontalSpace = true; composite.setData(data); Button selectButton = createButton(buttonComposite, IDialogConstants.SELECT_ALL_ID, "Select &All", false); //$NON-NLS-1$ Button deselectButton = createButton(buttonComposite, IDialogConstants.DESELECT_ALL_ID, "&Deselect All", false); //$NON-NLS-1$ addSelectionButtonListener(selectButton, deselectButton); return buttonComposite; } /** * Add the listeners for all select(deselect) button. * * @param selectButton * @param deselectButton */ protected void addSelectionButtonListener(Button selectButton, Button deselectButton) { SelectionListener listener = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Object[] viewerElements = fContentProvider.getElements(fInput); if (fContainerMode) { fViewer.setCheckedElements(viewerElements); } else { for (Object viewerElement : viewerElements) { fViewer.setSubtreeChecked(viewerElement, true); } } updateOKStatus(); } }; selectButton.addSelectionListener(listener); listener = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { fViewer.setCheckedElements(new Object[0]); updateOKStatus(); } }; deselectButton.addSelectionListener(listener); } // ADD msjian 2011-7-8 feature 22206: Add filters /** * Adds the table and column filter texts to the dialog. * * @param composite the parent composite * @return Composite the composite the filter texts were created in. */ protected Composite createFilterTexts(Composite composite) { Composite filterTextsComposite = new Composite(composite, 0); GridLayout layout = new GridLayout(6, false); layout.marginHeight = 0; layout.marginWidth = 0; layout.verticalSpacing = 0; filterTextsComposite.setLayout(layout); filterTextsComposite.setFont(composite.getFont()); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(filterTextsComposite); Label leftFilterLabel = new Label(filterTextsComposite, SWT.NONE); if (DIALOG_TYPE_TABLE == this.getDialogType()) { leftFilterLabel.setText(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.SchemaCatalogFilter"));//$NON-NLS-1$ } else { leftFilterLabel.setText(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.TableFilter"));//$NON-NLS-1$ } GridData gd1 = new GridData(GridData.FILL_HORIZONTAL); gd1.horizontalSpan = 1; gd1.grabExcessHorizontalSpace = false; leftFilterLabel.setLayoutData(gd1); leftFilterText = new Text(filterTextsComposite, SWT.BORDER | SWT.SINGLE); leftFilterText.setMessage(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.FilterMessage"));// $NON-NSL-1$ GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; gd.grabExcessHorizontalSpace = true; leftFilterText.setLayoutData(gd); Label rightFilterLabel = new Label(filterTextsComposite, SWT.NONE); if (DIALOG_TYPE_TABLE == this.getDialogType()) { rightFilterLabel.setText(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.TableFilter"));//$NON-NLS-1$ } else { rightFilterLabel.setText(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.ColumnFilter"));// $NON-NSL-1$ } rightFilterText = new Text(filterTextsComposite, SWT.BORDER | SWT.SINGLE); rightFilterText.setMessage(DefaultMessagesImpl.getString("TwoPartCheckSelectionDialog.FilterMessage"));// $NON-NSL-1$ rightFilterText.setLayoutData(gd); addFilterTextsListener(); return filterTextsComposite; } /** * DOC msjian the FilterJob, use to run the filters. */ class FilterJob extends UIJob { private String filter; private boolean isfViewer; /** * set the filter string. * * @param text */ public void setFilter(String text) { this.filter = text; } /** * Sets the viewer. * * @param viewer (fViewer or sTableViewer) */ public void setViewer(boolean isfViewer) { this.isfViewer = isfViewer; } public FilterJob(String name, String filter, boolean isfViewer) { super(name); this.filter = filter; this.isfViewer = isfViewer; } @Override public IStatus runInUIThread(final IProgressMonitor monitor) { getDisplay().asyncExec(new Runnable() { public void run() { boolean save = DQRepositoryNode.isOnFilterring(); String value = DQRepositoryNode.getFilterStr(); boolean untilSchema = false; boolean untilTable = false; try { if (DIALOG_TYPE_TABLE == getDialogType()) { untilSchema = DQRepositoryNode.isUntilSchema(); } else if (isfViewer) { untilTable = DQRepositoryNode.isUntilTable(); } DQRepositoryNode.setFilterStr(filter); if (filter.equals("")) { //$NON-NLS-1$ DQRepositoryNode.setFiltering(false); if (isfViewer) { fViewer.refresh(); restoreCheckStatus(); } else { // ADD msjian 2011-7-27 22206: fixed note 93509 when cleared the filter, the selected // turn to unselected sTableViewer.refresh(); } unfoldToCheckedElements(); } else { DQRepositoryNode.setFiltering(true); if (isfViewer) { if (DIALOG_TYPE_TABLE == getDialogType()) { DQRepositoryNode.setUntilSchema(true); } else { DQRepositoryNode.setUntilTable(true); } // MOD msjian 2011-8-24: TDQ-3282 because there is something changed in // DQRepositoryNode.filterResultsIfAny DQRepositoryNode.setIsReturnAllNodesWhenFiltering(false); fViewer.refresh(); fViewer.expandAll(); DQRepositoryNode.setIsReturnAllNodesWhenFiltering(true); restoreCheckStatus(); } else { DQRepositoryNode.setIsReturnAllNodesWhenFiltering(false); sTableViewer.refresh(); DQRepositoryNode.setIsReturnAllNodesWhenFiltering(true); restoreTableCheckStatus(); // TDQ-3282 ~ } } } finally { DQRepositoryNode.setFiltering(save); DQRepositoryNode.setFilterStr(value); if (isfViewer) { DQRepositoryNode.setUntilTable(untilTable); } if (DIALOG_TYPE_TABLE == getDialogType()) { DQRepositoryNode.setUntilSchema(untilSchema); } } updateOKStatus(); } }); return Status.OK_STATUS; } } /** * restore the left viewer's check status. */ protected abstract void restoreCheckStatus(); /** * restore the right viewer's check status. */ protected abstract void restoreTableCheckStatus(); /** * Add the listeners for (table, column)filter texts. * * @param leftFilterText * @param rightFilterText */ protected void addFilterTextsListener() { final FilterJob job = new FilterJob("", leftFilterText.getText(), true);//$NON-NLS-1$ ModifyListener listener1 = new ModifyListener() { public void modifyText(ModifyEvent e) { job.cancel(); job.setFilter(leftFilterText.getText()); // if there is no input in 500 milliseconds, run the job job.schedule(500); } }; leftFilterText.addModifyListener(listener1); final FilterJob job2 = new FilterJob("", rightFilterText.getText(), false);//$NON-NLS-1$ ModifyListener listener2 = new ModifyListener() { public void modifyText(ModifyEvent e) { job2.cancel(); job2.setFilter(rightFilterText.getText()); // if there is no input in 500 milliseconds, run the job job2.schedule(500); } }; rightFilterText.addModifyListener(listener2); } private boolean evaluateIfTreeEmpty(Object input) { Object[] elements = fContentProvider.getElements(input); if (elements.length > 0) { if (fFilters != null) { for (int i = 0; i < fFilters.size(); i++) { ViewerFilter curr = fFilters.get(i); elements = curr.filter(fViewer, input, elements); } } } return elements.length == 0; } /* * (non-Javadoc) * * @see org.eclipse.ui.dialogs.SelectionDialog#setMessage(java.lang.String) */ @Override public void setMessage(String message) { super.setMessage(message); if (messageLabel != null) { this.messageLabel.setText(message); } } /** * judge whether is hided node * * @param selectNode * @return */ protected boolean isHideNode(List<IRepositoryNode> nodeList) { for (IRepositoryNode selectNode : nodeList) { if (isHideNode(selectNode)) { return true; } } return false; } /** * judge whether is hided node * * @param selectNode * @return */ protected boolean isHideNode(IRepositoryNode selectNode) { if (getRealNodeFromRepository(selectNode) == null) { return true; } return false; } /** * DOC talend Comment method "getRealNodeFromRepository". * * @param selectNode * @return */ protected IRepositoryNode getRealNodeFromRepository(IRepositoryNode selectNode) { IRepositoryNode returnNode = null; ModelElement currModelElement = null; if (selectNode.getObject() instanceof ISubRepositoryObject) { currModelElement = ((ISubRepositoryObject) selectNode.getObject()).getModelElement(); } if (currModelElement != null) { returnNode = RepositoryNodeHelper.recursiveFind(currModelElement); } return returnNode; } /** * find the last one which is visible Real repository node. * * @param reposNode */ protected IRepositoryNode findLastVisibleNode(IRepositoryNode reposNode) { if (reposNode == null) { return null; } IRepositoryNode returnNode = getRealNodeFromRepository(reposNode); if (returnNode == null) { returnNode = findLastVisibleNode(reposNode.getParent()); } return returnNode; } /** * when parentNode is catalogNode or SchemaNode we need to select tableFolderNode or ViewFolderNode or the left * treeView */ protected IRepositoryNode getAdaptLocationNode(IRepositoryNode parentNode, IRepositoryNode childNode) { // to get TableFolderNode or viewFolderNode IRepositoryNode FolderNode = getContainedFolderNode(childNode); if (FolderNode == null || !(parentNode instanceof DBCatalogRepNode) && !(parentNode instanceof DBSchemaRepNode)) { return null; } if (childNode != null) { for (IRepositoryNode theFolderNode : parentNode.getChildren()) { if (theFolderNode.getLabel().equalsIgnoreCase(FolderNode.getLabel())) { return theFolderNode; } } } return null; } /** * get TableFolderNode or ViewFolderNode. * * @param childNode * @return */ private IRepositoryNode getContainedFolderNode(IRepositoryNode childNode) { if (childNode instanceof DBColumnRepNode) { return childNode.getParent().getParent().getParent(); } else if (childNode instanceof DBTableRepNode || childNode instanceof DBViewRepNode) { return childNode.getParent(); } return null; } protected abstract void unfoldToCheckedElements(); }